#冬日生活打卡季#

智能合约(简称合约)开发是区块链开发的重要组成部分,当前区块链业界大部分链是将用高级语言编写的合约源代码编译成低端字节码后,在该低端字节码匹配的虚拟机中运行智能合约(即执行该低端字节码)。

然而,支持转换低端字节码的高级语言种类有限,即采用上述合约执行方式时可供选择的高级语言种类有限,无法满足各类高级语言开发者开发智能合约的需求。

区块链交易(简称交易)可以用于记录各类事件和/或数据。在一些实施例中,交易记录的事件可以包括表征新节点的加入、节点的退出、转账等中的一种或多种。在一些实施例中,交易记录的数据可以包括医疗信息、电子合同、电子凭据、电子订单、数字指纹等中的一种或多种。

期望的代码可以通过交易触发执行,也可称作交易的执行,区块链节点可以是交易的执行者。仅作为示例,用于记录转账行为的交易可以触发对转账双方账户余额的更新,用于存证数据的交易可以触发将数据写入区块链数据,用于查询数据的交易可以触发对区块链数据的查询,等等。

在一些实施例中,交易的执行可包括智能合约的调用。智能合约(简称合约)可以指分布式存储于区块链系统中各节点的可在一定条件下自动执行的数字化协议。智能合约本质是一段运行在区块链网络中的代码,用于完成用户所赋予的业务逻辑。

随着区块链的不断发展,其应用场景不断延伸,越来越多的开发者加入区块链开发。区块链开发中,智能合约开发十分重要。当前区块链业界大部分链是将用高级语言编写的合约源代码编译成低端字节码后,在该低端字节码匹配的虚拟机中运行智能合约(即执行该低端字节码)。例如,以太坊的合约开发者通常选择用Solidity语言编写合约源代码。相应地,将用Solidity语言编写的合约源代码编译成evm格式的字节码(简称evm字节码)后,可在EVM虚拟机中执行该evm字节码。又如,EOS(Enterprise Operating System,企业操作系统)的合约开发者大多选择用C 语言编写合约源代码。相应地,将用C 语言编写的合约源代码编译成wasm格式的字节码(简称wasm字节码)后,可在WASM(Web Assembly)虚拟机中执行该wasm字节码。

虚拟机的一些特性能够在一定程度上保障合约安全(如过滤代码中的不安全语句),合约安全包括但不限于不允许合约获取非授权的数据,如访问本地磁盘文件、访问网络资源等,以及/或者不允许合约行为破坏宿主环境(操作系统)的安全,如不允许智能合约获得一些影响操作系统正常运行的调用权限(比如fork, kill, chmod, ptrace等)。然而,支持转换成低端字节码的高级语言种类有限,使得上述合约执行方式下可供选择的高级语言种类有限,无法满足各类高级语言开发者开发智能合约的需求。

虽然也有区块链架构(如Fabric)支持以原生执行方式执行智能合约,但却没有对合约的操作权限进行限制以保障合约安全,例如,一些联盟链架构仅依靠授权成员的加入来保障合约安全。在没有对合约的操作权限进行限制的情况下,如果存在一些安全漏洞,同时刚好有“作恶”的智能合约利用安全漏洞,很可能导致隐私数据的泄露、节点的不可靠运行等问题。

需要说明的是,原生执行方式也称作传统/常规执行方式,是指将用高级语言编写的源代码编译成原生执行代码(区别于低端字节码)来执行。例如,对于Java语言,原生执行方式是指将用Java语言编写的源代码编译成class格式的字节码来执行。又如,对于C 语言,原生执行方式是指将用C 语言编写的源代码编译成与目标CPU架构匹配的字节码,可以理解,这里的目标CPU架构特指用于执行合约的CPU架构。每种高级语言对应一种原生执行代码,而有限种类的高级语言支持将源代码转换成统一格式的低端字节码。按照原生执行方式执行的智能合约代码(简称原生智能合约)可以满足各类高级语言开发者开发智能合约的需求。另外,相较于低端字节码,原生执行代码的可调试性更高。

