---
title: "什么是 Ethereum 虚拟机(EVM)?"
description: "EVM 全解析"
---

## **EVM——一台拥有多个名字的机器**

世界计算机、不可阻挡的机器、以太坊之心。以太坊虚拟机（EVM）拥有众多名字，这也凸显了它对以太坊网络的重要性。正是这一核心特性，使以太坊不仅仅是像比特币那样的“分布式账本”，而是一台“分布式状态机”。

EVM 允许开发者使用一种叫做 [Solidity](https://www.alchemy.com/overviews/solidity) 的编程语言来编写智能合约。智能合约的一个常见应用是管理代币的生成与交换。许多应用和协议使用代币来激励用户完成对其目标而言重要的行为。没有 EVM，这一切都无法实现。

为了更好地理解 EVM 的能力，我们来看看它的几个核心组成部分：

## **虚拟机——EVM 的运行平台**

去中心化网络很难被摧毁。如果你想做到这一点，你需要移除当前在线的每一个节点，并想办法阻止新节点的出现。

<ImageBlock
  src="https://media.alchemy.com/1703769963-distributed-networks.png"
  alt="对比中心化、去中心化和分布式网络拓扑的示意图"
  width={1445}
  height={420}
  caption="分布式网络"
/>

让去中心化网络实现扩展的一个好方法是使用虚拟机（VM）。这是因为虚拟机可以在不同的操作系统、硬件以及任意地理位置上运行。虚拟机在代码与执行代码的机器之间充当了一层抽象层。

虚拟机的工作方式与拥有存储、内存和 CPU 的物理机类似，但它们完全以代码形式运行。理论上，任何人都可以运行一个虚拟机，这使其成为去中心化网络中一个高度可移植的平台。EVM 正是利用一个去中心化的节点网络来执行智能合约。

## **智能合约——EVM 上的应用**

智能合约是一段自动执行的代码，使各方无需借助任何中心化权威即可相互交易。智能合约内部包含一系列预定义的操作，当链上或链下的某些条件满足时，这些操作便会被执行。这些操作可能包括向某个地址转账、与另一个合约通信，甚至创建一个新的合约。与通过第三方执行交易不同，任何发送者都可以向智能合约的地址发送资金来触发这些操作。

<ImageBlock
  src="https://media.alchemy.com/1703770046-how-smart-contract-works.png"
  alt="智能合约在满足条件时自动执行的示意图"
  width={820}
  height={521}
  caption="智能合约的工作原理"
/>

智能合约之所以是一种安全的交易方式，是因为其代码无法被更改或篡改。智能合约总会产生一个预期的结果，这就是代码内建的信任机制。每当一个合约被执行时，都可以说它改变了 EVM 的状态。

EVM 之所以被称为“状态机”，是因为它负责计算执行智能合约代码所产生的状态变化。这意味着它会维护账户的以太币余额、智能合约的数据存储，以及账户和合约层面已完成的交易记录。所有这些操作都会改变网络的“状态”。

<ImageBlock
  src="https://media.alchemy.com/1703770183-evm-transactions.png"
  alt="EVM 交易改变 Ethereum 网络状态的示意图"
  width={1080}
  height={607}
  caption="EVM 交易"
/>

智能合约主要使用 Solidity 语言编写。EVM 无法直接执行 Solidity 代码，因此代码首先必须被编译为更底层的机器指令，即操作码（opcode）。

## **操作码——EVM 的语言**

EVM 通常被称为具有[图灵完备性](https://en.wikipedia.org/wiki/Turing_completeness)，更准确地说是准图灵完备。这意味着 EVM 理论上可以解决任何计算问题。这是通过执行称为 EVM 操作码的机器级指令来实现的。

EVM 操作码协助 EVM 完成智能合约或交易的具体任务。目前，EVM 可以执行大约 150 个操作码，涵盖算术运算、停止、日志记录、复制、压栈、内存操作、比较、交换等一系列操作，以及区块和环境信息的获取。你可以在[这里](https://github.com/wolflo/evm-opcodes/blob/main/gas.md)找到操作码列表。

<ImageBlock
  src="https://media.alchemy.com/1703770312-evm-opcodes.jpeg"
  alt="EVM 操作码（EVM 执行的机器级指令）示意图"
  width={1600}
  height={916}
  caption="EVM 操作码"
/>

出于效率考虑，EVM 会将其字节码转换为操作码，每个操作码在字节码中占用一个或多个字节。每个操作码的执行都需要 EVM 消耗特定数量的 gas。你可能已经听说过 gas，但它究竟是什么？

## **Gas——EVM 的燃料**

Gas 可能是关于 EVM 讨论最多、却理解最少的话题。在撰写本文时，gas 价格可能非常高，不过也有一些改善这一状况的努力。高昂的 gas 价格可能成为以太坊被主流接受的一大障碍。但我们为什么要支付 gas 费用，又是什么导致了价格如此之高？

Gas 的作用是作为每个以太坊节点执行智能合约操作时的计算费用。之所以需要为计算收取费用，是为了防止攻击者通过部署大量需要长时间计算的复杂合约来使网络陷入瘫痪。这类 DDoS 攻击因运行成本过高而受到抑制。

每个操作码都被分配了[相应的 gas 成本](https://github.com/wolflo/evm-opcodes/blob/main/gas.md)，操作越复杂，成本越高。例如，简单的加法操作成本为 3 gas，而每笔交易的起始成本为 21,000 gas。大多数抱怨其实并非针对 gas 本身，而是针对成功完成一笔交易所需的 gas 限额。

Gas 限额是发送者愿意为交易执行和验证支付的最大 gas 数量。要计算 gas 费用，可以将总 gas 成本（各操作的基础值）乘以 gas 价格（完成这些操作的成本）。这就像给车加油一样，既有燃油本身的价格，也有到达目的地所需的油量。

Gas 费用 = 总 Gas 成本 x Gas 价格

Gas 费用用于补偿验证者，因为他们负责确保交易信息有效、EVM 中不出现错误/异常，并确认发送者拥有支付计算所需的资金。当发送者设置较高的 gas 限额时，这表明该操作较为复杂，从而激励验证者以获取高额回报为动力去处理该交易。

<ImageBlock
  src="https://media.alchemy.com/1703770395-evm-gas.png"
  alt="Gas 费用补偿验证者进行 EVM 计算的示意图"
  width={1080}
  height={607}
  caption="EVM Gas"
/>

当网络活动频繁时，验证者可以直接从待处理交易池中挑选 gas 限额较高的交易。因此，gas 费用受供需关系影响。好在，任何未被消耗的 gas 都会退还给发送者。

如果预付的 gas 限额被耗尽，验证者仍会因其工作获得补偿，但交易不会被完成。正是在这个意义上，EVM 是准图灵完备的——它所能完成的计算量，受限于发送者愿意支付的金额。

## **EVM 的应用场景**

在了解了 EVM 的各个组成部分之后，让我们看看这些部分是如何共同作用，为以太坊上的项目提供支持的：

### **ERC-20 代币**

[ERC-20](https://www.alchemy.com/overviews/erc20-solidity) 代币是可以在地址之间转移的代币，其数量固定，且在整个网络中价值保持一致。遵循 EVM 上某种预定义数据结构的智能合约被用来创建 ERC-20 代币。这种数据结构控制着代币的命名、分发、供应量以及监控。

多个应用和项目使用 ERC-20 代币来激励用户。[Livepeer](https://www.alchemy.com/dapps/livepeer) 是一个去中心化视频流网络，使用 Livepeer 代币（LPT）来激励那些为网络提供资源的用户。[Nexus Mutual](https://www.alchemy.com/dapps/nexus-mutual) 是基于智能合约的去中心化保险项目，使用 NXM 代币让用户购买保单并进行理赔。

### 去中心化交易所

去中心化交易所通过部署智能合约，让用户能够交换 ERC-20 代币。这些智能合约被称为自动做市商（AMM），因为它们允许用户为特定代币的流动性池贡献资金，而无需任何第三方对其进行控制。一些流行的交易所，如 [Uniswap](https://www.alchemy.com/dapps/uniswap) 和 [SushiSwap](https://ethereum.org/en/developers/docs/standards/tokens/erc-721/)，都是这种 AMM 模型的应用实例。

<ImageBlock
  src="https://media.alchemy.com/1703770478-automated-market-maker.png"
  alt="自动做市商通过流动性池匹配代币兑换的示意图"
  width={1236}
  height={1128}
  caption="自动做市商"
/>

### **ERC-721 代币**

另一个广受欢迎的代币标准是 ERC-20 的非同质化“表亲”——[ERC-721](https://ethereum.org/en/developers/docs/standards/tokens/erc-721/)。这类智能合约用于铸造 NFT（非同质化代币），即在区块链上具有独特价值的代币。创作独一无二的艺术作品是这类代币最主要的应用场景。游戏领域的其他项目，如 [Axie Infinity](https://www.alchemy.com/dapps/axie-infinity) 和 God Unchained，也使用这类代币作为游戏内的收藏品。

### EVM 及其未来

EVM 使以太坊成为一个平台，而不仅仅是一条区块链。然而，EVM 并非一个完美的系统。在交易速度和网络吞吐量方面仍存在诸多挑战。这也是开发者社区以及[以太坊路线图](https://ethereum.org/en/roadmap/)所关注的重点领域。如果以太坊要兑现其颠覆人们彼此交易方式的承诺，这一切都将建立在对 EVM 的不断改进之上。
