溫故知新:EVM 101

2021-11-20 00:11:07

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 的架構。


      溫故知新:EVM 101

圖表來自 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

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

推薦文章

btc日內再次下跌 短线應當如何處理?

盡管以太坊現貨ETF獲批是個好消息,但市場反應卻不如預期。在消息公布後,以太坊價格出現了小幅下跌,...

加密蓮
65 1個月前

7月23日、BTC(合約)ETH(合約)行情分析及操作策略

昨日收益還是不錯的,日內給出的現價空單分別止盈我們目標點位,恭喜跟上的朋友喫肉。時間一晃到月底了,...

倪老師
64 1個月前

幣圈院士:血與淚的教訓!交易者為何總是撞死在同一棵樹上?

幣圈院士談。交易市場中的幾種“死法” 在幣圈市場鱗次櫛比的海洋,風起雲湧,時常讓人感到驚手不及。在...

幣圈院士
57 1個月前

7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC

7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC一個引...

168超神
64 1個月前

悅盈:比特幣68000的空完美落地反彈繼續看跌 以太坊破前高看回撤

一個人的自律中,藏着無限的可能性,你自律的程度,決定着你人生的高度。 人生沒有近路可走,但你走的每...

我是周悅盈
55 1個月前

btc完美盈利 晚間波動較大注意

昨日btc空單完美給到,最大化走出一千七百點空間~ btc: 日內开盤下跌繼續測試66000一线,...

加密蓮
58 1個月前