官方只支持用C++寫智能合約
用C++寫智能合約門檻過高璧亮,會把許多開發(fā)者擋在門外渐扮,C++的復雜性也會讓智能合約的設計變得困難稻爬。
Wasm智能合約的效率并不是最優(yōu)
由于C++最終也是編譯成wasm字節(jié)碼并在虛擬機中運行剃毒,效率并不能達到和編譯成native code一樣高樊拓。Wasm可以在三種模式下運行:binaryen, wavm和wabt餐塘。其中妥衣,binaryen的運行模式是字節(jié)碼的方式,運行速度最慢。wavm模式是JIT運行方式税手,速度最快蜂筹,但是由于需要預編譯,加載速度實在是太慢了芦倒,并不能為Eos的主鏈所用艺挪。wabt是最近才支持的運行模式,是基于棧的虛擬機兵扬,運行效率會比binaryen運行效率高三倍麻裳,算是有了比較大的優(yōu)化,但是執(zhí)行的效率和編譯成native code后運行仍然還是有一定的差距的器钟。
C++代碼編譯后的字節(jié)碼過大
C++智能合約最終會被編譯成Wasm字節(jié)碼津坑。由于編譯的時候會把所有用到的庫函數(shù)的代碼都編譯進去,造成C++智能合約編譯后的wasm字節(jié)碼過大傲霸。以很簡單的eosio.token智能合約為例疆瑰,編譯后的代碼也在20K左右。智能合約之間其實包含了大量的重復的代碼狞谱,這在一定程度上會造成鏈上存儲空間的浪費乃摹,并且也會增加開發(fā)的費用禁漓。
不支持直接調(diào)用其它智能合約的代碼
目前跟衅,Eos可以通過以下三個函數(shù)和其它智能合約進行交互。
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);
但是這三個函數(shù)的都是異步的播歼,調(diào)用者返回之后才會得到執(zhí)行伶跷,這有時會增加智能合約編程的復雜度。那么秘狞,為什么Eos不支持直接調(diào)用一個智能合約的代碼呢叭莫?這和Wasm的設計是有關系的。目前烁试,Wasm的虛擬機并不支持直接運行多個實例雇初,也就是說Eos的Wasm智能合約無法做到直接從一個智能合約去調(diào)用另一個智能合約的代碼。這也是今后Eos的團隊必須解決的一個問題减响。