以太机虚拟机 (EVM)
EVM 的物理实例不能像指向云端或海浪那样描述,但它确实作为一个单一的实体 存在 ,由数以千计运行以太坊客户端的电脑连接在一起构成。
以太坊协议本身的存在仅仅是为了保持这种特殊状态机的连续、不间断和永久的运行。 这是所有以太坊帐户和智能合约赖以存在的环境。 在链中任何给定的区块上,以太坊只有一个“规范”状态,而 EVM 定义了从一个区块计算产生下一个区块新的有效状态的规则。
前置要求
对计算机科学中常见术语的基本了解,如字节、内存和堆栈是理解 EVM 所必需的。 熟悉诸如 哈希函数、工作量证明和 Merkle 树等密码学/区块链概念对理解也很有帮助。
从账本到状态机
通常使用“分布式账簿”的类比来描述像比特币这样的区块链,它使用密码学的基本工具来实现去中心化的货币。 加密货币的行为类似于“正常”货币,这是因为有规则支配着人们可以做什么和不可以做什么来修改账簿。 例如,比特币地址不能花费比之前收到的更多的比特币。 这些规则是比特币和许多其他区块链上所有交易的基础。
虽然以太坊有自己的本机加密货币(Ether),遵循几乎完全相同的直观规则,但它也支持更强大的功能:智能合约。 对于此更复杂的功能,需要一个更复杂的类比。 以太坊不是分布式账本,而是分布式状态机。 以太坊的状态是一个大型数据结构,它不仅保存所有帐户和余额,而且还保存一个机器状态,它可以根据预定义的一组规则在不同的区块之间进行更改,并且可以执行任意的机器代码。 在区块中更改状态的具体规则由 EVM 定义。
以太坊状态转换函数
EVM 的行为就像一个数学函数:在给定输入的情况下,它会产生确定性的输出。 因此,将以太坊更正式地描述为具有状态转换函数非常有帮助:
1Y(S, T)= S'2
给定一个旧的有效状态 (S)
> 和一组新的有效交易 (T)
,以太坊状态转换函数 Y(S,T)
产生新的有效输出状态 S'
状态
在以太坊的上下文中,状态是一个巨大的数据结构,称为调整后的 Merkle Patricia Trie,使所有帐户通过哈希链接,并可回溯到存储在区块链上的单个根哈希。
交易
交易是来自帐户的密码学签名指令。 交易分为两种:一种是消息调用交易,另一种是合约创建交易。
合约创建交易会创建一个新的合约帐户,其中包含已编译的 智能合约 字节码。 每当另一个帐户对该合约进行消息调用时,它都会执行其字节码。
EVM 说明
EVM 作为一个[堆栈机](https://en. wikipedia. org/wiki/Stack_machine)运行,其栈的深度为 1024 个项。 每一项都是 256 比特的 word,选择如此是为了与 SHA-3-256 哈希方案最大限度地兼容。
在执行期间,EVM 会维护一个临时的内存(作为 word 寻址的字节数组),该内存不会在交易之间持久存在。
然而,合约确实包含一个 Merkle Patricia storage trie(作为按 word 编址的 word 数组),该 trie 与帐户和部分全局状态相关联。
已编译的智能合约字节码作为许多 EVM opcodes 执行,它们执行标准的堆栈操作,例如 XOR
、 AND
、 ADD
、SUB
等。 EVM 还实现了一些区块链特定的堆栈操作,如 ADDRESS
、BALANCE
、SHA3
、BLOCKHASH
,等等。
EVM 实现
EVM 的所有实现都必须遵守以太坊黄皮书中描述的规范。
在以太坊的 5 年历史中,EVM 经历了几次修订,并且以各种编程语言完成了 EVM 的多种实现。
所有以太坊客户端都包含一个 EVM 实现。 此外,还有多个独立的实现方法,包括:
- Py-EVM - Python
- evmone - C++
- ethereumjs-vm - JavaScript
- eEVM - C++
- Hyperledger Burrow - Go