了解區(qū)塊鏈虛擬機:EVM、HVM、WASM、MOVE
時間:2023-06-27 12:45:01 | 來源:網站運營
時間:2023-06-27 12:45:01 來源:網站運營
了解區(qū)塊鏈虛擬機:EVM、HVM、WASM、MOVE:
在區(qū)塊鏈上,用戶通過運行部署在區(qū)塊鏈上的合約,完成需要共識的操作。而為智能合約提供運行環(huán)境的便是對應的虛擬機。
EVM基礎概念EVM,是ERC協(xié)議和運作的心臟。
簡單的類比:EVM之于以太坊,正如Java虛擬機之于Java語言
我們寫的java代碼會被編譯成字節(jié)碼,但計算機無法識別字節(jié)碼;java虛擬機把字節(jié)碼編譯成計算機系統(tǒng)可以識別的機器碼指令,然后在計算機上運行。如下圖所示:
EVM的存在是為了能讓我們用Solidity編寫的合約代碼,運行在以太坊的環(huán)境中。這樣類比的話,以太坊就相當于計算機環(huán)境,EVM把合約代碼編譯成以太坊能識別的機器碼運行。如下圖所示:
大致流程:
當智能合約被編譯成二進制文件后,被部署到區(qū)塊鏈上。用戶通過調用智能合約的接口,來觸發(fā)智能合約的執(zhí)行操作。EVM執(zhí)行智能合約的代碼,修改當前區(qū)塊鏈上的數(shù)據(jù)(狀態(tài))。被修改的數(shù)據(jù),會被共識,確保一致性。
它實際上是完全隔離的,這意味著在EVM上運行的代碼無法訪問網絡、文件系統(tǒng)和其他進程。智能合約對其他的智能合約的訪問權也有限,在區(qū)塊鏈網絡上單獨運作。
編寫智能合約有三個主要步驟:
- 用高級語言編寫,如Solidity
- 用EVM編譯器編譯成字節(jié)碼
- 用客戶端上傳到區(qū)塊鏈網絡
技術細節(jié)EVM的存儲模型EVM是一個基于堆棧的虛擬機,具有臨時內存字節(jié)數(shù)組和持久鍵值存儲(持久存儲在Storage中)。
Stack:EVM是基于棧(stack)的虛擬機,stack用來保存指令的輸入輸出數(shù)據(jù),最大深度為1024個字,其中每個單元就是一個字。
臨時存儲Memory:內存,一個簡單的內存數(shù)組,用于臨時存儲EVM代碼運行中需要存取的各種數(shù)據(jù),基于字進行尋址和擴展
永久存儲Storage:用來保存所有合約“狀態(tài)”的永久存儲,由以太坊客戶端獨立維護,每個賬戶的存儲區(qū)域被以“字”為單位劃分為若干個“槽”(solt),合約中的狀態(tài)變量會根據(jù)其具體類型分別保存到這些槽中。例如在合約創(chuàng)建時由EVM根據(jù)合約定義的狀態(tài)變量進行初始化,將他們保存進以“字”為單位劃分的“存儲槽(solt storage)”中。
Storage也是作為是世界狀態(tài)的一部分存在的,客戶端會用一個MPT來維護其數(shù)據(jù)。
ROM:用來保存所有EVM程序代碼的只讀存儲,由以太坊客戶端獨立維護。
交易在EVM的執(zhí)行輸入一筆交易,內部會轉換成一個Message 對象,傳入EVM執(zhí)行。
普通轉賬交易如果是一筆普通轉賬交易,那么直接修改StateDB中對應的賬戶余額即可。
智能合約的創(chuàng)建或者調用如果是智能合約的創(chuàng)建或者調用,則通過EVM中的解釋器加載和執(zhí)行字節(jié)碼,執(zhí)行過程中可能會查詢或者修改StateDB。
1.生成Contract對象交易會被轉換成一個Message對象傳入EVM,而EVM則會根據(jù)Message生成一個Contract對象以便后續(xù)執(zhí)行。
2.送入解釋器執(zhí)行EVM是基于棧的虛擬機,解釋器中需要操作四大組件
PC:類似于CPU中的PC寄存器,指向當前執(zhí)行的指令
Stack:執(zhí)行堆棧,位寬為256bits,最大深度為1024
Memory:內存空間
Gas:油費池,耗光油費則交易執(zhí)行失敗
EVM的每條指令稱為一個OpCode,占用一個字節(jié),所以指令集最多不超過256
- 首先PC會從合約代碼中讀取一個OpCode
- 然后從一個JumpTable中檢索出對應的operation,也就是與其相關聯(lián)的函數(shù)集合
- 接下來會計算該操作需要消耗的油費,如果油費耗光則執(zhí)行失敗,返回ErrOutOfGas錯誤。如果油費充足,則調用execute()執(zhí)行該指令,根據(jù)指令類型的不同,會分別對Stack、Memory或者StateDB進行讀寫操作。
EVM機器語言EVM機器語言分為特定的指令集組,例如算術運算,邏輯和比較運算,控制流,系統(tǒng)調用,堆棧操作和儲存器操作。除典型的Bytecode操作外,EVM還必須管理帳戶資訊(即地址和余額),當前gas價格和區(qū)塊資訊。
通用堆棧操作POP // 項目出棧PUSH // 項目入棧MLOAD // 將項目加載到記憶體中MSTORE // 在記憶體中儲存項目JUMP // 改變程式計數(shù)器的位置PC // 程式計數(shù)器MSIZE // 活動的記憶體大小GAS // 交易可用的gas數(shù)量DUP // 復制棧項目SWAP // 交換棧項目
通用系統(tǒng)操作CREATE // 創(chuàng)建新的帳戶CALL // 在帳戶間傳遞消息的指令RETURN // 執(zhí)行停機REVERT // 執(zhí)行停機,恢復狀態(tài)更改SELFDESTRUCT // 執(zhí)行停機,并標記帳戶為刪除的
算術運算MUL //乘法SUB //減法DIV //整數(shù)除法SDIV //有符號整數(shù)除法MOD // Modulo(剩余)操作SMOD //簽名模運算ADDMOD //模數(shù)加法MULMOD //模數(shù)乘法EXP //指數(shù)運算STOP //停止操作
環(huán)境操作碼ADDRESS //當前執(zhí)行帳戶的地址BALANCE //帳戶余額CALLVALUE //執(zhí)行環(huán)境的交易值ORIGIN //執(zhí)行環(huán)境的原始地址CALLER //執(zhí)行調用者的地址CODESIZE //執(zhí)行環(huán)境程式碼大小GASPRICE //gas價格狀態(tài)EXTCODESIZE //帳戶的程式碼大小RETURNDATACOPY //從先前的記憶體調用輸出的數(shù)據(jù)的副本
與現(xiàn)有的虛擬機科技作比較- 虛擬機(Virtual Machine)
- Java 虛擬機(VM)
虛擬機技術與EVM的不同之處在于它們的目的是提供管理程式功能,或者處理客戶作業(yè)系統(tǒng)與底層主機作業(yè)系統(tǒng)和硬體之間的系統(tǒng)調用,任務調度和資源管理的軟體抽象。
然而,Java VM(JVM)規(guī)范的某些方面確實包含與EVM的相似之處。從高級概述來看,JVM旨在提供與底層主機作業(yè)系統(tǒng)或硬體無關的運行時環(huán)境,從而實現(xiàn)各種系統(tǒng)的兼容性。在JVM上運行的高級程式語言(如Java或Scala)被編譯到相應的指令集Bytecode 中。這與編譯要在EVM上運行的Solidity源檔案相當。
EVM的幾個功能- 便于測試:為了保證各種“智能合約”的順利執(zhí)行,我們需要給它們創(chuàng)建一個安全的運行環(huán)境,EVM就是一個代碼的運行環(huán)境。
正如我們上文所說,在虛擬機里的各種操作不會影響主機一樣,任何想要在EVM創(chuàng)建智能合約的開發(fā)者可以在虛擬機上測試各種應用而不占用主鏈資源也不受其他區(qū)塊鏈的影響。 - 增加安全性:ETH上承載著具有強大功能的各種應用,其邏輯也就更加復雜,開發(fā)者也越容易出現(xiàn)各種漏洞。而EVM是一個完全獨立的沙盒,合約代碼可對外完全隔離并在EVM內部運行。
不僅可以防止因為不法分子或者程序員的編程錯誤而影響整個主鏈,還可以防止運行智能合約的物理設備遭受攻擊。 - 保障穩(wěn)定性:由于EVM部署在ETH網絡的每個節(jié)點,整個ETH網絡的數(shù)據(jù)由眾多節(jié)點共同維護和更新,這保持了整個區(qū)塊鏈數(shù)據(jù)的一致性,這同樣也使ETH有極高的故障容錯性,保證零停機。
EVM和公鏈的關系目前市面上主流的公鏈,大部分都兼容EVM。
為什么這些鏈要做EVM兼容呢?
核心當然是以太坊在公鏈領域的影響力。目前市場上的各種公鏈此起彼伏,但是ETH依然是公鏈領域的龍頭。這些新興的公鏈需要利用以太坊引流,如果開發(fā)者可以把智能合約直接無縫遷移到自己的鏈上,那就是最好的引流方式。
在這些公鏈產生之前,以太坊的生態(tài)里,EVM已經部署了大量的應用。如果你不兼容這些應用,前進的道路必然是舉步維艱。
下面這個圖是2022年5月31日的全球公鏈的市場份額:
這個網站看到所有兼容EVM的公鏈:
https://www.coincarp.com/zh/chainlist/HVMHVM介紹概述HVM為趣鏈科技首創(chuàng)支持Java語言的智能合約執(zhí)行引擎,支持符合Java編寫規(guī)范多種數(shù)據(jù)結構,內置數(shù)據(jù)表結構,可以實現(xiàn)業(yè)務數(shù)據(jù)可視化,在保證智能合約執(zhí)行的安全性、確定性、可終止性的前提下,提供了一系列靈活的應用模式和工具方法集,以滿足復雜多樣的業(yè)務場景需求,為廣泛的區(qū)塊鏈開發(fā)人員提供更便捷、靈活、安全的區(qū)塊鏈應用開發(fā)模式。
使用HVM合約執(zhí)行的操作:從SDK調用一筆HVM的合約,首先需要共識模塊將通過共識的區(qū)塊交易發(fā)送給執(zhí)行模塊,然后執(zhí)行模塊調用HVM暴露出來的合約接口,最后合約執(zhí)行完成后會將結果返回,將執(zhí)行結果寫入賬本中。
在架構層面,HVM自上而下主要分為三個部分:合約操作層、庫函數(shù)層以及虛擬機層。
1.虛擬機層虛擬機層主要是在合約執(zhí)行過程中,對于合約解析執(zhí)行的內部操作。為了提高整體的執(zhí)行效率,HVM設計定制類加載器,類加載緩存提供合約地址到合約類加載器的映射,一個合約類加載器保存合約的字節(jié)碼和合約類實例,采用最近最少使用淘汰策略(LRU)減少類重復加載帶來的開銷;指令解析從開始的每次對指令進行解析到將指令做成單例,并進行棧幀復用,大量節(jié)省指令執(zhí)行時間,提高整體執(zhí)行效率。
2.庫函數(shù)層庫函數(shù)包括數(shù)據(jù)結構、賬本操作、日志信息以及加解密等功能。
- 數(shù)據(jù)結構符合Java編寫范式:HyperList、HyperMap為平臺獨立研發(fā),為了方便Java軟件開發(fā)者習慣,使其無需感知區(qū)塊鏈底層KV結構即可編寫相應業(yè)務邏輯代碼。HyperMap和HyperList的使用類似于開發(fā)者所熟知的HashMap和ArrayList,但做了原創(chuàng)性地優(yōu)化,在減少內存使用的同時也提高了更新賬本的插入效率。
- 內置數(shù)據(jù)表結構:為了滿足復雜業(yè)務場景下數(shù)據(jù)類型多樣化、業(yè)務數(shù)據(jù)可視化與可分析的需求,智能合約需要支持復雜的表結構數(shù)據(jù)組織形式。HVM提供了內置數(shù)據(jù)結構HyperTable,支持在合約內部按照表的形式組織業(yè)務數(shù)據(jù),便于業(yè)務數(shù)據(jù)可視化以及后續(xù)的數(shù)據(jù)分析與價值挖掘。這種結構可以讓原Solidity語言中復雜嵌套的數(shù)據(jù)操作簡單化,同時在性能方面,能有效解決序列化、反序列化造成的性能瓶頸,整體維護成本更低、使用更高效。
- 內置嵌套Map數(shù)據(jù)結構:HyperList、HyperMap數(shù)據(jù)結構都無法滿足復雜數(shù)據(jù)組織結構的需求;HyperTable的表結構擁有嚴格的層級格式(表-行-列簇-列-值),缺乏在復雜結構下的靈活性(例如:不可只有列,沒有列簇)。針對上述問題,HVM推出新型的數(shù)據(jù)結構——NestedMap,支持用戶按需進行靈活的數(shù)據(jù)組織,并且實現(xiàn)對多層映射數(shù)據(jù)更高的讀寫性能。
3.合約操作層這一層與用戶直接相關聯(lián),主要包括合約部署、調用等全生命周期管理,對于合約的操作通過會對鏈上的合約數(shù)據(jù)狀態(tài)產生影響,所以平臺采取了靈活的合約管理提案申請-閾值投票-提案執(zhí)行的策略,通過合約管理員對合約操作進行控制,保證合約管理操作的公平與安全。
- 合約部署 :編寫Java智能合約,并通過SDK發(fā)交易的形式將其部署到區(qū)塊鏈上;
- 合約調用 :根據(jù)合約地址,調用相應合約中的邏輯。
- 合約升級 :需要對合約進行升級操作時,因為升級合約是一個鏈級操作(改變整個鏈上的狀態(tài)),所以需要采用CAF聯(lián)盟自治框架才可以進行合約升級,保證鏈上合約的安全控制。
- 合約凍結/解凍 :將鏈上的合約凍結,在合約所有者解凍之前,禁止任何人調用,凍結不同于銷毀,其具備一個可逆的過程,可以通過合約解凍的操作重新使用。
- 合約銷毀 :不同于合約凍結,合約銷毀是一個不可逆的操作,被銷毀的合約不能夠被訪問,不可以恢復,不允許再進行任何操作,但合約銷毀后的數(shù)據(jù)仍然會存在鏈的底層賬本中,僅用于監(jiān)管審計。
優(yōu)勢EVM未對出現(xiàn)的異常進行詳細定位,給編譯調試造成極大的難度。而HVM通過內置日志工具類,支持六種日志級別:critical、error、warning、notice、info、debug??梢詾槊糠N常見的錯誤進行合理的提示,方便使用者對合作操作過程中產生的異常進行debug,方便開發(fā)和運維快速定位問題。
HVM采取分層調用的模式,可以有效降低合約升級的成本。其實現(xiàn)方法主要通過InvokeBean的方式在業(yè)務調用層在不更新合約的情況下定義豐富的業(yè)務邏輯, 合約層只實現(xiàn)最核心、最基本的原子操作。以轉賬場景為例,合約層只有增加余額和減少余額的方法,在InvokeBean調用層定義轉賬的邏輯:如余額是否充足、 減少轉讓方余額和增加接收方余額。
一些業(yè)務場景需要在智能合約中進行簽名驗簽邏輯處理,從而進行身份認證,便于進行權限判斷或者后續(xù)業(yè)務的開展。因此HVM設計了基于TEE的加解密工具, 支持在合約中調用存儲于TEE的公私鑰完成簽名、驗簽操作,并支持ECDSA國標系列、SM國密系列等多種加解密算法,具有方便友好安全的特性。
合約編碼者可以通過智能合約和訪問控制策略來限制訪問數(shù)據(jù)的角色和用戶,在合約中針對節(jié)點、角色、用戶定制不同的合約函數(shù)訪問權限。合約編碼者可以在 合約中為一些高權限的函數(shù)設置權限控制,使得該函數(shù)只能被固定地址的調用者調用,從而實現(xiàn)訪問權限控制。
WASMWASM-VM簡介概述WebAssembly(wasm) 是一個基于二進制操作指令的棧式結構的虛擬機,wasm可以被編譯為機器碼,可以更快,更高效的執(zhí)行本地方法和硬件資源,通過和js協(xié)作,前端可以實現(xiàn)更快,更復雜的計算和應用。
不僅可以嵌入瀏覽器增強web應用,也可以應用于其他的場景。
wasm支持高級語言編程,目前比較成熟的編譯器支持C / C++ /Rust。
工作原理WASM是一種不依賴于具體物理機器的匯編語言,可以抽象的理解成它是概念的機器語言,而不是實際的物理機器語言,因此,WebAssembly指令也可稱為虛擬指令,可以更快的更直接的映射的到機器碼!
優(yōu)勢WASM虛擬機已經被Google,F(xiàn)acebook,Microsoft等世界頂級互聯(lián)網公司同時支持,同時也可以在所有流行的瀏覽器中運行。WASM虛擬機一開始設計的目的是用于解決Web程序日益嚴峻的性能問題,因其有以下優(yōu)越的特性,被越來越多的非Web項目所采用。
- 快速、高效、可移植:通過利用常見的硬件能力,WASM代碼在不同平臺上能夠以接近本地速度運行。
- 可讀、可調試:WASM是一門低階語言,但是它有一種人類可讀的文本格式,這允許通過人工來寫代碼、看代碼以及調試代碼。
- 保持安全:WASM被限制運行在一個安全的沙箱執(zhí)行環(huán)境中。像其他網絡代碼一樣,它遵循瀏覽器的同源策略和授權策略。
- 不破壞網絡:WASM的設計原則是與其他網絡技術和諧共處并保持向后兼容。
與EVM對比速度- EVM
- 只能處理256位字節(jié)碼,這意味著小于256位的字節(jié)碼必須先轉換為256位格式,然后才能發(fā)送給EVM。
- EVM的可擴展性問題很明顯,因為它每秒只處理25個交易。
- WASM
- 直接轉換為編譯后的代碼,這使它能夠更快地加載,同時增加每個區(qū)塊所處理的交易數(shù)量。
預編譯- EVM
- 依賴于預編譯(預編譯合約)。當發(fā)出預編譯調用時,EVM將執(zhí)行預定義的本機代碼,然后顯示結果。這些預編譯特定于用于基本操作的特定協(xié)議,例如簽名方案和哈希。
- 盡管預編譯在不消耗大量gas的情況下使加密計算變得高效,但它們也帶來了問題。引入新的預編譯器通常要求網絡經歷一個系統(tǒng)范圍的硬分叉。
- WASM
- 消除了以太坊對預編譯合同的依賴。由于WASM非常高效,開發(fā)人員可以創(chuàng)建高效、快速的智能合約,而無需擔心潛在的硬分叉。
靈活性和互操作性WASM支持更多的語言,并且提供了比EVM更廣泛的工具集。WASM支持傳統(tǒng)語言,如Rust、C和c++。WASM也被本地JavaScript引擎支持,例如 Google 的 V8 引擎(基于Node.js 和 Chromium 的瀏覽器)、微軟的Chakra 引擎(Microsoft Edge)和Mozilla 的 Spidermonkey 引擎(Thunderbird和 Firefox)。
MOVE概述MoveVM是具有靜態(tài)類型系統(tǒng)的堆棧機。MoveVM從幾個方面來約束 Move語言規(guī)范,包括混合文件格式、驗證和運行時的約束。文件格式的結構允許定義模塊,類型(資源和非限制類型)和函數(shù)。代碼通過字節(jié)碼指令表示,字節(jié)碼指令可以引用外部函數(shù)和類型。
實現(xiàn)細節(jié)Move VM執(zhí)行以Move字節(jié)碼表示的交易。它有兩個核心包:核心VM和VM運行時。
MoveVM核心包提供文件格式的定義以及與文件格式相關的所有實用程序:
- 一個簡單的Rust抽象文件格式
(libra/language/vm/src/file_format.rs) 和字節(jié)碼。這些Rust結構廣泛用于代碼庫中。 - 文件格式的序列化和反序列化。這些定義了代碼的鏈上二進制表示。
- 一些漂亮的輸出展示功能。
- 文件格式的基本架構。
- gas成本/綜合基礎設施。
Move編程語言Move是一種新的編程語言,旨在為Libra區(qū)塊鏈提供安全可編程的基礎。
Move與平臺無關,支持跨區(qū)塊鏈的共享庫、工具和開發(fā)人員社區(qū)。Move語言的設計強調安全性,旨在避免許多Web3.0用戶受害的情形,包括但不限于重入漏洞(re-entrancy vulnerabilities)、毒令牌(poison tokens)和欺騙性令牌批準(spoofed token approvals)等問題
Move語言目錄由五個部分組成:- 虛擬機 (VM), 它包含字節(jié)碼格式、字節(jié)碼解釋器和執(zhí)行交易塊的基礎設施。該目錄還包含生成創(chuàng)世區(qū)塊的基礎設施
- 字節(jié)碼驗證器, 其中包含一個靜態(tài)分析工具,用于拒絕無效的Move字節(jié)碼。虛擬機在執(zhí)行新的Move代碼前,會先運行字節(jié)碼驗證器。編譯器運行字節(jié)碼驗證器則會把輸出和錯誤顯示給程序員。
- Move中間層表示 (IR:intermediate representation) 編譯器, 它將可讀的程序文本編譯成Move字節(jié)碼. 警告:IR編譯器是一個測試工具。它會生成將被Move字節(jié)碼驗證器拒絕的無效字節(jié)碼。IR語法工作仍在進行,或將經歷重大的變化。
- 標準庫, 其中包含LibraAccount和LibraCoin等核心系統(tǒng)模塊的Move IR代碼。
- 一些測試 ,用于虛擬機,字節(jié)碼驗證程序和編譯器。這些測試是用Move IR編寫的,由測試框架運行,該測試框架從注釋中編碼的特殊指令解析運行測試的預期結果。
版權聲明:本文為CSDN博主「鯤志說」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/m0_37482190/article/details/128294434文章來源:CSDN博主「鯤志說」
文章原標題:《web3:智能合約-虛擬機(EVM、HVM、WASM、MOVE)》
如有侵權請與我們聯(lián)系刪除。