以太坊虚拟机 (EVM)

以太坊虚拟机 以太坊虚拟机 (EVM) 是一个去中心化的虚拟环境,它能够在所有以太坊节点上以一致且安全的方式执行代码。节点运行 EVM 来执行智能合约,使用“衡量操作所需的计算量,确保高效的资源分配和网络安全。

硬件需求

要理解EVM,需要对常见的计算机科学术语有一定的了解,例如字节、内存和堆栈。此外,熟悉密码学和区块链的概念,例如哈希函数和默克尔树,也会有所帮助。

从账本到状态机

像比特币这样的区块链通常被描述为“分布式账本”,它维护着一份活动记录,并遵循一套规则来控制修改。例如,一个比特币地址花费的比特币数量不能超过其收到的比特币数量。这些规则是比特币以及许多其他区块链上所有交易的基础。

虽然以太坊拥有自己的原生加密货币(以太币),规则也类似,但它还支持一项更强大的功能: 聪明的合同为了更好地理解这一点,可以将以太坊描述为一个分布式状态机。以太坊的状态是一个庞大的数据结构,它不仅保存所有账户和余额,还包含一个机器状态,该状态可以根据预定义的规则在区块之间发生变化,并执行任意机器代码。EVM(以太坊虚拟机)定义了这些状态变化的规则。

EVM和以太坊有什么区别?

Ethereum 以太坊是一个平台,它允许用户在去中心化的计算机网络上创建和运行应用程序。它拥有自己的数字货币,称为以太币 (ETH),用于在网络上进行支付。您可以将以太坊想象成一台巨大的共享计算机,任何人都可以用它来构建和运行自己的应用程序,而无需中央机构的控制。

以太坊虚拟机 它就像这台巨型计算机内部的引擎。它确保网络中的所有应用程序和智能合约(自动协议)在每台计算机上以相同的方式运行。为了保持公平和高效,EVM 使用一种名为“gas”的系统来衡量每个任务所需的计算能力,从而确保资源不会被浪费。

简单来说,以太坊是一个完整的平台,它允许你构建和使用去中心化应用程序和合约,而 以太坊虚拟机 它是运行这些应用程序和合约的平台的一部分,确保网络中所有计算机都能流畅、一致地运行。这就是 EVM 和以太坊的区别。

以太坊状态转换函数

EVM 的行为类似于数学函数:给定一个输入,它会产生一个确定性的输出。这可以正式地描述为一个状态转移函数:

\[ Y(S, T) = S' \]

给定一个旧的有效状态 \( S \) 和一组新的有效交易 \( T \),以太坊状态转换函数 \( Y(S, T) \) 产生一个新的有效输出状态 \( S' \)。

在以太坊中,状态是一个庞大的数据结构,称为改进的 Merkle Patricia Trie,它通过哈希值将所有账户链接起来,并将它们简化为存储在区块链上的单个根哈希值。

交易

交易是账户发出的经过加密签名的指令,分为两类:一类是消息调用,另一类是合约创建。合约创建会生成一个新的合约账户,其中包含已编译的智能合约字节码。当另一个账户向该合约发出消息调用时,就会执行其字节码。

电子投票机使用说明

EVM 以栈式机器的形式运行,深度为 1024 项,每项为 256 位字,选择此深度是为了兼容 256 位加密技术(例如 Keccak-256 哈希或 secp256k1 签名)。在执行过程中,EVM 维护一个临时内存(一个字寻址的字节数组),该内存不会在交易之间持久存在。合约拥有一个与账户关联的 Merkle Patricia 存储树(一个字寻址的字数组),该存储树也是全局状态的一部分。

编译后的智能合约字节码执行如下: 以太坊虚拟机 操作码,执行标准堆栈操作,如 XOR、AND、ADD、SUB 等,以及区块链特定操作,如 ADDRESS、BALANCE 和 BLOCKHASH。

EVM实施

所有 EVM 实现都必须遵循以太坊黄皮书规范。在以太坊的发展历程中,EVM 经历了多次修订,最终形成了多种编程语言的实现,其中包括:

  • Py-EVM(Python)
  • evmone(C++)
  • ethereumjs-vm(JavaScript)
  • eEVM(C++)
  • revm(Rust)

这些实现措施确保 EVM 在不同的平台上保持一致性和安全性。