本发明属于区块链技术领域,更为具体地讲,涉及一种区块链智能合约执行方法。
背景技术:
区块链技术作为一种全新的分布式基础架构与计算范式,涵盖了p2p网络、加密算法、智能合约、共识算法等多种技术。基于这种集成式的技术堆叠,区块链实现了一种防篡改、可追溯、去中心化的系统,有效解决了传统模式中存在的中央权威、可靠性差、安全性低等问题。
智能合约(smartcontract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。从本质上讲,区块链中的智能合约是一段由各个参与方共同编写、确认之后部署在区块链上并以沙箱形式运行的代码。但是目前智能合约执行大多存在设计复杂、功能扩展困难等问题。
技术实现要素:
本发明的目的在于克服现有技术的不足,提供一种区块链智能合约执行方法,快速完成智能合约的加载运行,提升区块链智能合约调用的便捷性和高效性。
为实现上述发明目的,本发明区块链智能合约执行方法包括以下步骤:
s1:在区块链节点中设置合约数据服务模块和合约装载模块,其中合约数据服务模块采用基于网络套接字uds的远程过程调用rpc实现,用于为智能合约目标函数的执行提供所需的业务数据,在区块链节点启动时以uds的形式启动;合约装载模块用于创建并启动合约docker容器;
s2:区块链节点自用户处接收智能合约的动态共享库以及智能合约部署交易,该动态共享库中的文件由智能合约源代码编译得到;区块链节点对接收到的智能合约部署交易进行合法性校验,校验通过后将智能合约动态共享库转发给合约装载模块;
s3:合约装载模块利用接收到的智能合约动态共享库和基础环境docker镜像创建合约docker镜像,随后对该合约和区块链节点进行目录映射,得到目录映射关系,再利用所述合约docker镜像和目录映射关系来创建并启动合约docker容器;
s4:docker容器内的合约服务程序启动,在启动过程中对合约动态共享库进行解析进而创建智能合约实例,并创建与合约数据服务模块通信的客户端;
s5:区块链节点自用户处到接收到智能合约请求,智能合约请求包括合约地址、目标函数名及其执行参数;区块链节点对收到的智能合约调用请求进行合法性校验,校验通过后根据合约地址将该智能合约调用请求转发至对应的合约服务程序;
s6:docker容器内的合约服务程序首先解析出该智能合约调用请求中的目标函数名及其执行参数,并创建智能合约编程接口对应的实例对象;然后根据合约实例和目标函数名,利用反射机制获取目标函数的句柄;最后将目标函数执行参数和编程接口实例对象封装成目标函数的请求参数,通过获取到的目标函数句柄完成相应的处理逻辑,在整个处理过程合约服务程序利用编程接口的实例对象向合约数据服务模块获取相应的业务数据。
本发明区块链智能合约执行方法,在区块链节点中设置合约数据服务模块和合约装载模块,区块链节点自用户处接收智能合约的动态共享库以及智能合约部署交易,进行合法性校验后将智能合约动态共享库转发给合约装载模块进行装载,创建并启动合约docker容器,然后启动合约服务程序,区块链节点自用户处到接收到智能合约请求转发至合约服务程序进行执行。
本发明中智能合约源码被编译成动态共享库文件的形式,具有代码文件简洁、便于快速加载的特点,采用docker容器的方式运行智能合约,并以uds服务的方式将合约数据服务模块、合约装载模块以及合约服务程序进行整合,具有设计简捷轻便的特点,同时还可以实现智能合约之间的相互调用,使得各个智能合约不在相互独立,便于业务功能的扩展。
附图说明
图1是本发明区块链智能合约执行方法的具体实施方式流程图。
具体实施方式
下面结合附图对本发明的具体实施方式进行描述,以便本领域的技术人员更好地理解本发明。需要特别提醒注意的是,在以下的描述中,当已知功能和设计的详细描述也许会淡化本发明的主要内容时,这些描述在这里将被忽略。
实施例
图1是本发明区块链智能合约执行方法的具体实施方式流程图。如图1所示,本发明区块链智能合约执行方法的具体步骤包括:
s101:区块链节点设置:
在区块链节点中设置合约数据服务模块和合约装载模块,其中合约数据服务模块采用基于网络套接字uds(unixdomainsocket)的远程过程调用rpc实现,用于为智能合约目标函数的执行提供所需的业务数据,在区块链节点启动时以uds的形式启动;合约装载模块用于创建并启动合约docker容器。
s102:智能合约部署:
区块链节点自用户处接收智能合约的动态共享库以及智能合约部署交易,该动态共享库中的文件由智能合约源代码编译得到;区块链节点对接收到的智能合约部署交易进行合法性校验,校验通过后将智能合约动态共享库转发给合约装载模块。
s103:合约装载:
合约装载模块利用接收到的智能合约动态共享库和基础环境docker镜像创建合约docker镜像,随后对该合约和区块链节点进行目录映射,得到目录映射关系,再利用所述合约docker镜像和目录映射关系来创建并启动合约docker容器。基础环境docker镜像中仅包含ubuntu操作系统和合约服务程序。
其中,目录映射的具体过程包括:
1)将合约数据服务模块启动时创建的uds文件与docker容器中的文件进行关联;
2)将合约服务程序启动时创建的uds文件所在目录与区块链节点中该智能合约的目录进行关联;
3)将区块链中所有合约的目录与合约docker容器中的新建合约目录进行关联。
s104:合约服务程序启动:
docker容器内的合约服务程序启动(合约服务程序在合约docker容器启动后会自动以基于uds的rpc服务形式启动),在启动过程中对合约动态共享库进行解析进而创建智能合约实例,并创建合约数据服务模块通信的客户端。其中,智能合约实例是由合约服务程序在加载智能合约动态共享库时利用反射机制所创建的,与合约数据服务模块通信的客户端是由合约服务程序利用合约docker容器中合约数据服务的uds文件所创建的。
s105:智能合约请求处理:
区块链节点自用户处到接收到智能合约请求,智能合约请求包括合约地址、目标函数名及其执行参数;区块链节点对收到的智能合约调用请求进行合法性校验,校验通过后根据合约地址将该智能合约调用请求转发至对应的合约服务程序。
s106:智能合约执行:
docker容器内的合约服务程序首先解析出该智能合约调用请求中的目标函数名及其执行参数,并创建智能合约编程接口对应的实例对象;然后根据合约实例和目标函数名,利用反射机制获取目标函数的句柄;最后将目标函数执行参数和编程接口实例对象封装成目标函数的请求参数,通过获取到的目标函数句柄完成相应的处理逻辑,在整个处理过程合约服务程序利用编程接口的实例对象通过与合约数据服务模块通信的客户端获取相应的业务数据。
为了实现智能合约之间的相互调用,合约服务程序可以利用合约docker容器中所有智能合约的uds文件与其他智能合约的合约docker容器中的合约服务程序建立通信连接,并向其发送合约调用请求,从而实现智能合约之间的调用
为了更好地说明本发明的技术方案,以支付领域中的转账应用为你对本发明进行说明,其具体过程如下:
区块链节点在启动时以uds的形式启动合约数据服务模块。
用户根据合约服务程序预定的编程接口编写转账合约代码,该合约代码中的transfer函数提供具体的转账操作。用户将转账合约编译成动态共享库,并将其打包后发往区块链节点请求合约部署。区块链节点首先验证该部署请求的合法性,验证通过后,由合约装载模块利用转账合约的动态共享库和基础环境docker镜像创建转账合约的docker镜像,随后利用该合约docker镜像和设置的目录挂载关系创建并启动转账合约的docker容器。
转账合约docker容器内的合约服务程序启动,对转账合约的动态共享库进行解析进而创建转账合约实例对象,随后创建与合约数据服务模块通信的客户端,最后以uds的形式完成整个服务的启动。
用户向区块链节点发送合约调用请求,请求中的合约地址为转账合约的合约地址,目标函数名为transfer,执行参数为用户a向用户b转账10元。区块链节点对该调用请求进行合法性校验,校验通过后将该请求转发给合约服务程序。
合约服务程序首先从该合约调用请求中获取出目标函数名transfer及其执行参数用户a向用户b转账10元,随后合约服务程序会创建智能合约编程接口对应的实例对象,接着利用反射机制从转账合约实例对象中获取名为transfer的函数句柄,随后将目标函数的执行参数用户a向用户b转账10元以及编程接口的实例对象封装成目标函数的请求参数,最后利用该参数和transfer的函数句柄来执行真正的转账操作逻辑,在执行转账逻辑时,会利用编程接口的实例对象通过与合约数据服务模块通信的客户端来请求相应的业务数据来完成账户余额的更改。
尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领域的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
1.一种区块链智能合约执行方法,其特征在于,包括以下步骤:
s1:在区块链节点中设置合约数据服务模块和合约装载模块,其中合约数据服务模块采用基于网络套接字uds的远程过程调用rpc实现,用于为智能合约目标函数的执行提供所需的业务数据,在区块链节点启动时以uds的形式启动;合约装载模块用于创建并启动合约docker容器;
s2:区块链节点自用户处接收智能合约的动态共享库以及智能合约部署交易,该动态共享库中的文件由智能合约源代码编译得到;区块链节点对接收到的智能合约部署交易进行合法性校验,校验通过后将智能合约动态共享库转发给合约装载模块;
s3:合约装载模块利用接收到的智能合约动态共享库和基础环境docker镜像创建合约docker镜像,随后对该合约和区块链节点进行目录映射,得到目录映射关系,再利用所述合约docker镜像和目录映射关系来创建并启动合约docker容器;
s4:docker容器内的合约服务程序启动,在启动过程中对合约动态共享库进行解析进而创建智能合约实例,并创建与合约数据服务模块通信的客户端;
s5:区块链节点自用户处到接收到智能合约请求,智能合约请求包括合约地址、目标函数名及其执行参数;区块链节点对收到的智能合约调用请求进行合法性校验,校验通过后根据合约地址将该智能合约调用请求转发至对应的合约装载服务程序;
s6:docker容器内的合约服务程序首先解析出该智能合约调用请求中的目标函数名及其执行参数,并创建智能合约编程接口对应的实例对象;然后根据合约实例和目标函数名,利用反射机制获取目标函数的句柄;最后将目标函数执行参数和编程接口实例对象封装成目标函数的请求参数,通过获取到的目标函数句柄完成相应的处理逻辑,在整个处理过程合约服务程序利用编程接口的实例对象向合约数据服务模块获取相应的业务数据。
2.根据权利要求1所述的区块链合约执行方法,其特征在于,所述步骤s3中目录映射的具体步骤包括:
1)将合约数据服务模块启动时创建的uds文件与docker容器中的文件进行关联;
2)将合约服务程序启动时创建的uds文件所在目录与区块链节点中该智能合约的目录进行关联;
3)将区块链中所有合约的目录与合约docker容器中的新建合约目录进行关联。
3.根据权利要求1所述的区块链智能合约执行方法,其特征在于,所述步骤s4中智能合约实例是由合约服务程序在加载智能合约动态共享库时利用反射机制所创建的,与合约数据服务模块通信的客户端是由合约服务程序利用合约docker容器中合约数据服务的uds文件所创建的。
4.根据权利要求1所述的区块链智能合约执行方法,其特征在于,所述合约服务程序利用合约docker容器中所有智能合约的uds文件与其他智能合约的合约docker容器中的合约服务程序建立通信连接,并向其发送合约调用请求。
技术总结