区块链 - 以太坊虚拟机
以太坊虚拟机 (EVM) 是一个简单的基于堆栈的执行环境,可处理字节码指令以将系统状态从一种状态转换为另一种状态。
虽然 EVM 是图灵完备的,但其操作受到执行指令所需的 gas 的限制。此限制可防止发生可能导致拒绝服务攻击的无限循环。此外,EVM 还配备了异常处理机制,以解决潜在问题,例如 gas 不足或指令无效,导致机器停止并向执行代理返回错误。
以太坊虚拟机结构
以太坊虚拟机 (EVM) 使用256 位字长,其堆栈可容纳多达 1,024 个元素,按照后进先出 (LIFO)原则运行。它作为一个完全隔离和沙盒化的运行时环境运行。在 EVM 中执行的代码被限制访问外部资源,包括网络或文件系统。
这种设计增强了安全性,确保了确定性执行,并允许在以太坊区块链上执行不受信任的代码(任何用户都可以运行的代码)。如前所述,EVM 采用基于堆栈的架构。它本质上是大端的,并使用 256 位宽的字,这有助于 Keccak 256 位哈希和 椭圆曲线加密 (ECC) 计算。
存储类型
合约和以太坊虚拟机 (EVM) 使用三种主要存储类型 −
内存
第一种类型称为内存或易失性内存,其功能是字寻址字节数组。合约完成执行后,内存将被重置。这类似于传统计算中的 RAM。写入操作可以以 8 位或 256 位执行,而读取操作则限制为 256 位字。
存储
第二种类型称为存储,它作为键值存储运行,并永久记录在区块链上。键和值的大小均为 256 位。它可以与传统系统中的硬盘存储进行比较。
堆栈
EVM 用作基于堆栈的机器,在称为堆栈的数据区域内执行所有计算。内存中保存的所有值也存储在堆栈中。堆栈的最大深度为 1024 个元素,可容纳 256 位字长。
![以太坊虚拟机中的存储类型](/blockchain/images/types_of_storage_in_ethereum_virtual_machine.jpg)
执行环境
执行环境需要几个基本组件才能有效运行代码。这些关键参数由执行代理(例如交易)提供。
以下元素是必需的 −
- 当前系统状态。
- 可用于执行的 gas。
- 拥有正在执行的代码的帐户的地址。
- 交易发送者的地址,作为此执行的来源,可能与发送者的地址不同。
- 与发起交易相关的 gas 价格。
- 输入数据或交易数据,取决于执行代理类型。这表示为字节数组。
- 发起代码执行或交易发送者的帐户的地址。
- 以 Wei 表示的值或交易值。如果执行代理是交易,则这代表交易值。
- 要执行的代码,以字节数组的形式提供,迭代器函数在每个执行周期中检索该数组。
- 当前块的块头。
- 当前正在执行的消息调用或合约创建交易(CALL、CREATE 或 CREATE2)的数量。
- 修改状态的授权。
![执行环境](/blockchain/images/execution_environment.jpg)
机器状态
机器状态的内部维护发生,并在 EVM 的每个执行周期后进行更新。 迭代器函数(将在后续章节中详细介绍)在 EVM 中运行,以从状态机的单个循环中产生结果。
机器状态表示为包含以下组件的元组 −
- 可用 gas
- 程序计数器,一个最大为 256 的正整数
- 内存内容,表示为一系列零,总计 2256
- 内存中活动字数,从位置 0 开始连续跟踪
- 堆栈的内容。
迭代器函数
迭代器函数执行几个基本任务,这些任务对于确定机器的下一个状态和整体世界状态都至关重要。这些任务包括以下内容 −
- 它从包含执行环境中的机器代码的字节数组中检索下一个指令。
- 它使用 PUSH 或 POP 操作适当地从堆栈中添加或删除项目。
- 根据与指令或操作码相关的 gas 成本调整 gas 消耗,并且 程序计数器 (PC) 相应增加。
此外,当 EVM 在执行周期中遇到 STOP、SUICIDE 或 RETURN 操作码时,它在正常情况下能够停止。