:2026-03-07 2:51 点击:4
在前两篇笔记中,我们梳理了以太坊的状态世界模型和账户系统,了解了以太坊如何像一个分布式的全球计算机,维护着一个不断变化的共享状态数据库,这个“全球计算机”究竟是如何执行指令、改变状态的呢?答案就在于以太坊的执行引擎——以太坊虚拟机,本篇笔记,我们将深入黄皮书(Yellow Paper)的第9章,详细解析EVM的执行模型,这是理解以太坊智能合约运行机制的核心。
从本质上讲,EVM是一个基于栈的、图灵完备的虚拟机,这个描述包含了几个关键概念:
EVM的执行模型,就是一条指令接一条指令地执行,每一条指令都会根据当前的状态和栈的内容,改变栈的状态、内存的状态,并最终可能改变以太坊的全球状态。
在深入指令集之前,我们必须理解贯穿整个EVM执行的灵魂——Gas。
Gas是以太坊网络中衡量计算、存储和带宽资源消耗的单位,每一笔交易发送时,发送者都需要设定一个Gas Limit( gas限制)和愿意支付的Gas Price( gas价格),Gas Limit是交易愿意消耗的最大Gas数量,而Gas Price是每个Gas单位的价格。
执行过程如下:
Gas Limit * Gas Price 的以太币,作为“预付款”。Gas Limit - 已消耗Gas)会按原价退还给发送者,成功执行的操作费(已消耗Gas * Gas Price)会作为矿工费(手续费)支付给打包该交易的矿工。Gas机制确保了网络的安全性,防止了恶意合约(如无限循环)对网络造成拒绝服务攻击。
EVM的执行并非在真空中进行,而是在一个精心设计的执行环境中,黄皮书用结构体 ExecutionEnvironment 定义了这个上下文,它包含了执行当前代码所需的所有信息,主要包括:
caller:调用者的地址,即发起交易的账户地址。value:随交易发送的以太币数量(以Wei为单位)。address:当前正在执行的合约的地址。code:当前正在执行的合约的字节码。data:伴随交易或调用传入的数据(Calldata)。gasprice:交易设定的Gas Price。origin:交易的原始发起者地址,用于权限控制。block相关字段:如当前区块号、时间戳、难度、Gas Limit、Coinbase(矿工地址)等,这使得智能合约能够与区块链的当前状态进行交互。这个执行环境为每一条指令的执行提供了必要的上下文,是连接全局状态和局部计算的桥梁。
黄皮书中最核心、最令人望而生畏的部分之一,就是状态转换函数 S,它是一个数学化的函数,形式化地定义了从一个状态 到下一个状态 的完整过程。
σ' = S(σ, t)
t 代表一笔交易,这个函数的内部逻辑,就是EVM的执行模型,我们可以将其分解为以下几个步骤(黄皮书中的算法96):
t 中提取 caller, value, data, gasLimit 等信息,验证发送者账户的 nonce 和余额。ExecutionEnvironment 结构体。code 的起始位置开始,逐条执行指令:ADD指令会从栈中弹出两个值,相加后压回栈;SLOAD指令会从存储中读取一个值并压入栈;CALL指令则会发起一次子调用。CALL, DELEGATECALL, CREATE 等指令时,EVM会递归地创建一个新的执行环境,开始一次新的、嵌套的执行过程,这构成了以太坊强大的组合能力。这个严谨的函数定义,确保了以太坊的状态转换是确定性和可验证的,任何一个节点,只要输入相同的初始状态和交易序列,都会通过执行这个函数得到完全相同的最终状态。
通过学习黄皮书对EVM执行模型的描述,我们可以清晰地看到以太坊的设计哲学:
S
理解EVM的执行模型,是从“会用”智能合约到“看懂”智能合约的关键一步,它不仅让我们明白一笔交易背后究竟发生了什么,也为我们未来深入研究智能合约安全、优化Gas消耗以及开发区块链上层应用打下了坚实的理论基础,下一章,我们将继续探索EVM的指令集,看看这些强大的原子操作是如何组合成复杂应用的。
本文由用户投稿上传,若侵权请提供版权资料并联系删除!