本发明涉及去中心化区块链智能合约执行过程的设计领域,尤其涉及一种基于Java虚拟机的智能合约复杂度限制方法。
背景技术:
区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改;智能合约是一种可以在区块链网络环境中部署和执行的一段代码,这段代码的部署以及执行都是可以在区块链网络中以交易的形式呈现,其部署和执行结果可以随着交易被全网共识;由于结果需要交给共识层共识,由此执行的结果必须保证在每个节点上的一致性。
传统联盟区块链智能合约执行引擎包括evm和jvm,以jvm为例,jvm没有在部署时对合约的大小做出限制,无法在执行过程中让执行过程立即停止,因此无法对合约的复杂度做出很好的限制,如何解决Java智能合约在需要停止执行时能够立即停止执行,保证区块链智能合约引擎的稳定安全以及区块链网络的稳定是一项全新的挑战。
技术实现要素:
针对现有技术的不足,本发明提出一种基于Java虚拟机的智能合约复杂度限制方案,即保证了对复杂的智能合约进行部署限制,也保证了执行过程的可立即终止。
本发明的目的是通过以下技术方案实现的:一种基于Java虚拟机的智能合约复杂度限制方法,该方法具体包括如下步骤:
步骤一:区块链节点收到客户端发起的部署合约的请求后,将首先进行合约字节数大小的检查,如果当前收到的合约字节数大于给定的字节数上限值,则拒绝此智能合约的部署;
步骤二:在部署智能合约的时候,会进行部署合约的Java字节码调用,目的是将需要部署的合约的字节码存储在区块链节点的DB中,在进行部署的Java字节码调用的时候,Java字节码在调用前会先指定一个gas的总值,Java字节码会被解释为一个个指令,对于每一个指令的执行,会先判断当前的gas总值是否大于执行当前指令所需要的gas值,如果小于则直接停止执行,否则会在gas的总值的基础上减去当前指令对应gas的数值,直到字节码执行完毕;
步骤三:当调用合约时,区块链节点收到调用合约的请求,将用户需要调用的合约从DB中取出,然后对相应的方法进行解析调用;与步骤二的调用过程类似,Java合约在调用前会先指定一个gas的总值,在调用指令的过程中,先判断是否有足够的gas来执行此条指令,然后不断消耗,直到合约执行完毕;
步骤四:在调用合约的同时,会创建并启动一个计时器Timmer,在智能合约执行的时候Timmer会一直运转,如果在Timmer运转结束,智能合约还没有运行结束,那么会直接停止智能合约的运行。
进一步地,所述的步骤一中,从字节大小方面限制合约的大小;
进一步地,所述的步骤二中,gas总值是在Java合约解释为指令的调用过程中,能都消耗的总数值,一旦消耗完字节码执行过程将会立即终止;在进行部署合约的Java字节码调用的时候,进行调用的计费限制;
进一步地,所述的步骤三中,会在合约方法的字节码调用过程中进行gas的消费计算,可以保证智能合约执行过程的终止性;
进一步地,所述的步骤四中,在Java智能合约的执行过程中加入了超时限制,保证过多的耗时操作不会影响共识的过程。
本发明的有益效果如下:
本发明应用于联盟链背景下的区块链智能合约执行引擎上,既保证了对复杂的智能合约进行部署限制,也保证了执行过程的可立即终止,是区块链虚拟机执行引擎下Java虚拟机执行引擎的大突破。
附图说明
图1是本发明的方法中部署合约流程图;
图2是本发明的方法中调用合约流程图;
具体实施方式
下面根据附图和优选实施例详细描述本发明,本发明的目的和效果将变得更加明白,以下结合附图和实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1、图2所示,一种基于Java虚拟机的智能合约复杂度限制方法,该方法具体包括如下步骤:
步骤一:区块链节点收到客户端发起的部署合约的请求后,将首先进行合约字节数大小的检查,如果当前收到的合约字节数大于给定的字节数上限值,则拒绝此智能合约的部署;
步骤二:在部署智能合约的时候,会进行部署合约的Java字节码调用,目的是将需要部署的合约的字节码存储在区块链节点的DB中,在进行部署的Java字节码调用的时候,Java字节码在调用前会先指定一个gas的总值,Java字节码会被解释为一个个指令,对于每一个指令的执行,会先判断当前的gas总值是否大于执行当前指令所需要的gas值,如果小于则直接停止执行,否则会在gas的总值的基础上减去当前指令对应gas的数值,直到字节码执行完毕;
步骤三:当调用合约时,区块链节点收到调用合约的请求,将用户需要调用的合约从DB中取出,然后对相应的方法进行解析调用;与步骤二的调用过程类似,Java合约在调用前会先指定一个gas的总值,在调用指令的过程中,先判断是否有足够的gas来执行此条指令,然后不断消耗,直到合约执行完毕;
步骤四:在调用合约的同时,会创建并启动一个计时器Timmer,在智能合约执行的时候Timmer会一直运转,如果在Timmer运转结束,智能合约还没有运行结束,那么会直接停止智能合约的运行。
进一步地,所述的步骤一中,从字节大小方面限制合约的大小;通过合约的字节数初步进行合约的大小判断,实现了对Java智能合约从合约本身大小的控制。
进一步地,所述的步骤二中,gas总值是在Java合约解释为指令的调用过程中,能都消耗的总数值,一旦消耗完字节码执行过程将会立即终止;在进行部署合约的Java字节码调用的时候,进行调用的计费限制;
进一步地,所述的步骤三中,会在合约方法的字节码调用过程中进行gas的消费计算,可以保证智能合约执行过程的终止性;
进一步地,所述的步骤四中,在Java智能合约的执行过程中加入了超时限制,保证过多的耗时操作不会影响共识的过程。
通过在部署过程中进行指令gas的消耗判断以及超时的限制,使得部署的合约大小方面的复杂性可控,进一步的,在调用合约的时候也进行指令gas的消耗判断以及超时时间的限制,使得合约代码的复杂性可控,并且可以在指令执行的任意一处立即停止执行。
本领域普通技术人员可以理解,以上所述仅为发明的优选实例而已,并不用于限制发明,尽管参照前述实例对发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在发明的精神和原则之内,所做的修改、等同替换等均应包含在发明的保护范围之内。