563  
如何突破智能合约性能极限
作者: 潘昊 于 2020年03月31日 发布在分类 / 区块链基础知识 / 底层框架资料 / XuperChain 下,并于 2020年03月31日 编辑

关注区块链的人,经常会听到有关“智能合约”的讨论。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转,是区块链技术的关键。百度超级链在智能合约上也进行了深入研发,实现高性能,且支持多种语言编写,大大提高合约使用效率。


本期超级链学院线上微课堂就带你突破以往智能合约的性能极限!明星讲师超哥将主要围绕以下几点展开: 

1.超级链智能合约有哪些特点?


2.超级链智能合约与以太坊的异同点?


3.超级链智能合约执行的运行模式是怎样的?


4.超级链智能合约如何做到高性能?


5.超级链智能合约能为开发者提供的能力?

 

快来继续往下看吧!

 

Q1:什么是智能合约?

智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。

 

Q2:超级链的智能合约有什么特点

1.多语言支持,支持C++/Go等高级语言。


2.高性能,独创的XuperModel数据模型来最大化合约并行��行能力。


3.安全,支持合约资源审计以及屏蔽操作系统接口,保证合约安全。


4.可扩展性,可以扩展合约的多语言以及链上资源的访问能力。


5.隔离性, 不同合约调用之间互不影响。


确定性,同样的参数和环境下得到一致的结果。

 

Q3:超级链智能合约跟hyperledger fabric合约的异同点

相同点:

1.超级链和fabric的智能合约都使用了两阶段提交的预执行模型,最大化的并发合约的执行


2.超级链和fabric都可以使用高级语言,如go等编写智能合约,降低合约的开发门槛。


不同点:

1.fabric的合约是运行在docker的常驻进程,一个不规范的合约会导致多次合约调用互相影响,如全局变量的使用等。超级链的每次合约调用都会启动一个单独的合约上下文,结合ModelCache,彻底做到多次合约调用相互隔离,互不影响。


2.fabric的合约没有对合约的资源做限制,理论上合约里面的一个死循环会导致合约无法顺利执行。超级链的智能合约会设置资源的上限(cpu,内存等),一旦合约的执行超过上限会自动停止,杜绝死循环的情况发生。


3.合约里面的代码还是会访问系统的一些资源,比如文件系统,随机数等,都会导致合约的不确定性.超级链的智能合约对任何访问系统资源的系统调用都做了隔离,是一个行为完全可控的沙盒环境,不会出现不确定的行为。

 

Q4:超级链智能合约跟以太坊合约的异同点

相同点:

1.超级链和以太坊的智能合约都具有确定性,即相同的输入得到相同的输出。


2.超级链和以太坊的智能合约都支持合约的资源审计,从而保证合约安全。


不同点:

1.目前以太坊的合约虚拟机是EVM,里面的大部分指令都是256bit的,导致性能比较低。超级链使用的合约指令是WASM,是运行于浏览器的汇编指令,有Google,Apple,Molliza, Microsoft四大公司联合贡献,指令接近机器汇编,性能很高。


2.目前运行于以太坊的语言主要是Sodility,通过编译成EVM的字节码从而运行在以太坊上,然而由于EVM的很多指令跟以太坊的功能高度耦合,导致通用编程语言很难编译到EVM指令上,因此以太坊的多语言支持比较弱。超级链得益于WASM指令,很多高级语言都可以编译到WASM上,如C++,Go,Rust等,另外超级链使用了XuperBridge来扩展合约访问链上的能力,跟指令解耦,有更好的扩展能力。

 

Q5:超级链智能合约是怎么运行WASM指令的

超级链合约执行有两种运行模式,

1.一种是解释执行,这种模式在读取合约代码之后,首先把合约代码翻译成一种内存数据结构,之后根据指令类型逐条执行,类比传统的解释型语言的解释器。这种模式的优点是部署合约比较快,缺点是性能比较慢一些。


2.另一种是编译执行,这种模式在读取合约代码之后,首先把合约翻译成native cpu指令,如x86指令,之后交给cpu来运行编译之后的指令。这种模式的优点是运行速度很快,缺点是由于需要预先编译,部署速度会比较慢,但编译是一次性动作,后续执行直接复用编译结果。

 

Q6:超级链智能合约是如何支持资源统计的

主要分三步:

第一步:分析合约的字节码,根据字节码分函数构建出一个控制流图。什么是控制流图呢?我们大体上把合约的指令按照是否会引起跳转分为两类,一类是顺序执行的指令,如add, load等;一类是loop,if等会引起跳转的指令,而控制流图就是一个以控制指令为节点的能表现合约的指令流向的一个图。


第二步,有了控制流图我们就可以插入资源检查的指令了,我们把所有的控制指令的子指令序列看做一个链表,如下面代码所示的if语句的子block

if (flag) {

    n += 1;

    sum += n;

}

由于非跳转指令是顺序执行的,我们只需要在链表的开头加上检查资源的指令就可以了,不需要在每个指令后面都加上资源检查。


第三步,在翻译为机器码或者解释器解释到资源检查指令的时候,根据当前已经累加的资源counter比对limit值,如果超出则直接终止虚拟机的执行,否则继续执行。

 

