WASM(WebAssembly)不是一種語言,而是一種新的位元組碼格式,是一種全新的底層二進位制語法,經編譯器編譯後的指令程式碼。其體積小、可移植、載入快併相容WEB的全新格式,是一種以安全有效的方式執行可移植程式的新技術。
早期WASM主要的應用領域在web應用,但隨著其不斷地發展,越來越多的專案將其作為智慧合約的最終格式,使用對應的VM載入執行,如wavm、wagon,位元組碼的具體解析與執行則在核心虛擬機器模組中進行。
虛擬機器(VM Virtual Machine)指的是,透過軟體模擬的、具備完整硬體系統功能並執行在隔離環境下的完整計算機系統,比如作業系統虛擬化的Vmware虛擬機器,軟體執行環境的JVM虛擬機器等。而區塊鏈中的虛擬機器是建立在區塊鏈上的程式碼執行環境,其主要作用是處理區塊鏈的智慧合約。
WASM 的引入背景
PlatON為何要在引用EVM虛擬機器的同時引入WASM虛擬機器?
隨著區塊鏈應用對虛擬機器和智慧合約的需求增多,區塊鏈虛擬機器技術也在逐漸完善。目前,基於WASM的虛擬機器在速度和效能方面都有了顯著提升,支援C、C++等多種程式語言,開發門檻更低。
為了讓區塊鏈應用開發更便捷,PlatON推出了雙虛擬機器引擎,同時支援WASM虛擬機器和EVM虛擬機器。原本在Ethereum等支援EVM的主鏈上執行的區塊鏈應用,如果由於效能等原因需要使用PlatON,可以輕鬆實現無縫遷移。
EVM在本質上是指令碼程式,需要由編譯程式翻譯成指令後執行,而不是由本地機器的CPU讀取指令執行,這樣的執行方式在效率上是非常低的。同時EVM在架構和使用上也存在一些問題,例如:
強耦合,難擴充套件:鏈本身與EVM內部之間存在相互依賴的關係;
缺少標準庫:solidity中基本沒有標準的庫,必須透過自己編碼才能實現相應功能,如:字串比較;
與EVM相比,WASM作為一種中間程式碼,擁有更高更快的智慧合約執行速度,可以使用任何熟悉的程式語言進行開發(C/C++/JAVA),同時存在諸多特點:
效能高效:採用二進位制編碼,在程式執行過程中效能優越;
多語言支援:可使用C/C++/RUST/Go等多種語言編寫合約後編譯出位元組碼;
豐富的標準庫:不同語言有附帶豐富的標準庫可供使用;
同時,考慮到越來越多的專案使用WASM,包括引入EVM虛擬機器的Ethereum也在開始轉向WASM。WASM越發流行,其社羣生態體系也越來越完善。
為讓已經存在的一些WASM應用或者一些熟悉WASM的開發者更好地切換到PlatON生態中來,PlatON經綜合考慮後決定,在已存在EVM虛擬機器的同時引入WASM虛擬機器,實現雙虛擬機器支援。
PlatON引入WASM的優勢
PlatON在決定引入虛擬機器之初就考慮到了EVM的一些弊端,在初步引入EVM虛擬機器之後馬上就開始了對於WASM虛擬機器的相關方案設計及開發,在拓展性、穩定性、執行效率等方面不斷地創新和改進。主要功能點包含:
提供一整套完備的合約開發套件PlatON-CDT[1];
更小的合約位元組碼,使用CDT套件編譯出來的WASM二進位制碼,大小相比其他專案減少 1/2;
提供可用於進行快速開發的智慧合約框架PlatON-Truffle[2];
擴充套件對string, address, hash, u128等資料型別的支援;
增加了Gas機制。每執行一條合約指令,都會扣除相應的Gas,確保合約指令在執行有限次運算後,一定可以終止執行,有效防止程式碼無限迴圈攻擊;
增加了合約巢狀呼叫功能,可以立即獲取到呼叫另外一個合約方法的結果,使得合約之間的呼叫像函式呼叫一樣方便;
支援自動擴充套件線性記憶體,快取wasm module,最佳化合約的載入效能,從而極大提升了虛擬機器執行效能;
基於對WASM語言的應用及最佳化改造,PlatON的智慧合約模組具備更高的相容性與效能,同時擁有更強的安全性與靈活性。在成功整合WASM,成功實現雙虛擬機器支援之後,PlatON在同等環境下進行了EVM和WASM效能對比測試。
測試結果表明,基於WASM虛擬機器的執行效率遠遠高於EVM虛擬機器。EVM使用了256位的機器碼在很大程度上影響了執行的效能,同時增大了記憶體的佔用率。
PlatON在引用WASM虛擬機器實現雙虛機支援後,主要具備如下優勢:
主流的WASM智慧合約可以方便快捷地切入到PlatON網路;
降低合約開發者的門檻,學習成本低;
使用其他基於WASM的網路的開發者可以無縫切換,上手快;
智慧合約的執行效率更高效;
豐富的開發庫,提升智慧合約開發效率;
WASM 的執行機理
WASM虛擬機器是一個完全獨立的沙盒,合約程式碼對外完全隔離並在虛擬機器內部執行,執行在虛擬機器內部的程式碼不能接觸到網路、檔案系統或其它程序。同時,為了防止虛擬機器執行過多的計算指令,陷入死迴圈等情況,引入了燃料(Gas)機制+超時機制雙重控制。
雙虛擬機器工作原理
如圖所示:使用solidity/c/c++等語言編寫的智慧合約,經過編譯器編譯成為位元組碼,同時不同型別的合約包含了不同的位元組碼特徵,PlatON雙虛擬機器引擎透過對特徵的識別,可以判斷該段位元組碼需要使用哪種虛擬機器進行執行,選擇對應虛擬機器後載入位元組碼,解析位元組碼,然後根據指令去執行對應的函式功能。
智慧合約使用流程
如圖所示,可以使用c++編寫基於WASM的智慧合約,也可以使用solidity編寫屬於EVM的智慧合約,然後透過工具套件編譯生成位元組碼等資訊,再透過SDK開發工具集透過交易的方式傳送到PlatON網路節點中。這樣一個與合約相關的交易流程就完成了。
PlatON提供了完備的WASM合約開發套件PlatON-CDT,使用該套件,可以快速地編寫出WASM虛擬機器的智慧合約,該套件提供了多種資料型別的封裝,簡潔的API介面,同時配套詳細的介面文件。同時,還可以使用智慧合約測試框架PlatON-Truffle進行開發、編譯、部署、合約介面測試等功能,方便開發者開發與測試合約。
PlatON提供了合約SDK[3]自動生成工具,能自動生成後端系統呼叫合約介面的程式碼,可以遮蔽呼叫合約時的引數編解碼細節等,幫助開發者快速整合合約業務到系統中,從而可以投入更多的精力到智慧合約業務邏輯的開發中。
總結
本文主要探討了PlatON支援WASM虛擬機器的背景及初衷,同時介紹了關於引入WASM後PlatON的獨有優勢,還對WASM虛擬機器的基本原理及執行機制做了簡單說明。希望能對參與PlatON的社羣人員、相關的區塊鏈從業者提供一些可借鑑的經驗。WASM從最初的不被看好到現在被廣泛使用,我們可以肯定未來它將作為分散式應用開發的基礎層被運用到越來越多的專案之中。