2.3以太坊虛擬機(jī)

以太坊虛擬機(jī)

以太坊虛擬機(jī)(EVM)是運(yùn)行智能合約的環(huán)境,運(yùn)行在每一個節(jié)點(diǎn)上,類似于一個獨(dú)立的沙盒,嚴(yán)格控制了訪問權(quán)限;也就是說,合約代碼在EVM中運(yùn)行時是不能接觸網(wǎng)絡(luò)、文件或者其他進(jìn)程的。EVM模塊主要分為三大模塊:編譯合約模塊、Ledger模塊和EVM執(zhí)行模塊。
編譯合約模塊主要是對底層Solc編譯器進(jìn)行一層封裝,提供RPC接口給外部服務(wù),對用Solidity編寫的智能合約進(jìn)行編譯。編譯后將會返回二進(jìn)制碼和相應(yīng)的合約ABI,ABI可以理解為合約的手冊,通過ABI可以知道合約的方法名、參數(shù)、返回值等信息。
Ledger模塊主要是對區(qū)塊鏈賬戶系統(tǒng)進(jìn)行修改和更新,賬戶一共分為兩種,分別是普通賬戶和智能合約賬戶,調(diào)用方如果知道智能合約地址則可以調(diào)用改合約,賬戶的每一次修改都會被持久化到區(qū)塊鏈中。
EVM執(zhí)行模塊作為核心模塊,主要功能是對交易中的智能合約代碼進(jìn)行解析和執(zhí)行,一般分為創(chuàng)建合約和調(diào)用合約兩部分,同時為了提高效率,EVM執(zhí)行模塊除了支持普通的字節(jié)碼執(zhí)行外,還支持JIT模塊的指令執(zhí)行,普通的字節(jié)碼執(zhí)行主要是對編譯后的二進(jìn)制碼直接執(zhí)行其指令,而JIT模式會對執(zhí)行過程中的指令進(jìn)行優(yōu)化,如把連續(xù)的push指令打包成一個切片,方便程序高效執(zhí)行。EVM執(zhí)行流程圖:
image.png
(1)EVM執(zhí)行收到Transaction信息,然后判斷Transaction類型是部署合約還是執(zhí)行合約。如果是部署合約,執(zhí)行指令集,來存儲合約地址和編譯后的代碼:如果是執(zhí)行合約或是調(diào)用合約,則使用EVM來執(zhí)行輸入指令集。
(2)執(zhí)行上一條指令集之后,判斷EVM是否停機(jī),如果停機(jī)則判斷是否正常停機(jī),正常停機(jī)則更新合約狀態(tài)到區(qū)塊鏈,否則會滾合約狀態(tài)。如果不停機(jī)則回到上一步(1)進(jìn)行判斷。
(3)執(zhí)行完的合約會返回一個執(zhí)行結(jié)果,EVM會將結(jié)果存儲在Receipt回執(zhí)中,調(diào)用者可以通過Transaction的哈希來查詢結(jié)果。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容