请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
发布
  • QQ空间
  • 回复
  • 收藏

智能合约 | 合约的执行过程及5条安全性原则

2021-3-5 17:32

1

智能合约介绍

智能合约 | 合约的执行过程及5条安全性原则



智能合约 | 合约的执行过程及5条安全性原则


如图所示,在区块链系统里,智能合约是存储在区块链上的一段代码,被写在合约的账户里,并且实现特定业务操作,可以被触发执行。

智能合约的代码不能被修改,否则将会造成被滥用修改的风险。

智能合约使用交易触发执行,并且在每个全节点上都会被执行,如果单个节点作恶,那么该节点的数据失效,不会影响其他节点,这让智能合约的执行具有一致性,且无法作恶,可以利用去中心化的特性保证业务规则的正确性。


智能合约 | 合约的执行过程及5条安全性原则


如图所示,智能合约的执行条件是,当其他账户给这个合约账户转账(BU原生资产或者asset资产)的时候触发执行。

智能合约的代码被加载到ChainVM中,ChainVM执行代码,最终将执行的结果写入区块链里,而这个过程将会在所有的节点中执行和存储。

智能合约 | 合约的执行过程及5条安全性原则

2


合约执行过程

智能合约 | 合约的执行过程及5条安全性原则


ChainVM基于Chrome V8引擎和WebAssembly技术实现并进行改进和优化,可以更好地满足区块链系统生态友好性的需求。

Chrome V8是由Google开发的开源JavaScript引擎,可将JavaScript代码直接翻译成二进制机器码在物理机上执行,执行效率高;WebAssembly是一种可移植、加载高效、与平台无关的字节码格式,能在平台上以接近原生的速度执行程序,是一种全新的Web标准,由Google、苹果、微软、Mozilla等几大公司同时支持和制定。

这两项技术可以为ChainVM提供良好的基础功能支撑,但是无法直接应用到区块链系统场景,主要应用在合约执行安全、接口权限、合约间交互、异常处理、语法检查等方面。

为了便于描述,本节将围绕一个支持JavaScript语言的Chrome V8引擎来阐述ChainVM的实现原理。


智能合约 | 合约的执行过程及5条安全性原则


如图所示,智能合约的执行过程如下:

(1)用户A发起签名交易,目标账户为B,B为一个智能合约账户,里面存储着智能合约代码。假定此时交易被广播且被打包,节点需要将该交易存储在区块链上,需要对该交易进行回放和演算。

(2)客户端(定义其使用C++代码实现)调用Chrome V8引擎,并把合约代码加载到引擎里执行,在执行的过程中如果遇到内置的接口,就会产生回调函数,调用客户端代码,此时实现了双向交互功能。

(3)合约在执行过程中,有可能产生新的交易,如合约账户B在合约内部通过接口对账户C进行转账操作,如果账户C仅是普通账户,那么只需进行普通转账操作即可;如果账户C是一个合约账户,那么将会再次触发新的合约形成一次递归调用。

合约调用合约的递归深度为3层,超过3层将会出错并回退整个交易,这是出于合约实现的复杂度和区块链底层的安全性来考虑与设计的。

智能合约 | 合约的执行过程及5条安全性原则


3


智能合约的安全

智能合约 | 合约的执行过程及5条安全性原则


智能合约的执行需要考虑更多的安全性,要注意以下几个原则。

1. 增加合约执行的安全性校验

智能合约在执行过程中可能出现安全问题,比如CPU、内存、堆栈等资源过度消耗和节点执行结果不一致等。为了便于描述,定义如下变量:合约执行步数为Step,合约栈使用量为Stack,合约堆使用量为Heap,合约执行时间为Time,合约字节数为Byte,合约间调用深度为Deep。

(1)如果合约字节数超过Max(Byte),那么校验参数失败,无法交易。

(2)如果合约执行步数超过Max(Step),那么抛出异常。

(3)如果合约栈使用量超过Max(Stack),那么抛出异常。

(4)如果合约堆使用量超过Max(Heap),那么抛出异常。

(5)如果合约执行时间超过Max(Time),那么抛出异常。

(6)如果合约间调用深度超过Max(Deep),那么执行失败。

(7)如果合约抛出异常,那么整个交易失败。

(8)当虚拟机加载智能合约执行环境时,删除不确定因素函数,如随机函数、时间函数。

2. 明确接口权限

智能合约的入口函数需要进行权限限制,目的是防止开发者在入口函数中调用未经授权的内置函数,破坏合约执行内容。ChainVM优化如下:

首先,定义内置函数权限,如只读权限或者可写权限等;

然后,定义合约模板的入口函数,包括main、init、query,三个入口函数拥有不同的权限,同时对入口函数和内置函数进行如下约定:

(1)所有内置函数都拥有固定的只读或者可写权限。

(2)合约入口函数拥有固定的只读和可写权限,main、init函数拥有可写权限,query函数拥有只读权限。

(3)只读入口函数只能调用只读的内置函数,否则会执行异常。

(4)可写入口函数可以调用只读和可写的内置函数。

3. 增加合约间的交互操作

实际的应用场景具有合约交互需求,允许合约之间进行相互调用操作,例如,合约A调用合约B的查询接口,或者合约A通过交易的方式触发合约B的执行等。

4. 增强异常处理机制

当合约在运行中捕获到异常时,将会进行异常处理,参考6.3.4节。

5. 语法安全检查

区块链系统智能合约在编写期间同步进行语法安全检查,以保证代码的质量。如针对JavaScript语言有语法约束,参考6.3.2节。

此外,ChainVM提供多语言(如JavaScript、C、C++、Python、Go等)支持,可跨平台运行,底层接口丰富、可扩展,同时拥有独立的沙箱环境,确保区块链系统智能合约在隔离环境中安全执行。

添加新手交流群:币种分析、每日早晚盘分析

添加助理微信,一对一亲自指导:YoYo8abc

相关新闻