가장 단순한 ETH 전송은 고정적으로 21000 gas를 소비합니다(옐로 페이퍼 부록 G의 Gtransaction). ERC-20 전송의 소비량은 컨트랙트 구현과 슬롯의 콜드·핫 상태에 따라 달라지며, 보통 수만 gas 규모에 들어갑니다. 이는 실측값이 아니라 자릿수 추정입니다. 이 숫자들은 프로토콜이 정하며 하드포크로만 바뀝니다. 반면 같은 트랜잭션에 실제로 얼마의 ETH를 지불하는지는 몇 시간 만에 열 배 이상 달라질 수 있습니다. 전자는 계량 단위이고 후자는 가격입니다. 이 두 개념을 분리해야 수수료 논의와 확장 서사, 실행 중단의 동작을 명확히 말할 수 있습니다.
Gas 메커니즘은 세 가지 일을 동시에 맡습니다. 계산과 상태 연산을 하나의 단위로 환산하고, 가격 시장으로 한정된 블록 공간을 배분하며, 자원이 고갈될 때 확정적인 롤백 경계를 제시합니다. 아래에서는 이 세 축으로 펼쳐 갑니다. 고유 비용과 동적 비용에 각각 무엇이 포함되는지, 콜드·핫 접근이 어떻게 과금되는지, 트랜잭션이 무효와 REVERT, out-of-gas 세 가지 중단 상황에서 각각 무엇을 돌려주는지, EIP-1559 이후 base fee와 priority fee, 실행 계층 gas의 경계가 어디인지, 그리고 Gas가 DoS를 과금 가능하게 만들면서도 가격을 영원히 정확하게 만들지는 못하는 이유입니다.
Gas는 계산과 저장의 계량 단위이고, 코인 가격과는 다른 이야기입니다
Gas는 추상적인 계량 단위로, 명령 하나를 실행하고 상태를 한 번 읽거나 쓰고 메모리 워드 하나를 확장할 때 소모되는 추상적 자원량에 대응합니다. 그 값은 프로토콜 상수가 정합니다. 예를 들어 덧셈은 3 gas(Gverylow)이고, Berlin 업그레이드(블록 12,244,000, 2021년 4월 15일) 이후 SLOAD 핫 접근은 100 gas, SSTORE로 0에서 0이 아닌 값을 쓰는 경우는 20000 gas입니다. 이 상수들은 하드포크를 통해서만 바뀌고, 시장 수요·공급과는 무관합니다.
Gas의 가격은 wei로 표시하고, 흔히 쓰는 단위는 gwei이며 1 gwei는 10⁹ wei입니다. 트랜잭션 수수료는 gas_used에 effective_gas_price를 곱한 값입니다. 전자는 실행 과정이 결정하고, 후자는 수수료 시장과 트랜잭션 서명에 담긴 입찰가가 함께 결정합니다. 이 곱셈 관계가 뒤의 모든 논의의 기초입니다.
이 두 층을 구분하면 직접적인 이점이 몇 가지 있습니다. "gas를 낮춘다"고 할 때는 목표가 gas_used를 낮추는 것인지 gas price를 낮추는 것인지 먼저 확인해야 합니다. 전자는 연산을 줄이거나 스토리지 레이아웃을 최적화하거나 EVM 과금 규칙을 바꾸는 일이고, 후자는 현재 수요와 수수료 시장의 형태에 달려 있습니다. EIP-1559는 후자를 더 예측 가능하게 만들었지만 어떤 명령의 가격도 바꾸지 않았습니다. "수수료가 누구에게 가는가"를 논할 때 base fee 부분은 프로토콜이 소각하므로 수취인이 없고, priority fee만 검증인 계정으로 들어갑니다. "트랜잭션 상한"을 논할 때 gas_limit은 용량 상한이지 비용 상한이 아니며, 비용 상한은 max_fee_per_gas로 서로 다른 필드입니다.
고유 비용: 실행이 시작되기 전에 이미 차감되는 부분
모든 트랜잭션은 고유 비용(intrinsic gas)을 먼저 지불하며, 이는 EVM이 첫 명령을 실행하기 전에 차감됩니다. 옐로 페이퍼 식 (64)는 이를 g₀로 적습니다. 21000의 고정 기본가(Gtransaction)에 데이터 필드의 0 바이트당 4 gas, 0이 아닌 바이트당 16 gas를 더합니다(0이 아닌 바이트 가격은 EIP-2028이 Istanbul 업그레이드, 블록 9,069,000, 2019년 12월 8일에 68에서 16으로 내렸습니다). 컨트랙트 생성 트랜잭션이면 32000(Gtxcreate)을 더하고, EIP-2930(Berlin 업그레이드, 블록 12,244,000, 2021년 4월 15일) 이후에는 access list의 주소마다 2400 gas, 스토리지 키마다 1900 gas를 더합니다. EIP-3860(Shanghai 업그레이드, 블록 17,034,870, 2023년 4월 12일) 이후에는 컨트랙트 생성의 initcode에 32바이트 워드마다 2 gas를 더 받습니다.
21000의 의미는 "전송 수수료"로 오독되기 쉽습니다. 정확히는 "트랜잭션이 하나 있다"는 것의 기본가이고, 전송 금액과는 무관합니다. 가장 단순한 ETH 전송은 calldata가 비어 있어 데이터 부분이 추가 비용을 만들지 않으므로 정확히 21000입니다.
EIP-2929(Berlin 업그레이드, 블록 12,244,000, 2021년 4월 15일)는 트랜잭션 시작 시점의 핫 집합도 규정합니다. 발신자 주소, 수신자 주소(생성 트랜잭션이면 생성되는 주소), 모든 프리컴파일 컨트랙트 주소가 이미 accessed_addresses에 들어 있어 이들에 대해서는 콜드 접근 비용을 받지 않습니다. 그래서 일반 주소로 보내는 전송에서 수신자 계정 접근에 추가 요금이 붙지 않습니다.
고유 비용은 실행 전에 차감되므로 행동 경계가 세 가지 생깁니다. gas_limit이 고유 비용보다 낮은 트랜잭션은 그대로 무효가 되어 블록에 포함되지 않고 gas도 전혀 차감되지 않습니다. 실행 도중 out-of-gas로 중단되면 고유 비용은 돌려받지 못합니다. access list의 2400과 1900(Berlin 이후 가격)은 선불 성격입니다. 앞으로 접근할 주소와 슬롯을 한 번 훑어 미리 핫으로 만들어 두는 것이고, 실제 실행에서 접근하지 않았다면 이 돈은 돌려받지 못합니다.
동적 비용: 메모리 확장과 콜드·핫 접근은 어떻게 누적되는가
실행 단계의 비용은 정적 부분과 동적 부분을 더한 값입니다. 정적 부분은 오프코드의 고정 가격이고, 옐로 페이퍼 부록 G의 수수료표는 이를 몇 개 등급으로 표현합니다. Gverylow 3 gas(ADD, SUB, MLOAD, MSTORE, PUSH 계열 등), Glow 5, Gmid 8, Ghigh 10, Gbase 2, Gjumpdest 1입니다.
동적 부분은 피연산자 규모와 상태 접근의 콜드·핫 여부에 달려 있습니다. 메모리 확장은 C_mem(a) = 3a + ⌊a² / 512⌋로 과금하고(옐로 페이퍼 식 (328), Gmemory = 3), a는 워드 수이며, 실제 차감액은 확장 전후의 차이입니다. 이 항목은 704바이트(22 워드) 이내에서는 거의 선형이고, 그 이후부터 이차 항이 작동합니다. 복사 계열 연산은 기본가에 워드당 3 gas를 더 받습니다(Gcopy). KECCAK256은 30 gas(Gkeccak256)에 워드당 6 gas(Gkeccak256word)를, LOG는 375 gas(Glog)에 topic마다 375 gas(Glogtopic)를 더하고 다시 바이트당 8 gas(Glogdata)를 받습니다. EXP는 10 gas(Gexp)에 지수 바이트당 50 gas(Gexpbyte)를 받습니다.
콜드·핫 접근은 EIP-2929(Berlin 업그레이드)가 정의합니다. 어떤 (주소, 슬롯) 쌍을 처음 접근하면 콜드 접근으로 SLOAD는 2100 gas를 받고, 같은 트랜잭션 안에서 다시 접근하면 핫 접근으로 100 gas를 받습니다. 계정 관련 접근의 콜드 가격은 2600 gas이며, CALL, CALLCODE, DELEGATECALL, STATICCALL, BALANCE와 EXTCODESIZE, EXTCODECOPY, EXTCODEHASH를 포괄합니다. 이 집합은 트랜잭션 범위이고, 범위가 롤백되면 집합도 함께 롤백됩니다.
| 연산(Berlin 업그레이드 이후 기준) | 콜드 접근 | 핫 접근 |
|---|---|---|
| SLOAD | 2100 | 100 |
| CALL 계열, BALANCE, EXT* | 2600 | 100 |
| SSTORE의 추가 콜드 접근 비용 | 2100 | 추가 없음 |
콜드·핫 메커니즘은 두 차례 DoS 공격이 남긴 교훈에서 직접 나왔습니다. EIP-150(Tangerine Whistle, 블록 2,463,000, 2016년 10월 18일)은 2016년 9월과 10월의 공격 이후 SLOAD를 50 gas에서 200으로, CALL을 40에서 700으로, SELFDESTRUCT를 0에서 5000으로 올렸습니다. EIP-2929의 동기는 2019년 논문 arXiv:1909.07220의 측정 하나를 인용합니다. 저자들의 하드웨어에서 이더리움 이력을 재생할 때 같은 악성 트랜잭션 묶음은 20~80초가 걸린 반면 일반 트랜잭션은 몇 밀리초밖에 걸리지 않았고, 이는 상태 읽기 계열 오프코드가 여전히 너무 싸게 책정되어 있음을 보여줍니다. 이는 일회성 측정이며 2019년의 하드웨어와 부하만 대표하므로, 지속적으로 추적한 기준으로 삼을 수 없습니다.
실행 중단의 세 가지 결말: 무효 트랜잭션, REVERT, out-of-gas
트랜잭션은 서로 다른 세 단계에서 끝날 수 있고, 롤백 범위와 수수료 처리가 각각 다릅니다.
첫째는 무효 트랜잭션입니다. nonce 불일치, 서명 오류, gas 선불금을 감당하지 못하는 잔액, 고유 비용보다 낮은 gas_limit 등이 여기 해당합니다. 이런 트랜잭션은 블록에 아예 들어가지 않고 gas도 소비하지 않습니다. 이는 오프체인 거부에 속하며 실행 중단과는 다른 문제입니다.
둘째는 REVERT로, revert 문이나 require 실패, 인라인 어셈블리의 revert가 트리거합니다. 현재 프레임의 상태 변경이 전부 롤백되고 남은 gas는 상위 계층으로 돌아가며, 이미 소비한 부분은 그대로 지불합니다. 환불 카운터도 해당 프레임에 진입하기 전으로 롤백됩니다. REVERT는 "이유가 있는 실패"이고 오류 데이터를 되돌려 줄 수 있어, 호출자가 실패 원인을 구분해야 하는 상황에 적합합니다.
셋째는 예외 중단(exceptional halt)으로, out-of-gas, 불법 오프코드, 스택 오버플로, 정적 호출에서의 상태 쓰기, initcode 초과 등이 포함됩니다. 상태는 마찬가지로 롤백되지만 현재 프레임에 남은 gas는 전부 소멸합니다. 예외가 최상위 프레임에서 발생하면 트랜잭션의 gas_used는 gas_limit과 같아지고 수수료는 전액 차감되며, 돌려받는 부분이 없습니다. 이것이 "OOG 이후 gas가 전부 소모된다"의 정확한 의미입니다. 현재 프레임의 남은 gas가 0이 되는 것이지, 체인 전체의 잔액과는 무관합니다.
// REVERT: 상태 롤백, 남은 gas는 반환, 소비한 부분은 지불
function guarded(uint256 x) external pure returns (uint256) {
require(x != 0, "zero");
return 1e18 / x;
}
// 예외 중단: 무한 루프가 out-of-gas를 유발, 현재 프레임의 남은 gas 전부 소멸
function oog() external pure {
while (true) {}
}
자식 호출의 실패가 부모 프레임까지 번지는지는 EIP-150(Tangerine Whistle)이 도입한 "1/64 보존" 규칙이 결정합니다. 자식 프레임을 호출할 때 부모 프레임은 자신의 남은 gas 중 최대 63/64(즉 gas - gas // 64)까지만 전달하고 최소 1/64를 남깁니다. CREATE와 CREATE2도 마찬가지로 63/64만 제공합니다. 따라서 자식 프레임의 OOG가 부모 프레임의 OOG로 이어지지 않고, 부모 프레임은 남겨 둔 gas로 실패를 붙잡고 계속 실행할 수 있습니다. 이 규칙은 2016년에 기존의 호출 깊이 제한을 대체했고, "깊이 폭탄"을 구조적 공격에서 순수한 gas 문제로 격하시켰습니다.
// 자식 호출에 gasleft()의 최대 63/64를 전달, 부모 프레임은 1/64 보존
(bool ok, ) = target.call{gas: gasleft()}("");
value를 가진 CALL에는 추가 항목이 두 가지 더 있습니다(옐로 페이퍼 부록 G). 0이 아닌 전송에는 Gcallvalue 9000 gas를 받고, 대상 계정이 존재하지 않으면 Gnewaccount 25000 gas를 더 받습니다. 피호출자는 2300 gas의 호출 보조금(Gcallstipend)을 받으며, 가장 단순한 수신 로직에 쓰입니다. EIP-2200(Istanbul 업그레이드, 블록 9,069,000, 2019년 12월 8일)은 gasleft가 2300 이하일 때 SSTORE가 곧바로 OOG로 실패하도록 정했는데, 바로 이 보조금 경로가 상태 쓰기에 악용되는 것을 막기 위해서입니다.
환불(refund)은 트랜잭션 실행이 끝난 뒤에 정산되고 실행 중에는 보이지 않습니다. EIP-3529(London 업그레이드, 블록 12,965,000, 2021년 8월 5일)는 0이 아닌 값을 0으로 바꿀 때의 환불을 15000에서 4800으로 내리고 SELFDESTRUCT 환불을 폐지했으며, 트랜잭션 한 건의 총 환불 상한을 gas_used // 5로 눌렀습니다. 환불은 실행 중에 쓸 수 없으므로, 컨트랙트가 트랜잭션 도중 필요한 gas를 환불로 메꾸는 것에 의존할 수 없습니다.
EIP-1559: base fee, tip과 실행 계층의 경계
EIP-1559(London 업그레이드, 블록 12,965,000, 2021년 8월 5일)는 트랜잭션 수수료를 두 구간으로 나눕니다. base fee는 프로토콜이 부모 블록의 gas_used와 목표값(gas_limit의 절반)으로 계산하고, 블록당 최대 12.5%까지 오르내릴 수 있으며 소각됩니다. priority fee(tip)는 더 이른 패키징을 노려 사용자가 검증인에게 주는 추가 단가입니다. 트랜잭션 서명에는 max_fee_per_gas와 max_priority_fee_per_gas 두 상한이 들어가고, 실제 적용 단가는 이렇습니다. priority fee는 max_priority_fee_per_gas와 (max_fee_per_gas - base fee) 중 작은 값이고, effective_gas_price는 priority fee 더하기 base fee입니다. 사용하지 않은 gas는 이 단가로 환급됩니다.
실행 계층의 경계도 분명히 해야 합니다. GASPRICE 오프코드는 EIP-1559 이후 effective_gas_price, 즉 발신자가 실제로 지불하는 단가를 반환합니다. 검증인이 실제로 받는 부분은 실행 환경에서 직접 읽을 수 없습니다. 따라서 GASPRICE로 "채굴자 수익"을 판단하던 옛 로직은 더 이상 성립하지 않습니다.
두 구간의 수수료는 서로 다른 질문에 답합니다. base fee는 블록에 들어가는 최소 문턱을, tip은 같은 블록 안에서의 우선순위를 결정합니다. 블록 공간의 총량은 변하지 않으며, 지속 사용량이 목표값을 넘으면 base fee가 블록마다 올라 수요를 밀어냅니다. 이는 대기열 메커니즘이지 생산 능력 확장과는 무관합니다. EIP-1559를 gas_used를 낮추는 방안으로 보는 것은 흔한 오해이며, 그것은 가격 형성 방식만 바꿉니다.
혼동하기 쉬운 경계가 하나 더 있습니다. blob 수수료는 실행 계층 gas에 속하지 않습니다. EIP-4844(Cancun 업그레이드, 블록 19,426,587, 2024년 3월 13일)는 blob 데이터에 독립적인 기본 수수료와 계량 단위(blob gas)를 도입했고, EIP-7516은 blob base fee를 반환하는 오프코드를 추가했습니다. 롤업의 데이터 게시 비용 논의는 blob 시장을 다루는 것이고, 컨트랙트 실행이 소비하는 gas와는 별개의 장부입니다.
DoS의 "과금 가능"이 정확한 가격 책정을 뜻하지는 않습니다
Gas의 핵심 보안 속성은 자원 점유를 비용으로 환산하는 것입니다. 한 블록을 스팸 트랜잭션으로 가득 채우려면 공격자가 그 블록의 전체 gas에 해당하는 수수료를 지불해야 하며, 이것이 "과금 가능"의 의미입니다. 수수료를 받지 않는 네트워크에 비해 공격의 한계 비용이 0에서 점유량에 비례하는 값으로 바뀝니다.
그러나 이는 가격이 실제 비용과 맞을 때만 유효합니다. 2016년 9월과 10월의 DoS 공격이 노린 것이 바로 과소 책정된 상태 읽기와 호출 계열 오프코드였고, 이것이 Tangerine Whistle 하드포크를 직접 촉발했습니다. 이후 EIP-1884(Istanbul 업그레이드, 블록 9,069,000, 2019년 12월 8일)는 SLOAD를 200에서 800으로, BALANCE와 EXTCODEHASH를 400에서 700으로 올렸고, EIP-2929는 다시 상태 접근을 콜드·핫 두 단계로 나누고 콜드 접근 가격을 크게 올렸습니다. 이유는 여전히 같은 패턴이 블록 하나의 처리 시간을 수십 초로 늘릴 수 있다는 것이었습니다. EIP-3860이 다루는 것은 initcode의 점프 대상 분석이며, 이전에는 이 작업량이 전혀 계량되지 않았습니다. 과금 규칙과 구현 비용 사이에는 구조적 지연이 있습니다. 클라이언트의 데이터베이스 레이아웃과 실행 엔진은 계속 최적화되는데, gas 상수는 다음 하드포크까지 기다려야 재평가됩니다.
환불 메커니즘은 반대 방향의 예를 제공합니다. 원래는 컨트랙트가 더 이상 쓰지 않는 상태를 정리하도록 장려하려는 것이었지만, 실제로는 상태 슬롯을 배터리처럼 써서 저렴할 때 gas를 비축하고 비쌀 때 방출하는 GasToken 같은 방식을 낳았고, 상태 팽창과 블록 gas 사용량의 추가적인 분산을 만들었습니다. EIP-3529가 환불을 줄이고 상한을 둔 것은 바로 이 통로를 닫기 위해서입니다.
메커니즘이 실패하는 조건은 몇 곳을 따로 짚어야 합니다. 가격 책정은 거버넌스의 산물이고, 상수는 보통 각 구현의 최악 사용 사례를 기준으로 고릅니다(EIP-3860도 자신의 2 gas/워드가 서로 다른 구현의 최악 상황 기준에서 나왔다고 명시합니다). 그런데 클라이언트마다 같은 연산 묶음에 걸리는 시간이 다르므로, 같은 gas 가격이 대응하는 실제 자원 비용은 일관되지 않습니다. 이는 정성적 판단입니다. EIP-2929가 가격 인상을 위해 제시한 정량적 근거는 2019년 특정 테스트 하드웨어에서의 일회성 측정이며, 지속적인 기준으로 삼을 수 없습니다. 정렬 시장의 가치는 tip만이 나르지 않습니다. MEV 경매와 클라이언트 전략도 패키징 순서에 영향을 주므로, tip이 높다는 것은 다음 블록에 들어갈 가능성을 높이는 여러 인센티브 중 하나일 뿐입니다. 블록 gas 상한 자체가 처리량과 검증 비용의 절충이며, 상한을 올리면 풀 노드의 하드웨어 문턱도 함께 올라갑니다.
이 절의 요점은 이것이 정기적으로 보정해야 하는 메커니즘이라는 점입니다. "gas 가격 책정은 믿을 만하다"와 "gas 가격 책정은 믿을 수 없다"는 모두 지나치게 강한 결론입니다. EIP-150, EIP-1884, EIP-2929, EIP-3860은 모두 보정 작업이었습니다. 다음 보정이 무엇으로 촉발될지는 결론이 아니라 추론만 가능합니다. 네 차례 보정의 직접적 계기는 모두 공개적으로 관측된 자원 증폭 공격이었으므로, 이를 근거로 이 글은 다음번에도 같은 종류의 사건일 가능성이 크다고 추론합니다. 이 추론에는 공개된 근거가 없으며, 상태 증가나 블록 용량 같은 다른 고려로 더 앞당겨 재평가될 가능성도 배제하지 않습니다.
경계와 불확실한 부분
인용한 기준은 옐로 페이퍼 부록 G의 수수료표와 식 (64), 식 (328)(내려받은 버전의 푸터에는 Shanghai 버전으로 표기됨), 그리고 EIP-150, EIP-1884, EIP-2028, EIP-2200, EIP-1559, EIP-2929, EIP-2930, EIP-3529, EIP-3860의 명세 텍스트입니다. 구체적인 숫자는 포크에 따라 달라지며, 본문에 표시한 포크와 블록 높이는 다음과 같습니다. Istanbul(2019년 12월 8일, 블록 9,069,000), Berlin(2021년 4월 15일, 블록 12,244,000), London(2021년 8월 5일, 블록 12,965,000), Shanghai(2023년 4월 12일, 블록 17,034,870), Cancun(2024년 3월 13일, 블록 19,426,587). EVM 호환 체인에서 gas를 논하기 전에는 그 체인이 어떤 포크를 활성화했는지 먼저 확인해야 하며, 과금 상수가 이더리움 메인넷과 다를 수 있습니다. Tangerine Whistle의 블록 2,463,000과 2016년 10월 18일도 ethereum.org의 업그레이드 역사에서 가져왔습니다.
"가격 지연"의 심각도에 대해서는 간접 증거만 제시할 수 있고 정량적 결론은 낼 수 없습니다. 공개 자료에는 "프로토콜 gas 상수와 실제 실행 시간의 비율"을 지속적으로 추적한 시계열이 없으므로, 지연이 커지는지 줄어드는지 판단할 수 없습니다. 이 점은 불확실 항목으로 남겨 두어야 하며, 이를 근거로 "악화되고 있다"거나 "이미 수렴했다"는 결론을 역산해서는 안 됩니다.
또한 수수료 시장의 동작은 MEV와 클라이언트 전략의 영향을 받습니다. 정렬 시장의 메커니즘 세부는 다루지 않았고, blob 수수료 시장과 실행 계층 gas를 같은 틀에서 비교하지도 않았습니다. 둘은 EIP-4844 이후 분리된 과금 체계입니다. 이 숫자들을 인용해 비용 모델을 만들 때는 기준과 버전을 먼저 확인해야 합니다.
출처
- EIP-1559, Fee market change for ETH 1.0 chain: https://eips.ethereum.org/EIPS/eip-1559
- EIP-2929, Gas cost increases for state access opcodes: https://eips.ethereum.org/EIPS/eip-2929
- EIP-3529, Reduction in refunds: https://eips.ethereum.org/EIPS/eip-3529
- EIP-150, Gas cost changes for IO-heavy operations: https://eips.ethereum.org/EIPS/eip-150
- EIP-1884, Repricing for trie-size-dependent opcodes: https://eips.ethereum.org/EIPS/eip-1884
- EIP-2028, Transaction data gas cost reduction: https://eips.ethereum.org/EIPS/eip-2028
- EIP-2200, Structured Definitions for Net Gas Metering: https://eips.ethereum.org/EIPS/eip-2200
- EIP-2930, Optional access lists: https://eips.ethereum.org/EIPS/eip-2930
- EIP-3860, Limit and meter initcode: https://eips.ethereum.org/EIPS/eip-3860
- EIP-4844, Shard Blob Transactions: https://eips.ethereum.org/EIPS/eip-4844
- EIP-7516, BLOBBASEFEE opcode: https://eips.ethereum.org/EIPS/eip-7516
- Ethereum Yellow Paper(부록 G 수수료표, 식 (64) 고유 비용, 식 (328) 메모리 과금 함수): https://ethereum.github.io/yellowpaper/paper.pdf
- ethereum.org 개발자 문서, Gas와 수수료: https://ethereum.org/en/developers/docs/gas/
- ethereum.org 오프코드 참고: https://ethereum.org/en/developers/docs/evm/opcodes/
- ethereum.org 네트워크 업그레이드 역사(각 포크의 블록 높이와 날짜): https://ethereum.org/en/history/
- arXiv:1909.07220, EIP-2929이 인용한 상태 접근 소요 시간 측정: https://arxiv.org/abs/1909.07220
더 읽기
이 글은 EVM 기초 시리즈에 속하며, 선행 글은 0.5 "헷갈리기 쉬운 세 가지 스토리지: Memory, Storage, Transient Storage"입니다.