区块链 - 以太坊虚拟机

以太坊虚拟机 (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 位字长。

以太坊虚拟机中的存储类型

执行环境

执行环境需要几个基本组件才能有效运行代码。这些关键参数由执行代理(例如交易)提供。

以下元素是必需的 −

  • 当前系统状态。
  • 可用于执行的 gas。
  • 拥有正在执行的代码的帐户的地址。
  • 交易发送者的地址,作为此执行的来源,可能与发送者的地址不同。
  • 与发起交易相关的 gas 价格。
  • 输入数据或交易数据,取决于执行代理类型。这表示为字节数组。
  • 发起代码执行或交易发送者的帐户的地址。
  • 以 Wei 表示的值或交易值。如果执行代理是交易,则这代表交易值。
  • 要执行的代码,以字节数组的形式提供,迭代器函数在每个执行周期中检索该数组。
  • 当前块的块头。
  • 当前正在执行的消息调用或合约创建交易(CALL、CREATE 或 CREATE2)的数量。
  • 修改状态的授权。
执行环境

机器状态

机器状态的内部维护发生,并在 EVM 的每个执行周期后进行更新。 迭代器函数(将在后续章节中详细介绍)在 EVM 中运行,以从状态机的单个循环中产生结果。

机器状态表示为包含以下组件的元组 −

  • 可用 gas
  • 程序计数器,一个最大为 256 的正整数
  • 内存内容,表示为一系列零,总计 2256
  • 内存中活动字数,从位置 0 开始连续跟踪
  • 堆栈的内容。

迭代器函数

迭代器函数执行几个基本任务,这些任务对于确定机器的下一个状态和整体世界状态都至关重要。这些任务包括以下内容 −

  • 它从包含执行环境中的机器代码的字节数组中检索下一个指令。
  • 它使用 PUSH 或 POP 操作适当地从堆栈中添加或删除项目。
  • 根据与指令或操作码相关的 gas 成本调整 gas 消耗,并且 程序计数器 (PC) 相应增加。

此外,当 EVM 在执行周期中遇到 STOP、SUICIDE 或 RETURN 操作码时,它在正常情况下能够停止。