---
title: "什麼是 Ethereum virtual machine（EVM）？"
description: "全面解析 EVM"
---

## **EVM——擁有許多名字的機器**

世界電腦。無法阻擋的機器。Ethereum 的核心。Ethereum Virtual Machine（EVM）有許多名字，這凸顯了它對 Ethereum 網路的重要性。正是這項核心功能，使 Ethereum 不只是像 Bitcoin 那樣的「分散式帳本」，而是一個「分散式狀態機」。

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）。這是因為 VM 可以在不同的作業系統與硬體上執行，也不受地理位置限制。VM 作為程式碼與執行程式碼的機器之間的抽象層運作。

VM 的運作方式類似於具有儲存、記憶體與 CPU 的實體機器，但它們完全以程式碼形式運作。理論上，任何人都可以執行一個 VM，這使它成為去中心化網路中高度可攜的平台。EVM 就是利用去中心化的節點網路來執行智慧合約。

## **智慧合約——EVM 的應用**

智慧合約是能自動執行的程式碼，讓各方無需任何中央權威機構即可互相交易。智慧合約中包含一份定義好的操作清單，當鏈上或鏈下的某些條件被滿足時，這些操作就會被執行。有些操作可能是將資金轉移到某個地址、與另一份合約通訊，甚至建立新的合約。與其由第三方執行交易，任何發送方都可以將資金發送到智慧合約的地址來觸發這些操作。

<ImageBlock
  src="https://media.alchemy.com/1703770046-how-smart-contract-works.png"
  alt="智能合約在條件達成時自動執行的示意圖"
  width={820}
  height={521}
  caption="智能合約如何運作"
/>

智慧合約之所以是一種安全的交易方式，是因為程式碼無法被更改或修改。智慧合約永遠會有一個預期的結果，這就是程式碼內建的信任機制。每當一份合約被執行時，就會改變 EVM 的狀態。

EVM 可以被稱為「狀態機」，因為它負責計算執行智慧合約程式碼所產生的狀態變化。這意味著它會維護帳戶的 ether 餘額、智慧合約的資料儲存，以及帳戶與合約層級的交易，並在這些交易完成時進行更新。所有這些動作正是改變網路「狀態」的原因。

<ImageBlock
  src="https://media.alchemy.com/1703770183-evm-transactions.png"
  alt="EVM 交易改變 Ethereum 網路狀態的示意圖"
  width={1080}
  height={607}
  caption="EVM 交易"
/>

智慧合約主要以 Solidity 語言撰寫。EVM 無法直接執行 Solidity，因此程式碼必須先被編譯成較低階的機器指令，稱為 opcode。

## **Opcode——EVM 的語言**

