对智能合约的执行进行资源扣除的方法和处理器
技术领域
本说明书实施例涉及区块链技术领域,更具体地,涉及一种对智能合约的执行进行资源扣除的方法和处理器、计算设备及计算机数字信号。
背景技术
在区块链中,当在虚拟机中执行智能合约之前,通常需要从相应账户中扣除预定数量的燃料(GAS),以作为用于执行预定操作所支付的代价。当前,在对智能合约中的包括一条或多条指令的基本块进行GAS扣费时,基本流程包括:判断分配给该智能合约的GAS余额是否大于等于在编译时确定的该基本块的GAS消耗值,如果大于等于,则进行与该基本块对应的GAS扣费,然后执行该基本块中的所有指令,如果小于,则终止对智能合约的执行。然而,在现有技术中,通过使用处理器的多个通用指令来执行上述GAS扣费操作,而在执行智能合约的过程中,所述GAS扣费为热点操作(即,频繁进行的操作),因此,使用多个通用指令执行GAS扣费操作影响了智能合约的执行效率。
因此,需要一种更有效的对智能合约的执行进行资源扣除的方案。
发明内容
本说明书实施例旨在提供一种更有效的对智能合约的执行进行资源扣除的方案,以解决现有技术中的不足。
为实现上述目的,本说明书一个方面提供一种对智能合约的执行进行资源扣除的方法,所述方法由处理器执行,所述处理器中包括专用寄存器,所述专用寄存器中存储有用于执行所述智能合约的第一资源余额,所述方法包括:
读取第一扩展指令,所述第一扩展指令中包括与所述预定代码集合对应的扣除资源额度,基于所述第一扩展指令进行以下操作:
从所述专用寄存器读取所述第一资源余额;
将所述第一资源余额与所述扣除资源额度比较;
在所述比较的结果为第一资源余额大于等于所述扣除资源额度的情况中,将第一资源余额与所述扣除资源额度相减,以获取第二资源余额;
将所述第二资源余额存入所述专用寄存器中。
在一种实施方式中,所述处理器中还包括第一通用寄存器,所述第一通用寄存器中在执行所述智能合约之前存储有用于执行所述智能合约的第三资源余额,所述方法还包括:
在执行所述智能合约之前,读取第二扩展指令,所述第二扩展指令中包括第一通用寄存器的标识;
从所述第一通用寄存器读取所述第三资源余额;
将所述第三资源余额存入所述专用寄存器。
在一种实施方式中,所述处理器中还包括第二通用寄存器,所述方法还包括:
在执行完所述智能合约之后,读取第三扩展指令,所述第三扩展指令中包括第二通用寄存器的标识;
从所述专用寄存器读取当前的第四资源余额;
将所述第四资源余额存入所述第二通用寄存器。
在一种实施方式中,所述处理器中还包括状态寄存器,所述方法还包括,在所述比较的结果为第一资源余额小于所述扣除资源额度的情况中,结束对所述智能合约的执行,并在所述状态寄存器中对余额不足的状态进行记录。
在一种实施方式中,读取第一扩展指令包括,在执行智能合约中的预定代码集合之前,读取第一扩展指令。
本说明书另一方面提供一种对智能合约的执行进行资源扣除的方法,所述方法由计算设备中的处理器执行,所述计算设备中包括第一存储单元,所述第一存储单元中存储有用于执行所述智能合约的第一资源余额,所述方法包括:
读取第四扩展指令,所述第四扩展指令中包括所述第一存储单元的标识和所述预定代码集合对应的扣除资源额度,基于所述第四扩展指令进行以下操作:
从所述第一存储单元读取所述第一资源余额;
将所述第一资源余额与所述扣除资源额度比较;
在所述比较的结果为第一资源余额大于等于所述扣除资源额度的情况中,将第一资源余额与所述扣除资源额度相减,以获取第二资源余额;
将所述第二资源余额存入所述第一存储单元中。
在一种实施方式中,所述第一存储单元为处理器中包括的第一通用寄存器。
在一种实施方式中,所述第一存储单元为计算设备中的第一内存地址。
本说明书另一方面提供一种处理器,包括第一逻辑电路,所述第一逻辑电路包括:专用寄存器,用于存储用于执行智能合约的第一资源余额;比较器和加法器,
所述第一逻辑电路用于在接收到第一数字信号之后执行以下操作,其中,所述第一数字信号包括与智能合约中预定代码集合对应的扣除资源额度:
从所述专用寄存器读取所述第一资源余额;
通过所述比较器将所述第一资源余额与所述扣除资源额度比较;
在所述比较的结果为第一资源余额大于等于所述扣除资源额度的情况中,通过所述加法器将第一资源余额与所述扣除资源额度相减,以获取第二资源余额;
将所述第二资源余额存入所述专用寄存器中。
在一种实施方式中,所述处理器还包括第二逻辑电路,所述第二逻辑电路中包括第一通用寄存器和所述专用寄存器,所述第一通用寄存器用于在执行所述智能合约之前存储用于执行所述智能合约的第三资源余额,所述第二逻辑电路用于在接收到第二数字信号之后执行以下操作,其中,所述第二数字信号中包括第一通用寄存器的标识:
从所述第一通用寄存器读取所述第三资源余额;
将所述第三资源余额存入所述专用寄存器。
在一种实施方式中,所述处理器还包括第三逻辑电路,所述第三逻辑电路中包括第二通用寄存器和所述专用寄存器,所述第三逻辑电路用于在接收到第三数字信号之后执行以下操作,其中,所述第三数字信号中包括第二通用寄存器的标识:
从所述专用寄存器读取当前的第四资源余额;
将所述第四资源余额存入所述第二通用寄存器。
在一种实施方式中,所述第一逻辑电路中还包括状态寄存器,所述第一逻辑电路还用于,在所述比较的结果为第一资源余额小于所述扣除资源额度的情况中,结束对所述智能合约的执行,并在所述状态寄存器中对余额不足的状态进行记录。
本说明书另一方面提供一种处理器,包括第四逻辑电路,所述第四逻辑电路包括:第一通用寄存器,所述第一通用寄存器用于存储用于执行智能合约的第一资源余额;比较器和加法器,
所述第四逻辑电路用于在接收到第四数字信号之后执行以下操作,其中,所述第四数字信号中包括第一通用寄存器的标识、和与智能合约中预定代码集合对应的扣除资源额度:
从所述第一通用寄存器读取所述第一资源余额;
通过所述比较器将所述第一资源余额与所述扣除资源额度比较;
在所述比较的结果为第一资源余额大于等于所述扣除资源额度的情况中,通过所述加法器将第一资源余额与所述扣除资源额度相减,以获取第二资源余额;
将所述第二资源余额存入所述第一通用寄存器中。
本说明书另一方面提供一种处理器,包括第五逻辑电路,所述第五逻辑电路包括:比较器和加法器,
所述第五逻辑电路用于在接收到第五数字信号之后执行以下操作,其中,所述第五数字信号中包括第一内存地址、和与智能合约中预定代码集合对应的扣除资源额度,所述第一内存地址用于存储用于执行智能合约的第一资源余额:
从所述第一内存地址读取所述第一资源余额;
通过所述比较器将所述第一资源余额与所述扣除资源额度比较;
在所述比较的结果为第一资源余额大于等于所述扣除资源额度的情况中,通过所述加法器将第一资源余额与所述扣除资源额度相减,以获取第二资源余额;
将所述第二资源余额存入所述第一内存地址中。
本说明书另一方面提供一种计算设备,包括上述任一种处理器。
本说明书另一方面提供一种计算机数字信号,包括与智能合约中的预定代码集合对应的扣除资源额度,所述计算机数字信号用于指示对上述第一逻辑电路的使用。
本说明书另一方面提供一种计算机数字信号,包括处理器中的第一通用寄存器的标识,所述计算机数字信号用于指示对上述第二逻辑电路的使用。
本说明书另一方面提供一种计算机数字信号,包括处理器中的第二通用寄存器的标识,所述计算机数字信号用于指示对上述第三逻辑电路的使用。
本说明书另一方面提供一种计算机数字信号,包括处理器中的第一通用寄存器的标识、和与智能合约中的预定代码集合对应的扣除资源额度,所述计算机数字信号用于指示对上述第四逻辑电路的使用。
本说明书另一方面提供一种计算机数字信号,包括处理器中的第一内存地址、和与智能合约中的预定代码集合对应的扣除资源额度,所述计算机数字信号用于指示对上述第五逻辑电路的使用。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
通过根据本说明书实施例的执行智能合约的方案,通过基于处理器扩展指令和基于该扩展指令重新构造的处理器来执行对智能合约的扣费操作,以更高效的方式完成了该热点操作,加速了智能合约的执行,提高了虚拟机的执行效率。
附图说明
通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
图1示出虚拟机100的结构示意图;
图2示出计算设备的基本结构;
图3示出根据本说明书一个实施例的处理器300的结构示意图;
图4示出根据本说明书另一个实施例的处理器400的结构示意图;
图5示出根据本说明书另一个实施例的处理器500的结构示意图。
具体实施方式
下面将结合附图描述本说明书实施例。
在区块链中,通过向区块链节点发送用于创建智能合约的交易而部署智能合约。区块链中的节点在对该交易进行共识之后,可由区块链节点的虚拟机(例如EVM或WASM虚拟机)来执行该交易,从而创建与该智能合约对应的合约账户,对该合约分配特定的地址,并将合约代码和账户状态保存该用于存储账户信息的账户存储(Storage)中。后续,区块链节点可以接收调用部署的智能合约的交易(例如交易1),该交易1可以包括调用的合约的地址、调用的合约中的函数和输入的参数,另外,该交易1中还包括分配给该交易1的用于执行交易1的GAS余额。区块链各个节点在对该交易1经过共识后,可以各自独立执行指定调用的智能合约。该执行可通过节点的虚拟机执行。
图1示出虚拟机100的结构示意图。如图1中所示虚拟机100包括解释器(Interpreter)11、上下文12、虚拟机内存13和栈14。虚拟机100例如与交易1相对应,在将要执行交易1时,运行虚拟机100(即实例化虚拟机100)。虚拟机100实质上为待执行的几部分代码,即解释器11中包括的解析代码、跳转代码、GAS计费代码和数据计算代码,同时,在运行虚拟机100时,在内存中为虚拟机100分配一定的存储空间,即上下文12、虚拟机内存13和栈14,其中上下文12用于存储交易1中调用的智能合约的上下文信息,虚拟机内存13和栈14的作用如下文所述。
当执行交易1时,节点可以根据交易1中的合约的地址将合约的字节码(Bytecode)从上述账户存储载入虚拟机100中,节点还可以从交易1获取用于执行交易1的GAS余额,并将该GAS余额提供给虚拟机100,之后,由解释器11解释执行智能合约。所述解释执行过程包括:首先通过执行解析代码对调用的合约的字节码进行解析,得到机器码,并将这些机器码存入虚拟机内存13中,同时还得到调用的函数的地址;通过执行GAS计费代码,计算执行合约预定指令块所需要消耗的GAS,确定分配给交易1的GAS余额是否充足(即是否大于等于所述需要消耗的GAS),在GAS余额充足的情况中,进行GAS扣费,其中所述预定指令块包括预定的机器码中的一条或多条指令;在扣费完成之后,通过执行跳转代码跳转到虚拟机内存13中的对应地址取得所述预定块中的指令并开始执行,通过执行数据计算代码对所述预定块中的指令所操作的数据进行计算、并进行推入/推出栈14的操作,从而完成数据计算。在该过程中,还可能需要一些合约的上下文(Context)信息,例如区块号、调用合约的发起者的信息等等,解释器11可以从上下文12中得到这些信息。最后,将产生的状态通过调用存储接口以存入账户存储中。
从上文的执行交易1的过程可以看出,虚拟机100在执行交易1的过程中,在每次执行智能合约的一个指令块之前,需要先进行GAS扣费,在扣费成功之后再进行对该指令块的执行。也就是说,在执行智能合约的过程中,需要多次执行上述GAS计费代码,即,该GAS扣费操作是热点操作,其执行效率将大大影响对智能合约的执行效率。可以理解,上述全部执行过程都是通过节点设备中的处理器进行的,虚拟机内存13中存储的机器码也即为可由处理器执行的代码,所述虚拟机的解释器11中包括的代码也是可由处理器执行的代码。所述处理器可以为中央处理器(CPU),也可以为微处理器,对此不作限定。
表1示出与交易1对应的指令序列:
表1
其中,288(a0)为内存a0的地址加288所获取的地址,其中a0为内存的基地址,R2和R3为处理器中的寄存器名称,288为存储位置相对于a0的偏移量,288仅仅用于示例说明,所述偏移量不限于为288。假设虚拟机100在获取交易1的GAS余额之后,将该GAS余额存入虚拟机内存13中的内存地址288(a0)中。虚拟机100在解析交易1中的智能合约的过程中,在执行智能合约中的指令块1之前,虚拟机100首先确定该指令块1的GAS消耗为20GAS,从而,虚拟机100可基于GAS计算代码生成如表1所示的通用指令1-通用指令5作为与指令块1对应的GAS计费代码。其中,通用指令1表示从内存地址288(a0)中读取GAS余额并存入通用寄存器R2中,通用指令2表示在寄存器R3中存入0+20的和,即在寄存器R3中存入20,通用指令3表示比较通用寄存器R2与R3中的值,如果通用寄存器R2中的值小于R3中的值(即20),则指向内存54,即程序结束位置,终止对该合约的执行,如果通用寄存器R2中的值大于等于20,则继续对指令的执行,通用指令4表示将通用寄存器R2中的值减20再存回到通用寄存器R2中,即,如果GAS余额足够用于扣费,则进行GAS扣费,通用指令5表示将通用寄存器R2中的值存入内存地址288(a0)中,即,将更新内存地址288(a0)中的GAS余额。
从而,处理器在执行指令块1之前,将首先执行上述通用指令1-通用指令5,以进行相对于指令块1的GAS扣费。图2示出计算设备的基本结构。如图2所示,该计算设备包括处理器200和内存201,其中,处理器200通过外部总线(图2中以处理器200外部的箭头示出)与内存201连接,以用于从内存201读取数据或者向内存201写入数据。可以理解,在计算设备中,处理器200还通过外部总线与多个单元连接,如永久性存储介质、各种硬件设备等,这些在图2中未示出。处理器200中包括控制单元21和执行单元22,执行单元22中包括存储单元221和运算单元222,图2中在处理器200内部的箭头代表内部总线(例如64位数据线),控制单元21通过内部总线向执行单元22发送控制信号,存储单元221与运算单元222之间通过内部总线传输数据。其中,控制单元21是处理器200的指挥控制中心,包括指令寄存器(Instruction Register,IR)、指令译码器(Instruction Decoder,ID)和操作控制器(Operation Controller,OC)等。控制单元21依次从上述虚拟机内存13中读取各条指令放在指令寄存器中,通过指令译码器将指令转换为硬件数字信号作为控制信号,通过操作控制器按确定的时序向执行单元22发送硬件控制信号,以指示执行单元22执行与该硬件控制信号对应的操作,其中,所述硬件数字信号例如由在64位总线的每位数据线上的高低电平构成。
所述存储单元221包括CPU片内缓存和寄存器组,所述寄存器组包括多个通用寄存器和多个专用寄存器,所述寄存器例如为64位寄存器。所述运算单元222例如为ALU单元,其可执行算术运算和逻辑运算。所述执行单元22中通过对存储单元221和运算单元222的连接实现多个逻辑电路,该多个逻辑电路与处理器200的预定指令集中的多条指令分别一一对应。从而,控制单元21通过向执行单元22发送与特定逻辑电路对应的控制信号(其中包括操作数据的数据信号),从而可指示该特定逻辑电路对操作数据进行操作,从而执行与该特定逻辑电路对应的指令。
处理器200在执行每个指令时,都需要进行例如取指(Instruction Fetch,IF)、译码(Instruction Decode, ID)、执行(Instruction Execute, IE)、访存(Memory Access,MA)、写回(Write Back, WB)五个阶段。其中,取指是指将指令从存储器(在这里即虚拟机内存13)中读出,译码是指将指令翻译为数字信号,执行是指通过处理器中的算术逻辑运算单元(ALU)进行算术或逻辑运算,访存是指访问存储器以读取或写入数据,写回是指将指令的执行结果写回寄存器中。每个阶段通常需要1-2个时钟周期,从而,通过处理器200执行上述通用指令1-通用指令5将需要较多的执行时间。
针对上述问题,本说明书实施例针对处理器设计了专用于进行合约扣费的扩展指令,并基于扩展指令重新设计了处理器的硬件结构,从而使得该处理器可以以更高的效率进行合约扣费过程。
图3示出根据本说明书一个实施例的处理器300的结构示意图。如图3所示,处理器300包括控制单元31和执行单元32,其中,执行单元32相比于执行单元22增加了第一逻辑电路321、第二逻辑电路322和第三逻辑电路323。在本说明书实施例中,对处理器300新设计了三条扩展指令:扩展指令1、扩展指令2和扩展指令3,以用于在执行智能合约时进行合约扣费操作。所述第一逻辑电路321、第二逻辑电路322和第三逻辑电路323与所述扩展指令1、扩展指令2和扩展指令3分别一一对应。处理器300相比于处理器200还增加专用寄存器S2,该专用寄存器S2在执行交易的过程中专用于存储与该交易对应的GAS余额,图3中示出的专用寄存器S1为用于记录处理器300的执行状态的专用寄存器。
表2示出根据本说明书实施例的与交易1对应的指令序列。
表2
假设交易1中的智能合约中包括指令块1和指令块2,并且指令块1的GAS消耗为20GAS,指令块2的GAS消耗为30GAS,从而虚拟机100可基于GAS计算代码生成表2中的指令“gas_dec 20”和“gas_dec 30”,其都为扩展指令2。下面描述对表2所示的指令序列的执行过程。
具体是,在通过根据本说明书实施例的处理器300执行上述交易1之前,虚拟机100在获取到用于执行交易1的GAS余额之后,可暂时存储到通用寄存器R1中,处理器300在开始执行交易1之后,首先对智能合约中的第一个指令块(例如上述指令块1)进行扣费,如表2所示,在与指令块1对应的GAS计算代码中包括扩展指令1(gas_set R1)和扩展指令2 (gas_dec 20),其中“gas_set”为操作码,“R1”表示通用寄存器R1。
处理器300在通过控制单元31从虚拟机内存13中取出扩展指令1 (gas_set R1)之后,通过控制单元31对指令“gas_set R1”进行译码,从而生成与指令“gas_set R1”对应的控制信号,并将该控制信号发送给执行单元32。执行单元32基于该控制信号选择与指令“gas_set R1”对应的第一逻辑电路321,并将该控制信号发送给第一逻辑电路321。第一逻辑电路321中包括相互连接的通用寄存器R1和专用寄存器S2,第一逻辑电路321基于上述控制信号从通用寄存器R1中读取当前GAS余额,并将该GAS余额存入专用寄存器S2中。可以理解,虚拟机在从交易1中获取GAS余额之后,不限于将GAS余额存储到通用寄存器R1中,而是可以存储到其它通用寄存器中,或者存储到内存中的地址中。因此,根据虚拟机存储GAS余额的位置不同,第一逻辑电路321的结构也随之相应地变化,例如,如果虚拟机将GAS余额存储到内存中,则第一逻辑电路321中只需要包括与CPU外部总线连接的专用寄存器S2即可。
处理器300在执行完成指令“gas_set R1”之后从虚拟机内存13中取出扩展指令2(gas_dec 20),其中,“gas_dec”为操作码,“20”为操作数。处理器300在取出指令gas_dec20之后,类似地,通过控制单元31对指令gas_dec 20译码,并将译码获取的控制信号发送给执行单元32,以选择与指令gas_dec 20对应的第二逻辑电路322,并将该指令发送给第二逻辑电路322。第二逻辑电路322中包括如图3中所示连接的专用寄存器S2、专用寄存器S1、比较器、加法器。第二逻辑电路322在接收到与指令gas_dec 20对应的控制信号之后,比较器从专用寄存器S2中读取GAS余额,通过比较器比较GAS余额是否大于等于20,如果大于等于20,则通过加法器将GAS余额减去20并存回到专用寄存器S2中,并进行对下一条指令(即指令块1中的指令)的执行。如果GAS余额小于20,则将专用寄存器S1中的与GAS余额不足的状态对应的位设置为1,并停止对指令块1的执行,从而处理器进入异常状态。在该情况中,处理器将跳转执行虚拟机100中的异常处理函数,从而通过读取专用寄存器S1确定交易的GAS余额不足,并返回余额不足的提示。
在上述成功完成对指令块1的GAS扣费的情况中,处理器300将顺序执行指令块1中的全部指令。也就是说,通过本说明书实施例的处理器300执行对指令块1的扣费过程中,仅需要执行扩展指令1和扩展指令2,相比于上文中执行通用指令1-通用指令5的过程,大大减少了全部扣费过程需要的时钟周期,提高了执行效率。
在执行完指令块1之后、执行指令块1后面的指令块2之前,处理器300根据表2所示代码序列,执行与该指令块2对应的计费代码。由于,此时专用寄存器S2中已经存储了与交易1对应的GAS余额,而不再需要通过执行扩展指令1来在专用寄存器S2中存入GAS余额,因此,与指令块2对应的计费代码中仅包括扩展指令2(即gas_dec 30)。处理器300在进行对指令块2的扣费过程中,仅需要执行一个指令,即可完成扣费,从而减少了所述扣费过程需要的时钟周期,进一步提高了合约执行效率。
在执行完交易1之后,处理器300从虚拟机内存13中还取出扩展指令3,即表2中的指令gas_get R2,其中“gas_get”为操作码,“R2”表示通用寄存器R2。控制单元31在对扩展指令3译码之后,将译码获取的控制信号发送给执行单元32,从而执行单元32选择与扩展指令3对应的第三逻辑电路323,并将该控制信号发送给第三逻辑电路323。第三逻辑电路323中包括相互连接的专用寄存器S2和通用寄存器R2,第三逻辑电路323在接收到控制信号之后从专用寄存器S2读取当前GAS余额,并将该GAS余额存入通用寄存器R2中,从而虚拟机100可通过读取该通用寄存器R2获取GAS余额,并基于该GAS余额更新账户存储中的发送交易1的账户的状态。
可以理解,虽然在上文中描述了在执行智能合约的指令块之前执行表2中的扩展指令2,本说明书实施例不限于此。例如,在虚拟机中可预设先执行后扣费的扣费规则,从而可在执行预定指令块之后执行相应的扩展指令2,或者在执行智能合约之后执行与各个指令块对应的各个扩展指令2等等。
图4示出根据本说明书另一个实施例的处理器400的结构示意图。如图4所示,处理器400包括控制单元41和执行单元42,其中,执行单元42包括第四逻辑电路421和第五逻辑电路422,其中,执行单元42相比于上述执行单元22新增了第五逻辑电路422。在本说明书实施例中,对处理器400增加了新的扩展指令:扩展指令4,以用于在执行智能合约时进行合约扣费操作。其中,所述第五逻辑电路422与所述扩展指令4相对应。
表3示出根据本说明书另一实施例的与交易1对应的指令序列。
表3
下面描述对表3所示的指令序列的执行过程。
具体是,在通过根据本说明书实施例的处理器400执行上述交易1之前,虚拟机100在获取到用于执行交易1的GAS余额之后,可将其存入指定用于存储GAS余额的内存地址(即288(a0)中),处理器400在开始执行交易1之后,首先对智能合约中的第一个指令块(例如上述指令块1)进行扣费,如表3所示,在与指令块1对应的GAS计算代码中包括通用指令1、扩展指令4和通用指令5。
处理器400在通过控制单元41从虚拟机内存13中取出通用指令1 (ld R1,288(a0))之后,通过控制单元41对指令“ld R1,288(a0)”进行译码,从而生成与指令“ld R1,288(a0)”对应的控制信号,并将该控制信号发送给执行单元42。执行单元42基于该控制信号选择与指令“ld R1,288(a0)”对应的第四逻辑电路421,第四逻辑电路421中包括与外部总线连接的通用寄存器R1,从而,第四逻辑电路421在接收到控制信号之后从内存地址288(a0)中读取当前GAS余额,并将该GAS余额存入通用寄存器R1中。可以理解,虚拟机在从交易1中获取GAS余额之后,不限于将GAS余额存储到内存地址中,而是可以存储到其它通用寄存器中。因此,根据虚拟机存储GAS余额的位置不同,第四逻辑电路421的结构也随之相应地变化,例如,如果虚拟机将GAS余额存储到通用寄存器R2中,则第四逻辑电路421中将包括相互连接的通用寄存器R1和通用寄存器R2。
处理器400在执行完成指令“ld R1,288(a0)”之后从虚拟机内存13中取出扩展指令4(gas_dec R1,20),其中,“gas_dec”为操作码,R1指通用寄存器R1,“20”为操作数。处理器400在取出指令gas_dec R1,20之后,类似地,通过控制单元41对指令gas_dec R1,20译码,并将译码获取的控制信号发送给执行单元42,以指示选择与扩展指令4对应的第五逻辑电路422。第五逻辑电路422中包括如图4中所示连接的通用寄存器R1、专用寄存器S1、比较器、加法器。第五逻辑电路422在接收到控制信号之后,比较器从通用寄存器R1中读取GAS余额,通过比较器比较GAS余额是否大于等于20,如果大于等于20,则通过加法器将GAS余额减去20并存回到通用寄存器R1中,并进行对下一条指令的执行。如果GAS余额小于20,则将专用寄存器S1中的与GAS余额不足的状态对应的位设置为1,并停止对指令的执行,从而处理器进入异常状态。在该情况中,处理器将跳转到执行虚拟机100中的异常处理函数,从而通过读取专用寄存器S1确定交易的GAS余额不足,并返回余额不足的提示。
在上述成功完成对指令块1的GAS扣费的情况中,处理器400将取出通用指令5,即Sd R1,288(a0)。控制单元41在对指令Sd R1,288(a0)译码之后,将译码获取的控制信号发送给执行单元42,从而执行单元42选择与指令Sd R1,288(a0)对应的第四逻辑电路421。第四逻辑电路421在接收到控制信号之后从通用寄存器R1读取当前GAS余额,并将该GAS余额存入内存地址288(a0)中。也就是说,在表3所示的程序序列中,通用指令1和通用指令5对应于相同的第四逻辑电路421,并使得第四逻辑电路421执行不同的操作。之后,处理器400顺序执行指令块1中的全部指令。在通过本说明书实施例的处理器400执行对指令块1的扣费过程中,仅需要执行如表3所示的三个指令,相比于上文中执行通用指令1-通用指令5的过程,大大减少了全部扣费过程需要的时钟周期,提高了执行效率。
图5示出根据本说明书另一个实施例的处理器500的结构示意图。如图5所示,处理器500包括控制单元51和执行单元52,其中,执行单元52包括第六逻辑电路521,其中,执行单元52相比于上述执行单元22新增了第六逻辑电路521。在本说明书实施例中,对处理器500增加了新的扩展指令:扩展指令5,以用于在执行智能合约时进行合约扣费操作。其中,所述第六逻辑电路521与所述扩展指令5相对应。
表4示出根据本说明书另一实施例的与交易1对应的指令序列。
表4
下面描述对表4所示的指令序列的执行过程。
具体是,在通过根据本说明书实施例的处理器500执行上述交易1之前,虚拟机100在获取到用于执行交易1的GAS余额之后,可将其存入指定用于存储GAS余额的内存地址(即288(a0)中),处理器500在开始执行交易1之后,首先对智能合约中的第一个指令块(例如上述指令块1)进行扣费,如表4所示,在与指令块1对应的GAS计算代码中仅包括扩展指令5。
处理器500在通过控制单元51从虚拟机内存13中取出扩展指令5 (gas_dec 288(a0),20)之后,通过控制单元51对指令“gas_dec 288(a0),20”进行译码,从而生成与该指令对应的控制信号,并将该控制信号发送给执行单元52。执行单元52基于该控制信号选择与指令“gas_dec 288(a0),20”对应的第六逻辑电路521。第六逻辑电路521中包括如图5中所示连接的专用寄存器S1、比较器、加法器,并且第六逻辑电路521中的比较器和加法器还通过外部总线与内存连接。第六逻辑电路521在接收到控制信号之后,从内存地址288(a0)中读取GAS余额,通过比较器比较GAS余额是否大于等于20,如果大于等于20,则通过加法器将GAS余额减去20并存回到内存地址288(a0)中,并进行对下一条指令(即指令块1中的指令)的执行。如果GAS余额小于20,则将专用寄存器S1中的与GAS余额不足的状态对应的位设置为1,并停止对指令的执行,从而处理器进入异常状态。在该情况中,处理器将跳转到执行虚拟机100中的异常处理函数,从而通过读取专用寄存器S1确定交易的GAS余额不足,并返回余额不足的提示。根据该实施例的处理器500例如可以为基于CISC架构的处理器、或其它能对内存中的数据进行运算的处理器。
也就是说,在通过本说明书实施例的处理器500执行对指令块1的扣费过程中,仅需要执行如表4所示的一个指令,相比于上文中执行通用指令1-通用指令5的过程,大大减少了全部扣费过程需要的时钟周期,提高了执行效率。
本说明书实施例还公开了一种计算设备,包括上述任一种处理器。所述计算设备用作为区块链中的节点的节点设备。在所述计算设备中,还对操作系统(例如Linux系统的内核(Kernel))进行相应的修改,以适配与根据本说明书实施例的处理器。例如,在通过该计算设备并行处理交易1和交易2时,例如上述处理器300可通过线程T1和T2分别处理交易1和交易2,当线程T1处理交易1时,专用寄存器S2中存储用于执行交易1的GAS余额,当转换为由线程T2处理交易2时,通过Kernel的调度,将专用寄存器S2中的交易1的余额保存到另外的存储单元(例如内存、寄存器、高速缓存等),并将交易2的GAS余额存入专用寄存器S2中。
通过根据本说明书实施例的执行智能合约的方案,对指令集进行了扩展,从而将原来的多条指令实现扣费的功能由相对较少的扩展指令替代实现,实现将原有多条指令的执行周期压缩为较少的时钟周期,因此提升了虚拟机的执行效率。
需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。其中,软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。