什麼是EVM(Ethereum Virtual Machine,以太坊虛擬機)?
以太坊虛擬機是一種輕量級虛擬機,用於在以太坊網絡上運行各種智能合約。 EVM的功能不同於傳統的操作系統,例如一次只能在一台機器上運行的Windows。 EVM是現有操作系統的“鏡像”,用以模擬本地操作系統,但它又是獨立運行的,不會對真正的系統產生影響。
使用EVM,同一平台可以在許多不同的操作系統和硬件架構上運行。這樣的特性使得虛擬機適用於如以太坊這樣的分佈式網絡。 EVM可以模擬在物理CPU上完成的功能,並實現以太坊網絡上的大部分功能。
EVM具有如下特點:
確定的:一個確定的程序能夠向同一組輸入提供相同的輸出,而與它執行相同代碼的次數無關。在以太坊網絡中,DAPP一次能夠處理數百萬美元的交易,不同的用戶需要知道代碼在執行的每個階段是如何反應的。
隔離的:智能合約需要在完全隔離的環境中運行,以確保如果智能合約發生黑客攻擊或bug,而不會影響底層協議的其餘部分。
可終止的:以太坊智能合約是圖靈完備的。因此,只要有足夠的時間和資源,它理論上能夠解決任何問題。智能合約應該附帶終止機制,因為很難確定合約是否會在給定的時間限制內完成所有操作。以太坊使用gas限額來終止超出執行額度的智能合約。
EVM的功能:
它是以太坊網絡的去中心化式處理單元,每個交互、交易和智能合約執行都只能在這裡發生。獲取並執行指令,然後通過給定的指令分派器對操作數進行解碼。負責所有數據結構,如操作數、數據處理和指令。跟踪網絡組件,如存儲狀態、塊信息和世界狀態。負責為以太坊網絡上不同的智能合約創建運行環境。
EVM面臨的挑戰:
EVM的速度並不快,它可以處理很多不同的操作,但是它的操作碼規範還沒有發展到可以處理不同的需求。支持的語言有限。
什麼是WASM(WebAssembly)?
WASM是一種可以在現代瀏覽器上執行的新型代碼,此新代碼由萬維網聯盟(W3C)創建和定義。本質上,WASM(通常稱為以太坊2.0)具有EVM的所有功能,並附帶額外功能。
為網絡而構建:
WASM由來自谷歌、微軟和蘋果等大型科技公司的各種工程師所組成的開發團隊構建。因此,這些工程師得確保WASM與他們的引擎和協議相兼容。
設計時考慮到一系列特定的目標:
快速、高效、可移植:通過利用常見的硬件能力,WASM代碼在不同平台上能夠以接近本地速度運行。
可讀、可調試:WASM是一門低階語言,但是它有一種人類可讀的文本格式,這允許通過人工來寫代碼、看代碼以及調試代碼。
保持安全:WASM被限制運行在一個安全的沙箱執行環境中。像其他網絡代碼一樣,它遵循瀏覽器的同源策略和授權策略。
不破壞網絡:WASM的設計原則是與其他網絡技術和諧共處並保持向後兼容。
EVM vs WASM
速度
簡單地說,EVM是一個萬事通,但不是一個大師。 EVM如何處理編譯就是一個很好的例子。本機引擎難以找到執行某些操作的最佳路徑,最終影響EVM的總體吞吐量。 EVM只能處理256位字節碼,這意味著小於256位的字節碼必須先轉換為256位格式,然後才能反饋給EVM。 EVM的可擴展性問題很明顯。
WASM直接轉換為編譯代碼,這使它能夠更快地加載,同時增加每個塊處理的交易數。
預編譯
EVM依賴於預編譯(預編譯合約)。當發出預編譯調用時,EVM將執行預定義的本機代碼,然後顯示結果。這些預編譯是特定於某個協議的基本操作,如簽名方案和哈希。儘管預編譯可以在不消耗大量gas的情況下提高密碼計算的效率,但也會帶來一些問題。新預編譯的引入通常要求網絡進行系統範圍的硬分叉。
WASM消除了以太坊對預編譯合約的依賴。因為WASM非常高效,開發者可以創建高效快速的智能合約,而不用擔心潛在的硬分叉。
靈活性/互操作性
WASM支持更多的語言,並且提供了比EVM更廣泛的工具集。 WASM支持傳統的語言,如Rust、C和C++。 WASM還受到本機JavaScript引擎的支持,如Google的V8引擎(Node.js和基於Chromium的瀏覽器)、Microsoft的Chakra引擎(Microsoft Edge)、Mozilla的Spidermonkey引擎(Thunderbird和Firefox)。
EVM與WASM互相調用?
如上所述,EVM和WASM具有不同的特點,如果能實現兩者的相互調用,將對開發者更為友好。
萬向區塊鏈推出的“萬納鏈”,支持EVM虛擬機和WASM虛擬機的相互調用,同時對WASM進行了創新優化。萬納鏈支持WASM虛擬機意味著開發智能合約不再局限於Solidity一門語言,同時可以使用多種高級語⾔,例如:C/C++/Rust等來編寫智能合約,最後編譯成WASM字節碼就可以在萬納鏈上運行,極大地降低了入門門檻和開發成本,同時也提高了智能合約的安全性。
萬納鏈支持隱私計算,隱私合約同樣支持高級語言開發,編譯成「llvm ir」中間語言執行。隱私合約的輸入數據保存在數據節點本地,由數據節點在鏈下以安全多方計算方式進行隱私計算,並提交計算結果到鏈上。
