
- 區塊鏈教程
- 區塊鏈 - 首頁
- 區塊鏈基礎
- 區塊鏈 - 簡介
- 區塊鏈的歷史
- 區塊鏈 - 技術
- 區塊鏈與密碼學
- 區塊鏈超越加密貨幣
- 區塊鏈 - 高階概念
- 區塊鏈 - 去中心化
- 區塊鏈 - DApp
- 區塊鏈 - DeFi
- 區塊鏈 - 未來展望
- 區塊鏈中的智慧合約
- 區塊鏈 - 裡卡迪安合約
- 區塊鏈 - 預言機
- 區塊鏈 - DAO
- 比特幣
- 比特幣 - 無形的黃金
- 比特幣是如何工作的?
- 比特幣 - 網路
- 比特幣 - 錢包
- 比特幣 - 創新
- 以太坊
- 以太坊替代加密貨幣
- 以太坊生態系統
- 以太坊虛擬機器
- 高階以太坊
- 以太坊錢包
- 以太坊礦工節點
- 其他
- 區塊鏈 - 雙重支付
- 公鑰密碼學
- 區塊鏈 - 雜湊演算法
- 比特幣 - 挖礦
- 區塊鏈 - 區塊鏈
- 區塊鏈 - 工作量證明
- 區塊鏈 - 網路與挖礦
- 區塊鏈 - 礦工激勵
- 區塊鏈 - 梅克爾樹
- 區塊鏈 - 支付驗證
- 區塊鏈 - 解決衝突
- 區塊鏈 - 隱私
- 比特幣 - 緩解攻擊
- 區塊鏈 - 總結
- 區塊鏈資源
- 區塊鏈 - 快速指南
- 區塊鏈 - 資源
- 區塊鏈 - 討論
區塊鏈 - 以太坊虛擬機器
以太坊虛擬機器 (EVM) 作為一個簡單的基於堆疊的執行環境執行,它處理位元組碼指令以將系統狀態從一種條件轉換到另一種條件。
雖然 EVM 是圖靈完備的,但其操作受執行指令所需 gas 的限制。此限制可防止出現可能導致拒絕服務攻擊的無限迴圈。此外,EVM 配備了異常處理機制,以解決潛在問題,例如 gas 不足或指令無效,從而導致機器停止並向執行代理返回錯誤。
以太坊虛擬機器結構
以太坊虛擬機器 (EVM) 使用256 位字長,其堆疊最多可容納 1024 個元素,並遵循後進先出 (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操作碼時在正常情況下停止。