溫故知新:EVM 101
EVM 對於以太坊狀態機就好比處理器對於計算機般至關重要。它主要是用於執行智能合約的邏輯和進行相應的狀態轉換。在我們深入 EVM 時,現在先簡單看看以太坊吧。
以太坊簡介
以太坊是开源、去中心化的區塊鏈,具有智能合約的額外功能。它意味着,在網絡上發生的交易種類大致是 ETH 轉账 (或) 智能合約部署 (或) 智能合約調用——所有這些都會改變以太坊區塊鏈的狀態。一堆這些交易按照特定順序組合成一個區塊,執行該區塊裏交易合起來所需的 gas 應小於或等於區塊 gas 上限 (譯者注:EIP-1559 後 gas 上限是 30 m) 。
一筆交易大概如下:
Transaction -
nonce - 由交易發件人發送的交易號
gas price - 這筆交易的 gas 價格 (單位為 wei)
gas limit - 這筆交易可以使用的最高 gas 量
to - 這筆交易的受款人
value - 轉給受款人的 wei 數值
data - 信息調用的輸入數據
v, r, s - 可恢復的發件人 Secp256K1 籤名
以太坊的世界狀態就是地址和其對應的账戶狀態之間的映射。账戶狀態大概如下:
Account -
nonce - 到現在從該相應账戶發送的交易數量的值
balance - 這個账戶持有的 wei 數量
storageRoot - 256 位鍵值對之間的映射
codeHash - 屬於這個账戶的的 EVM 代碼的不可變哈希值。當有人與這個账戶進行交易時,此代碼將被執行。
礦工通過匯集一些交易來形成一個區塊,並獲取打包該區塊的工作量證明。這個區塊隨後會在網絡被廣播到其他參與以太坊區塊鏈的節點。現在,其他接收到此區塊的節點必須驗證其有效性,因為礦工可能是惡意的,可能會出現傳輸錯誤,中間人攻擊 (man-in-the-middle attack)。每個節點 (大致) 從以下方面驗證區塊:
它們按照以太坊協議驗證區塊特性 (如區塊高度、父塊哈希值、時間戳、gas 上限、使用的 gas 量等)
然後這個區塊裏的交易會被逐一執行。執行每筆交易都會消耗一些 gas 並改變區塊鏈的狀態。因此,在區塊執行的最後,我們會得到一個結果狀態,它由狀態樹根來表示,這個根是唯一的。如果礦工和驗證節點對協議和交易都達成共識,那么狀態根應該是唯一的。礦工添加在區塊頭獲得的狀態根,隨後其他節點根據區塊頭提到的狀態根對其進行驗證。
以太坊虛擬機 (Ethereum Virtual Machine, EVM) 負責執行交易和更新區塊鏈狀態。讓我們在下文了解更多 EVM 的細節。
以太坊虛擬機
智能合約可以被編譯成 EVM 字節碼。作為類比,把 Solidity 代碼 (編寫智能合約的通用語言) 想象成 C++代碼。把 EVM 字節碼看作是機器代碼,它是可以被處理器理解和執行的。因此,EVM 可以被認為是以太坊的一個處理器。EVM 字節代碼是操作碼和數據序列,可以被 EVM 處理,形成狀態轉換。
因此,EVM 在執行交易中的作用:
使一個账戶轉账 WEI (1 ETH = 10¹⁸ WEI) 到另一個账戶變得可能
如果交易的受款人账戶有一些字節碼與 EVM 相關,EVM 必須執行相應的字節碼 (可能使用從 transaction.data 欄位獲取的輸入數據)。
現在,任何账戶都可以有與 EVM 相關的字節碼嗎?答案是否定的。以太坊有兩種類型的账戶——外部所有账戶 (EOA) 和合約账戶 (CA)。EOA 是具有私人密鑰關聯的账戶,由像個人、組織等的外部實體操作。另一方面,合約账戶是通過部署智能合約創建的。它們沒有相關私鑰,並由外部實體對其進行的代碼調用 (通過區塊鏈上的交易) 控制。
基本上,每個節點上都會啓動一個 EVM 實例來執行每筆交易。但是,只有當交易的受款方 (或目標) 是一個合約账戶時,EVM 實例才會執行字節碼。
現在,讓我們來看看 EVM 的架構。
圖表來自 https://ethereum.org/en/developers/docs/evm/
啓動的每個 EVM 實例都是為運行一個特定的字節碼 (由於交易的目標是一個合約账戶)。因此,字節碼就像是 EVM 實例的 ROM,是不能修改的。類似於圖靈機,EVM 由一個程序計數器 (Program Counter)、堆棧 (Stack)、內存 (Memory) 和外部存儲器。這個外部存儲器對所有交易進行永久存儲,但其余組件的存儲是易失的,並會對 EVM 的每個實例進行重新實例化。
讓我們來逐個了解這些組件——
-
程序計數器 (PC) 只是一個指向字節碼中下一個操作碼的指針,由 EVM 執行。它是一個非負整數,範圍是 [0, number_of_bytes(bytecode)-1]
-
EVM 裏的堆棧可以有最多 1024 個條目,每個條目都是 256 位 (32 字節) 的無符號整數。
-
EVM 裏的內存是可以無限擴充的 (盡管你必須為內存擴充本身支付額外的費用) 且每個條目都有一個 8 位 (1字節) 的無符號整數。
這裏的外部存儲就是所有账戶存儲的集合。( EVM 的字節碼可以寫到目標账戶或外部账戶的存儲空間 )
與計算機處理器如何根據每個指令集理解特定的操作碼類似,EVM 也需要理解操作碼。每個 EVM 操作碼都是一個字節,因此根據理論,最多可以有 256 個操作碼,但這裏就不列出全部 256 個操作碼了。EVM 操作碼主要可分為以下幾類——
控制像 PC、堆棧、內存和存儲狀態的操作碼
算數運算和按位運算
環境信息——關於區塊、當前交易或某特定账戶的屬性的信息
日志操作——添加日志記錄
系統操作——創建新的合約账戶、對另一個账戶進行信息調用、銷毀已創建的合約账戶等
很快會出下一篇更詳細的關於操作碼的文章。敬請關注!
來源 | medium.com/@somubhargava97
作者 | Somu Bhargava
原文鏈接: https://medium.com/@somubhargava97/introduction-to-evm-part-1-b27203883a03
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC
7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC一個引...
悅盈:比特幣68000的空完美落地反彈繼續看跌 以太坊破前高看回撤
一個人的自律中,藏着無限的可能性,你自律的程度,決定着你人生的高度。 人生沒有近路可走,但你走的每...