Eos的Wasm智能合約的侷限性

官方只支持用C++寫智能合約

用C++寫智能合約門檻太高,會把許多開發者擋在門外,C++的複雜性也會讓智能合約的設計變得困難。編程

Wasm智能合約的效率並非最優

因爲C++最終也是編譯成wasm字節碼並在虛擬機中運行,效率並不能達到和編譯成native code同樣高。Wasm能夠在三種模式下運行:binaryen, wavm和wabt。其中,binaryen的運行模式是字節碼的方式,運行速度最慢。wavm模式是JIT運行方式,速度最快,可是因爲須要預編譯,加載速度實在是太慢了,並不能爲Eos的主鏈所用。wabt是最近才支持的運行模式,是基於棧的虛擬機,運行效率會比binaryen運行效率高三倍,算是有了比較大的優化,可是執行的效率和編譯成native code後運行仍然仍是有必定的差距的。異步

C++代碼編譯後的字節碼過大

C++智能合約最終會被編譯成Wasm字節碼。因爲編譯的時候會把全部用到的庫函數的代碼都編譯進去,形成C++智能合約編譯後的wasm字節碼過大。以很簡單的eosio.token智能合約爲例,編譯後的代碼也在20K左右。智能合約之間其實包含了大量的重複的代碼,這在必定程度上會形成鏈上存儲空間的浪費,而且也會增長開發的費用。函數

不支持直接調用其它智能合約的代碼

目前,Eos能夠經過如下三個函數和其它智能合約進行交互。優化

void send_inline(char *serialized_action, size_t size); void send_context_free_inline(char *serialized_action, size_t size); void send_deferred(const uint128_t& sender_id, account_name payer, const char *serialized_transaction, size_t size, uint32_t replace_existing = 0); 

可是這三個函數的都是異步的,調用者返回以後纔會獲得執行,這有時會增長智能合約編程的複雜度。那麼,爲何Eos不支持直接調用一個智能合約的代碼呢?這和Wasm的設計是有關係的。目前,Wasm的虛擬機並不支持直接運行多個實例,也就是說Eos的Wasm智能合約沒法作到直接從一個智能合約去調用另外一個智能合約的代碼。這也是從此Eos的團隊必須解決的一個問題。ui

相關文章
相關標籤/搜索