이더리움 트랜잭션 처리와 Mempool·가스비 최적화
Ethereum 트랜잭션의 Nonce·Gas·Value 구조와 Mempool 정책, EIP-1559 수수료 전략 및 가스비 최적화 방법을 정리한다.
2026-08-14 · 최초 발행 2025-10-31
Nonce와 수수료 설정이 트랜잭션 처리 결과를 바꾼다
Ethereum에서 트랜잭션 처리는 상태를 바꾸는 서명된 메시지를 네트워크에 전달하고, 블록 생산자가 이를 선택해 실행하는 과정이다. 성능과 비용, 신뢰성은 단순히 가스비를 높이는 방식만으로 결정되지 않는다. Nonce의 연속성, Mempool의 검증·교체 정책, EIP-1559 수수료 모델이 함께 영향을 준다.
트랜잭션에는 송신자 주소, Nonce, Gas 관련 필드, Value, 데이터(payload), 서명이 담긴다. 실행 전에는 Gas 비용을 선결제하고, EVM 실행 결과에 따라 상태가 전이된다. 성공하면 상태 변경이 기록되고 실패하면 상태는 롤백되지만, 소비한 Gas에 대한 수수료는 남는다.
Nonce는 계정별 순차 카운터다. 동일 계정에서 어떤 트랜잭션이 먼저 포함될지 정하고 재실행을 막는다. 중간 Nonce에 갭이 생기면 그 뒤 트랜잭션은 대기한다. 따라서 대량 송신이나 여러 프로세스가 같은 계정을 사용할 때는 Nonce 관리가 필수다.
Gas 관련 필드는 최대 연산량을 뜻하는 gasLimit, EIP-1559의 maxFeePerGas·maxPriorityFeePerGas·baseFee, 그리고 legacy 방식의 gasPrice로 나뉜다. 가스가 부족하면 Out-of-Gas로 revert되고 Gas는 소각된다. Value는 송금하는 ETH 양이며, 컨트랙트를 호출할 때는 calldata와 함께 사용한다.
노드는 아직 블록에 들어가지 않은 트랜잭션을 Mempool에 보관한다. 이 집합은 검증, 정렬, 교체, 만료 정책에 따라 달라지며, 채굴자나 검증자는 보통 수수료 우선순위를 고려해 트랜잭션을 골라 블록에 포함한다.
EIP-1559는 동적으로 바뀌는 baseFee를 소각하고 우선 수수료인 tip을 더하는 모델이다. 사용자는 maxFee와 maxPriorityFee를 지정한다. 네트워크가 혼잡하면 포함 지연과 비용이 커질 수 있고, 한가한 상황에서는 비용이 자동으로 낮아진다.
Dencun/EIP-4844 도입 이후에는 L2 데이터 가용성 비용으로 Blob gas도 존재한다. L1 수수료 추정과 서로 영향을 줄 수 있으므로 최신 정보 확인이 필요하다.
Mempool에 들어온 뒤 블록에 담기기까지
트랜잭션 타입은 Legacy(Type 0), Access List(Type 1/EIP-2930), EIP-1559(Type 2/EIP-1559)로 구분된다. RLP 인코딩과 EIP-2718 Typed Transaction 프레임워크가 적용된다. 일반적으로는 예측 가능성과 평균 비용 측면에서 EIP-1559를 권장한다. Access List는 콜드·웜 접근 비용을 최적화하는 데 유리하다.
Mempool은 서명, Nonce, 잔액, 가스한도, 체인ID를 확인한다. 유효성 검증을 통과하지 못하면 즉시 거절된다. 이후 우선순위 수수료, 유효 Gas, Nonce 연속성을 기준으로 정렬하며, 로컬 트랜잭션을 우대하는 정책도 존재한다.
동일 Nonce를 가진 트랜잭션은 기존 거래보다 일정 임계치를 넘는 수수료를 제시해야 교체될 수 있다. 예를 들어 tip·가격이 기존 대비 10%↑ 이상이어야 하는 정책이 있으며, 이 조건을 충족하지 못하면 replacement underpriced 오류가 발생할 수 있다.
블록 생산자는 보통 tip이 높은 트랜잭션을 선호한다. 반면 baseFee는 네트워크가 결정한다. 수수료 상한이 부족하면 블록에 포함될 수 없다. Nonce의 연속성도 보장되어야 하므로, 갭이 생긴 계정의 후속 트랜잭션은 지연된다.
실행 후 Receipt에는 상태, Gas 사용량, 로그, 블록 정보가 남는다. 재편성(reorg)이 발생하면 일시적으로 포함된 트랜잭션이 취소될 수 있다. 현장에서 자주 마주치는 오류는 nonce too low/high, replacement underpriced, insufficient funds, out-of-gas, maxFee too low다. Nonce 예약 관리, 추적형 재전송, 할당 금액 버퍼, 동적 fee cap, 실패 감지 후 자동 재시도로 대응할 수 있다.
에러 처리에서는 트랜잭션, 네트워크 혼잡도, 계정 Nonce, 잔액을 입력으로 다룬다. 사전 시뮬레이션과 동적 수수료 산정, Nonce 예약·락, 실패 코드 분류를 거쳐 송신 성공·대체 재시도·실패 알림을 결정한다. 이후 확정성 n 블록을 기준으로 사후 모니터링을 이어간다.
| 구분 | 성능(포함 예측) | 확장성(수수료 예측) | 일관성(정책 표준성) | 안정성(오류/리스크) | 운영 편의 |
|---|---|---|---|---|---|
| Legacy (Type 0) | 중간 | 낮음(급등 시 과금 리스크) | 중 | 교체·지연 리스크 큼 | 낮음 |
| Access List (Type 1) | 중상 | 중간(콜드 접근 최적화) | 중 | 접근 리스트 관리 필요 | 중 |
| EIP-1559 (Type 2) | 높음 | 높음(baseFee 자동 조정) | 높음(현 표준) | 교체 임계 이해 필요 | 높음 |
컨트랙트와 전송 계층에서 가스비를 줄이는 방법
온체인 코드에서는 상태 저장을 줄이는 일이 출발점이다. 상태 압축과 Bit packing, mapping·struct 설계 최적화로 SSTORE 비용을 낮출 수 있다. 데이터 전달에는 calldata를 활용하고 불필요한 abi.encode를 피하며, 로그 비용을 고려해 이벤트를 최소화한다.
함수는 external을 우선 고려하고 immutable·constant를 사용한다. custom error는 revert reason 비용을 줄일 수 있다. Access List(EIP-2930)로 콜드 접근을 예열하고 반복 읽기·쓰기를 묶어 처리하는 방식도 선택지다.
전송 단계에서는 maxFee = baseFee * 계수 + 여유 형태로 상한을 설정하고, tip은 목표 포함 시간에 맞춰 조정한다. Multicall과 router 패턴은 왕복 횟수를 줄이며, permit(EIP-2612)는 approve 트랜잭션을 줄인다. 동일 Nonce로 재전송할 때는 tip을 기존 대비 10~15% 높이는 정책을 지갑이나 백엔드에서 자동화할 수 있다.
민감한 트랜잭션은 private relayer(예: MEV-boost/Flashbots) 경로를 고려해볼 수 있다. 프라이버시와 MEV 관련 동작은 최신 정보 확인이 필요하다.
운영 계층에서는 계정별 락과 예약 큐를 둔 Nonce 관리자, 고가용 RPC 분산, pending·queued 풀 동기화가 필요하다. 최근 N 블록의 baseFee 추세와 포함 시간 SLO를 토대로 tip을 자동화하고, 실패하면 단계적으로 상향한다. 펜딩 체류 시간, 실패율, Gas 당 비용(gwei)을 KPI로 추적하고 알림 및 자동 교체를 연결한다.
네트워크 상황에 따라 EIP-1559 적용과 동적 tip은 평균 포함 시간이 같은 기준에서 비용을 1035% 절감할 수 있다. calldata·immutable·custom error 최적화는 컨트랙트 호출 가스를 520% 절감할 수 있다. Nonce 큐와 재전송을 자동화하면 펜딩 정체 건수는 80% 이상 감소하고 실패율은 30%↓를 기대할 수 있다.
운영 환경에서 보는 적용 방식
거래소와 브릿지 백엔드는 다계정 Nonce 큐를 관리하고, 1015% tip 상향 재전송 정책과 1020% 가스 버퍼를 적용할 수 있다. 블록 재편성에 대비해서는 L1 12블록, L2 20블록처럼 확정성 정책을 운영한다.
월렛과 커스터디 서비스는 사용자가 원하는 포함 시간에 맞춘 tip 프로파일을 제공할 수 있다. stuck 상태를 감지하면 자동 bump를 수행하고, Access List를 사전 계산해 콜드 접근 비용을 낮춘다.
디파이 프로토콜에서는 permit로 승인 트랜잭션을 제거하고 멀티콜 라우터로 여러 동작을 묶는다. 민감한 거래에는 private tx 채널을 사용해 프런트러닝을 완화할 수 있다.
L2 수수료는 별도 모델로 움직인다. L1 데이터 가용성의 Blob gas 영향을 모니터링하고, 브릿지 메시지 릴레이에는 L1·L2 수수료를 동시에 추정하는 파이프라인이 필요하다. 최신 정보 확인이 필요하다.
ethers.js에서 EIP-1559 트랜잭션을 전송하고 교체하기
전제 조건은 Node.js >= 18, ethers >= 6, 메인넷 또는 테스트넷 RPC 엔드포인트다. 송신 계정에는 충분한 ETH가 있어야 하며, 동일 Nonce 교체는 RPC 정책의 허용이 필요하다.
npm i ethers
// Node 18+, ethers ^6
import { ethers } from "ethers";
const RPC = process.env.RPC_URL; // 예: https://mainnet.infura.io/v3/xxx
const PRIV = process.env.PRIVATE_KEY; // 테스트 키 사용 권장
async function main() {
const provider = new ethers.JsonRpcProvider(RPC);
const wallet = new ethers.Wallet(PRIV, provider);
// 1) 수수료 추정(EIP-1559)
const fee = await provider.getFeeData(); // baseFee, maxFeePerGas, maxPriorityFeePerGas
const base = fee.gasPrice ?? fee.maxFeePerGas; // 일부 노드는 gasPrice 제공
const tip = ethers.parseUnits("2", "gwei"); // 목표 포함 시간에 따라 조정
const maxFee = base * 2n + tip; // 여유 계수(보수적)
// 2) Nonce 예약
const nonce = await provider.getTransactionCount(wallet.address, "pending");
// 3) 전송 트랜잭션 구성
const tx = await wallet.sendTransaction({
to: wallet.address, // 예시: self-send
value: ethers.parseEther("0.0001"),
nonce,
gasLimit: 21000n,
maxFeePerGas: maxFee,
maxPriorityFeePerGas: tip,
type: 2,
});
console.log("sent:", tx.hash);
// 4) 포함 지연 시 교체(bump)
const receipt = await provider
.waitForTransaction(tx.hash, 1, 30_000)
.catch(() => null);
if (!receipt) {
const bumped = await wallet.sendTransaction({
to: wallet.address,
value: ethers.parseEther("0.0001"),
nonce, // 동일 Nonce 유지
gasLimit: 21000n,
maxFeePerGas: (maxFee * 115n) / 100n, // 15% 상향
maxPriorityFeePerGas: (tip * 115n) / 100n,
type: 2,
});
console.log("replaced:", bumped.hash);
} else {
console.log("mined in block:", receipt.blockNumber);
}
}
main().catch(console.error);
nonce too low는 다른 프로세스가 Nonce를 이미 사용한 경우이므로 Nonce 동시성 제어가 필요하다. replacement underpriced가 발생하면 bump 비율을 높이거나 노드 정책을 확인한다. insufficient funds에는 수수료와 Value의 합계를 고려한 잔액 버퍼를 둔다. reverted/out-of-gas는 사전 시뮬레이션(callStatic)과 gasLimit 상향으로 다룬다.
EIP-1559와 동적 tip, 코드 최적화를 조합하면 평균 가스비를 1535% 절감할 수 있다. Nonce 관리자와 자동 재전송은 pending 정체율을 낮추고 실패율을 2040% 낮출 수 있다. 모니터링과 알림 체계를 도입하면 Mean Time To Inclusion(MTTI)을 단축하고 SLO 준수율을 높일 수 있다.
트랜잭션 처리는 Nonce·Gas·Value의 정확한 이해, EIP-1559 기반 수수료 전략, Mempool 대응 정책을 한 흐름으로 묶는 일이다. Nonce 동시성 제어와 동적 수수료 산정, 자동 재전송·모니터링 파이프라인을 표준화하고, 컨트랙트와 전송 계층 양쪽을 최적화해야 비용·지연·실패를 함께 줄일 수 있다.