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

相关文章
相关标签/搜索