Q7:超级链智能合约是怎么通过XuperBridge来扩展链上能力的

XuperBridge设计了一套标准接口以及序列化方法,合约虚拟机只需要把不同语言的不同访问方式统一为

XuperBridge的接口形式就可以访问链上资源,在形式上类似我们平时用的RPC调用,当我们需要扩展接口的时候只需要增加新的接口方法就行,超级链正是通过这种形式支持了多种虚拟机,如WASM,Docker,EVM等,而不需要为每一种虚拟机设计一种接口来访问链上资源。

 

Q8:超级链智能合约是怎么做到高性能的

超级链合约主要从以下几个方面来做到高性能:

1.合约指令选取的是WASM,WASM自身本身就比较贴近硬件底层,因此性能比较好。


2.合约虚拟机支持翻译合约指令到native指令,运行速度接近native程序。


3.合约的执行分两步,第一步是预执行,每个合约运行的时候都有一个唯一的上下文来隔离不同的合约运行,上下文里面会收集合约执行过程中对数据的读写结果,执行完毕后会生成一个对数据修改的读写集;第二步,把读写集上链打包成交易上链,这个时候通过XuperModel会对读写集进行冲突检测,如果两个读写集没有任何冲突则直接通过,有冲突的则会失败。正是通过这种方式来最大化合约的并行执行和校验能力。

 

Q9:基于超级链智能合约能做什么

目前的超级链智能合约提供了如下能力:

· 设置合约方法的ACL以控制不同的合约方法访问权限。

· 以KV的形式存储数据到链上和以及查询链上数据。

· 跨合约调用的能力,不同合约之间可以直接互通调用。

· 转账给合约以及从合约转出

· 查询历史交易以及区块

后续会逐渐加上一些新的功能,如SQL和文件系统的接口来丰富合约的功能

 

Q10:怎么部署一个超级链的智能合约

以超级链example目录下的ERC20合约为例,需要以下步骤:

1. 编译合约,进入到源代码的contractsdk/cpp目录,执行build.sh脚本


2.准备合约账户,调用xchain-cli account new --account 1111111111111111 来创建合约账号,合约必须部署到合约账号下


3.保证合约账号有充足的token,因此我们转给合约账户一些token xchain-cli transfer --to XC1111111111111111@xuper --amount 100000000


4.部署合约到刚才创建的合约账号下 xchain-cli wasm deploy $path_to_contract/erc20.wasm -n erc20 --account XC1111111111111111@xuper -a '{"totalSupply":"10000000"}'

至此一个ERC20合约已经部署上链,后续可以调用合约的相关接口来使用合约,具体文档见https://xuperchain.readthedocs.io/zh/latest/advanced_usage/create_contracts.html

 

需要注意事项如下:

1.不同语言的合约需要在部署的时候需要指明各自的runtime,否则会部署失败


2.合约账号需要充足的token来部署合约

 

Q11:哪里能找到更多的超级链智能合约例子

超级链开源代码里面包含了一些使用合约的例子,涵盖了ERC20,ERC721,存证等合约例子,后续会有更多的示例给大家。

 

分享结束后,群里涌现出的精彩问题,摘取部分分享给各位。

问:是不是所有区块链应用都必须要有智能合约?

答:自从以太坊发明了在区块链上运行智能合约后,智能合约几乎已经成为了新链的标配。因为有了智能合约,开发者就可以表达复杂的业务逻辑,在之前这些逻辑可能都是链下行为,不够“区块链”,可以说智能合约让区块链进入了2.0。

 

问:智能合约中有对关联数据的直接查询吗。还是说通过关键字段再查另外数据?因为c++语言是可以有主键设置类似的,但是go语言就没有这样的设置。

答:目前智能合约里面的数据是KV的形式存储的,可以认为唯一的主键就是key,c++中包装了一个table的数据接口来辅助生成多索引,go里面目前还没有这样的数据结构。后面可以期待一下超级链合约支持SQL。

 

问:如果有三个硬盘存储数据,不同的数据业务可以通过指定方式放到指定硬盘吗?

答:目前超级链支持多盘部署,但按照业务划分硬盘暂时不支持。

问:请问智能合约什么时候可以支持java语言编写?

答:Java语言的支持在计划中,可能先以native合约的形式提供,WASM的支持在调研中。

问:可以跨智能合约调用吗?如果智能合约不在同一条链上也可以调用吗?

答:多个智能合约之间可以互相调用,前提是得有对应的权限。但是目前超级链的智能合约只能��一个链上互通,多链技术正在研发中。

 


问:目前,超级链智能合约支持哪些资源消耗统计啊?它们与gas的兑换比例是如何衡量的?

答:支持资源消耗统计的有:CPU,内存,磁盘等;具体兑换比例参照源码,当然开发者也可以通过提案投票的方式来更改这些参数。


原文链接:https://xuperchain.baidu.com/n/news/0f549ee3c9a45e35060d10a98bcce086




 推荐知识

 历史版本

修改日期 修改人 备注
2020-03-31 20:43:37[当前版本] 潘昊 修改标题
2020-03-31 20:36:20 潘昊 调整分类
2020-03-31 20:35:41 潘昊 创建版本

区块链服务网络发展联盟