在一些实施例中,为了支持原生智能合约的执行,可以将容器作为原生智能合约的执行环境。容器具有占用资源少、部署快、易移植、隔离性等优势。每个交易的合约执行可以与容器实例建立一一对应的关系,可以理解,容器实例是指具体的单个容器。如此,可利用容器的隔离性隔离不同交易的合约执行。

然而,普通容器(如Docker, Inc.开发的Docker容器(简称Docker))与宿主环境(操作系统)共享内核(kernel),“作恶”的智能合约可以利用内核漏洞攻击宿主环境,窃取隐私数据甚至破坏操作系统。需要说明的是,内核是操作系统(Operation System ,OS)的核心,其可负责管理操作系统的进程、内存、设备驱动程序、文件和网络系统,决定着操作系统的性能和稳定性。

有鉴于此,本说明书实施例提供一种通过安全容器执行原生智能合约的方法和系统,可以满足各类语言开发者开发智能合约的需求,保证较高的代码可调试性,且确保智能合约的安全性。

可以理解,区别于普通容器(如Docker),安全容器是指与宿主环境不共享内核的容器。仅作为示例,安全容器可以包括由开源社区开发的kata容器(具体信息可参见https://katacontainers.io/)、由谷歌开发的gVisor容器、由亚马逊开发的Firecracker等中的一种或多种。

区块链智能合约的总结(区块链智能合约执行方法)(1)

图1是根据本说明书一些实施例所示的智能合约执行方法的流程示意图。

所述方法可以包括由运行在宿主环境中的区块链节点进程实现的节点流程,以及由运行在安全容器中的进程实现的合约流程。其中,区块链节点进程可指正在运行的区块链程序。在一些实施例中,宿主环境和安全容器可以集成于单个设备(宿主机),也可以分布在多个设备上,例如可以将安全容器运行在云服务器上。在一些实施例中,宿主环境和安全容器之间可通过宿主环境本身具备的网络模块建立通信连接。

如图1所示,所述节点流程可以包括:接收交易;响应于接收到交易,在安全容器中创建进程,以执行所述交易调用的智能合约的原生执行代码;获得所述交易的执行结果(也可称作“收据”)。所述合约流程可以包括在安全容器中执行所述智能合约的原生执行代码。

可以理解,区块链节点进程/安全容器中可运行多个进程以实现相应流程。

在一些实施例中,响应于接收到交易,区块链节点进程可以首先为合约的执行创建一个安全容器,然后在安全容器中创建守护进程。可选地,区块链节点进程也可以在已创建的安全容器中创建守护进程。可选地,区块链节点进程也可以直接使用已创建的守护进程。该守护进程可以用于管理合约执行进程的生命周期,包括负责合约执行进程的创建、销毁、调用等。进而,守护进程可在安全容器中创建合约执行进程,从区块链节点进程获取交易调用的智能合约的原生执行代码,并将所述原生执行代码传递至所述合约执行进程。其中,合约执行进程可用于执行交易调用的智能合约的原生执行代码。在一些实施例中,合约执行可包括设置智能合约中变量的值。具体地,合约执行进程可以从所述区块链节点进程获取智能合约中变量的值,设置所述变量的值,并将设置后的所述变量的值返回给所述区块链节点进程,以使区块链节点进程获得交易的执行结果。其中,交易中可指明要设置的变量的名称(key),区块链节点进程可根据该变量的名称查询该变量的值(value)。可以理解,同一变量的key和value可以键值对形式存储以便查询。

可以理解,本说明书的一个或多个实施例中的某些特征、结构或特点可以进行适当的组合。下面结合图2进行示例。

区块链智能合约的总结(区块链智能合约执行方法)(2)

图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,本说明书实施例还提供一种智能合约执行系统,该系统可以包括运行在宿主环境中的区块链节点进程以及运行在安全容器中的进程。

其中,区块链节点进程可以用于:接收区块链交易,根据接收到的区块链交易在所述安全容器中启动进程,以执行所述区块链交易调用的智能合约的原生执行代码,所述原生执行代码与所述智能合约的源代码所属的高级语言对应;获得所述区块链交易的执行结果

,