EVM 普遍被稱為[圖靈完備](https://en.wikipedia.org/wiki/Turing_completeness)，或更準確地說是準圖靈完備。這意味著 EVM 理論上可以解決任何計算問題。這是透過執行稱為 EVM opcode 的機器層級指令來完成的。

EVM opcode 協助 EVM 完成智慧合約或交易的特定任務。目前 EVM 大約可以執行 150 種 opcode，涵蓋各種操作，包括：算術運算、停止、記錄、複製、push、記憶體操作、比較、交換，以及取得區塊與環境資訊。你可以在[這裡](https://github.com/wolflo/evm-opcodes/blob/main/gas.md)找到 opcode 清單。

<ImageBlock
  src="https://media.alchemy.com/1703770312-evm-opcodes.jpeg"
  alt="EVM 操作碼的示意圖，即 EVM 執行的機器層級指令"
  width={1600}
  height={916}
  caption="EVM 操作碼"
/>

為了提升效率，EVM 會將其 bytecode 轉換成 opcode，每個 opcode 在 bytecode 中對應一個或多個位元組。每個 opcode 操作在被 EVM 執行時，都需要消耗特定數量的 gas。你可能聽過 gas，但它到底是什麼？

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

Gas 大概是關於 EVM 討論最多、卻也最少人真正理解的主題。在撰寫本文時，gas 價格可能非常高，不過目前有一些努力正試圖改善這個問題。高昂的 gas 價格可能是 Ethereum 走向主流的一大障礙。但為什麼我們必須支付 gas 費用，又是什麼導致價格這麼高？

Gas 的目的是作為費用，用來支付每個 Ethereum 節點執行智慧合約操作所需的運算成本。之所以需要對運算收取費用，是為了防止攻擊者透過部署大量需要長時間運算的複雜合約，讓網路陷入停擺。這類 DDoS 攻擊之所以會受到抑制，正是因為執行成本太高。

每個 opcode 都被賦予一個[gas 成本](https://github.com/wolflo/evm-opcodes/blob/main/gas.md)，越複雜的 opcode 成本越高。舉例來說，簡單的加法運算需要 3 gas，而每筆交易的起始成本是 21,000 gas。大部分的抱怨其實不是針對 gas 本身，而是針對成功完成交易所需的 gas limit。

Gas limit 是發送方願意為交易的執行與驗證支付的最大 gas 數量。要計算 gas 費用，可以將總 gas 成本（各操作的基礎數值）乘以 gas price（完成這些操作的價格）。這就像替汽車加油一樣，既有汽油本身的價格，也有到達目的地所需的油量。

Gas 費用 = 總 Gas 成本 x Gas Price

Gas 費用是用來補償驗證者，因為他們負責確認交易中的資訊是有效的、EVM 沒有出現錯誤或異常，並確認發送方確實擁有支付運算所需的資金。當發送方設定較高的 gas limit 時，這表示該操作較為複雜，也因此激勵驗證者為了獲得更高的報酬而優先處理該交易。

<ImageBlock
  src="https://media.alchemy.com/1703770395-evm-gas.png"
  alt="燃料費如何補償驗證者進行 EVM 運算的示意圖"
  width={1080}
  height={607}
  caption="EVM 燃料費"
/>

當網路活動量高時，驗證者可以直接從待處理交易池中，挑選 gas limit 較高的交易來處理。因此 gas 費用會受到供需影響。好消息是，任何未被消耗的 gas 都會退還給發送方。

如果預先支付的 gas limit 被用盡，驗證者仍然會因為其工作獲得補償，但該筆交易不會完成。從這個角度來看，EVM 是準圖靈完備的，因為它能完成的運算，會受限於發送方願意支付的金額。

## **EVM 的使用案例**

在了解了 EVM 的各個組成元素後，讓我們來看看這些部分如何結合起來，為 Ethereum 上的各個專案提供動力：

### **ERC-20 代幣**

[ERC-20](https://www.alchemy.com/overviews/erc20-solidity) 代幣是可以在地址之間轉移的代幣，其數量固定，且在整個網路中價值一致。遵循 EVM 上定義好的資料結構的智慧合約，被用來建立 ERC-20 代幣。這個資料結構控制代幣的命名、分配、供給量與監控。

有多個應用與專案使用 ERC-20 代幣來激勵使用者。[Livepeer](https://www.alchemy.com/dapps/livepeer) 是一個去中心化的影音串流網路，它使用 Livepeer token（LPT）來激勵那些為網路提供資源的人。[Nexus Mutual](https://www.alchemy.com/dapps/nexus-mutual) 是建立在智慧合約上的去中心化保險，它使用 NXM token 讓使用者可以購買保障並提出理賠。

### 去中心化交易所

去中心化交易所會部署智慧合約，讓使用者可以交換 ERC-20 代幣。這些智慧合約被稱為自動做市商（Automated Market Makers，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（Non-fungible token，非同質化代幣），也就是在區塊鏈上具有獨特價值的代幣。創作獨一無二的藝術作品是這類代幣最大的應用場景。其他遊戲領域的專案，如 [Axie Infinity](https://www.alchemy.com/dapps/axie-infinity) 與 God Unchained，也使用這類代幣作為遊戲內的收藏品。

### EVM 及其未來

EVM 讓 Ethereum 成為一個平台，而不只是一條區塊鏈。然而，EVM 並非一個完美的系統，在交易速度與網路吞吐量方面仍存在許多挑戰。這是開發社群與 [Ethereum 路線圖](https://ethereum.org/en/roadmap/)持續關注的領域。如果 Ethereum 要實現它徹底改變彼此交易方式的承諾，這一切都必須建立在 EVM 不斷改進的基礎之上。
