EIP-1559 가스비: 예상 비용·상한·실제 청구액 구분하기
TECH INSIGHT / EXPLAINED
허용한 가스 한도, 실제 사용 가스, 단위당 실제 가격을 구분해야 합니다. 수수료 상한은 예산 한도이지 최종 청구 금액이 아닙니다.
팁이 잘리는 경우까지 포함한 식
유효한 EIP-1559 트랜잭션의 실제 단가는 base fee + min(팁 상한, 총 단가 상한 − base fee)입니다. 총 상한이 해당 블록의 base fee보다 낮으면 그 조건으로 포함될 수 없습니다. 팁을 올려도 실행 순서를 보장하지는 않습니다. 이 설명은 이더리움 실행 가스 기준이며 다른 체인이나 L2에는 별도 비용 규칙이 있을 수 있습니다.
def effective_gas_price(base, tip_cap, fee_cap):
if min(base, tip_cap, fee_cap) < 0 or fee_cap < tip_cap:
raise ValueError('invalid fee parameters')
if fee_cap < base:
raise ValueError('fee cap below this block base fee')
return base + min(tip_cap, fee_cap - base)
assert effective_gas_price(30, 3, 32) == 32 # units: gwei
assert 150_000 * 32 * 10**9 == 4_800_000_000_000_000영수증과 예산을 따로 계산하기
base fee 30 gwei, 팁 상한 3 gwei, 총 상한 32 gwei라면 실제 팁은 2 gwei까지만 가능합니다. 150,000 gas를 사용했다면 실행 비용은 0.0048 ETH입니다. gas limit을 180,000으로 잡았다고 그 수량 전부를 청구하는 것은 아닙니다.
보수적인 허용 비용 상한은 180,000 × 32 gwei = 0.00576 ETH입니다. 기대 비용과 허용 상한을 나눠 예상 이익과 비교하고, 동일 시점 가격을 사용해 같은 토큰 단위로 환산합니다.
추정이 확인해 주는 범위
실제 보낼 sender·value·calldata와 관련 상태를 사용해 가스를 추정합니다. RPC 장애와 컨트랙트 실행 중 revert는 구분해야 합니다. 추정 성공이나 고정 20% 여유가 이후 상태에서도 성공을 보장하지는 않습니다.
실제 트랜잭션에는 올바른 chain ID, nonce, value, 서명도 필요합니다. 헤더·팁 조회 오류를 무시하지 말고 BaseFee 유무를 검사합니다. 기존의 축약된 생성 코드만으로 전송 가능한 완전한 트랜잭션이 되지는 않습니다.
실행 판단 기록
추정에 사용한 블록, 추정 가스, 가스 한도, 두 수수료 상한, 견적 만료, 실제 영수증을 남깁니다. 포함된 뒤 revert된 거래도 가스를 쓰므로 성공 거래뿐 아니라 실패 시도 비용도 합산합니다. base fee를 두 배로 잡는 방식은 여유를 주는 경험적 설정일 뿐, 프로토콜 의무나 포함 보장이 아닙니다.
수수료 여유를 대기 블록 수로 읽기
30 gwei에서 시작해 목표 가스의 두 배를 쓰는 가득 찬 블록만 이어진다는 가상 조건을 잡아 봅시다. EIP-1559의 정수식으로 다음 base fee를 계산하면 여섯 번 뒤 60.818595885 gwei, 일곱 번 뒤 68.420920370 gwei입니다. 팁 상한 3 gwei와 총 상한 63 gwei라면 여섯 번째에는 팁이 2.181404115 gwei로 잘리고 일곱 번째에는 상한이 부족합니다.
base = 30_000_000_000 # wei per gas
for _ in range(7):
base += max(base // 8, 1)
print(base)
# step 6: 60818595885
# step 7: 68420920370
독립 Python으로 재현한 이 계산은 혼잡 예측이 아니라 특정 조건의 경계값입니다. 일반 블록에서는 부모 블록의 실제 사용량과 목표량을 넣어야 합니다. 정수 내림과 증가 시 최소 1 wei 규칙 때문에 부동소수점으로 1.125만 반복 곱하는 구현은 모든 입력에서 같지 않습니다. 식의 근거는 EIP-1559입니다.
대기 거래들이 같은 잔고를 중복 사용하지 않게 하기
잔고 검사는 거래 하나에서 끝나면 안 됩니다. 예를 들어 gas limit 180,000, 총 상한 63 gwei, 함께 보낼 ETH 0.01이면 단일 거래의 보수적 자금 예약은 0.02134 ETH입니다. 서로 다른 nonce의 거래 두 개를 준비하면 0.04268 ETH를 예약해야 같은 잔고를 두 번 배정하지 않습니다.
이 예약은 실제 청구액이 아니라 애플리케이션의 자금 관리 정책입니다. 같은 송신자·같은 nonce의 대체 후보는 한 정식 체인에서 하나만 실행되므로 후보별 상한을 무조건 합산하는 대신 그룹별 최대 필요액을 관리할 수 있습니다. 단, 대체 거래를 보냈다는 이유만으로 이전 후보를 이미 취소된 것으로 표시하면 안 됩니다. 정식 체인의 영수증과 nonce를 대사한 뒤 예약을 정리합니다.
영수증의 누적 가스를 비용으로 잘못 읽지 않기
가상의 블록에서 앞선 거래들까지 21,000 gas, 현재 거래까지 누적 171,000 gas라면 현재 거래의 사용량은 150,000 gas입니다. 영수증의 cumulativeGasUsed에 단가를 곱하면 다른 거래 비용까지 가져오는 오류가 납니다. 비용 대사에는 개별 gasUsed와 effectiveGasPrice를 사용하며 필드 의미는 JSON-RPC 영수증 문서에서 확인할 수 있습니다.
비용 원장 키에는 체인·거래 해시와 포함 블록 해시를 보관하세요. 재구성으로 영수증이 사라지면 확정 지출을 그대로 두거나 새 영수증을 중복 더하지 않도록 잠정 상태로 되돌립니다. 영수증 없음은 즉시 실패 확정이 아니며, 대기·관측 실패·재구성 가능성을 조회 상태로 구분해야 합니다.
가스 정책도 만료되는 견적의 일부다
실행 계획에는 수수료를 다시 계산할 시점과 중단 조건을 함께 둡니다. 예를 들어 팁이 깎였다는 사실만으로 총 상한을 계속 올리지 않고, 갱신된 예상 비용이 애플리케이션 예산을 넘으면 계획을 폐기합니다. 가스 가격을 높이는 재시도와 calldata를 바꾸는 새 시도는 다른 후보로 기록해야 원인 분석이 가능합니다.
Ethereum 가스 설명의 실행 비용 범위를 기준으로 원장을 설계하되, 이 예제는 일반 실행 가스만 다룹니다. L2 데이터 비용이나 blob 비용을 한 필드에 숨기지 말고 별도 항목으로 합산하세요. 위 숫자는 예시이며 특정 수수료 설정의 채택이나 거래 실행을 권하는 값이 아닙니다.
공식 자료와 함께 읽기
내용·예제 검토: 2026-10-01
댓글
댓글 쓰기