java 状态引擎_一种安全的Java智能合约解释执行引擎及方法与流程

737e634079f489a86632cfd8ab0fadfe.gif

本发明涉及去中心化的区块链智能合约执行引擎的设计领域,尤其涉及一种安全的Java智能合约解释执行引擎及方法。

背景技术:

区块链技术,是一种新型的分布式去中心化协议,能够确定地有序地存储一系列交易数据,存储的数据不可伪造和篡改,区块链上的交易数据依靠分布式共识协议实现数据的一致性,所有的网络节点共同维护一个公共状态,该公共状态所有节点可见,通过块链式存储保证保持数据的连贯和不可篡改性。

智能合约作为区块链技术的扩展,通过在节点上部署智能合约执行引擎,为区块链提供了能够按照一定的逻辑执行代码并对公共状态进行操作的能力,该操作不可逆,且所有的参与节点行为一致。

技术实现要素:

针对现有Java智能合约引擎的不足,本发明提出了一种安全的Java智能合约解释执行引擎(Hyper smart-contract VM,以下简称HVM)及执行方法,该执行引擎允许用户使用Java语言编写智能合约并实现字节码和虚拟机层面的沙箱安全。

具体的技术方案如下:一种安全的Java智能合约解释执行引擎,包括如下模块:

(1)定制的Java虚拟机模块,其特征是:仅支持解释执行,不会对代码进行动态优化;精简了包括文件、网络、硬件信息访问、随机数值、日期时间这些会导致执行结果差异的功能;实现了严格一致的数学与大整数库;实现了平台无关的基本类型类;

(2)API模块,负责接收外部用户发起的部署调用请求;

(3)安全检查模块,负责对用户合约字节码进行预检查,对用户代码中危险操作进行防御性检查;

(4)状态存储模块,为Java虚拟机提供JNI接口,允许Java虚拟机能够操作区块链状态,以实现智能资产的操作。

一种安全的Java智能合约解释执行引擎的执行方法,具体包括如下步骤:

步骤一:用户按照既定规则使用Java语言编写智能合约,并通过标准的Java语言编译器,将原始码编译成对应的字节码;在编译过程当中,Java智能合约需要同对应的预载环境Java代码一同编译;编译完成之后,将编译完成的class文件通过标准Jar压缩协议打包成Jar文件,在jar文件的Manifest文件中需要置入对应的MainClass配置项,以指定智能合约的入口主类;用户通过SDK将打包好的智能合约发送至区块链平台进行部署;

步骤二:区块链平台接收到智能合约部署交易之后,对智能合约部署交易的格式进行验证,然后对交易签名进行验证,验证通过之后,对部署交易的载荷进行安全检查,部署阶段的载荷即打包完成的智能合约字节码,平台需要对智能合约的字节码进行敏感操作检查,防止智能合约对宿主环境进行危险操作造成安全隐患;检查通过之后,将对智能合约进行解包,执行引擎中的Java虚拟机根据Manifest中MainClass配置对代码进行预解释执行,来验证合约代码的合法性;预执行通过之后,区块链平台将生成一个全局唯一的标识,作为该合约在网络中的对应表示,然后将标识与代码映射存储到区块链网络状态当中;

步骤三:合约部署完成之后,用户可以根据业务需要,对特定合约方法发起调用,发起调用时,需要提供合约标识、被调方法签名和参数列表;当区块链平台接收到标识、方法签名和方法参数之后,执行引擎将从区块链网络状态存储中将对应的合约代码进行检索,检索完成之后,将智能合约字节码、被调函数签名和被调函数参数列表作为执行引擎的输入,执行引擎通过Java虚拟机进行解释执行;解释执行期间,Java虚拟机将会收集智能合约中对将对区块链网络状态进行修改操作集合,最后在执行阶段末尾,将所有修改操作集合提交应用,完成区块链网络状态的修改;

步骤四:状态修改完成之后,将合约逻辑中需要返回的返回值进行序列化之后,返回给调用客户端SDK,客户端SDK依照协议进行反序列化,将返回值封装为客户端本地类型数据进行返回。

进一步地,所述的步骤一中,预载环境Java代码指的是,为了完成用户编写的代码能够符合智能合约引擎解释执行规范,以及能够对一些内置变量进行预先设置,所需要遵循的接口和继承规范,因此预载Java代码需要同用户合约一同进行编译。

进一步地,所述的步骤二中,对部署交易的载荷进行的安全检查指的是,由于区块链网络是分布式系统,需要对Java语言的能力进行限制,需要禁止用户对文件、网络、硬件信息访问、随机数值、日期时间敏感资源的访问,也需要防止用户使用Java反射技术对执行环境进行的攻击。因此通过对载荷中的智能合约字节码进行检查是必要的,通过对标准Class文件的格式进行解析,分析代码中的上下文信息,确定是否有加载敏感操作类,来防御相关敏感操作。

进一步地,所述的步骤二中,对智能合约代码进行解析执行是指按照Java虚拟机规范对符合标准的Class文件进行解释执行,对Class文件中所定义的字节码进行解析之后,按照确定的顺序对指令进行执行,为了能够保证执行过程的可确定性,Java虚拟机不能够对代码进行动态优化,仅仅能够按照既定方式解释执行。

进一步地,所述的步骤三中,被调函数签名以及参数列表提供的形式,应当以客户端与服务端协定的序列化方式进行传输,函数签名用于检索合约代码中的具体智能合约代码,参数列表不受类型限制,可以是任意合法的Java对象。

进一步地,所述的步骤四中,返回给客户端SDK的返回值,应当按照预先定义的序列化协议进行传输,对于SDK本地代码而言,应当能够将返回值进行反序列化之后,作为本地类型进行使用。

