#冬季生活潘趣酒季#
智能合同(简称合同)开发是区块链开发的重要组成部分。目前区块链行业大部分链条都是将高级语言编写的合约源代码编译成低端字节码,然后在低端字节码匹配的虚拟机中运行智能合约(即执行低端字节码)。
但是支持低端字节码转换的高级语言种类有限,即采用上述契约执行方式时可选择的高级语言种类有限,无法满足各类高级语言开发者开发智能契约的需求。
区块链交易(简称交易)可以用来记录各种事件和/或数据。在一些实施例中,交易记录的事件可以包括新节点的加入、节点的退出、资金转移等中的一个或多个。在一些实施例中,交易记录的数据可以包括医疗信息、电子合同、电子凭证、电子订单、数字指纹等中的一个或多个。
预期的代码可以由事务触发并执行,也可以称为事务的执行,区块链节点可以是事务的执行者。仅作为示例,用于记录转账行为的交易可以触发双方账户余额的更新,用于存放凭证数据的交易可以触发数据写入区块链数据,用于查询数据的交易可以触发区块链数据的查询,等等。
在一些实施例中,交易的执行可以包括智能合约的调用。智能合约(Intelligent contract,简称contract)可以指分布存储在区块链系统中各个节点上,在一定条件下可以自动执行的数字协议。智能合约的本质是运行在区块链网络中的一段代码,用来完成用户给定的业务逻辑。
随着区块链的不断发展,其应用场景不断延伸,越来越多的开发者加入到区块链开发中。在区块链开发中,智能合约开发非常重要。目前区块链行业大部分链条都是将高级语言编写的契约源代码编译成低端字节码,然后在匹配低端字节码的虚拟机中运行智能契约(即执行低端字节码)。比如以太坊的合约开发者,通常选择用Solidity语言编写合约源代码。相应地,用Solidity语言编写的合同源代码被编译成evm字节码(简称evm字节码)后,evm字节码就可以在EVM虚拟机上执行了。再比如EOS(企业操作系统)的合约开发者大多选择用C语言编写合约源代码。相应地,用C语言编写的契约源代码被编译成wasm格式的字节码(简称wasm字节码)后,wasm字节码就可以在WASM(Web Assembly)虚拟机中执行了。
虚拟机的一些特性可以在一定程度上保证契约安全(比如过滤代码中的不安全语句)。合同安全包括但不限于不允许合同获取未经授权的数据,如访问本地磁盘文件、访问网络资源等。和/或不允许契约行为损害宿主环境(操作系统)的安全性,如不允许智能契约获取一些影响操作系统正常运行的调用权限(如fork、kill、chmod、ptrace等。).而能够转换成低端字节码的高级语言类型有限,使得上述契约执行模式下可用的高级语言类型有限,无法满足各类高级语言开发者开发智能契约的需求。
虽然也有区块链架构(比如Fabric)支持智能合约的原生执行,但是对于合约的操作权限没有限制,以保证合约的安全性。例如,一些联盟链架构仅依靠授权成员的参与来确保合同安全。在没有对契约的操作权限进行限制的情况下,如果存在一些安全漏洞,而恰好一些“邪恶”的智能契约利用了这些安全漏洞,就很可能导致隐私数据的泄露、节点的操作不可靠等问题。
需要注意的是,原生执行模式,也称传统/常规执行模式,是指用高级语言编写的源代码编译成原生执行代码(不同于低端字节码)来执行。比如对于Java语言,原生执行就是把Java语言写的源代码编译成类格式的字节码来执行。再比如,对于C语言,原生执行模式是指将C语言编写的源代码编译成与目标CPU架构相匹配的字节码。可以理解为,这里的目标CPU架构是指用来执行契约的CPU架构。每种高级语言对应一个本机可执行代码,而有限数量的高级语言支持将源代码转换成统一格式的低端字节码。按照原生执行方式执行的智能合约代码(简称原生智能合约),可以满足各类高级语言开发者开发智能合约的需求。另外,与低端字节码相比,原生执行代码的可调试性更强。
在一些实施例中,为了支持本地智能合同的执行,容器可以被用作本地智能合同的执行环境。容器具有资源占用少、部署快、易于移植和隔离等优点。每个事务的契约执行可以与容器实例建立一对一的关系。可以理解,容器实例指的是特定的单个容器。这样,容器的隔离可以用来隔离不同事务的契约执行。
然而,常见的容器(如Docker,Inc .开发的Docker container(简称Docker ))与主机环境(操作系统)共享内核,“邪恶的”智能合约可以利用内核漏洞攻击主机环境,窃取隐私数据,甚至破坏操作系统。需要注意的是,内核是操作系统(OS)的核心,负责管理操作系统的进程、内存、设备驱动、文件和网络系统,决定了操作系统的性能和稳定性。
有鉴于此,本说明书的实施例提供了一种通过安全容器执行原生智能合约的方法和系统,能够满足各种语言开发者开发智能合约的需求,保证代码可调试性高,保证智能合约的安全性。
可以理解,与普通容器(如Docker)不同,安全容器是指不与主机环境共享内核的容器。仅作为示例,安全容器可以包括由开源社区开发的kat。
a容器(具体信息可参见https://katacontainers.io/)、由谷歌开发的gVisor容器、由亚马逊开发的Firecracker等中的一种或多种。图1是根据本说明书一些实施例所示的智能合约执行方法的流程示意图。
所述方法可以包括由运行在宿主环境中的区块链节点进程实现的节点流程,以及由运行在安全容器中的进程实现的合约流程。其中,区块链节点进程可指正在运行的区块链程序。在一些实施例中,宿主环境和安全容器可以集成于单个设备(宿主机),也可以分布在多个设备上,例如可以将安全容器运行在云服务器上。在一些实施例中,宿主环境和安全容器之间可通过宿主环境本身具备的网络模块建立通信连接。
如图1所示,所述节点流程可以包括:接收交易;响应于接收到交易,在安全容器中创建进程,以执行所述交易调用的智能合约的原生执行代码;获得所述交易的执行结果(也可称作“收据”)。所述合约流程可以包括在安全容器中执行所述智能合约的原生执行代码。
可以理解,区块链节点进程/安全容器中可运行多个进程以实现相应流程。
在一些实施例中,响应于接收到交易,区块链节点进程可以首先为合约的执行创建一个安全容器,然后在安全容器中创建守护进程。可选地,区块链节点进程也可以在已创建的安全容器中创建守护进程。可选地,区块链节点进程也可以直接使用已创建的守护进程。该守护进程可以用于管理合约执行进程的生命周期,包括负责合约执行进程的创建、销毁、调用等。进而,守护进程可在安全容器中创建合约执行进程,从区块链节点进程获取交易调用的智能合约的原生执行代码,并将所述原生执行代码传递至所述合约执行进程。其中,合约执行进程可用于执行交易调用的智能合约的原生执行代码。在一些实施例中,合约执行可包括设置智能合约中变量的值。具体地,合约执行进程可以从所述区块链节点进程获取智能合约中变量的值,设置所述变量的值,并将设置后的所述变量的值返回给所述区块链节点进程,以使区块链节点进程获得交易的执行结果。其中,交易中可指明要设置的变量的名称(key),区块链节点进程可根据该变量的名称查询该变量的值(value)。可以理解,同一变量的key和value可以键值对形式存储以便查询。
可以理解,本说明书的一个或多个实施例中的某些特征、结构或特点可以进行适当的组合。下面结合图2进行示例。
----pic---
图2是根据本说明书一些实施例所示的智能合约执行方法的交互示意图。
如图2所示,区块链节点程序进程可以包括容器接口、数据库(DB)、容器管理模块和gRPC客户端,守护进程可以包括gRPC服务器和合约运行模块。其中,容器接口可用于接收交易。容器管理模块可用于响应于容器接口接收到交易,创建安全容器并在所述安全容器中创建进程,以执行所述交易调用的智能合约的原生执行代码。数据库可用于存储区块链数据。区块链数据包括区块数据、账户状态、账户存储、合约代码(如原生执行代码)等中的一个或多个。
gRPC服务器可以与gRPC客户端进行通信,用作用于与区块链节点进程进行通信的通信模块,该通信可以包括获取智能合约的原生执行代码。可选地,gRPC客户端可以主动与gRPC服务器进行通信。具体地,响应于容器接口接收到交易,gRPC客户端可以通过容器接口从数据库中获取交易调用的智能合约的原生执行代码,并将其发送给gRPC服务器。
合约运行模块从gRPC服务器获取调用的智能合约的原生执行代码并将其传递至合约执行进程。
从而,合约执行进程可执行获得的原生执行代码。
在一些实施例中,容器接口和gRPC客户端之间可设置容器代理,容器接口接收到交易后可通过容器代理和gRPC客户端与守护进程进行通信。
在一些实施例中,合约执行进程与区块链节点进程之间的通信也可以遵循客户端-服务端模式。即,合约执行进程中的gRPC客户端可以向区块链节点进程中的gRPC服务器线程池(线程集合,thread即线程)发起请求,相应地gRPC服务器线程池对合约执行进程的请求做出响应。具体地,所述请求可以包括获取要设置的合约变量的值,设置合约变量的值以及通知合约执行结果。
gRPC服务器线程池可以通过VM(Virtual Machine,虚拟机)线程(如VMthread1、VMthread2等)和Container(容器,如Container1、Container2等)向合约执行进程(中的gRPC客户端)返回执行合约所需的数据,如要设置的合约变量的值。gRPC服务器线程池中的IO线程/Container可以通过队列存取消息。例如,IO线程可以通过MsgPut函数(操作)将消息放入队列,Container可以通过Msg Get函数(操作)将该消息从队列中取出,进而通过Return函数(操作)将获得的响应数据放入队列以供IO线程取出。
每个线程(IO线程/VM线程)每次可负责一笔交易的执行。合约执行进程通知gRPC服务器线程池中的线程某交易调用的原生智能合约执行完毕后,负责该交易的执行的VM线程可确定该交易执行完毕。相应地,容器接口可获得交易的执行结果(即收据)。
应当注意的是,上述有关流程的描述仅仅是为了示例和说明,而不限定本说明书的适用范围。对于本领域技术人员来说,在本说明书的指导下可以对流程进行各种修正和改变。然而,这些修正和改变仍在本说明书的范围之内。
参考图2,本说明书实施例还提供一种智能合约执行系统,该系统可以包括运行在宿主环境中的区块链节点进程以及运行在安全容器中的进程。
其中,区块链节点进程可以用于:接收区块链交易,根据接收到的区块链交易在所述安全容器中启动进程,以执行所述区块链交易调用的智能合约的原生执行代码,所述原生执行代码与所述智能合约的源代码所属的高级语言对应;获得所述区块链交易的执行结果