개요
EVM 트랜잭션 수수료 모델은 자동차 연료 비유가 직관적임 Gas는 연료, 트랜잭션 수행은 목적지까지 주행이라는 맥락으로 이해하면 됨 핵심은 두 파라미터, Gas Limit와 Gas Price이며 EIP-1559 이후에는 Base Fee와 Priority Fee로 세분됨
핵심 개념
Gas Limit
- 이 트랜잭션이 최대 얼마만큼의 연산을 사용할 수 있는지에 대한 상한
- 단순 ETH 송금은 21,000 가스 고정값 수준
- 컨트랙트 실행은 로직 복잡도, 저장소 접근, 반복 등에 비례해 증가
- 사용하지 않은 가스는 환불, 부족하면 Out of Gas로 실패 후 사용한 가스 비용만큼 청구
Gas Price
- 가스 1단위당 지불 단가, 단위는 Gwei (1 Gwei = 0.000000001 ETH)
- 네트워크 혼잡도에 따라 경쟁적으로 책정하는 입찰값 성격
- 높으면 포함 우선순위 상승, 낮으면 대기 또는 드롭 가능성
동작 원리
- 블록 프로듀서는 더 높은 보상을 주는 트랜잭션부터 포함하려는 경향
- 가스가 실행 중 소진되면 즉시 중단하고 상태 변경은 리버트 처리, 이미 사용된 가스 비용은 청구됨
- 가스 단가가 지나치게 낮으면 멤풀에서 장시간 대기하거나 노드 정책에 따라 제거될 수 있음
- 블록체인에 포함되지 않은 트랜잭션은 수수료 지불도 발생하지 않음
EIP-1559 이후의 구조
- Base Fee
- 네트워크 혼잡도에 따라 프로토콜이 자동 조정하는 최소 수수료 성분
- 블록에 포함되면 소각됨
- Priority Fee
- 블록 프로듀서에게 주는 팁
- 빠른 포함을 원할 때 상향
- 트랜잭션 필드
- maxFeePerGas, maxPriorityFeePerGas 지정
- 실제 지불 단가인 effectiveGasPrice는 min(maxFeePerGas, baseFee + priorityFee)에 의해 결정됨
- 기존 gasPrice 단일 필드는 레거시 호환 목적, 현재는 타입2 트랜잭션 사용 권장
수수료 계산
- 기본식
- 총 수수료 = Gas Used × 단가
- 레거시 가정
- 단가 = Gas Price
- EIP-1559 가정
- 단가 = effectiveGasPrice = min(maxFeePerGas, baseFee + priorityFee)
- 총 수수료는 Gas Used × effectiveGasPrice이며, baseFee는 소각, priorityFee는 블록 프로듀서에게 전달
예시
- 단순 송금 케이스
- Gas Used 21,000, Gas Price 20 Gwei 가정
- 총 수수료 = 21,000 × 20 Gwei = 420,000 Gwei = 0.00042 ETH
- EIP-1559 케이스
- baseFee 15 Gwei, priorityFee 2 Gwei, maxFeePerGas 30 Gwei, Gas Used 21,000
- effectiveGasPrice = min(30, 15 + 2) = 17 Gwei
- 총 수수료 = 21,000 × 17 Gwei = 357,000 Gwei = 0.000357 ETH
실패와 대기 시나리오
- Gas Limit이 너무 낮은 경우
- 실행 도중 가스 소진으로 즉시 중단, 상태 리버트
- 사용한 가스 비용은 청구
- 블록에는 실패 상태로 기록
- Gas Price가 너무 낮은 경우
- 멤풀 대기 또는 노드 정책에 따라 드롭
- 블록 미포함, 비용 지불 없음
- 익스플로러에서 pending으로 보일 수 있으나 확정 아님
한눈에 비교
| 상황 | 부족한 것 | 블록 포함 | 비용 | 상태 |
|---|---|---|---|---|
| Out of Gas | Gas Limit(연산량 상한) | 포함됨 | 사용된 가스만큼 지불 | Fail 및 Revert |
| Underpriced | Gas Price 또는 effectiveGasPrice | 포함 안 됨 | 0 | Pending → Drop |
주의와 베스트 프랙티스
- Gas Limit는 노드의 estimateGas 결과를 기본으로, 약간의 마진 추가 권장
- 반복적 저장소 쓰기나 루프가 있는 컨트랙트는 가스 변동성 큼, 경계 케이스에 대한 사전 시뮬레이션 필요
- EIP-1559 사용 시 maxFeePerGas는 baseFee 변동을 흡수할 수 있도록 여유 있게, maxPriorityFeePerGas는 시장 상황에 맞춰 설정
- 멤풀 장기 대기 시 동일 nonce로 수수료를 상향해 트랜잭션 교체하는 전략 유효
- 실패 트랜잭션도 가스 비용 발생 가능, 리트라이 시 원인 분석 후 수정 재전송 권장
요약
- Gas Limit은 작업량 상한, 부족하면 Out of Gas로 실패하며 이미 사용한 가스 비용 청구
- Gas Price는 단가, 낮으면 대기 또는 드롭으로 블록 미포함
- EIP-1559 이후 수수료는 baseFee 소각 + priorityFee 보상 구조이며, effectiveGasPrice에 의해 실제 지불 단가 결정