以太坊虚拟机 (EVM)
上次修改时间: @EffectChen(opens in a new tab), 2024年6月21日
以太坊虚拟机 (EVM) 是一个去中心化虚拟环境,它在所有以太坊节点上一种安全一致地方式执行代码。 节点运行以太坊虚拟机,以执行智能合约,利用“燃料”度量执行操作所需的计算工作,从而确保高效的资源分配和网络安全性。
前提条件
对计算机科学中常见术语的基本了解,如字节(opens in a new tab)、内存(opens in a new tab)和堆栈(opens in a new tab)是理解 EVM 的前提。 熟悉哈希函数(opens in a new tab)和默克尔树(opens in a new tab)等密码学/区块链概念也会很有帮助。
从账本到状态机
通常使用“分布式账本”的类比来描述像比特币这样的区块链,它使用密码学的基本工具来实现去中心化的货币。 账本保存着活动记录,而活动必须遵守一套规则,这些规则限制用户在修改账本时可以做什么和不可以做什么。 例如,比特币地址不能花费比之前收到的更多的比特币。 这些规则是比特币和许多其他区块链上所有交易的基础。
虽然以太坊有自己的本机加密货币 (ETH),遵循几乎完全相同的直观规则,但它也支持更强大的功能:智能合约。 对于此更复杂的功能,需要一个更复杂的类比。 以太坊不是分布式账本,而是分布式状态机器(opens in a new tab)。 以太坊的状态是一个大型数据结构,它不仅保存所有帐户和余额,而且还保存一个机器状态,它可以根据预定义的一组规则在不同的区块之间进行更改,并且可以执行任意的机器代码。 在区块中更改状态的具体规则由 EVM 定义。
示意图节选自以太坊虚拟机图解(opens in a new tab)
以太坊状态转换函数
EVM 的行为就像一个数学函数:在给定输入的情况下,它会产生确定性的输出。 因此,将以太坊更正式地描述为具有状态转换函数非常有帮助:
1Y(S, T)= S'
给定一个旧的有效状态 (S)
> 和一组新的有效交易 (T)
,以太坊状态转换函数 Y(S,T)
产生新的有效输出状态 S'
状态
在以太坊环境中,状态是一种称为改进版默克尔帕特里夏树的巨大数据结构,它保存所有通过哈希关联在一起的帐户并可回溯到存储在区块链上的单个根哈希。
交易
交易是来自帐户的密码学签名指令。 交易分为两种:一种是消息调用交易,另一种是合约创建交易。
合约创建交易会创建一个新的合约帐户,其中包含已编译的 智能合约 字节码。 每当另一个帐户对该合约进行消息调用时,它都会执行其字节码。
EVM 说明
EVM 作为一个堆栈机(opens in a new tab)运行,其栈的深度为 1024 个项。 每个项目都是 256 位字,为了便于使用,选择了 256 位加密技术(如 Keccak-256 哈希或 secp256k1 签名)。
在执行期间,EVM 会维护一个瞬态内存(作为字可寻址的字节数组),该内存不会在交易之间持久存在。
然而,合约确实包含一个 Merkle Patricia 存储 trie(作为可字寻址的字数组),该 trie 与帐户和部分全局状态关联。
已编译的智能合约字节码作为许多 EVM opcodes执行,它们执行标准的堆栈操作,例如 XOR
、AND
、ADD
、SUB
等。 EVM 还实现了一些区块链特定的堆栈操作,如 ADDRESS
、BALANCE
、BLOCKHASH
等。
示意图节选自以太坊虚拟机图解(opens in a new tab)
EVM 实现
EVM 的所有实现都必须遵守以太坊黄皮书中描述的规范。
在以太坊九年的历程中,以太坊虚拟机经过了几次修订,并且存在不同编程语言实现的以太坊虚拟机版本。
以太坊执行客户端都包含一个以太坊虚拟机实现。 此外,还有多个独立的实现,包括:
- Py-EVM(opens in a new tab) - Python
- evmone(opens in a new tab) - C++
- ethereumjs-vm(opens in a new tab) - JavaScript
- revm(opens in a new tab) - Rust
延伸阅读
- 以太坊黄皮书(opens in a new tab)
- Jellopaper aka KEVM:K 中的 EVM 语法(opens in a new tab)
- The Beigepaper(opens in a new tab)
- 以太坊虚拟机操作码(opens in a new tab)
- 以太坊虚拟机操作码交互参考(opens in a new tab)
- Solidity 文档的简短介绍(opens in a new tab)
- 精通以太坊 - 以太坊虚拟机(opens in a new tab)