Gas — EVM 연산의 화폐
이더리움에서 모든 연산에는 비용이 있다. 그 비용의 단위가 Gas다. 왜 Gas가 필요할까? 이더리움 네트워크는 수만 개의 노드가 동일한 EVM 코드를 실행한다. 만약 비용이 없다면 누군가 무한 루프 코드를 올려 네트워크 전체를 마비시킬 수 있다. Gas는 이를 막는 경제적 안전장치다.
Gas 비용 — 연산마다 다르다
EVM의 모든 opcode는 고정된 Gas 비용을 가진다. 복잡한 연산일수록 비용이 높다.
| 연산 종류 | Gas 비용 |
|---|---|
| ADD, MUL 등 기본 산술 | 3~5 |
| SLOAD (스토리지 읽기, cold) | 2,100 |
| SLOAD (스토리지 읽기, warm) | 100 |
| SSTORE (새 값 저장) | 20,000 |
| SSTORE (기존 값 수정) | 2,900 |
| LOG2 (Transfer 이벤트) | ~1,381 |
| 단순 ETH 전송 | 21,000 |
| 컨트랙트 배포 | 32,000 + 바이트당 200 |
스토리지 읽기(SLOAD)가 비싼 이유: 전 세계 모든 노드가 동일한 스토리지 값을 조회해야 하기 때문이다. “warm” vs “cold”는 같은 트랜잭션 내에서 이미 접근한 슬롯인지 여부다.
EIP-1559 이전 vs 이후
EIP-1559 이전 (레거시)
단일 gasPrice 값으로 경쟁 입찰. 네트워크가 혼잡할 때 가스비를 얼마나 써야 할지 예측하기 매우 어려웠다. 검증자(마이너)는 가장 높은 gasPrice 트랜잭션을 우선 처리해 수익을 극대화했다.
EIP-1559 이후 (현재 이더리움)
두 개의 값으로 가스비가 분리됐다.
실제 지불액 = min(maxFeePerGas, baseFee + maxPriorityFeePerGas) × gasUsed
baseFee → 네트워크가 자동 결정. 전부 소각됨.
maxPriorityFeePerGas → 검증자에게 가는 팁 (인센티브)
maxFeePerGas → 최대 지불 의사. baseFee > maxFeePerGas이면 pending됨.
baseFee 소각 메커니즘 — 왜 ETH를 소각하는가
baseFee를 소각(burn)하는 것은 EIP-1559의 핵심 설계 결정이다. 왜 검증자에게 주지 않는가?
만약 baseFee가 검증자에게 간다면, 검증자는 인위적으로 블록을 꽉 채워 baseFee를 높게 유지할 인센티브가 생긴다. 이를 “fee manipulation” 공격이라 한다. 소각함으로써 검증자의 수익은 오직 팁(tip)과 블록 보상에만 의존하게 만들었다.
baseFee 자동 조정 공식
new_baseFee = old_baseFee × (1 + (gas_used - target_gas) / target_gas / 8)
target_gas = 블록 gas 한도의 50% (약 15M gas)
예:
- 블록이 꽉 찼을 때(30M gas): baseFee × 1.125 (12.5% 상승)
- 블록이 비었을 때(0 gas): baseFee × 0.875 (12.5% 하락)
- 최대 변동폭: 블록당 ±12.5%
이 메커니즘 덕분에 baseFee가 예측 가능해졌다. 다음 블록의 baseFee는 현재 블록 사용량을 보면 계산할 수 있다.
ETH 단위 완전 정리
1 ETH = 10^18 wei
1 gwei = 10^9 wei = 0.000000001 ETH
// 코드에서는 항상 wei 단위 사용
ethers.parseEther("1.5") → 1500000000000000000n
ethers.parseUnits("30", "gwei") → 30000000000n
// 화면 표시용 변환
ethers.formatEther(value) → "1.5"
ethers.formatUnits(value, "gwei") → "30.0"
운용 전략 — 가스비를 어떻게 설정할까
기본 전략
// 현재 baseFee 조회
const block = await provider.getBlock("latest");
const baseFee = block.baseFeePerGas; // BigInt
// 권장 설정
const maxPriorityFee = ethers.parseUnits("1", "gwei"); // 팁: 1 gwei
const maxFee = baseFee * 2n + maxPriorityFee; // 버퍼 2배 + 팁
const tx = await wallet.sendTransaction({
to: recipient,
value: ethers.parseEther("0.1"),
maxFeePerGas: maxFee,
maxPriorityFeePerGas: maxPriorityFee,
});
빠른 처리가 필요할 때
// 팁을 높여 검증자 우선 처리 유도
const maxPriorityFee = ethers.parseUnits("5", "gwei"); // 팁 5배
const maxFee = baseFee * 2n + maxPriorityFee;
트랜잭션 교체 (RBF — Replace-by-Fee)
pending 상태가 너무 오래 지속되면 동일 nonce로 더 높은 gas 트랜잭션을 보내 교체할 수 있다.
// 기존 pending 트랜잭션의 nonce 재사용
const stuckNonce = 42;
const replaceTx = await wallet.sendTransaction({
nonce: stuckNonce,
to: recipient,
value: amount,
// 기존보다 최소 10% 높은 tip 필요
maxPriorityFeePerGas: originalTip * 120n / 100n,
maxFeePerGas: originalMaxFee * 120n / 100n,
});
gasLimit 설정 — 너무 낮으면 out of gas
// gas 추정 (실제 실행 시뮬레이션)
const estimated = await provider.estimateGas({
to: contractAddress,
data: encodedFunctionCall,
value: 0n,
});
// 버퍼 30% 추가 (실행 환경 변화 대비)
const gasLimit = estimated * 130n / 100n;
console.log(`추정: ${estimated}, 설정: ${gasLimit}`);
out of gas revert 발생 시: 상태는 롤백되지만 gasLimit 전체 gas는 소모된다. 즉 가장 비싼 실패다. 그래서 버퍼를 충분히 주는 것이 중요하다.
EIP-1559가 ETH 가치에 미치는 영향
baseFee 소각은 이더리움의 통화 정책을 바꿨다. 네트워크가 활발할수록 더 많은 ETH가 소각된다. PoS 전환 이후 검증자 보상으로 새로 발행되는 ETH보다 소각되는 ETH가 많아지는 “Ultra Sound Money” 시나리오가 실현되고 있다.
2022년 9월 PoS 전환 이후 이더리움의 연간 ETH 발행량은 약 90% 감소했으며, 네트워크 사용량이 높은 기간에는 실제로 ETH 공급이 줄어드는 디플레이션 상태가 나타나기도 한다.
핵심 정리
- Gas = EVM 연산 비용 단위. SSTORE가 가장 비싸므로 스토리지 최적화가 중요
- EIP-1559: baseFee(소각) + maxPriorityFee(검증자 팁) 분리
- baseFee는 블록 사용량에 따라 ±12.5% 자동 조정
- maxFeePerGas = baseFee × 2 + tip가 일반적인 설정
- gasLimit는 추정값 × 1.3 버퍼 권장. 부족 시 gas 전액 손실
- pending 트랜잭션은 동일 nonce + 더 높은 가스비로 교체 가능(RBF)