馬蹄鏈智慧合約dapp系統開發搭建

aa111111發表於2023-03-28

EVM模組主要分為三大模組:編譯合約模組、Ledger模組和EVM執行模組。


編譯合約模組

主要是對底層Solc編譯器進行一層封裝,提供RPC介面給外部服務,對用Solidity編寫的智慧合約進行編譯。編譯後將會返回二進位制碼和相應的合約ABI, ABI可以理解為合約的手冊

Ledger模組

Ledger模組主要是對區塊鏈Account系統進行修改和更新,Account一共分為兩種,分別是普通Account(EOA)和智慧合約Account,呼叫方如果知道合約Account地址則可以呼叫該合約,Account的每一次修改都會被持久化到區塊鏈中。

EVM執行模組

EVM執行模組作為核心模組,主要功能是對事務中的智慧合約程式碼進行解析和執行,一般分為建立合約和呼叫合約兩部分。

支援普通的位元組碼執行和JIT模式的指令執行

指令集

EVM指令由很多標準機器碼指令組成,包含:

算術和位運算邏輯操作

執行上下文查詢

棧、記憶體和儲存訪問

處理流程操作

日誌、跳轉和其他操作

EVM模組執行流程

EVM執行事務的流程如圖所示

(1) EVM接收到Transaction資訊,然後判斷Transaction型別是部署合約還是執行合約。如果是部署合約,執行指令集,來儲存合約地址和編譯後的程式碼;如果是執行合約或是呼叫合約,則使用EVM來執行輸入指令集。


(2) 執行上一條指令集之後,判斷EVM是否停機,如果停機則判斷是否正常停機,正常停機則更新合約狀態到區塊鏈,否則回滾合約狀態。如果不停機則回到上一步(1)進行判斷。


(3) 執行完的合約會返回一個執行結果,EVM會將結果儲存在Receipt回執中,呼叫者可以透過Transaction的雜湊來查詢結果。


EVM程式碼的正式執行模型

每輪執行時,透過調出程式碼的第pc(程式計數器)個位元組,每個指令如何影響元組都有定義。例如,ADD將兩個元素出棧並將它們的和入棧,將Gas減1並將pc加1; stack將頂部的兩個元素出棧,並將第2個元素插入由第1個元素定義的合約儲存位置,同樣減少最多200的Gas值,並將pc加1。雖然有許多方法透過即時編譯去最佳化以太坊,但以太坊的基礎性的實施可以用幾百行程式碼實現。


EVM是基於棧的虛擬機器

以太坊合約的程式碼是使用低階的基於堆疊的位元組碼的語言寫成的,被稱為“以太坊虛擬機器程式碼”或者“EVM程式碼”。程式碼由一系列位元組構成,每一個位元組代表一種操作。一般而言,程式碼執行是無限迴圈,程式計數器每增加一(初始值為零)就執行一次操作,直到程式碼執行完畢或者遇到錯誤、STOP或者RETURN指令。


EVM不是基於暫存器的,而是基於棧的虛擬機器。因此所有的計算都在一個稱為棧的區域內執行。棧最大有1024個元素,每個元素有256位。對棧的訪問只限於其頂端,允許複製最頂端的16個元素中的一個到棧頂,或者是交換棧頂元素和下面16個元素中的一個。所有其他操作都只能取最頂的一個或幾個元素,並把結果壓在棧頂。當然可以把棧裡的元素放到儲存或者主存中。但是無法只訪問棧裡指定深度的那個元素,在那之前必須把指定深度之上的所有元素都從棧中移除才行。


EVM的指令集被刻意保持在最小規模,以儘可能避免可能導致共識問題的錯誤。所有的指令都是針對256位這個基本的資料單位進行的操作,具備常用的算術、位、邏輯和比較操作,也可以進行條件和無條件跳轉。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010128/viewspace-2942123/,如需轉載,請註明出處,否則將追究法律責任。

相關文章