[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-1-evm-ruhe-zhixing-daima-caozuoma-zhan-gas":3},{"article":4,"author":54},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":34,"related_articles":35},"d3000000-0000-0000-0000-000000000101","a0000000-0000-0000-0000-000000000032","Deep EVM #1：EVM如何执行你的代码——操作码、栈和Gas","deep-evm-1-evm-ruhe-zhixing-daima-caozuoma-zhan-gas","以太坊虚拟机的底层解析：操作码如何操纵栈、Gas计量如何工作，以及你的交易执行时到底发生了什么。","## EVM是一台栈机器\n\n以太坊虚拟机不像你笔记本电脑中的x86处理器。它没有寄存器。相反，它是一台**栈机器**——每次计算都从一个1024元素的栈中推入或弹出，每个元素是一个256位（32字节）的字。\n\n当你调用智能合约时，EVM接收合约的字节码——一个扁平的单字节操作码序列——并从字节0开始执行。没有函数表，没有ELF头，没有链接步骤。字节码就是程序。\n\n```\n\u002F\u002F Solidity:\n\u002F\u002F uint256 result = 2 + 3;\n\n\u002F\u002F 编译为字节码：\n\u002F\u002F PUSH1 0x02  PUSH1 0x03  ADD\n\n\u002F\u002F 栈追踪：\n\u002F\u002F []           -> PUSH1 0x02 -> [2]\n\u002F\u002F [2]          -> PUSH1 0x03 -> [2, 3]\n\u002F\u002F [2, 3]       -> ADD        -> [5]\n```\n\n每个操作码从栈顶消费其操作数并将结果推回。ADD操作码弹出两个值，将它们相加，并推入总和。这与基于寄存器的架构有根本性的不同。\n\n## 操作码分类\n\nEVM定义了大约140个操作码，按功能分组：\n\n### 算术和比较\n- **ADD、SUB、MUL、DIV、MOD** — 基本256位整数算术。全部消耗3 gas（G_verylow级别）。\n- **SDIV、SMOD** — 使用二进制补码的有符号除法和取模。\n- **ADDMOD、MULMOD** — 模运算：单个操作码中的`(a + b) % N`和`(a * b) % N`。对椭圆曲线运算至关重要，消耗8 gas。\n- **EXP** — 指数运算。消耗10 gas + 指数中每字节50 gas。\n- **LT、GT、SLT、SGT、EQ、ISZERO** — 比较操作码，推入1（真）或0（假）。\n\n### 位运算\n- **AND、OR、XOR、NOT** — 位逻辑，每个3 gas。\n- **SHL、SHR、SAR** — 左移、逻辑右移、算术右移（Constantinople升级中添加，EIP-145）。\n- **BYTE** — 从32字节字中提取单个字节。\n\n### 栈操作\n- **POP** — 丢弃栈顶元素。\n- **PUSH1到PUSH32** — 将1到32字节的立即数推入栈。\n- **DUP1到DUP16** — 复制第N个栈元素到栈顶。\n- **SWAP1到SWAP16** — 将栈顶元素与其下方第N个元素交换。\n\n### 环境和区块信息\n- **CALLER**（msg.sender）、**CALLVALUE**（msg.value）、**CALLDATALOAD**、**CALLDATASIZE**、**CALLDATACOPY** — 访问交易上下文。\n- **NUMBER**、**TIMESTAMP**、**BASEFEE**、**CHAINID** — 区块级信息。\n- **BALANCE**、**EXTCODESIZE**、**EXTCODECOPY** — 查询其他账户。\n\n## Gas计费表\n\n每个操作码都有gas成本。Gas服务于两个目的：防止无限循环（停机问题）和公平定价计算资源。\n\n| 级别 | Gas | 示例 |\n|------|-----|------|\n| 零 | 0 | STOP、RETURN、REVERT |\n| 基础 | 2 | ADDRESS、ORIGIN、CALLER |\n| 极低 | 3 | ADD、SUB、LT、GT、AND、OR、POP |\n| 低 | 5 | MUL、DIV、MOD |\n| 中 | 8 | ADDMOD、MULMOD、JUMP |\n| 高 | 10 | JUMPI |\n| 特殊 | 可变 | SLOAD、SSTORE、CALL、CREATE |\n\n## 冷访问与热访问（EIP-2929）\n\nEIP-2929（Berlin升级，2021年4月）引入了**访问列表**的概念——每笔交易中被访问过的地址和存储槽的集合。\n\n在交易中首次访问存储槽或外部地址时，它是\"冷\"的，需要支付额外gas。后续访问是\"热\"的，比较便宜。\n\n## 交易执行流程\n\n当你发送调用合约的交易时，完整的执行序列如下：\n\n1. **交易验证** — Nonce检查、余额检查、签名验证\n2. **固有Gas扣除** — 交易本身21000 gas，加上每非零calldata字节16 gas和每零字节4 gas\n3. **上下文设置** — EVM创建执行上下文：代码、calldata、调用者、值、剩余gas\n4. **程序计数器从0开始** — EVM读取位置0处的操作码并执行\n5. **顺序执行** — 每个操作码被执行，gas被扣除。JUMP和JUMPI允许非线性控制流\n6. **终止** — 执行以STOP、RETURN、REVERT或Gas耗尽结束\n7. **状态提交或回滚** — 成功时提交所有状态变更，回滚时撤销所有变更\n\n## 对MEV的实际影响\n\n如果你在构建MEV机器人，在操作码级别理解EVM不是可选的——而是竞争必备。节省的每一单位gas都是利润空间。\n\n## 总结\n\nEVM的简洁性体现了它的优雅：一台使用256位字的栈机器、扁平的字节码格式，以及为每个操作定价的Gas计量系统。理解这个基础——操作码、栈和Gas——是本系列后续内容的前提。","\u003Ch2 id=\"evm\">EVM是一台栈机器\u003C\u002Fh2>\n\u003Cp>以太坊虚拟机不像你笔记本电脑中的x86处理器。它没有寄存器。相反，它是一台\u003Cstrong>栈机器\u003C\u002Fstrong>——每次计算都从一个1024元素的栈中推入或弹出，每个元素是一个256位（32字节）的字。\u003C\u002Fp>\n\u003Cp>当你调用智能合约时，EVM接收合约的字节码——一个扁平的单字节操作码序列——并从字节0开始执行。没有函数表，没有ELF头，没有链接步骤。字节码就是程序。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F Solidity:\n\u002F\u002F uint256 result = 2 + 3;\n\n\u002F\u002F 编译为字节码：\n\u002F\u002F PUSH1 0x02  PUSH1 0x03  ADD\n\n\u002F\u002F 栈追踪：\n\u002F\u002F []           -&gt; PUSH1 0x02 -&gt; [2]\n\u002F\u002F [2]          -&gt; PUSH1 0x03 -&gt; [2, 3]\n\u002F\u002F [2, 3]       -&gt; ADD        -&gt; [5]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>每个操作码从栈顶消费其操作数并将结果推回。ADD操作码弹出两个值，将它们相加，并推入总和。这与基于寄存器的架构有根本性的不同。\u003C\u002Fp>\n\u003Ch2 id=\"\">操作码分类\u003C\u002Fh2>\n\u003Cp>EVM定义了大约140个操作码，按功能分组：\u003C\u002Fp>\n\u003Ch3>算术和比较\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>ADD、SUB、MUL、DIV、MOD\u003C\u002Fstrong> — 基本256位整数算术。全部消耗3 gas（G_verylow级别）。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SDIV、SMOD\u003C\u002Fstrong> — 使用二进制补码的有符号除法和取模。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ADDMOD、MULMOD\u003C\u002Fstrong> — 模运算：单个操作码中的\u003Ccode>(a + b) % N\u003C\u002Fcode>和\u003Ccode>(a * b) % N\u003C\u002Fcode>。对椭圆曲线运算至关重要，消耗8 gas。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>EXP\u003C\u002Fstrong> — 指数运算。消耗10 gas + 指数中每字节50 gas。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>LT、GT、SLT、SGT、EQ、ISZERO\u003C\u002Fstrong> — 比较操作码，推入1（真）或0（假）。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>位运算\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>AND、OR、XOR、NOT\u003C\u002Fstrong> — 位逻辑，每个3 gas。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SHL、SHR、SAR\u003C\u002Fstrong> — 左移、逻辑右移、算术右移（Constantinople升级中添加，EIP-145）。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>BYTE\u003C\u002Fstrong> — 从32字节字中提取单个字节。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>栈操作\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>POP\u003C\u002Fstrong> — 丢弃栈顶元素。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>PUSH1到PUSH32\u003C\u002Fstrong> — 将1到32字节的立即数推入栈。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>DUP1到DUP16\u003C\u002Fstrong> — 复制第N个栈元素到栈顶。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SWAP1到SWAP16\u003C\u002Fstrong> — 将栈顶元素与其下方第N个元素交换。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>环境和区块信息\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>CALLER\u003C\u002Fstrong>（msg.sender）、\u003Cstrong>CALLVALUE\u003C\u002Fstrong>（msg.value）、\u003Cstrong>CALLDATALOAD\u003C\u002Fstrong>、\u003Cstrong>CALLDATASIZE\u003C\u002Fstrong>、\u003Cstrong>CALLDATACOPY\u003C\u002Fstrong> — 访问交易上下文。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>NUMBER\u003C\u002Fstrong>、\u003Cstrong>TIMESTAMP\u003C\u002Fstrong>、\u003Cstrong>BASEFEE\u003C\u002Fstrong>、\u003Cstrong>CHAINID\u003C\u002Fstrong> — 区块级信息。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>BALANCE\u003C\u002Fstrong>、\u003Cstrong>EXTCODESIZE\u003C\u002Fstrong>、\u003Cstrong>EXTCODECOPY\u003C\u002Fstrong> — 查询其他账户。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"gas\">Gas计费表\u003C\u002Fh2>\n\u003Cp>每个操作码都有gas成本。Gas服务于两个目的：防止无限循环（停机问题）和公平定价计算资源。\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>级别\u003C\u002Fth>\u003Cth>Gas\u003C\u002Fth>\u003Cth>示例\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>零\u003C\u002Ftd>\u003Ctd>0\u003C\u002Ftd>\u003Ctd>STOP、RETURN、REVERT\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>基础\u003C\u002Ftd>\u003Ctd>2\u003C\u002Ftd>\u003Ctd>ADDRESS、ORIGIN、CALLER\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>极低\u003C\u002Ftd>\u003Ctd>3\u003C\u002Ftd>\u003Ctd>ADD、SUB、LT、GT、AND、OR、POP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>低\u003C\u002Ftd>\u003Ctd>5\u003C\u002Ftd>\u003Ctd>MUL、DIV、MOD\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>中\u003C\u002Ftd>\u003Ctd>8\u003C\u002Ftd>\u003Ctd>ADDMOD、MULMOD、JUMP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>高\u003C\u002Ftd>\u003Ctd>10\u003C\u002Ftd>\u003Ctd>JUMPI\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>特殊\u003C\u002Ftd>\u003Ctd>可变\u003C\u002Ftd>\u003Ctd>SLOAD、SSTORE、CALL、CREATE\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"eip-2929\">冷访问与热访问（EIP-2929）\u003C\u002Fh2>\n\u003Cp>EIP-2929（Berlin升级，2021年4月）引入了\u003Cstrong>访问列表\u003C\u002Fstrong>的概念——每笔交易中被访问过的地址和存储槽的集合。\u003C\u002Fp>\n\u003Cp>在交易中首次访问存储槽或外部地址时，它是“冷“的，需要支付额外gas。后续访问是“热“的，比较便宜。\u003C\u002Fp>\n\u003Ch2 id=\"\">交易执行流程\u003C\u002Fh2>\n\u003Cp>当你发送调用合约的交易时，完整的执行序列如下：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>交易验证\u003C\u002Fstrong> — Nonce检查、余额检查、签名验证\u003C\u002Fli>\n\u003Cli>\u003Cstrong>固有Gas扣除\u003C\u002Fstrong> — 交易本身21000 gas，加上每非零calldata字节16 gas和每零字节4 gas\u003C\u002Fli>\n\u003Cli>\u003Cstrong>上下文设置\u003C\u002Fstrong> — EVM创建执行上下文：代码、calldata、调用者、值、剩余gas\u003C\u002Fli>\n\u003Cli>\u003Cstrong>程序计数器从0开始\u003C\u002Fstrong> — EVM读取位置0处的操作码并执行\u003C\u002Fli>\n\u003Cli>\u003Cstrong>顺序执行\u003C\u002Fstrong> — 每个操作码被执行，gas被扣除。JUMP和JUMPI允许非线性控制流\u003C\u002Fli>\n\u003Cli>\u003Cstrong>终止\u003C\u002Fstrong> — 执行以STOP、RETURN、REVERT或Gas耗尽结束\u003C\u002Fli>\n\u003Cli>\u003Cstrong>状态提交或回滚\u003C\u002Fstrong> — 成功时提交所有状态变更，回滚时撤销所有变更\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"mev\">对MEV的实际影响\u003C\u002Fh2>\n\u003Cp>如果你在构建MEV机器人，在操作码级别理解EVM不是可选的——而是竞争必备。节省的每一单位gas都是利润空间。\u003C\u002Fp>\n\u003Ch2 id=\"\">总结\u003C\u002Fh2>\n\u003Cp>EVM的简洁性体现了它的优雅：一台使用256位字的栈机器、扁平的字节码格式，以及为每个操作定价的Gas计量系统。理解这个基础——操作码、栈和Gas——是本系列后续内容的前提。\u003C\u002Fp>\n","zh","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:25.830445Z","以太坊虚拟机底层解析：操作码、栈操作、Gas计量以及冷热访问详解。","EVM操作码",null,"index, follow",[21,26,30],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity","区块链",[36,42,48],{"id":37,"title":38,"slug":39,"excerpt":40,"locale":12,"category_name":34,"published_at":41},"d0000000-0000-0000-0000-000000000599","Ethereum互操作层：55+个L2如何成为一条链","ethereum-hucaozuoceng-55-l2-chengwei-yitiao-lian","Ethereum有55+个Layer 2 rollup，碎片化了流动性和用户体验。Ethereum互操作层 — 结合跨rollup消息传递、共享排序器和based rollup — 旨在将它们统一为一个可组合的网络。","2026-03-28T10:44:44.539584Z",{"id":43,"title":44,"slug":45,"excerpt":46,"locale":12,"category_name":34,"published_at":47},"d0000000-0000-0000-0000-000000000598","ZK证明超越Rollups：Ethereum上的可验证AI推理","zk-zhengming-chaoyue-rollups-ethereum-keyanzheng-ai-tuili","零知识证明不再仅仅是扩容工具。在2026年，zkML实现了链上可验证的AI推理，ZK协处理器将繁重计算移至链下并在链上验证，而SP1和Jolt等新证明系统使其变得实用。","2026-03-28T10:44:44.534954Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":34,"published_at":53},"d0000000-0000-0000-0000-000000000575","EIP-7702实战：Pectra之后构建智能账户流程","eip-7702-shizhan-pectra-zhihou-goujian-zhineng-zhanghu-liucheng","EIP-7702允许任何Ethereum EOA在单笔交易中临时充当智能合约。以下是如何使用新的账户抽象原语实现批量交易、gas赞助和社交恢复。","2026-03-28T10:44:42.997040Z",{"id":13,"name":55,"slug":56,"bio":57,"photo_url":18,"linkedin":18,"role":58,"created_at":59,"updated_at":59},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]