本发明的有益效果如下:

本发明设实现了一种安全的Java智能合约解释执行引擎,允许用户用Java语言编写智能合约,相对于原有的JCEE实现,HVM在字节码安全检查方面,需要检查的内容更少,通过安全的Java虚拟机并不实现文件,网络,硬件访问等敏感操作,实现了完全的沙箱安全,提高了安全性,同时,避免了远程调用,通过本地函数调用,共享内存,大大提升了效率,节约了资源。

附图说明

图1是本发明的方法中模块数据流转图;

图2是本发明的方法中Java智能合约引擎架构图;

图3是本发明的方法的用户请求调用流程图;

具体实施方式

下面根据附图和优选实施例详细描述本发明,本发明的目的和效果将变得更加明白,以下结合附图和实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

如图1和2所示,一种安全的Java智能合约解释执行引擎,包括如下模块:

(1)定制的Java虚拟机模块,其特征是:仅支持解释执行,不会对代码进行动态优化;精简了包括文件、网络、硬件信息访问、随机数值、日期时间这些会可能导致执行结果差异的功能;实现了严格一致的数学与大整数库;实现了平台无关的基本类型类;

(2)API模块,负责接收外部用户发起的部署调用请求;

(3)安全检查模块,负责对用户合约字节码进行预检查,对用户代码中危险操作进行防御性检查;

(4)状态存储模块,为Java虚拟机提供JNI接口,允许Java虚拟机能够操作区块链状态,以实现智能资产的操作。

如图3所示,一种安全的Java智能合约解释执行引擎的执行方法,具体包括如下步骤:

步骤一:用户按照既定规则使用Java语言编写智能合约,并通过标准的Java语言编译器,将原始码编译成对应的字节码;在编译过程当中,Java智能合约需要同对应的预载环境Java代码一同编译;编译完成之后,将编译完成的class文件通过标准Jar压缩协议打包成Jar文件,在jar文件的Manifest文件中需要置入对应的MainClass配置项,以指定智能合约的入口主类;用户通过SDK将打包好的智能合约发送至区块链平台进行部署;

步骤二:区块链平台接收到智能合约部署交易之后,对智能合约部署交易的格式进行验证,然后对交易签名进行验证,验证通过之后,对部署交易的载荷进行安全检查,部署阶段的载荷即打包完成的智能合约字节码,平台需要对智能合约的字节码进行敏感操作检查,防止智能合约对宿主环境进行危险操作造成安全隐患;检查通过之后,将对智能合约进行解包,执行引擎中的Java虚拟机根据Manifest中MainClass配置对代码进行预解释执行,来验证合约代码的合法性;预执行通过之后,区块链平台将生成一个全局唯一的标识,作为该合约在网络中的对应表示,然后将标识与代码映射存储到区块链网络状态当中;

步骤三:合约部署完成之后,用户可以根据业务需要,对特定合约方法发起调用,发起调用时,需要提供合约标识、被调方法签名和参数列表;当区块链平台接收到标识、方法签名和方法参数之后,执行引擎将从区块链网络状态存储中将对应的合约代码进行检索,检索完成之后,将智能合约字节码、被调函数签名和被调函数参数列表作为执行引擎的输入,执行引擎通过Java虚拟机进行解释执行;解释执行期间,Java虚拟机将会收集智能合约中对将对区块链网络状态进行修改操作集合,最后在执行阶段末尾,将所有修改操作集合提交应用,完成区块链网络状态的修改;

步骤四:状态修改完成之后,将合约逻辑中需要返回的返回值进行序列化之后,返回给调用客户端SDK,客户端SDK依照协议进行反序列化,将返回值封装为客户端本地类型数据进行返回。

进一步地,所述的步骤一中,预载环境Java代码指的是,为了完成用户编写的代码能够符合智能合约引擎解释执行规范,以及能够对一些内置变量进行预先设置,所需要遵循的接口和继承规范,因此预载Java代码需要同用户合约一同进行编译。

进一步地,所述的步骤二中,对部署交易的载荷进行的安全检查指的是,由于区块链网络是分布式系统,需要对Java语言的能力进行限制,需要禁止用户对文件、网络、硬件信息访问、随机数值、日期时间资源的访问,也需要防止用户使用Java反射内省对执行环境进行的攻击。因此通过对载荷中的智能合约字节码进行检查是必要的,通过对标准Class文件的格式进行解析,分析代码中的上下文信息,确定是否有加载敏感操作类,来防御相关敏感操作。

进一步地,所述的步骤二中,对智能合约代码进行解析执行是指按照Java虚拟机规范对符合标准的Class文件进行解释执行,对Class文件中所定义的字节码进行解析之后,按照确定的顺序对指令进行执行,为了能够保证执行过程的可确定性,Java虚拟机不能够对代码进行动态优化,仅仅能够按照既定方式解释执行。

进一步地,所述的步骤三中,被调函数签名以及参数列表提供的形式,应当以客户端与服务端协定的序列化方式进行传输,函数签名用于检索合约代码中的具体智能合约代码,参数列表不受类型限制,可以是任意合法的Java对象。

进一步地,所述的步骤四中,返回给客户端SDK的返回值,应当按照预先定义的序列化协议进行传输,对于SDK本地代码而言,应当能够将返回值进行反序列化之后,作为本地类型进行使用。

本领域普通技术人员可以理解,以上所述仅为发明的优选实例而已,并不用于限制发明,尽管参照前述实例对发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在发明的精神和原则之内,所做的修改、等同替换等均应包含在发明的保护范围之内。


版权声明:本文为weixin_36268390原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。