# Ethereum Virtual Machine (EVM)

> 以太坊虚拟机 (EVM) 是一个去中心化的计算引擎，在以太坊网络上执行智能合约，强制代码一致性并阻止...

- Canonical URL: https://iq.wiki/zh/wiki/ethereum-virtual-machine-evm
- Categories: Projects & Protocols
- Tags: Layer 1, Infrastructure
- Created: 2024-05-15T02:53:04.141Z
- Last updated: 2024-10-28T22:20:23.834Z
- Source: IQ.wiki — the world's largest blockchain and crypto encyclopedia (https://iq.wiki)

---

**以太坊虚拟机 (EVM)** 是一个去中心化的计算引擎，它在 [以太坊](https://iq.wiki/wiki/ethereum) 网络上执行 [智能合约](https://iq.wiki/wiki/smart-contract)。EVM 通过强制执行规则并在整个网络中保持一致性，确保智能合约中的代码按照预期运行。[\[1\]](#cite-id-jvpmsnbuvni)[\[2\]](#cite-id-q455fo6g4bm)


## 概述

正如其名称所示，虚拟机 (VM) 与实际计算机的虚拟化相关。[EVM](https://iq.wiki/wiki/ethereum) 区块链旨在成为基于 [以太坊](https://iq.wiki/wiki/ethereum) 的智能合约的基础设施。最初，它的构建是为了避免对加密货币领域构成威胁的 [拒绝服务](https://iq.wiki/wiki/distributed-denial-of-service-ddos-attack) 攻击。[\[3\]](#cite-id-hxyjwg7mr9f)

以太坊虚拟机 (EVM) 由 [Gavin Wood](https://iq.wiki/wiki/gavin-wood) 在他从事 [以太坊](https://iq.wiki/wiki/ethereum) 工作期间设计。EVM 使用 C++ 编写并使用 LLVM 项目编译器，是一种特殊的[状态机](https://en.wikipedia.org/wiki/Finite-state_machine)，它持续运行，其不可变的操作决定了以太坊 [区块链](https://iq.wiki/wiki/blockchain) 中每个区块的状态。[\[1\]](#cite-id-jvpmsnbuvni)

[以太坊虚拟机 (EVM)](https://iq.wiki/wiki/ethereum) 是 [以太坊](https://iq.wiki/wiki/ethereum) 网络的基本组成部分。EVM 是使以太坊不仅仅像 [比特币](https://iq.wiki/wiki/bitcoin) 这样的 [分布式账本](https://iq.wiki/wiki/distributed-ledger-technology-dlt) 的核心功能。EVM 构成了以太坊区块链的支柱，为开发人员提供了一个运行时环境，可以使用 Solidity、Vyper、Python 和 Yul 等语言创建 [智能合约](https://iq.wiki/wiki/smart-contract) 和 [DApp（去中心化应用程序）](https://iq.wiki/wiki/decentralized-application)。[\[1\]](#cite-id-jvpmsnbuvni)[\[4\]](#cite-id-exl5c8aoap)


EVM 可以访问网络中的所有 [节点](https://iq.wiki/wiki/node)，处理智能合约的执行，并处理以太坊区块链上的所有交易，而没有报告任何重大停机时间。[\[1\]](#cite-id-jvpmsnbuvni)

## EVM 的要素

### 操作码

EVM 操作码协助 EVM 执行 [智能合约](https://iq.wiki/wiki/smart-contract) 或交易的特定任务。为了提高效率，EVM 将其字节码转换为操作码，其中每个操作码在字节码中分配一个字节。每个操作码操作都需要 EVM 使用一定量的 gas。[\[4\]](#cite-id-exl5c8aoap)


### 智能合约

每次执行 [智能合约](https://iq.wiki/wiki/smart-contract) 时，EVM 都会计算以太坊网络的新状态，更新账户余额、智能合约的数据存储以及账户和合约级别的交易。所有这些功能都存在于被调用的状态中。EVM 是这些智能合约可以存在并相互交互的环境，EVM 结合了连接到 [以太坊](https://iq.wiki/wiki/ethereum) 网络的数千个 CPU 的资源。EVM 无法直接执行 Solidity，因此代码被编译为称为操作码的机器指令，并且需要 gas 才能使用操作码。[\[4\]](#cite-id-exl5c8aoap)[\[8\]](#cite-id-s2c82ovcl8)

### Gas

[Gas](https://iq.wiki/wiki/gas) 的主要目标是充当以太坊网络中每个节点完成的智能合约操作的计算费用。计算费用可防止攻击者部署许多复杂的合约，这些合约需要很长的计算时间才能停止网络。这些费用使得这种类型的 [DDoS（分布式拒绝服务](https://iq.wiki/wiki/distributed-denial-of-service-ddos-attack)）攻击的执行成本过高。

Gas 还可以作为对负责保证交易信息有效的 [验证者](https://iq.wiki/wiki/validator) 的补偿。当网络活动很高时，人们会提高他们的 gas 限制以执行和验证他们的交易。这样，验证者将从内存池中选择具有更高 gas 限制的交易。[\[4\]](#cite-id-exl5c8aoap)

## EVM 的工作原理


虚拟机本质上是在执行代码和执行机器之间创建一个抽象层。需要这一层来提高软件的可移植性，并确保应用程序彼此分离，并与它们的主机分离。

像 Solidity 这样的智能合约语言不能直接被 EVM 执行。相反，它们被编译成称为操作码的低级机器指令。这些操作码允许 EVM 成为 [图灵完备](https://en.wikipedia.org/wiki/Turing_completeness) 的。因为操作码是 1 个字节，所以最多只能有 256 个（16²）操作码。
![1_wPF4wH9t5AVwB8ffj03nfg.webp](https://ipfs.everipedia.org/ipfs/QmPcGgKV8P65Z11zQWC61t2sHJHQEQcREUeL9uAxLX2Ztb)为了有效地存储操作码，它们被编码为 [字节码](https://en.wikipedia.org/wiki/Bytecode)。每个操作码分配一个字节。在执行期间，字节码被分成它的字节（1 个字节等于 2 个十六进制字符）。
![1_5Xu21kO2n6y7mSPoZ2sXTg.webp](https://ipfs.everipedia.org/ipfs/QmbFMJnzzXjzs6u23gxfsZ2fPtZuPvRU9QjatSX66uugmP)EVM 使用一个 256 位的寄存器堆栈，从中可以一次访问或操作最近的 16 个项目。总的来说，堆栈只能容纳 1024 个项目。由于这些限制，复杂的操作码而是使用合约内存来检索或传递数据。但是，内存不是持久的。当合约执行完成时，内存内容将不会被保存。因此，虽然堆栈可以与函数参数进行比较，但内存可以与声明变量进行比较。为了无限期地存储数据并使其可用于未来的合约执行，可以使用存储。

由于所有合约执行都由运行以太坊 [节点](https://iq.wiki/wiki/node) 的每个人运行，因此攻击者可能会尝试创建包含大量计算密集型操作的合约以减慢网络速度。为了防止此类攻击发生，每个操作码都有其自己的基本 gas 成本。

在此字节码的末尾，附加了由 Solidity 创建的元数据文件的 [Swarm 哈希](https://swarm-gateways.net/bzz:/theswarm.eth/)。Swarm 是一个分布式存储平台和内容分发服务，或者更简单地说：一个去中心化的文件存储。元数据文件包含有关合约的各种信息，例如编译器版本或合约的函数。这是一个实验性功能，没有多少合约公开将其元数据上传到 Swarm 网络。[\[1\]](#cite-id-jvpmsnbuvni)[\[3\]](#cite-id-hxyjwg7mr9f)[\[5\]](#cite-id-qcsriv7kg6)[\[6\]](#cite-id-5bkzmktpdeh)

## 用例

### 智能合约

EVM 执行 [智能合约](https://iq.wiki/wiki/smart-contract)，使 [去中心化应用程序 (DApps)](https://iq.wiki/wiki/decentralized-application) 能够在没有中介的情况下自主运行。[\[4\]](#cite-id-exl5c8aoap)[\[7\]](#cite-id-khrq574sdw)

### 去中心化金融 (DeFi)

EVM 为 [DeFi](https://iq.wiki/wiki/defi) 应用程序提供支持，促进金融服务，如贷款、借款和交易，而无需传统银行。[\[4\]](#cite-id-exl5c8aoap)[\[7\]](#cite-id-khrq574sdw)

### 代币化

创建和管理数字代币，包括 [ERC-20](https://iq.wiki/wiki/erc-20) 代币，这些代币广泛用于各种 [区块链](https://iq.wiki/wiki/blockchain) 项目。[\[4\]](#cite-id-exl5c8aoap)

### 跨链兼容性

[EVM](https://iq.wiki/wiki/ethereum-virtual-machine-evm) 兼容链实现了不同 [区块链](https://iq.wiki/wiki/blockchain) 网络之间的互操作性。[\[4\]](#cite-id-exl5c8aoap)[\[7\]](#cite-id-khrq574sdw)

### DAO

[去中心化自治组织 (DAO)](https://iq.wiki/wiki/dao) 管理 EVM。DAO 是一个没有中央机构的社区项目，让成员完全控制该项目。除了自治之外，DAO 还是透明的。智能合约规定了指导方针，并根据编码指令实施政策。由于 DAO 活动是可访问、可验证且对公众审计开放的，因此参与者可以了解协议的运行方式。[\[7\]](#cite-id-khrq574sdw)

## 其他区块链的虚拟机

除了以太坊之外，其他链也提供他们的虚拟机。一些例子是 [Algorand](https://iq.wiki/wiki/algorand) 虚拟机 (AVM)、[NEO](https://iq.wiki/wiki/neo) 虚拟机 (NeoVM) 和 Rootstock 虚拟机 (RSK)，它们构建在 [比特币](https://iq.wiki/wiki/bitcoin) 网络之上，并允许开发人员为 [以太坊](https://iq.wiki/wiki/ethereum) 上的 [去中心化应用程序](https://iq.wiki/wiki/decentralized-application) 编写 [智能合约](https://iq.wiki/wiki/smart-contract) 代码。[\[4\]](#cite-id-exl5c8aoap)


## EVM 的优点和缺点

### 优点

开发人员可以执行代码，而不必担心其对网络其余部分的影响，或者担心它会篡改托管在任何节点计算机上的数据或个人文件。此外，他们可以在具有分布式共识的不同计算环境中运行复杂的 [智能合约](https://iq.wiki/wiki/smart-contract)。这确保了单个节点的故障不会对 [DApp](https://iq.wiki/wiki/decentralized-application) 或智能合约的运行产生任何负面影响，因为 EVM 代码在所有节点上保持不变。

EVM 所做的结果的神圣性非常适合 DApp 和智能合约以太坊生态系统的可持续扩展。再加上开发人员可选择的标准代码库、越来越多的 EVM 兼容 [layer-2](https://iq.wiki/wiki/layer-2) 区块链以及大量潜在的 EVM 用例，很容易理解为什么 EVM 是 [Web3](https://iq.wiki/wiki/web3) 开发的首选平台。[\[1\]](#cite-id-jvpmsnbuvni)

### 缺点

需要考虑的最重要的缺点是与在以太坊网络上运行 [智能合约](https://iq.wiki/wiki/smart-contract) 相关的高交易费用或 gas 成本。这些费用以 [ETH](https://iq.wiki/wiki/ethereum) 支付，具体取决于合约的复杂性和执行时的网络拥塞情况，因此开发人员和企业家必须相应地为其服务定价。

此外，由于 Solidity 是 EVM 上编码最受欢迎的语言，因此这意味着开发人员需要具备足够的经验，并具备一定的技术专业知识才能使用它创建高效的智能合约。如果开发人员选择使用其他语言进行编码，他们需要小心解决代码中的任何固有重复，因为 EVM 无论如何都会继续编译它们。虽然可以在后期阶段升级智能合约，但它会带来与创建引用原始智能合约地址的中间智能合约相关的安全风险。[\[1\]](#cite-id-jvpmsnbuvni)
