CN114091111A - 一种区块链智能合约的存储方法及装置 - Google Patents
一种区块链智能合约的存储方法及装置 Download PDFInfo
- Publication number
- CN114091111A CN114091111A CN202111055168.9A CN202111055168A CN114091111A CN 114091111 A CN114091111 A CN 114091111A CN 202111055168 A CN202111055168 A CN 202111055168A CN 114091111 A CN114091111 A CN 114091111A
- Authority
- CN
- China
- Prior art keywords
- code
- intelligent contract
- field
- slice
- block chain
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/64—Protecting data integrity, e.g. using checksums, certificates or signatures
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明实施例提供了一种区块链智能合约的存储方法及装置,该方法包括第一区块链节点在确定智能合约部署交易满足执行条件时,通过对智能合约部署交易进行解析得到智能合约源代码,将智能合约源代码转换为智能合约操作码,以至少一个关键字段作为切分智能合约操作码的切分字段,对智能合约操作码进行切分,得到至少一个切分字段对应的代码切片,在确定区块链中不存在某一切分字段对应的代码切片的哈希值时,将该切分字段对应的代码切片的哈希值以及该切分字段对应的代码切片存储至区块链。如此,该方案可以避免出现将不同智能合约所具有的相同功能函数对应的代码片段进行重复存储的情况,从而可以有效地提高区块链存储智能合约代码的效率。
Description
技术领域
本发明实施例涉及金融科技(Fintech)领域,尤其涉及一种区块链智能合约的存储方法及装置。
背景技术
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。
现阶段,智能合约代码是存储在区块链中的,并且是在账户状态accountstate中的智能合约代码哈希值codehash指向的一块存储区域中。具体地,智能合约在部署时,通过提交一个智能合约部署交易,该智能合约部署交易中包括智能合约代码,并将该智能合约部署交易封装在一个区块中,然后将该区块上链至区块链。并且,针对任一区块,该区块中有一个默克尔树,是将智能合约地址、智能合约代码哈希值codehash等智能合约相关信息以键值对的形式存储在该默克尔树中,比如,以智能合约地址作为key,交易次数nonce、账户余额balance、默克尔树的根的哈希值storageroot、智能合约代码哈希值codehash作为value进行存储。其中,在智能合约代码哈希值codehash所指向的存储区域中,存储智能合约代码的结构形式是以智能合约代码哈希值codehash作为key,智能合约代码作为value的键值对形式。然而,这种存储方式是以智能合约代码作为一个整体进行存储的,如此就会出现不同智能合约所具有的相同功能函数对应的代码片段被重复存储的情况,导致区块链存储智能合约代码的效率低,而且灵活性差。
综上,目前亟需一种区块链智能合约的存储方法,用以有效地提高区块链存储智能合约代码的效率。
发明内容
本发明实施例提供了一种区块链智能合约的存储方法及装置,用以有效地提高区块链存储智能合约代码的效率。
第一方面,本发明实施例提供了一种区块链智能合约的存储方法,适用于具有N个区块链节点的区块链网络,所述方法包括:
第一区块链节点在确定智能合约部署交易满足执行条件时,通过对所述智能合约部署交易进行解析得到智能合约源代码;所述第一区块链节点为所述N个区块链节点中的任一个;
所述第一区块链节点将所述智能合约源代码转换为智能合约操作码;
所述第一区块链节点以至少一个关键字段作为切分所述智能合约操作码的切分字段,对所述智能合约操作码进行切分,得到至少一个切分字段对应的代码切片;所述至少一个关键字段为所述智能合约操作码中具有的字段;
针对每个切分字段对应的代码切片,所述第一区块链节点在确定区块链中不存在所述切分字段对应的代码切片的哈希值时,将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链。
上述技术方案中,由于现有技术方案中是将智能合约代码作为一个整体进行存储,因此在将不同的智能合约存储至区块链时,会将至少两个不同智能合约中具有的相同功能函数对应的代码片段进行重复存储,如此会导致区块链存储智能合约代码的效率低,而且灵活性差。基于此,本发明中的技术方案通过将智能合约代码进行切分,得到切分后的各代码片段,并将切分后的各代码片段存储至区块链,如此可以避免因将智能合约代码整体存储而导致出现不同智能合约所具有的相同功能函数对应的代码片段被重复存储的情况,从而可以有效地提高区块链存储智能合约代码的效率,并可以使得智能合约代码存储的灵活性更高,更加符合区块链网络的实际需求。具体来说,第一区块链节点在确定智能合约部署交易满足执行条件时,将智能合约部署交易中的智能合约源代码转换为智能合约操作码,以便能够准确地基于智能合约操作码中的切分字段进行切分。再以至少一个关键字段作为切分智能合约操作码的切分字段,就可以及时准确地将该智能合约操作码切分为多个可以灵活存储的代码切片。然后,针对每个切分字段对应的代码切片,若确定区块链中用于存储代码切片的存储区域中不存在该切分字段对应的代码切片的哈希值,则才将该切分字段对应的代码切片的哈希值以及该切分字段对应的代码切片存储至区块链,若确定区块链中用于存储代码切片的存储区域中存在该切分字段对应的代码切片的哈希值,则不会将该切分字段对应的代码切片的哈希值以及该切分字段对应的代码切片存储至区块链,如此就可以避免出现将不同智能合约所具有的相同功能函数对应的代码片段进行重复存储的情况,有助于减少存储智能合约代码所占用的存储空间,从而可以有效地提高区块链存储智能合约代码的效率。
可选地,所述第一区块链节点将所述智能合约源代码转换为智能合约操作码,包括:
所述第一区块链节点通过编译器将所述智能合约源代码编译为智能合约字节码;
所述第一区块链节点通过代码转换器将所述智能合约字节码转换为所述智能合约操作码。
上述技术方案中,由于区块链底层存储的是智能合约字节码,但是针对智能合约字节码不能准确地进行切分,所以为了能够实现针对智能合约字节码的切分,可以通过将智能合约字节码转换为智能合约操作码,从而通过智能合约操作码中的一些切分字段就可以将智能合约操作码进行合理且准确地切分,以此就能够实现针对智能合约字节码的切分,从而可以实现将智能合约字节码进行分片段的存储至区块链。
可选地,所述第一区块链节点以至少一个关键字段作为切分所述智能合约操作码的切分字段,对所述智能合约操作码进行切分,包括:
所述第一区块链节点对所述智能合约操作码进行内容检测,在确定所述智能合约操作码中存在属于第一层级的至少一个第一切分字段时,按照所述至少一个第一切分字段在所述智能合约操作码中的位置顺序依次将所述至少一个第一切分字段所在的代码片段从所述智能合约操作码中进行切分,从而得到属于第一层级的至少一个第一切分字段对应的代码片段,并将所述至少一个第一切分字段对应的代码片段作为所述至少一个第一切分字段对应的代码切片;所述第一切分字段为所述至少一个切分字段中的任一个。
上述技术方案中,由于在对智能合约操作码进行内容检测时,一般是从智能合约操作码的起始位置一直检测到末尾位置,所以也是依次检测到某一切分字段。而且,由于智能合约操作码中所存在的切分字段可能有嵌套层,也即是一个切分字段下面又嵌套一个切分字段,所以为了准确地切分智能合约操作码,同时又为了避免遗漏切分一些切分字段所在的代码片段,当然也是为了避免具有相同功能函数对应的代码片段被重复存储,会针对智能合约操作码进行一个层级又一个层级的检测和切分,首先会针对智能合约操作码进行属于第一层级的切分字段所在的代码片段的切分,在属于第一层级的各切分字段所在的代码片段全部被切分完毕后,再进行属于第二层级的切分字段的检测,如此就可以将所有切分字段所在的代码片段进行切分出来,从而实现针对智能合约字节码进行更细粒度的切分,以此就可以避免区块链上存储有相同功能函数对应的代码片段。
可选地,在得到属于第一层级的至少一个第一切分字段对应的代码片段之后,还包括:
针对属于第一层级的每个第一切分字段对应的代码切片,所述第一区块链节点对所述第一切分字段所在的代码片段进行内容检测,在确定所述第一切分字段所在的代码片段中存在属于第二层级的至少一个第二切分字段时,按照所述至少一个第二切分字段在所述第一切分字段所在的代码片段中的位置顺序依次将所述至少一个第二切分字段所在的代码片段从所述第一切分字段所在的代码片段中进行切分,从而得到属于第二层级的至少一个第二切分字段对应的代码片段,并将所述至少一个第二切分字段对应的代码片段作为所述至少一个第二切分字段对应的代码切片;所述第二切分字段为所述至少一个切分字段中的任一个。
上述技术方案中,由于智能合约操作码中所存在的切分字段可能有嵌套层,也即是一个切分字段下面又嵌套一个切分字段,下面嵌套的切分字段也可能对应一个代码片段,所以需要针对第一切分字段所在的代码片段进行再次内容检测,以便对存在嵌套层的切分字段所在的代码片段进行再次切分字段的检测,并在确定存在切分字段时,进行更深层次的代码片段的切分,从而可以实现针对智能合约字节码进行更细粒度的切分,以此就可以避免区块链上存储有相同功能函数对应的代码片段。
可选地,所述至少一个切分字段中包括tag字段;
针对每个切分字段对应的代码切片,所述第一区块链节点在确定区块链中不存在所述切分字段对应的代码切片的哈希值时,将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链,包括:
针对每个切分字段对应的代码切片,所述第一区块链节点若确定所述切分字段对应的代码切片中存在push tag指令,则将所述切分字段标注为中间态字段,并在确定所述push tag指令指向的tag字段所在的代码片段为不能切分的片段时,将所述中间态字段替换为终结态字段;
所述第一区块链节点根据所述终结态字段,通过代码转换器将所述切分字段对应的代码切片转换为第一字节码切片,并对所述第一字节码切片进行哈希运算,得到所述第一字节码切片的哈希值;
所述第一区块链节点若确定所述区块链中不存在所述第一字节码切片的哈希值,则将所述第一字节码切片的哈希值以及所述第一字节码切片存储至区块链。
上述技术方案中,针对每个切分字段对应的代码切片,通过判断该切分字段对应的代码切片中是否存有push tag指令来确定是否需要立即将该切分字段对应的代码切片进行哈希运算以及进行代码转换。如果该切分字段对应的代码切片中存有push tag指令,且在确定指令指向的tag字段所在的代码片段为不能切分的片段时,才通过代码转换器将切分字段对应的代码切片进行转换,如此可以确保智能合约操作码中不存在能够继续进行切分的切分字段,从而可以避免将不同智能合约中具有同一功能函数对应的字节码切片进行重复存储,以此可以减少存储智能合约代码所占用的存储空间,并可以使得智能合约字节码存储的灵活性更高。
可选地,所述方法还包括:
所述第一区块链节点若确定所述切分字段对应的代码切片中不存在所述pushtag指令,则通过所述代码转换器将所述切分字段对应的代码切片转换为第二字节码切片;
所述第一区块链节点对所述第二字节码切片进行哈希运算,得到所述第二字节码切片的哈希值;
所述第一区块链节点若确定所述区块链中不存在所述第二字节码切片的哈希值,则将所述第二字节码切片的哈希值以及所述第二字节码切片存储至区块链。
上述技术方案中,如果确定切分字段对应的代码切片中不存在push tag指令,则可以确认该切分字段对应的代码切片已经最终状态的切分,无法再切分,所以可以直接通过代码转换器将切分字段对应的代码切片转换为第二字节码切片,并在确定区块链上不存在该第二字节码切片的哈希值时,将该第二字节码切片的哈希值以及该第二字节码切片存储至区块链,如此就可以避免将不同智能合约中具有同一功能函数对应的字节码切片进行重复存储,以此可以减少存储智能合约代码所占用的存储空间,有助于提高区块链存储智能合约字节码的效率。
可选地,在将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链之后,还包括:
所述第一区块链节点在检测到智能合约调用请求时,基于所述智能合约调用请求中的智能合约地址从区块链中查询到对应的智能合约,并获取到所述智能合约中存储的各字节码切片的哈希值;所述各字节码切片的哈希值是按照所述各字节码切片在所述智能合约中的位置顺序进行排列的;
所述第一区块链节点根据所述各字节码切片的哈希值,从所述区块链中的用于存储字节码切片的存储区域查询出对应的各字节码切片;
所述第一区块链节点按照所述各字节码切片的哈希值在所述智能合约中的位置顺序,将所述各字节码切片进行拼接处理,得到智能合约字节码;
所述第一区块链节点将所述智能合约字节码加载到用于执行智能合约的虚拟机;所述虚拟机用于执行所述智能合约字节码。
上述技术方案中,在需要调用某一智能合约时,可以通过该智能合约的地址访问该智能合约,并从该智能合约中获取其所包括的至少一个字节码切片的哈希值。然后,根据该至少一个字节码切片的哈希值从区块链上准确地读取到各自对应的字节码切片,并按照各字节码切片在智能合约中的位置顺序将各字节码切片进行拼接,以此可以获得完整的智能合约字节码,从而可以及时地将该智能合约字节码加载到对应的虚拟机中进行执行。
第二方面,本发明实施例还提供了一种区块链智能合约的存储装置,适用于具有N个区块链节点的区块链网络,所述装置包括:
解析单元,用于在确定智能合约部署交易满足执行条件时,通过对所述智能合约部署交易进行解析得到智能合约源代码;
处理单元,用于将所述智能合约源代码转换为智能合约操作码;以至少一个关键字段作为切分所述智能合约操作码的切分字段,对所述智能合约操作码进行切分,得到至少一个切分字段对应的代码切片;所述至少一个关键字段为所述智能合约操作码中具有的字段;针对每个切分字段对应的代码切片,在确定区块链中不存在所述切分字段对应的代码切片的哈希值时,将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链。
可选地,所述处理单元具体用于:
通过编译器将所述智能合约源代码编译为智能合约字节码;
通过代码转换器将所述智能合约字节码转换为所述智能合约操作码。
可选地,所述处理单元具体用于:
对所述智能合约操作码进行内容检测,在确定所述智能合约操作码中存在属于第一层级的至少一个第一切分字段时,按照所述至少一个第一切分字段在所述智能合约操作码中的位置顺序依次将所述至少一个第一切分字段所在的代码片段从所述智能合约操作码中进行切分,从而得到属于第一层级的至少一个第一切分字段对应的代码片段,并将所述至少一个第一切分字段对应的代码片段作为所述至少一个第一切分字段对应的代码切片;所述第一切分字段为所述至少一个切分字段中的任一个。
可选地,所述处理单元还用于:
在得到属于第一层级的至少一个第一切分字段对应的代码片段之后,针对属于第一层级的每个第一切分字段对应的代码切片,对所述第一切分字段所在的代码片段进行内容检测,在确定所述第一切分字段所在的代码片段中存在属于第二层级的至少一个第二切分字段时,按照所述至少一个第二切分字段在所述第一切分字段所在的代码片段中的位置顺序依次将所述至少一个第二切分字段所在的代码片段从所述第一切分字段所在的代码片段中进行切分,从而得到属于第二层级的至少一个第二切分字段对应的代码片段,并将所述至少一个第二切分字段对应的代码片段作为所述至少一个第二切分字段对应的代码切片;所述第二切分字段为所述至少一个切分字段中的任一个。
可选地,所述至少一个切分字段中包括tag字段;
所述处理单元具体用于:
针对每个切分字段对应的代码切片,若确定所述切分字段对应的代码切片中存在push tag指令,则将所述切分字段标注为中间态字段,并在确定所述push tag指令指向的tag字段所在的代码片段为不能切分的片段时,将所述中间态字段替换为终结态字段;
根据所述终结态字段,通过代码转换器将所述切分字段对应的代码切片转换为第一字节码切片,并对所述第一字节码切片进行哈希运算,得到所述第一字节码切片的哈希值;
若确定所述区块链中不存在所述第一字节码切片的哈希值,则将所述第一字节码切片的哈希值以及所述第一字节码切片存储至区块链。
可选地,所述处理单元还用于:
若确定所述切分字段对应的代码切片中不存在所述push tag指令,则通过所述代码转换器将所述切分字段对应的代码切片转换为第二字节码切片;
对所述第二字节码切片进行哈希运算,得到所述第二字节码切片的哈希值;
若确定所述区块链中不存在所述第二字节码切片的哈希值,则将所述第二字节码切片的哈希值以及所述第二字节码切片存储至区块链。
可选地,所述处理单元还用于:
在将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链之后,在检测到智能合约调用请求时,基于所述智能合约调用请求中的智能合约地址从区块链中查询到对应的智能合约,并获取到所述智能合约中存储的各字节码切片的哈希值;所述各字节码切片的哈希值是按照所述各字节码切片在所述智能合约中的位置顺序进行排列的;
根据所述各字节码切片的哈希值,从所述区块链中的用于存储字节码切片的存储区域查询出对应的各字节码切片;
按照所述各字节码切片的哈希值在所述智能合约中的位置顺序,将所述各字节码切片进行拼接处理,得到智能合约字节码;
将所述智能合约字节码加载到用于执行智能合约的虚拟机;所述虚拟机用于执行所述智能合约字节码。
第三方面,本发明实施例提供一种计算设备,包括至少一个处理器以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行上述第一方面任意所述的区块链智能合约的存储方法。
第四方面,本发明实施例提供一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述第一方面任意所述的区块链智能合约的存储方法。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种可能的***架构的示意图;
图2为本发明实施例提供的一种区块链智能合约的存储方法的流程示意图;
图3为本发明实施例提供的一种智能合约A的智能合约操作码的结构示意图;
图4为本发明实施例提供的一种区块链存储智能合约A、智能合约B的结构示意图;
图5为本发明实施例提供的一种区块链智能合约的存储装置的结构示意图;
图6为本发明实施例提供的一种计算设备的结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
下面首先对本发明实施例中涉及的部分用语进行解释说明,以便于本领域技术人员进行理解。
(1)智能合约(smart contract):是一种旨在以信息化方式传播、验证或执行合同的计算机协议,该智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。
(2)函数:是智能合约中代码的可执行单元。
(3)函数调用:可发生在合约内部或外部,且函数对其他合约有不同程度的可见性。
如上介绍了本发明实施例中涉及的部分用语,下面对本发明实施例涉及的技术特征进行介绍。
为了便于理解本发明实施例,首先以图1中示出的***架构为例说明适用于本发明实施例的区块链智能合约的存储***架构。如图1所示,该***架构可以包括客户端100和区块链网络200。其中,区块链网络200可以包括至少一个区块链节点,比如区块链节点201、区块链节点202、区块链节点203和区块链节点204等,至少一个区块链节点中任意两个区块链节点可以通信连接;客户端100与区块链网络200中的任一区块链节点可以通过有线方式进行通信连接,或者可以通过无线方式进行通信连接,本发明实施例对此并不作限定。
示例性地,客户端100在需要部署某一智能合约时,通常会以交易的形式向区块链网络200中的任一区块链节点(比如区块链节点201)提交一个部署该智能合约的请求,该区块链节点201在接收到该智能合约部署交易后,会将该智能合约部署交易放到本地的交易池中,同时会将该智能合约部署交易同步至除该区块链节点201以外的其它区块链节点(比如区块链节点202、区块链节点203和区块链节点204等),其它区块链节点也会将该智能合约部署交易放到各自的交易池中。然后,在区块链网络200中某一区块链节点被确定为出块节点(比如区块链节点201)时,该区块链节点201会将本地的交易池中多笔交易打包为区块,并将该区块发送给除该区块链节点201以外的其它区块链节点进行共识,在确定该区块共识成功后将该区块进行上链。也即是,在针对区块进行共识的过程中,区块链网络200中每个区块链节点都会执行区块,比如执行区块中的智能合约部署交易。在确定智能合约部署交易满足执行条件时,即可执行该智能合约部署交易,即,对该智能合约部署交易进行解析处理得到智能合约源代码,并通过编译器将智能合约源代码编译为智能合约字节码,以及通过代码转换器将智能合约字节码转换为智能合约操作码。再针对该智能合约操作码按照设定的切分规则将该智能合约操作码切分为至少一个代码切片,并记录至少一个字节码切片各自在智能合约中所处的位置顺序,并针对每个代码切片,确定区块链中是否存在该代码切片的哈希值,如果不存在,则将该代码切片转换为字节码切片,并针对该字节码切片进行哈希运算,得到该字节码切片的哈希值。然后每个区块链节点都会验证自己执行智能合约部署交易的执行结果与其它区块链节点执行智能合约部署交易的执行结果是否一致,并在确定全部一致或达成一致的数量满足第一设定数量阈值(比如与三分之二数量的区块链节点的执行结果一致)时,即可认可该执行结果,并在确定全部区块链节点或满足第二设定数量阈值(比如三分之二数量的区块链节点认可该执行结果)的区块链节点认可该执行结果时,可以将不存在于区块链中的至少一个字节码切片以及各自对应的哈希值存储至区块链。其中,第一设定数量阈值和第二设定数量阈值可以根据本领域技术人员的经验或实际应用场景进行设置,本发明实施例对此并不作限定。其中,通过每个智能合约的地址可以访问到对应的智能合约,每个智能合约中记录有该智能合约所包含的各字节码切片的位置顺序以及各字节码切片的哈希值,其中,在记录时,可以按照每个智能合约中各字节码切片的先后位置顺序进行记录,或者也可以不按照每个智能合约中各字节码切片的先后位置顺序进行记录,但是都需要针对每个智能合约中的各字节码切片进行标注位置顺序,本发明实施例对此并不作限定。需要说明的是,每个智能合约中各字节码切片在该智能合约中的位置顺序也即是按照该各字节码切片在该智能合约中被执行时的先后位置进行标注的。比如智能合约A包含有三个字节码切片,即字节码切片a、字节码切片b和字节码切片c,假设字节码切片a、字节码切片b和字节码切片c分别在智能合约A中的位置顺序为位置1、位置2、位置3,则也即是说,字节码切片a在智能合约A中的起始位置,字节码切片b在智能合约A中的中间位置,字节码切片c在智能合约A中的末尾位置,此时会针对字节码切片a标注上1、对字节码切片b标注上2以及对字节码切片c标注上3。然后,在智能合约A中记录时,可以按照字节码切片a、字节码切片b和字节码切片c进行记录,或者也可以按照字节码切片b、字节码切片a和字节码切片c进行记录等,同时会对应记录每个字节码切片的哈希值。
需要说明的是,上述图1所示的***结构仅是一种示例,本发明实施例对此不做限定。
基于上述描述,图2示例性的示出了本发明实施例提供的一种区块链智能合约的存储方法的流程,该流程可以由区块链智能合约的存储装置执行。其中,本发明实施例中的区块链智能合约的存储方法适用于N个区块链节点的区块链网络。
如图2所示,该流程具体包括:
步骤201,第一区块链节点在确定智能合约部署交易满足执行条件时,通过对所述智能合约部署交易进行解析得到智能合约源代码。
本发明实施例中,第一区块链节点在确定区块中的某一智能合约部署交易满足执行条件时,就会执行该智能合约部署交易,即,通过针对该智能合约部署交易进行解析处理,即可得到该智能合约部署交易中所包含的智能合约源代码。其中,第一区块链节点为N个区块链节点中的任一个。
示例性地,某一用户在终端设备(比如智能手机、平板电脑、笔记本电脑、台式电脑等)的客户端中编写好某一智能合约源代码后,可以在该终端设备的客户端上基于该编写好的智能合约源代码生成智能合约部署请求,并通过该终端设备的客户端将该智能合约部署请求以交易的形式发送给区块链网络中的任一区块链节点(比如区块链节点A),该区块链节点A在将该智能合约部署交易存储至本地的交易池中后,将该智能合约部署交易同步给区块链网络中除区块链节点A以外的其它区块链节点,其它区块链节点在接收到该智能合约部署交易后,也会将该智能合约部署交易放到各自的交易池中。然后,区块链网络中某一区块链节点(比如区块链节点B)被确定为出块节点(也即是主节点),则该区块链节点B会将本地的交易池中多笔交易打包为区块,并将该区块发送给区块链网络中除该区块链节点B以外的其它区块链节点进行共识,在确定该区块共识成功后将该区块进行上链。也即是,在针对该区块进行共识的流程中,每个区块链节点都会执行该区块,也就是执行该区块中的每笔交易,比如每笔交易在满足执行条件时即可执行该笔交易,该执行条件可以是每笔交易的执行时间,比如在将各交易打包为区块时可以为每笔交易设置一个执行时间,或者该执行条件也可以为每笔交易的执行顺序,比如在将每笔交易打包进区块中时会有一个先后顺序,每笔交易打包进区块中的先后顺序就可以作为该笔交易的执行顺序。例如,某一笔交易为智能合约部署交易,则可以为该智能合约部署交易设置一个执行时间,或者也可以为该智能合约部署交易设置一个在区块中的顺序号,在该智能合约部署交易的执行时间到达时,就可以执行该智能合约部署交易,比如通过对智能合约部署交易进行解析得到智能合约源代码,或者在检测到交易执行已经到该智能合约部署交易的顺序号时,即可执行该智能合约部署交易,比如通过对智能合约部署交易进行解析得到智能合约源代码。每个区块链节点在执行完区块后,也会将针对该区块的执行结果同步给除自身以外的其它区块链节点进行共识。其中,每个区块链节点会验证自己执行该区块的执行结果与接收到的其它区块链节点执行该区块的执行结果是否一致,在确定全部一致或者大部分一致时,就会认可区块的执行结果,也即是会向出块节点发送针对该区块的同意认可消息,也可以理解为投赞成票。其中,针对每个区块链节点,该区块链节点是验证自己执行的每笔交易的执行结果与接收到的其它区块链节点执行的对应每笔交易的执行结果是否一致,针对每笔交易,如果全部区块链节点针对该笔交易的执行结果一致或大部分区块链节点针对该笔交易的执行结果一致,则该区块链节点即会认可该笔交易的执行结果。
步骤202,所述第一区块链节点将所述智能合约源代码转换为智能合约操作码。
本发明实施例中,由于区块链底层存储的是智能合约字节码bytecode,但是针对智能合约字节码不能准确地进行切分,而且智能合约操作码opcode与智能合约字节码是映射对应的,也即是,智能合约操作码是智能合约字节码的一种汇编形式,所以为了能够实现针对智能合约字节码的切分,可以通过对智能合约操作码进行切分,如此就可以准确地针对智能合约字节码进行切分,以便后续能够将准确切分出的各代码切片进行转换为字节码切片,然后将不存在于区块链中的字节码切分存储至区块链。具体地,第一区块链节点通过编译器将智能合约源代码转换为智能合约字节码,并通过代码转换器将智能合约字节码转换为智能合约操作码。如此,通过智能合约操作码中的一些切分字段就可以将智能合约操作码进行合理且准确地切分,以此就能够实现针对智能合约字节码的切分,从而可以实现将智能合约字节码进行分片段的存储至区块链。
示例性地,某一区块链节点(比如区块链节点A)在执行智能合约部署交易(比如智能合约部署交易A)时,会先针对该智能合约部署交易A进行解析,可以得到该智能合约部署交易A中的智能合约源代码A,并通过编译器将智能合约源代码A转换为智能合约字节码A。然后,通过代码转换工具将智能合约字节码A转换为智能合约操作码A。其中,智能合约操作码A与智能合约字节码A是等价的,是智能合约字节码A的一种汇编形式。
步骤203,所述第一区块链节点以至少一个关键字段作为切分所述智能合约操作码的切分字段,对所述智能合约操作码进行切分,得到至少一个切分字段对应的代码切片。
本发明实施例中,第一区块链节点可以将至少一个关键字段作为切分智能合约操作码的切分字段,来针对智能合约操作码进行切分,以此可以得到至少一个切分字段对应的代码切片。其中,该至少一个关键字段为智能合约操作码中所具有的字段。具体地,第一区块链节点针对智能合约操作码进行内容检测,在确定智能合约操作码中存在属于第一层级的至少一个第一切分字段时,即可按照至少一个第一切分字段在智能合约操作码中的位置顺序依次将至少一个第一切分字段所在的代码片段从智能合约操作码中进行切分,从而可以得到属于第一层级的至少一个第一切分字段对应的代码片段,并将至少一个第一切分字段对应的代码片段作为至少一个第一切分字段对应的代码切片。在将属于第一层级的至少一个第一切分字段所在的代码片段从智能合约操作码中切分出来之后,需要针对第一切分字段所在的代码片段进行再次内容检测,在确定第一切分字段所在的代码片段中存在属于第二层级的至少一个第二切分字段时,即可按照至少一个第二切分字段在第一切分字段所在的代码片段中的位置顺序依次将至少一个第二切分字段所在的代码片段从第一切分字段所在的代码片段中进行切分,从而可以得到属于第二层级的至少一个第二切分字段对应的代码片段,并将至少一个第二切分字段对应的代码片段作为至少一个第二切分字段对应的代码切片。其中,第一切分字段、第二切分字段为至少一个切分字段中的任一个。具体地,第一区块链节点在对智能合约操作码进行内容检测时,一般是从智能合约操作码的起始位置一直检测到末尾位置,所以也是依次检测到某一切分字段。而且,由于智能合约操作码中所存在的切分字段可能有嵌套层,也即是一个切分字段下面又嵌套一个切分字段,下面嵌套的切分字段也可能对应一个代码片段,所以在针对智能合约操作码进行内容检测时,通常是第一轮先检测第一层级的切分字段,在第一轮将第一层级的所有切分字段都被检测完后,再开始第二轮针对第二层级的切分字段的检测,也即是,针对存在嵌套层(即下面存在嵌套的切分字段)的切分字段所在的代码片段进行再次内容检测,如此一个层级又一个层级的检测,即可将所有切分字段全部进行检测出来,同时也就可以将所有切分字段所在的代码片段进行切分出来,如此就可以得到多个切分字段对应的代码切片,从而可以实现将存在嵌套层的切分字段所在的代码片段进行进一步的切分,也即是将存在嵌套层的切分字段所在的代码片段进行更细粒度的切分。
示例性地,以第一区块链节点为区块链节点A为例进行描述,该区块链节点A在对智能合约操作码进行内容检测时,先针对智能合约操作码进行第一轮的内容检测,也即是先针对智能合约操作码进行第一层级的内容检测。比如,该区块链节点A在进行第一层级内容检测时,第一次检测到切分字段A,那么就可以将该切分字段A所在的代码片段从智能合约操作码中切分出来;第二次检测到切分字段B时,就可以该切分字段B所在的代码片段从智能合约操作码中切分出来,以此继续进行第一层级的内容检测,就可以将存在于智能合约操作码中第一层级的切分字段全部检测出来,同时将第一层级的所有切分字段所在的代码片段全部切分出来。然后,针对智能合约操作码进行第二轮的内容检测,就是针对智能合约操作码进行第二层级的内容检测,也即是针对第一层级的每个切分字段所在的代码片段进行内容检测。比如,在针对第一层级的每个切分字段所在的代码片段进行内容检测时,比如针对第一层级的切分字段A所在的代码片段进行内容检测,第一次先检测到切分字段C(或者也可能检测到切分字段A,或者也可能检测到切分字段B等),那么就可以将切分字段C所在的代码片段从切分字段A所在的代码片段中切分出来;第二次检测到切分字段A(或者也可能检测到切分字段B,或者也可能检测到切分字段C等)时,就可以该切分字段A所在的代码片段从切分字段A所在的代码片段中切分出来,以此继续进行第二层级的内容检测,就可以将存在于切分字段A所在的代码片段中的切分字段全部检测出来,同时将存在于切分字段A所在的代码片段中的所有切分字段所在的代码片段全部切分出来,如此一轮一轮的进行内容检测,可以将存在于智能合约操作码中的所有切分字段全部检测出来,同时也就可以将所有切分字段所在的代码片段进行切分出来,以此就可以得到多个切分字段对应的代码切片。
步骤204,针对每个切分字段对应的代码切片,所述第一区块链节点在确定区块链中不存在所述切分字段对应的代码切片的哈希值时,将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链。
本发明实施例中,在得到至少一个切分字段对应的代码切片之后,针对每个切分字段对应的代码切片,第一区块链节点如果确定该切分字段对应的代码切片中存在pushtag指令,则可以先将该切分字段标注为中间态字段,后续在确定push tag指令指向的tag字段所在的代码片段为不能切分的片段时,也即是确定该push tag指令指向的tag字段所在的代码片段中已经不存在嵌套的切分字段时,将该中间态字段替换为终结态字段,然后基于该终结态字段,即可通过代码转换器将该切分字段对应的代码切片转换为第一字节码切片,并将该第一字节码切片进行哈希运算,得到该第一字节码切片的哈希值。最后,如果确定区块链中不存在第一字节码切片的哈希值,则可以将第一字节码切片的哈希值作为key,第一字节码切片作为value,以键值对的形式进行存储至区块链;如果确定区块链中存在第一字节码切片的哈希值,则不会将第一字节码切片的哈希值以及第一字节码切片存储至区块链。此外,第一区块链节点如果该切分字段对应的代码切片中不存在push tag指令,则会将该切分字段标注为终结态字段,并通过代码转换器将该切分字段对应的代码切片转换为第二字节码切片。然后,对第二字节码切片进行哈希运算,得到该第二字节码切片的哈希值。最后,如果确定区块链中不存在第二字节码切片的哈希值,则可以将第二字节码切片的哈希值作为key,第二字节码切片作为value,以键值对的形式进行存储至区块链;如果确定区块链中存在第二字节码切片的哈希值,则不会将第二字节码切片的哈希值以及第二字节码切片存储至区块链。其中,至少一个切分字段中可以包括“.code”、“.data”、“tag1”、“tag2”、“tag3”、“tag4”、“tag5”等字段中任意一项或任意多项组合。如此,该方案就可以避免出现将不同智能合约中具有相同字节码切片哈希值的字节码切片进行重复存储的情况,有助于减少存储智能合约字节码所占用的存储空间,从而可以有效地提高区块链存储智能合约字节码的效率,并可以使得智能合约字节码存储的灵活性更高,更加符合区块链网络的实际需求。
示例性地,继续以第一区块链节点为区块链节点A为例,并以某一智能合约(比如智能合约A)为例进行描述,该智能合约A的智能合约字节码被切分为至少一个代码切片,比如切分为四个代码切片,即,代码切片1、代码切片2、代码切片3和代码切片4。如图3所示,为本发明实施例提供的一种智能合约A的智能合约操作码的结构示意图。基于该图3,该区块链节点A通过在针对智能合约A的智能合约操作码进行第一轮内容检测时,可以通过依次检测到切分字段“.code”、“.data”、“tag1”将“.code”所在的代码片段,“.data”所在的代码片段,以及“tag1”所在的代码片段从智能合约A的智能合约操作码中切分出来,然后,针对这三个切分字段所在的代码片段分别进行第二轮内容检测,比如针对“.code”所在的代码片段进行内容检测,发现该“.code”所在的代码片段中没有嵌套的切分字段,那么就无需针对“.code”所在的代码片段进行再次切分;针对“tag1”所在的代码片段进行内容检测,发现该“tag1”所在的代码片段中没有嵌套的切分字段,那么就无需针对“tag1”所在的代码片段进行再次切分;在针对“.data”所在的代码片段进行内容检测时,发现该“.data”所在的代码片段中有嵌套的切分字段,那么就需要针对该“.data”所在的代码片段进行再次切分,第一次先检测到切分字段“tag2”,那么就将“tag2”所在的代码片段从“.data”所在的代码片段中切分出来,第二次检测到切分字段“tag3”时,那么就将“tag3”所在的代码片段从“.data”所在的代码片段中切分出来,直至将该“.data”所在的代码片段中有嵌套的切分字段全部检测出来。如此,一轮一轮的进行内容检测,可以将存在于智能合约操作码中的所有切分字段全部检测出来,同时也就可以将所有切分字段所在的代码片段进行切分出来,从而可以切分字段“.code”对应的代码片段(即代码切片1)、切分字段“tag1”对应的代码片段(即代码切片2)、切分字段“tag2”对应的代码片段(即代码切片3)以及切分字段“tag3”对应的代码片段(即代码切片4)。
然后,针对每个代码切片,该区块链节点A判断该代码切片中是否存在push tag指令,比如针对代码切片1,该区块链节点A对该代码切片1进行内容检测,发现该代码切片1中存在push tag指令,且push tag指令指向的tag字段为“tag1”,那么可以先将切分字段“.code”标注为中间态字段,后续在确定push tag指令指向的切分字段“tag1”所在的代码片段为不能切分的片段时,也即是确定该push tag指令指向的切分字段“tag1”所在的代码片段中已经不存在嵌套的切分字段时,将该中间态字段替换为终结态字段,然后在确定该切分字段“.code”被标注为终结态字段时,即可通过代码转换器将代码切片1转换为字节码切片1,并将该字节码切片1进行哈希运算,得到该字节码切片1的哈希值。最后,如果确定区块链中不存在该字节码切片1的哈希值,则可以将该字节码切片1的哈希值作为key,该字节码切片1作为value,以键值对的形式进行存储至区块链;如果确定区块链中存在该字节码切片1的哈希值,则不会将该字节码切片1的哈希值以及该字节码切片1存储至区块链。针对代码切片2,该区块链节点A对该代码切片2进行内容检测,发现该代码切片2中不存在pushtag指令,则会将该切分字段“tag1”标注为终结态字段,并通过代码转换器将该代码切片2转换为字节码切片2。然后,对该字节码切片2进行哈希运算,得到该字节码切片2的哈希值。最后,如果确定区块链中不存在该字节码切片2的哈希值,则可以将该字节码切片2的哈希值作为key,该字节码切片2作为value,以键值对的形式进行存储至区块链;如果确定区块链中存在该字节码切片2的哈希值,则不会将该字节码切片2的哈希值以及该字节码切片2存储至区块链。针对代码切片3,该区块链节点A对该代码切片3进行内容检测,发现该代码切片3中不存在push tag指令,则会将该切分字段“tag2”标注为终结态字段,并通过代码转换器将该代码切片3转换为字节码切片3。然后,对该字节码切片3进行哈希运算,得到该字节码切片3的哈希值。最后,如果确定区块链中不存在该字节码切片3的哈希值,则可以将该字节码切片3的哈希值作为key,该字节码切片3作为value,以键值对的形式进行存储至区块链;如果确定区块链中存在该字节码切片3的哈希值,则不会将该字节码切片3的哈希值以及该字节码切片3存储至区块链。针对代码切片4,该区块链节点A对该代码切片4进行内容检测,发现该代码切片4中存在push tag指令,且push tag指令指向的tag字段为“tag2”,那么可以先将切分字段“tag3”标注为中间态字段,后续在确定push tag指令指向的切分字段“tag2”所在的代码片段为不能切分的片段时,也即是确定该push tag指令指向的切分字段“tag2”所在的代码片段中已经不存在嵌套的切分字段时,将该中间态字段替换为终结态字段,然后在确定该切分字段“tag3”被标注为终结态字段时,即可通过代码转换器将代码切片4转换为字节码切片4,并将该字节码切片4进行哈希运算,得到该字节码切片4的哈希值。最后,如果确定区块链中不存在该字节码切片4的哈希值,则可以将该字节码切片4的哈希值作为key,该字节码切片4作为value,以键值对的形式进行存储至区块链;如果确定区块链中存在该字节码切片4的哈希值,则不会将该字节码切片4的哈希值以及该字节码切片4存储至区块链。
再者,继续以第一区块链节点为区块链节点A为例,并以智能合约B为例进行描述,该区块链节点A针对该智能合约B的智能合约字节码可以按照上述智能合约A的智能合约字节码被切分存储的方式进行处理,假设也被切分为四个字节码切片,即,字节码切片a、字节码切片b、字节码切片c和字节码切片d。假设该智能合约B中的字节码切片a的哈希值与区块链中存储的字节码切片1的哈希值相同,则该区块链节点A不会将字节码切片a的哈希值以及字节码切片a存储至区块链;假设字节码切片b的哈希值与区块链上任意一个字节码切片的哈希值都不相同,则该区块链节点A会将字节码切片b的哈希值以及字节码切片b存储至区块链;假设字节码切片c的哈希值与字节码切片2的哈希值相同,则该区块链节点A不会将字节码切片c的哈希值以及字节码切片c存储至区块链;假设字节码切片d的哈希值与区块链上任意一个字节码切片的哈希值都不相同,则该区块链节点A会将字节码切片d的哈希值以及字节码切片d存储至区块链。
作为一种示例,以智能合约A、智能合约B为例进行描述区块链的存储,如图4所示,为本发明实施例提供的一种区块链存储智能合约A、智能合约B的结构示意图。假设该智能合约A的智能合约字节码被切分为四个字节码切片,即,字节码切片1、字节码切片2、字节码切片3和字节码切片4;并假设该智能合约B的智能合约字节码被切分为四个字节码切片,即,字节码切片a、字节码切片b、字节码切片c和字节码切片d。基于该图4,智能合约A中的字节码切片的哈希值与智能合约B中的字节码切片的哈希值相同的,只会存储一份,不相同的才会都存储,比如,智能合约A中的字节码切片1的哈希值hash1与智能合约B中的字节码切片a的哈希值hash a相同,则只会在区块链上存储一份;智能合约B中的字节码切片b的哈希值hash b与智能合约A中的任意一个字节码切片都不相同,则会将智能合约B中的字节码切片b的哈希值hash b以及该字节码切片b存储至区块链;智能合约A中的字节码切片2的哈希值hash2与智能合约B中的字节码切片c的哈希值hash c相同,则只会在区块链上存储一份;智能合约A中的字节码切片3的哈希值hash3与智能合约B中的任意一个字节码切片都不相同,则会将智能合约A中的字节码切片3的哈希值hash 3以及该字节码切片3存储至区块链;智能合约A中的字节码切片4的哈希值hash4与智能合约B中的任意一个字节码切片都不相同,则会将智能合约A中的字节码切片4的哈希值hash 4以及该字节码切片4存储至区块链;智能合约B中的字节码切片d的哈希值hash d与智能合约A中的任意一个字节码切片都不相同,则会将智能合约B中的字节码切片d的哈希值hash d以及该字节码切片d存储至区块链。
此外,继续以智能合约A为例进行描述,该智能合约A的智能合约字节码按照现有技术方案进行整体存储至区块链时,假设该智能合约A的智能合约字节码的存储长度为2692bit,但是如果按照本发明中的技术方案,以分片段的形式针对该智能合约A的智能合约字节码进行存储至区块链时,该智能合约A的智能合约字节码的存储长度就会减少,假设为1836bit,如此就可以计算出按照本发明中的技术方案进行存储至区块链时可以减少31.8%的存储空间。
进一步地,在将任一智能合约的智能字节码的至少一个代码切片的哈希值以及至少一个代码切片存储至区块链后,在某一用户需要调用某一智能合约时,就会通过客户端向某一区块链节点提交智能合约调用请求,该区块链节点在检测到该智能合约调用请求时,就可以根据该智能合约的智能合约地址查询到对应的智能合约,并获取该智能合约所包含的至少一个字节码切片的哈希值,并根据该至少一个字节码切片的哈希值从区块链上准确地读取到各自对应的字节码切片。然后,按照各字节码切片在智能合约中的位置顺序将各字节码切片进行拼接,以此可以获得完整的智能合约字节码,从而可以及时地将该智能合约字节码加载到对应的用于执行智能合约字节码的虚拟机中进行执行。其中,各字节码切片的哈希值是可以按照各字节码切片在智能合约中的位置顺序进行排列的,或者也可以为每个字节码切片的哈希值标注上该字节码切片的哈希值对应的字节码切片在智能合约中的位置顺序,以便在针对该智能合约的各字节码切片进行拼接的时候可以准确地拼接出完整的智能合约字节码,从而为可以后续虚拟机准确地执行该智能合约字节码提供支持。
示例性地,假设某一用户需要调用智能合约A,则可以通过客户端向某一区块链节点(比如区块链节点A)提交智能合约调用请求,该智能合约调用请求中包括智能合约A的地址。该区块链节点A在接收到智能合约调用请求后,就可以通过该智能合约调用请求中的智能合约A的地址访问对应的智能合约A,并可以获取该智能合约A中所包含的至少一个字节码切片的哈希值,根据该至少一个字节码切片的哈希值从区块链上能够准确地读取到各自对应的字节码切片。然后,按照各字节码切片在智能合约A中的位置顺序将各字节码切片进行拼接,以此可以获得完整的智能合约字节码,从而可以及时地将该智能合约字节码加载到对应的虚拟机中进行执行该智能合约字节码。
上述实施例表明,由于现有技术方案中是将智能合约代码作为一个整体进行存储,因此在将不同的智能合约存储至区块链时,会将至少两个不同智能合约中具有的相同功能函数对应的代码片段进行重复存储,如此会导致区块链存储智能合约代码的效率低,而且灵活性差。基于此,本发明中的技术方案通过将智能合约代码进行切分,得到切分后的各代码片段,并将切分后的各代码片段存储至区块链,如此可以避免因将智能合约代码整体存储而导致出现不同智能合约所具有的相同功能函数对应的代码片段被重复存储的情况,从而可以有效地提高区块链存储智能合约代码的效率,并可以使得智能合约代码存储的灵活性更高,更加符合区块链网络的实际需求。具体来说,第一区块链节点在确定智能合约部署交易满足执行条件时,将智能合约部署交易中的智能合约源代码转换为智能合约操作码,以便能够准确地基于智能合约操作码中的切分字段进行切分。再以至少一个关键字段作为切分智能合约操作码的切分字段,就可以及时准确地将该智能合约操作码切分为多个可以灵活存储的代码切片。然后,针对每个切分字段对应的代码切片,若确定区块链中用于存储代码切片的存储区域中不存在该切分字段对应的代码切片的哈希值,则才将该切分字段对应的代码切片的哈希值以及该切分字段对应的代码切片存储至区块链,若确定区块链中用于存储代码切片的存储区域中存在该切分字段对应的代码切片的哈希值,则不会将该切分字段对应的代码切片的哈希值以及该切分字段对应的代码切片存储至区块链,如此就可以避免出现将不同智能合约所具有的相同功能函数对应的代码片段进行重复存储的情况,有助于减少存储智能合约代码所占用的存储空间,从而可以有效地提高区块链存储智能合约代码的效率。
基于相同的技术构思,图5示例性的示出了本发明实施例提供的一种区块链智能合约的存储装置,该装置可以执行区块链智能合约的存储方法的流程。其中,本发明实施例中的区块链智能合约的存储装置适用于N个区块链节点的区块链网络。
如图5所示,该装置包括:
解析单元501,用于在确定智能合约部署交易满足执行条件时,通过对所述智能合约部署交易进行解析得到智能合约源代码;
处理单元502,用于将所述智能合约源代码转换为智能合约操作码;以至少一个关键字段作为切分所述智能合约操作码的切分字段,对所述智能合约操作码进行切分,得到至少一个切分字段对应的代码切片;所述至少一个关键字段为所述智能合约操作码中具有的字段;针对每个切分字段对应的代码切片,在确定区块链中不存在所述切分字段对应的代码切片的哈希值时,将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链。
可选地,所述处理单元502具体用于:
通过编译器将所述智能合约源代码编译为智能合约字节码;
通过代码转换器将所述智能合约字节码转换为所述智能合约操作码。
可选地,所述处理单元502具体用于:
对所述智能合约操作码进行内容检测,在确定所述智能合约操作码中存在属于第一层级的至少一个第一切分字段时,按照所述至少一个第一切分字段在所述智能合约操作码中的位置顺序依次将所述至少一个第一切分字段所在的代码片段从所述智能合约操作码中进行切分,从而得到属于第一层级的至少一个第一切分字段对应的代码片段,并将所述至少一个第一切分字段对应的代码片段作为所述至少一个第一切分字段对应的代码切片;所述第一切分字段为所述至少一个切分字段中的任一个。
可选地,所述处理单元502还用于:
在得到属于第一层级的至少一个第一切分字段对应的代码片段之后,针对属于第一层级的每个第一切分字段对应的代码切片,对所述第一切分字段所在的代码片段进行内容检测,在确定所述第一切分字段所在的代码片段中存在属于第二层级的至少一个第二切分字段时,按照所述至少一个第二切分字段在所述第一切分字段所在的代码片段中的位置顺序依次将所述至少一个第二切分字段所在的代码片段从所述第一切分字段所在的代码片段中进行切分,从而得到属于第二层级的至少一个第二切分字段对应的代码片段,并将所述至少一个第二切分字段对应的代码片段作为所述至少一个第二切分字段对应的代码切片;所述第二切分字段为所述至少一个切分字段中的任一个。
可选地,所述至少一个切分字段中包括tag字段;
所述处理单元502具体用于:
针对每个切分字段对应的代码切片,若确定所述切分字段对应的代码切片中存在push tag指令,则将所述切分字段标注为中间态字段,并在确定所述push tag指令指向的tag字段所在的代码片段为不能切分的片段时,将所述中间态字段替换为终结态字段;
根据所述终结态字段,通过代码转换器将所述切分字段对应的代码切片转换为第一字节码切片,并对所述第一字节码切片进行哈希运算,得到所述第一字节码切片的哈希值;
若确定所述区块链中不存在所述第一字节码切片的哈希值,则将所述第一字节码切片的哈希值以及所述第一字节码切片存储至区块链。
可选地,所述处理单元502还用于:
若确定所述切分字段对应的代码切片中不存在所述push tag指令,则通过所述代码转换器将所述切分字段对应的代码切片转换为第二字节码切片;
对所述第二字节码切片进行哈希运算,得到所述第二字节码切片的哈希值;
若确定所述区块链中不存在所述第二字节码切片的哈希值,则将所述第二字节码切片的哈希值以及所述第二字节码切片存储至区块链。
可选地,所述处理单元502还用于:
在将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链之后,在检测到智能合约调用请求时,基于所述智能合约调用请求中的智能合约地址从区块链中查询到对应的智能合约,并获取到所述智能合约中存储的各字节码切片的哈希值;所述各字节码切片的哈希值是按照所述各字节码切片在所述智能合约中的位置顺序进行排列的;
根据所述各字节码切片的哈希值,从所述区块链中的用于存储字节码切片的存储区域查询出对应的各字节码切片;
按照所述各字节码切片的哈希值在所述智能合约中的位置顺序,将所述各字节码切片进行拼接处理,得到智能合约字节码;
将所述智能合约字节码加载到用于执行智能合约的虚拟机;所述虚拟机用于执行所述智能合约字节码。
基于相同的技术构思,本发明实施例还提供了一种计算设备,如图6所示,包括至少一个处理器601,以及与至少一个处理器连接的存储器602,本发明实施例中不限定处理器601与存储器602之间的具体连接介质,图6中处理器601和存储器602之间通过总线连接为例。总线可以分为地址总线、数据总线、控制总线等。
在本发明实施例中,存储器602存储有可被至少一个处理器601执行的指令,至少一个处理器601通过执行存储器602存储的指令,可以执行前述的区块链智能合约的存储方法中所包括的步骤。
其中,处理器601是计算设备的控制中心,可以利用各种接口和线路连接计算设备的各个部分,通过运行或执行存储在存储器602内的指令以及调用存储在存储器602内的数据,从而实现数据处理。可选的,处理器601可包括一个或多个处理单元,处理器601可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作***、用户界面和应用程序等,调制解调处理器主要处理下发指令。可以理解的是,上述调制解调处理器也可以不集成到处理器601中。在一些实施例中,处理器601和存储器602可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。
处理器601可以是通用处理器,例如中央处理器(CPU)、数字信号处理器、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合区块链智能合约的存储方法实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器602作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器602可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(Random AccessMemory,RAM)、静态随机访问存储器(Static Random Access Memory,SRAM)、可编程只读存储器(Programmable Read Only Memory,PROM)、只读存储器(Read Only Memory,ROM)、带电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性存储器、磁盘、光盘等。存储器602是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本发明实施例中的存储器602还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
基于相同的技术构思,本发明实施例还提供了一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述区块链智能合约的存储方法的步骤。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (10)
1.一种区块链智能合约的存储方法,其特征在于,适用于具有N个区块链节点的区块链网络,所述方法包括:
第一区块链节点在确定智能合约部署交易满足执行条件时,通过对所述智能合约部署交易进行解析得到智能合约源代码;所述第一区块链节点为所述N个区块链节点中的任一个;
所述第一区块链节点将所述智能合约源代码转换为智能合约操作码;
所述第一区块链节点以至少一个关键字段作为切分所述智能合约操作码的切分字段,对所述智能合约操作码进行切分,得到至少一个切分字段对应的代码切片;所述至少一个关键字段为所述智能合约操作码中具有的字段;
针对每个切分字段对应的代码切片,所述第一区块链节点在确定区块链中不存在所述切分字段对应的代码切片的哈希值时,将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链。
2.如权利要求1所述的方法,其特征在于,所述第一区块链节点将所述智能合约源代码转换为智能合约操作码,包括:
所述第一区块链节点通过编译器将所述智能合约源代码编译为智能合约字节码;
所述第一区块链节点通过代码转换器将所述智能合约字节码转换为所述智能合约操作码。
3.如权利要求1所述的方法,其特征在于,所述第一区块链节点以至少一个关键字段作为切分所述智能合约操作码的切分字段,对所述智能合约操作码进行切分,包括:
所述第一区块链节点对所述智能合约操作码进行内容检测,在确定所述智能合约操作码中存在属于第一层级的至少一个第一切分字段时,按照所述至少一个第一切分字段在所述智能合约操作码中的位置顺序依次将所述至少一个第一切分字段所在的代码片段从所述智能合约操作码中进行切分,从而得到属于第一层级的至少一个第一切分字段对应的代码片段,并将所述至少一个第一切分字段对应的代码片段作为所述至少一个第一切分字段对应的代码切片;所述第一切分字段为所述至少一个切分字段中的任一个。
4.如权利要求3所述的方法,其特征在于,在得到属于第一层级的至少一个第一切分字段对应的代码片段之后,还包括:
针对属于第一层级的每个第一切分字段对应的代码切片,所述第一区块链节点对所述第一切分字段所在的代码片段进行内容检测,在确定所述第一切分字段所在的代码片段中存在属于第二层级的至少一个第二切分字段时,按照所述至少一个第二切分字段在所述第一切分字段所在的代码片段中的位置顺序依次将所述至少一个第二切分字段所在的代码片段从所述第一切分字段所在的代码片段中进行切分,从而得到属于第二层级的至少一个第二切分字段对应的代码片段,并将所述至少一个第二切分字段对应的代码片段作为所述至少一个第二切分字段对应的代码切片;所述第二切分字段为所述至少一个切分字段中的任一个。
5.如权利要求1所述的方法,其特征在于,所述至少一个切分字段中包括tag字段;
针对每个切分字段对应的代码切片,所述第一区块链节点在确定区块链中不存在所述切分字段对应的代码切片的哈希值时,将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链,包括:
针对每个切分字段对应的代码切片,所述第一区块链节点若确定所述切分字段对应的代码切片中存在push tag指令,则将所述切分字段标注为中间态字段,并在确定所述pushtag指令指向的tag字段所在的代码片段为不能切分的片段时,将所述中间态字段替换为终结态字段;
所述第一区块链节点根据所述终结态字段,通过代码转换器将所述切分字段对应的代码切片转换为第一字节码切片,并对所述第一字节码切片进行哈希运算,得到所述第一字节码切片的哈希值;
所述第一区块链节点若确定所述区块链中不存在所述第一字节码切片的哈希值,则将所述第一字节码切片的哈希值以及所述第一字节码切片存储至区块链。
6.如权利要求5所述的方法,其特征在于,所述方法还包括:
所述第一区块链节点若确定所述切分字段对应的代码切片中不存在所述push tag指令,则通过所述代码转换器将所述切分字段对应的代码切片转换为第二字节码切片;
所述第一区块链节点对所述第二字节码切片进行哈希运算,得到所述第二字节码切片的哈希值;
所述第一区块链节点若确定所述区块链中不存在所述第二字节码切片的哈希值,则将所述第二字节码切片的哈希值以及所述第二字节码切片存储至区块链。
7.如权利要求1至6任一项所述的方法,其特征在于,在将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链之后,还包括:
所述第一区块链节点在检测到智能合约调用请求时,基于所述智能合约调用请求中的智能合约地址从区块链中查询到对应的智能合约,并获取到所述智能合约中存储的各字节码切片的哈希值;所述各字节码切片的哈希值是按照所述各字节码切片在所述智能合约中的位置顺序进行排列的;
所述第一区块链节点根据所述各字节码切片的哈希值,从所述区块链中的用于存储字节码切片的存储区域查询出对应的各字节码切片;
所述第一区块链节点按照所述各字节码切片的哈希值在所述智能合约中的位置顺序,将所述各字节码切片进行拼接处理,得到智能合约字节码;
所述第一区块链节点将所述智能合约字节码加载到用于执行智能合约的虚拟机;所述虚拟机用于执行所述智能合约字节码。
8.一种区块链智能合约的存储装置,其特征在于,适用于具有N个区块链节点的区块链网络,所述装置包括:
解析单元,用于在确定智能合约部署交易满足执行条件时,通过对所述智能合约部署交易进行解析得到智能合约源代码;
处理单元,用于将所述智能合约源代码转换为智能合约操作码;以至少一个关键字段作为切分所述智能合约操作码的切分字段,对所述智能合约操作码进行切分,得到至少一个切分字段对应的代码切片;所述至少一个关键字段为所述智能合约操作码中具有的字段;针对每个切分字段对应的代码切片,在确定区块链中不存在所述切分字段对应的代码切片的哈希值时,将所述切分字段对应的代码切片的哈希值以及所述切分字段对应的代码切片存储至所述区块链。
9.一种计算设备,其特征在于,包括至少一个处理器以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行权利要求1至7任一权利要求所述的方法。
10.一种计算机可读存储介质,其特征在于,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行权利要求1至7任一权利要求所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111055168.9A CN114091111B (zh) | 2021-09-09 | 2021-09-09 | 一种区块链智能合约的存储方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111055168.9A CN114091111B (zh) | 2021-09-09 | 2021-09-09 | 一种区块链智能合约的存储方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114091111A true CN114091111A (zh) | 2022-02-25 |
CN114091111B CN114091111B (zh) | 2022-11-18 |
Family
ID=80296400
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111055168.9A Active CN114091111B (zh) | 2021-09-09 | 2021-09-09 | 一种区块链智能合约的存储方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114091111B (zh) |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101706825A (zh) * | 2009-12-10 | 2010-05-12 | 华中科技大学 | 一种基于文件内容类型的重复数据删除方法 |
CN102469142A (zh) * | 2010-11-16 | 2012-05-23 | 英业达股份有限公司 | 重复数据删除程序的数据传输方法 |
US20150347445A1 (en) * | 2014-05-30 | 2015-12-03 | International Business Machines Corporation | Deduplication of file |
CN109634932A (zh) * | 2018-11-30 | 2019-04-16 | 北京瑞卓喜投科技发展有限公司 | 一种智能合约存储方法及存储*** |
CN110032547A (zh) * | 2019-01-29 | 2019-07-19 | 香港贝尔科技有限公司 | 一种分布式环境下文件存储改进方法 |
CN110147202A (zh) * | 2019-05-15 | 2019-08-20 | 杭州云象网络技术有限公司 | 一种减少区块链智能合约代码存储体积的方法 |
CN110188097A (zh) * | 2019-04-19 | 2019-08-30 | 阿里巴巴集团控股有限公司 | 区块链中智能合约的存储、执行方法及装置和电子设备 |
CN110825363A (zh) * | 2019-11-01 | 2020-02-21 | 北京知道创宇信息技术股份有限公司 | 智能合约获取方法、装置、电子设备及存储介质 |
US20200202355A1 (en) * | 2019-04-19 | 2020-06-25 | Alibaba Group Holding Limited | Storage and execution of smart contracts in blockchains |
EP3724806A1 (en) * | 2017-12-13 | 2020-10-21 | Nchain Holdings Limited | Blockchain-implemented systems and methods for concurrent bytecode interpretation |
-
2021
- 2021-09-09 CN CN202111055168.9A patent/CN114091111B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101706825A (zh) * | 2009-12-10 | 2010-05-12 | 华中科技大学 | 一种基于文件内容类型的重复数据删除方法 |
CN102469142A (zh) * | 2010-11-16 | 2012-05-23 | 英业达股份有限公司 | 重复数据删除程序的数据传输方法 |
US20150347445A1 (en) * | 2014-05-30 | 2015-12-03 | International Business Machines Corporation | Deduplication of file |
EP3724806A1 (en) * | 2017-12-13 | 2020-10-21 | Nchain Holdings Limited | Blockchain-implemented systems and methods for concurrent bytecode interpretation |
CN109634932A (zh) * | 2018-11-30 | 2019-04-16 | 北京瑞卓喜投科技发展有限公司 | 一种智能合约存储方法及存储*** |
CN110032547A (zh) * | 2019-01-29 | 2019-07-19 | 香港贝尔科技有限公司 | 一种分布式环境下文件存储改进方法 |
CN110188097A (zh) * | 2019-04-19 | 2019-08-30 | 阿里巴巴集团控股有限公司 | 区块链中智能合约的存储、执行方法及装置和电子设备 |
US20200202355A1 (en) * | 2019-04-19 | 2020-06-25 | Alibaba Group Holding Limited | Storage and execution of smart contracts in blockchains |
CN110147202A (zh) * | 2019-05-15 | 2019-08-20 | 杭州云象网络技术有限公司 | 一种减少区块链智能合约代码存储体积的方法 |
CN110825363A (zh) * | 2019-11-01 | 2020-02-21 | 北京知道创宇信息技术股份有限公司 | 智能合约获取方法、装置、电子设备及存储介质 |
Non-Patent Citations (2)
Title |
---|
王守道等: "基于区块链的智能合约压缩存储方法", 《现代计算机(专业版)》 * |
黎天翔: "智能网络存储***中的重复数据删除技术研究", 《中国优秀博硕士学位论文全文数据库(硕士) 信息科技辑》 * |
Also Published As
Publication number | Publication date |
---|---|
CN114091111B (zh) | 2022-11-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8914780B2 (en) | Incremental generation of managed assemblies | |
US7861222B2 (en) | Discoscript: a simplified distributed computing scripting language | |
CN107766130B (zh) | 虚拟机向容器迁移的方法和装置 | |
CN110231994B (zh) | 内存分析方法、装置和计算机可读存储介质 | |
CN110599183B (zh) | 智能合约调用方法、装置及存储介质 | |
US10248409B1 (en) | Limiting the effects of source code patches on corresponding native-code patches | |
CN113296786B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
US20230100873A1 (en) | Memory tagging and tracking for offloaded functions and called modules | |
US11036527B2 (en) | Class splitting in object-oriented environments | |
CN112631600A (zh) | 基于Flutter的软件构建方法和*** | |
CN112487092B (zh) | 一种基于区块链的智能合约调用方法及装置 | |
CN111352631B (zh) | 一种接口兼容性检测方法及装置 | |
CN114091111B (zh) | 一种区块链智能合约的存储方法及装置 | |
US9442698B2 (en) | Migration between model elements of different types in a modeling environment | |
CN111880803B (zh) | 一种应用于多平台的软件构建方法及装置 | |
CN113867709B (zh) | 区块链智能合约读写集构建方法及装置 | |
CN114816772A (zh) | 基于兼容层运行的应用的排错方法、排错***及计算设备 | |
CN113721928A (zh) | 一种基于二进制分析的动态库裁剪方法 | |
CN103577170A (zh) | 网络应用的构建方法及装置 | |
US9720660B2 (en) | Binary interface instrumentation | |
CN106897588B (zh) | 一种标签函数的处理方法及装置 | |
CN113296910B (zh) | 文件***的调用方法、装置、终端设备及可读存储介质 | |
CN114201116B (zh) | 智能合约部署方法、装置、设备、介质及程序产品 | |
CN110879722B (zh) | 生成逻辑示意图的方法及装置、计算机可存储介质 | |
CN113076147B (zh) | 动态apk的资源加载方法、装置、***以及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |