CN109165224B - 一种在区块链数据库上针对关键字key的索引方法 - Google Patents
一种在区块链数据库上针对关键字key的索引方法 Download PDFInfo
- Publication number
- CN109165224B CN109165224B CN201810971875.4A CN201810971875A CN109165224B CN 109165224 B CN109165224 B CN 109165224B CN 201810971875 A CN201810971875 A CN 201810971875A CN 109165224 B CN109165224 B CN 109165224B
- Authority
- CN
- China
- Prior art keywords
- transaction
- key
- hash
- node
- data
- 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.)
- Active
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
-
- 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/62—Protecting access to data via a platform, e.g. using keys or access control rules
- G06F21/6218—Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database
- G06F21/6227—Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database where protection concerns the structure of data, e.g. records, types, queries
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q20/00—Payment architectures, schemes or protocols
- G06Q20/38—Payment protocols; Details thereof
- G06Q20/382—Payment protocols; Details thereof insuring higher security of transaction
- G06Q20/3829—Payment protocols; Details thereof insuring higher security of transaction involving key management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- Business, Economics & Management (AREA)
- General Physics & Mathematics (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- Accounting & Taxation (AREA)
- Computer Hardware Design (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Business, Economics & Management (AREA)
- Strategic Management (AREA)
- Finance (AREA)
- Databases & Information Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种在区块链数据库上针对关键字key的索引方法,涉及区块链数据查询技术领域。该方法首先普通节点根据用户输入的带关键字key的原始数据生成交易记录;存储节点将交易打包到区块中;将区块数据追加写入磁盘文件;根据key值查询交易数据,输出查询结果;普通用户对结果进行可信性验证。本发明直接根据数据关键字进行索引,实现数据的可查询性;将传统区块链中的交易结构扩展到可存储类似于传统数据库的模式结构,提高适用性;根据数字签名技术管理数据权限,提高数据安全性;根据MerkleRBTree自我感知索引是否被篡改,根据交易哈希感知交易是否被篡改,从而保证数据不可篡改性;同时实现轻量级节点的数据验证功能,使得查询端能有效检测数据可信性。
Description
技术领域
本发明涉及区块链数据查询技术领域,尤其涉及一种在区块链数据库上针对关键字key的索引方法。
背景技术
随着比特币,以太币等一系列加密货币的兴起,其底层的区块链技术也受到了越来越广泛的关注。比特币最核心的意图是为了实现去中心化,即在没有第三方信任机构参与的情况下实现两个对等实体的数字货币交易。然而,现实世界中不可避免的存在很多自然中心,比如提供贷款的银行,提供电信服务的电信运营商等。虽然可以把这些中心机构当作是对等实体,将其与用户的交易记录到区块链上,比如用比特币去交话费,但是这种做法是不切实际的,因为这不利于机构管理用户数据(包括用户的信用等级等)。实际上,现有的中心机构都是由自己管理其存储用户相关信息的数据库,但是这种模式存在很多缺陷:1)不同的数据库可能存储着相同的用户基本身份信息,导致数据冗余度高;2)不同的中心机构各自管理自己的数据,不利于机构之间的数据共享;3)每个数据库大都由单一机构中心化管理,使得用户必须无条件信任该机构,存在中心化问题;4)用户不能够独立验证数据的正确性,如果数据被恶意篡改,用户与机构都无法察觉。
而区块链技术具有去中心化、防篡改以及公开透明的特性,为解决上述这些问题提供了可能。为此,希望有高效的共识算法来提高***的吞吐率,并有高效的查询算法实现在区块链上检索数据。当前,在共识算法上已经有很多研究,例如POW、POS、PBFT。然而针对区块链查询的研究相对较少,大都是利用同步技术将交易数据同步到传统数据库,根据各数据项建立索引,从而实现快速查询,但是这种做法并不能保证索引的不可篡改,所以损失了区块链不可篡改的特性。
发明内容
本发明要解决的技术问题是针对上述现有技术的不足,提供一种在区块链数据库上针对关键字key的索引方法,解决区块链的查询问题,实现一种不可篡改的索引。
为解决上述技术问题,本发明所采取的技术方案是:
一种在区块链数据库上针对关键字key的索引方法,包括以下步骤:
步骤1:普通节点根据用户输入的带关键字key的原始数据生成交易记录,具体包括:
步骤1-1:生成交易默认信息,包括区块链版本号信息以及数据创建时刻的时间戳信息;
步骤1-2:指定该交易的前驱PreHash,若该关键字key是第一次出现,则前驱PreHash置为Null,否则前驱为该关键字key所对应的最新交易的哈希值;
步骤1-3:生成数据权限信息以及数据签名;将ScriptPubk赋值为下一个可对该关键字key数据进行修改的公钥,利用ECDSA算法,根据自己的私钥对交易数据进行签名;
步骤2:存储节点将交易打包到区块中,具体包括:
步骤2-1:验证交易格式是否符合规范,过滤无法识别的交易;
步骤2-2:验证交易签名是否有效;根据PreHash值到k-v数据库中检索其交易索引TxIndex,根据TxIndex检索到前驱交易PreTx,取其指定的下一任公钥信息PreTx.ScriptPubk;根据ECDSA算法的verify()函数进行签名验证,若verify(PreTx.ScriptPubk,Tx.ScriptSig,Tx)=True,则签名有效,否则签名无效,丢弃该交易;
步骤2-3:检测双花;读取交易的PreHash字段,若其不为空,则根据PreHash值到k-v数据库中检索前驱交易索引TxIndex,如果该索引指明前驱交易的后继交易不为空,则表明待验证交易为双花交易,判定其无效;如果其后继交易为空,则将后继交易赋值为待验证交易的哈希值,待验证交易有效;如果交易的PreHash字段为空,即交易的创建者认为之前不存在与此交易关键字key相同的交易,此时查找***中是否能够检索到关键字为key的交易,如果检索到则该交易无效,如果未检索到则该交易有效;
步骤2-4:当交易被验证有效之后,将交易***到区块体中key有序的交易数组vTx[]中,更新MerkleRBTree索引;
更新MerkleRBTree的规则如下:初始化当前节点为Merkleroot,比较待***节点关键字key和当前节点关键字NodeKey,如果key<=NodeKey,则***到当前节点的左子树,然后更新当前节点为当前节点的左孩子,否则***到右子树,然后更新当前节点为其右孩子,依次递归,直到最后一层分支节点;***交易之后,对该树进行旋转使其保证黑色平衡,并递归向上更新分支节点哈希值为Hash(lefthash,rigthhash,key);在最后一层分支节点根据如下4种情况***该节点:
情况1:如果该分支节点为空,该情况只在Merkleroot为空时出现,则对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建一个分支节点,并定义其关键值为key,左哈希为叶子结点哈希值,右哈希为0,形如(Hash(Tx),0,key);
情况2:如果待***数据key值小于该节点NodeKey值,应将该数据***到该节点左侧;首先对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建一个红色的分支节点,其关键字为待***节点key,左哈希为Hash(Tx),右哈希为原来分支节点的左哈希,即(Hash(Tx),Oldlefthash,key);记hash=Hash(Hash(Tx),Oldlefthash,key),则更新父节点为(hash,Oldrighthash,oldkey);
情况3:如果待***数据key值大于该节点NodeKey值,而且该节点右哈希为0,则对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后更新该分支节点为(Oldlefthash,Hash(Tx),Oldkey);
情况4:如果待***数据key值大于该节点NodeKey值而且该节点右哈希不为0,则先对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建红色分支节点,分支节点关键值为待***数据key值与原分支节点右孩子key值中的较小者,左孩子为待***数据与原分支节点右孩子中key值较小者,右孩子为较大者;最后更新其父节点右哈希为新建分支节点哈希;
步骤3:将区块数据追加写入磁盘文件,具体包括:
步骤3-1:将区块头以及区块体中保存交易原始数据的交易数组vTx[]序列化,顺序写入到磁盘文件blk000x中,并返回区块在磁盘中的位置nFile,BlockPos;
步骤3-2:生成每个交易的元数据TxIndex(nFile,BlockPos,n),其中nFile指定第几个文件,BlockPos指定该区块在文件中的偏移量,n指定交易对应在有序数组中的下标,并将每个交易的元数据信息存储到k-v数据库中,格式为k=Hash(Tx),v=(TxIndex);
步骤3-3:将MerkleRBTree索引项存储在k-v数据库中,其中k=Hash(lefthash,righthash,key),v=(lefthash,righthash,key);
步骤4:根据关键字key查询交易,返回查询结果;从最新的区块开始查找交易,如果该区块没有查找到则查询其前一区块;
在单个区块的查找方法为:从区块头的MerkleRoot进入到MerkleRBTree中,从MerkleRoot开始比较目标关键字key与当前节点关键字Ckey,若key小于等于Ckey,则查找其左孩子,并将右孩子和节点关键字压入到验证路径栈中,否则查找其右孩子,并将左孩子和节点关键字压入到验证路径栈中,依次执行直到叶子节点;如果叶子节点关键值key等于查询关键字key,则查询命中;根据最后在叶子节点查询到的交易哈希值Hash(Tx),以Hash(Tx)为k,在k-v数据库中查询到该交易对应在磁盘上的索引信息TxIndex,最后根据TxIndex在磁盘文件中读取到交易信息Tx;最后将验证路径栈和交易原信息返回给普通用户;
步骤5:普通用户对查询结果进行可信性验证;
普通用户收到验证路径栈和交易信息之后,首先对交易进行Sha256双哈希操作得到交易哈希值Hash(Tx),然后与验证路径栈中弹出的值做Sha256双哈希操作,得到的哈希值继续与栈中弹出的下一个值做哈希,直到栈为空;比较得到的哈希值与本地区块头中的Merkleroot值是否相等,如果相等则数据可信,否则不可信。
采用上述技术方案所产生的有益效果在于:本发明提供的一种在区块链数据库上针对关键字key的索引方法,可以直接根据数据关键字进行索引,而不是现有区块链中根据哈希值进行索引,实现了数据的可查询性;将传统区块链中的交易结构扩展到可以存储类似于传统数据库的模式结构,提高了适用性;根据数字签名技术管理数据权限,提高了数据安全性;可以根据MerkleRBTree自我感知索引是否被篡改,根据交易哈希感知交易是否被篡改,从而保证了数据的不可篡改性;同时实现了轻量级节点的数据验证功能,使得查询端能够有效检测数据可信性。
附图说明
图1为本发明实施例提供的交易结构图;
图2为本发明实施例提供的区块结构图;
图3为本发明实施例提供的MerkleRBTree结构图;
图4为本发明实施例提供的数据***规则示例图,其中,(a)为情况1的空节点***结果,(b)为情况2的左侧***结果,(c)为情况3的右孩子为空时的右侧***结果,(d)为情况4的右孩子不为空时的右侧***结果。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
本发明设计的区块链技术术语的解释如下:
哈希指针:一个数据项的哈希指针指的是将该数据项的内容做哈希操作后得到固定长度的哈希值,同时以该哈希值为key,该数据项的内容为value,将此k-v对存储于k-v数据库,则该key即为该数据项的哈希指针;
交易:如图1所示,为交易结构图,交易分为交易头(Transaction)和模式(Schema)两部分,交易头包含:版本号(Version)、父交易哈希(PreHash)、交易时间(nTime)、交易下一拥有者公钥(ScriptPubk)、证明本交易有效的签名(ScriptSig);模式部分类似于传统数据库中的表结构,包含关键字key,以及各个字段(field);
区块链:区块链就是一个个的区块根据哈希指针首尾相连,每一个区块一旦形成便不可改变;如图2所示,为区块结构图,区块分为区块头和区块体两部分,区块头包括:版本号、前一区块哈希指针(由前一区块头数据哈希得到)、区块形成时的时间戳、区块体中交易自下而上哈希得到的Merkle根以及用于工作量证明的随机数和目标哈希;区块体中保存着区块中的所有交易记录;
区块链数据库:数据库中有多条区块链,每一条区块链相当于传统数据库中的一张表,所有的中心机构充当数据的存储节点,所有的存储节点根据共识算法生成区块链,所有节点(包括用户)存储区块头信息,可以由区块头信息检索到记录并验证记录正确性;
MerkleRBTree:将Merkle树与红黑树进行结合,用于索引区块体中的交易数据;如图3所示,为MerkleRBTree结构图,每个节点都存有关键字信息,从根节点开始,关键值小于等于该节点关键字的数据存储于左子树,大于该节点关键字的数据存储于右子树;叶子节点存储交易数据的哈希指针,非叶子结点值由其左右孩子节点两两哈希得到。
针对已有区块链数据库中只能对交易哈希值查询、无法存储一般数据结构的不足,本发明提供一种在区块链数据库上针对关键字key的索引方法,具体步骤如下所述。
步骤1、生成交易记录。用户输入数据是类似于传统SQL数据库中的Schema数据,本步骤的目的是生成区块链机制运行所需要的额外信息。
步骤1-1、生成默认信息。
生成区块链版本号信息,以及数据创建时刻的时间戳信息。
步骤1-2、生成前驱信息。
在本发明中,对于拥有相同关键字key的数据,始终认为只有最新的数据是有效的,而旧的数据被认为是新数据的前驱,所以对于相同关键字的数据在逻辑上首尾相连生成一个链式结构。当写入关键字为key的数据时,要指定该数据对象的前驱,如果没有前驱,则前驱置为Null。
步骤1-3、生成数据权限信息以及数据签名。
在本发明中,写入数据库中的数据不可删除,数据修改是通过重新写入一条相同关键字的数据项来实现。数据的权限信息指的是,本交易数据的创建者可以指定对该数据进行修改所需要满足的条件。在这里引入了ECDSA算法,指定可以对该数据项进行修改的下一公钥,并将其赋值给ScriptPubk。最后本数据创建者利用其私钥对该交易进行签名,用于后续证明本数据创建者拥有对该数据进行修改的权限。
步骤2、将交易打包到区块中。
步骤2-1、验证交易正确性。
交易的正确性验证主要验证交易的格式以及数据权限信息。格式验证去除无法识别的交易,保证***安全。交易的权限验证引入了ECDSA算法,交易中的SicripPubk为下一权限拥有者公钥,ScriptSig为本交易创建者生成的数字签名信息。权限验证是通过verify()函数验证本交易的ScriptSig是否与其前驱交易的ScriptPubk相匹配,如果匹配则证明本交易的创建者拥有其前驱交易所要求的私钥,可以对本交易的前驱进行修改,如果不匹配则没有相关的权限,本交易无效。
步骤2-2、检测双花。
数据权限验证保证只有拥有对应的私钥,才能进行对交易前驱的修改,但是当交易的拥有者将权限转移给下一后继之后,其仍然可以将本交易的权限转移给其他后继者,并且对本交易进行修改,从而造成了数据不一致性,称这一现象为双花。存储节点收到交易记录之后,读取交易的prehash字段,根据prehash值到k-v数据库中检索前驱交易索引TxIndex,如果该索引指明前驱交易的后继交易不为空,则表明待验证交易为双花交易,判定其无效。如果其后继交易为空,则将后继交易赋值为待验证交易的哈希值,待验证交易有效。如果交易的prehash字段为空,即交易的创建者认为之前不存在与此交易关键字key相同的交易,此时的双花验证则是查找***中是否能够检索到关键字为key的交易,如果检索到则待验证交易无效,如果未检索到则该交易有效。
步骤2-3、更新区块索引。
当交易被验证有效之后,将其原始数据tx存储到key有序的数组vTx[]中,对Tx进行双Sha256哈希操作,得到交易的存储关键字KEY=Hash(Tx),将该存储关键字***到MerkleRBTree中。MerklrRBTree为红黑树与Merkle树的结合,每一个节点都是一个k-v对,其中k=hash(VAL),v=(hashleft,hashright,key)。从根节点开始***数据,比较待***节点关键字key和Merkleroot节点关键字NodeKey,如果key<=NodeKey则***到其左子树,否则***到其右子树,直到最后一层分支节点。***交易之后,对该树进行旋转使其保证黑色平衡,并递归向上更新分支节点哈希值为Hash(1efthash,rigthhash,key)。在最后一层分支节点根据如下4种情况***该节点:
情况1:如果该分支节点为空(只在Merkleroot为空时出现),对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建一个分支节点,并定义其关键值为key,左哈希为叶子结点哈希值,右哈希为0,形如(Hash(Tx),0,key),***结果如图4(a)所示。这也说明了一棵树只要不为空,则其分支节点一定不为空,而且最后一层分支节点的key值一定与其左孩子key值相同。
情况2:如果待***数据key值小于该节点NodeKey值,我们应该将该数据***到该节点左侧,但是由情况1可知,该节点左孩子一定不为空,而且是叶子结点。首先对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建一个红色的分支节点,其关键字为待***节点key,左哈希为Hash(Tx),右哈希为原来分支节点的左哈希,即(Hash(Tx),Oldlefthash,key)。记hash=Hash(Hash(Tx),Oldlefthash,key),则更新父节点为(hash,Oldrighthash,Oldkey),***结果如图4(b)所示。
情况3:如果待***数据key值大于该节点NodeKey值,而且该节点右哈希为0,则对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后更新该分支节点为(Oldlefthash,Hash(Tx),Oldkey),***结果如图4(c)所示。
情况4:如果待***数据key值大于该节点NodeKey值而且该节点右哈希不为0。则先对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建红色分支节点,分支节点关键值为待***数据key值与原分支节点右孩子key值中的较小者,左孩子为待***数据与原分支节点右孩子中key值较小者,右孩子为较大者;最后更新其父节点右哈希为新建分支节点哈希,***结果如图4(d)所示。
步骤3、将区块数据追加写入磁盘文件。
数据写入是以区块为单位进行的,当区块中交易数量达到固定阈值,则将区块中的数据写入到磁盘上。首先将区块头以及区块体中保存交易原始数据的交易数组vTx[]顺序写入到磁盘文件blk000x中。区块体中建立的MerkleRBTree则存储到k-v数据库中。同时生成BlockIndex存储区块的元数据,用来检索区块;生成TxIndex保存交易的存储位置。
步骤4、数据查找。
根据数据关键字key来查询交易,所有的区块首尾相连,从最新的区块开始根据key查找。在单个区块内,从区块头的MerkleRoot进入到MerkleRBTree中,从MerkleRoot开始比较目标关键字key与当前节点关键字Ckey,若key小于等于Ckey,则查找其左孩子,否则查找其右孩子,依次执行直到叶子节点,对于N个节点的区块中查询时间复杂度为O(lgN)。如果交易在本区块中,则最后在叶子节点会查询到交易哈希值Hash(Tx),以Hash(Tx)为k,可以在k-v数据库中查询到该交易对应在磁盘上的索引信息TxIndex,最后根据TxIndex在磁盘文件中读取到交易信息Tx。如果交易不在本区块中,则按照同一方法在其前驱区块中查找。
本发明中数据的不可篡改性体现在以下几个方面:(1)从key获得Hash(Tx)的过程中,根据MerkleRBTree从根节点向下检索,因为该树在生成时是由叶子节点哈希得来,所以一定能够最终检索到叶子节点,如果在途中查询不到某一分支节点,则说明是上一分支节点数据被篡改或者下一节点数据丢失;(2)从Hash(Tx)获得Tx的过程中,因为Hash(Tx)是Tx经由hash运算得来,所以可以根据Hash(Tx)检测交易Tx是否被篡改。
步骤5、数据验证。
轻量级节点只存储区块头信息,存储节点存储区块头和区块体。当轻量级节点查询数据时,存储节点返回查询结果以及验证路径。轻量级节点收到数据时,从查询结果开始往上两两哈希,最终生成验证MerkleRoot,通过比对该MerkleRoot是否与本地保存的区块头中的MerkleRoot一致来验证查询结果是否有效。
下面根据具体实施例进一步说明本发明提供的区块链数据索引方法。表1为用户想要存储到区块链数据库中的数据。
表1要存储到区块链数据库中的数据
Key | Name | Sex | Account |
1600005 | Bob | Male | 7000 |
1600004 | Alice | Female | 6000 |
1600007 | Tom | Male | 5000 |
1600006 | Jack | Male | 8000 |
本实施例主要演示数据在MerkleRBTree中的索引过程,故省略了交易Prehash、PubKey和ScriptSig等控制信息。假设当前区块为空,上述表1中的四条交易先后到来,存储节点依次将交易打包到区块中。
当节点接收到第1条交易,此时MerkleRoot为空,按照本实施例步骤2-3中情况1所述,首先将该交易进行双Sha256哈希操作,得到交易的哈希值为747d51d1007b4fb1be01aeb633e78f66cbdeae393aaa200e73627498b2551df(为便于书写后续只显示其前8位),然后生成分支节点,以交易哈希值为其左哈希,右哈希为0,结点关键字key为1600005,生成MerkleRBTree索引项如表2所示,其中k=Hash(v)。
表2第1条交易时生成MerkleRBTree索引项
当节点再***第2条交易时,此时MerkleRoot节点关键字为1600005,待***交易关键字为1600004,小于根节点关键字,此时应该***到左子树,又因为MerkleRoot为左侧最后一层分支节点(索引项表中不存在k=747d51d1的表项),此时情况与步骤2-3中情况2相符,则操作步骤为:先将交易2进行Sha256双哈希操作,得到交易哈希值为dcaa0e32,新生成分支节点,其左哈希为dcaa0e32,右哈希为父节点左哈希747d51d1,关键字为1600004;之后向上更新父节点,父节点左哈希为新生成分支节点哈希,父节点k也相应改变,更新之后MerkleRBTree索引项如表3所示。
表3***第2条交易后MerkleRBTree索引项
当节点***第3条交易时,MerkleRoot关键字为1600005,待***节点关键字为1600007,大于MerkleRoot关键字,则应该***到其右子树,又因为此时MerkleRoot本身为右侧最后一层分支节点,此时情况与步骤2-3中情况3相符,则后续步骤为:将交易进行Sha256双哈希操作,得到交易哈希值为b178577f,更新MerkleRoot右哈希为b178577f,继而MerkleRoot的k相应改变,最后MerkleRBTree索引项如表4所示。
表4***第3条交易后MerkleRBTree索引项
虽然在***关键字为1600007的交易之后,索引表中没有key=1600007的记录,但是在查询时,1600007>1600005,所以查找其右哈希b178577f,而b178577f正是key=1600007所对应的交易哈希,即1600005的右哈希记录了key>1600005的记录(1600007)。
当节点***第4条交易时,MerkleRoot关键字为1600005,待***节点关键字为1600006,大于MerkleRoot关键字,应当***右子树,又MerkleRoot为右侧最后一层分支节点,与步骤2-3情况4相符,之后操作为:将交易进行哈希操作,得到交易哈希值为228de82e,新生成分支节点,节点左哈希为228de82e,右哈希为b178577f,节点关键字为1600006,之后向上更新父节点右哈希为该分支节点哈希,最后更新MerkleRoot的k值。更新之后的MerkleRBTree索引项如表5所示。
表5***第4条交易后MerkleRBTree索引项
假设此时区块大小达到阈值(实际上每个区块有上千个交易),开始准备存入磁盘。此时区块头中的MerkleRoot值对应为d90f7e2e,区块体中的交易数组为表1中的交易原始数据,MerkleRBTree索引项直接写入k-v数据库。首先将区块头和区块体中的交易数组数据序列化,顺序追加到磁盘文件blk0001.dat中,返回区块在磁盘偏移量为nFile=1,BlockPos=8,随后生成每个交易的元数据TxIndex(nFile,BlockPos,n,NextHash),其中nFile指定第几个文件,BlockPos指定该区块在文件中的偏移量,n指定交易对应在有序数组中的下标,NextHash指定交易后继(用于检测双花在此省略)最后将每个交易的元数据信息存储到k-v数据库中,元数据如表6所示。
表6每个交易的元数据信息
Txhash | nFile | BlockPos | n |
dcaa0e32 | 1 | 8 | 0 |
eaf1e7ec | 1 | 8 | 1 |
228de82e | 1 | 8 | 2 |
b178577f | 1 | 8 | 3 |
为方便说明问题,将各个交易的哈希值罗列如下:
表7各个交易的哈希值
TxHash | Key | Name | Sex | Account |
dcaa0e32 | 1600004 | Alice | Female | 6000 |
eaf1e7ec | 1600005 | Bob | Male | 7000 |
228de82e | 1600006 | Jack | Male | 8000 |
b178577f | 1600007 | Tom | Male | 5000 |
当查询关键字为160006的交易时,首先根据区块头的MerkleRoot值d90f7e2e,到k-v数据库中检索到MerkleRoot值为(baa9d30a,be149016,1600005),1600006>1600005,故在k-v数据库中检索k=be149016,得到MerkleRBTree索引值为(228de82e,b178577f,1600006),1600006=1600006,故在k-v数据库中检索k=228de82e,得到交易元数据为(1,8,3),最后在磁盘文件中反序列化得到该交易原始数据为(1600006,Jack,Male,8000),同时验证路径为在查询时未命中的那侧的哈希值,在本实施例中即为((baa9d30a,1600005),(b178577f,1600006)),最后返回给轻量级节点的结果为((baa9d30a,1600005),(b178577f,1600006),(1600006,Jack,Male,8000)),轻量级节点通过验证Hash(baa9d30a,Hash(Hash(1600006,Jack,Male,8000),b178577f,1600006),1600005)的值是否与本地的MerkleRoot值相等来验证查询结果的可信性。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明权利要求所限定的范围。
Claims (3)
1.一种在区块链数据库上针对关键字key的索引方法,其特征在于:该方法包括以下步骤:
步骤1:普通节点根据用户输入的带关键字key的原始数据生成交易记录,具体包括:
步骤1-1:生成交易默认信息,包括区块链版本号信息以及数据创建时刻的时间戳信息;
步骤1-2:指定该交易的前驱PreHash,若该关键字key是第一次出现,则前驱PreHash置为Null,否则前驱为该关键字key所对应的最新交易的哈希值;
步骤1-3:生成数据权限信息以及数据签名;将交易下一拥有者公钥ScriptPubk赋值为下一个可对该关键字key数据进行修改的公钥,利用ECDSA算法,根据自己的私钥对交易数据进行签名;
步骤2:存储节点将交易打包到区块中,具体包括:
步骤2-1:验证交易格式是否符合规范,过滤无法识别的交易;
步骤2-2:验证交易签名是否有效;根据PreHash值到key-value数据库中检索其交易索引TxIndex,根据TxIndex检索到前驱交易PreTx,取其指定的下一任公钥信息PreTx.ScriptPubk;根据ECDSA算法的verify()函数进行签名验证,若verify(PreTx.ScriptPubk,Tx.ScriptSig,Tx)=True,则签名有效,否则签名无效,丢弃该交易;key-value数据库简称k-v数据库;
步骤2-3:检测双花;读取交易的PreHash字段,若其不为空,则根据PreHash值到k-v数据库中检索前驱交易索引TxIndex,如果该索引指明前驱交易的后继交易不为空,则表明待验证交易为双花交易,判定其无效;如果其后继交易为空,则将后继交易赋值为待验证交易的哈希值,待验证交易有效;如果交易的PreHash字段为空,即交易的创建者认为之前不存在与此交易关键字key相同的交易,此时查找***中是否能够检索到关键字为key的交易,如果检索到则该交易无效,如果未检索到则该交易有效;
步骤2-4:当交易被验证有效之后,将交易***到区块体中key有序的交易数组vTx[]中,更新MerkleRBTree索引;
更新MerkleRBTree的规则如下:初始化当前节点为Merkleroot,比较待***节点关键字key和当前节点关键字NodeKey,如果key<=NodeKey,则***到当前节点的左子树,然后更新当前节点为当前节点的左孩子,否则***到右子树,然后更新当前节点为其右孩子,依次递归,直到最后一层分支节点;***交易之后,对该树进行旋转使其保证黑色平衡,并递归向上更新分支节点哈希值为Hash(lefthash,rigthhash,key);
步骤3:将区块数据追加写入磁盘文件,具体包括:
步骤3-1:将区块头以及区块体中保存交易原始数据的交易数组vTx[]序列化,顺序写入到磁盘文件blk000x中,并返回区块在磁盘中的位置nFile,BlockPos;
步骤3-2:生成每个交易的元数据TxIndex(nFile,BlockPos,n),其中nFile指定第几个文件,BlockPos指定该区块在文件中的偏移量,n指定交易对应在有序数组中的下标,并将每个交易的元数据信息存储到k-v数据库中,格式为k=Hash(Tx),v=(TxIndex);
步骤3-3:将MerkleRBTree索引项存储在k-v数据库中,其中k=Hash(lefthash,righthash,key),v=(lefthash,righthash,key);
步骤4:根据关键字key查询交易,返回查询结果;从最新的区块开始查找交易,如果该区块没有查找到则查询其前一区块;
步骤5:普通用户对查询结果进行可信性验证;
普通用户收到验证路径栈和交易信息之后,首先对交易进行Sha256双哈希操作得到交易哈希值Hash(Tx),然后与验证路径栈中弹出的值做Sha256双哈希操作,得到的哈希值继续与栈中弹出的下一个值做哈希,直到栈为空;比较得到的哈希值与本地区块头中的Merkleroot值是否相等,如果相等则数据可信,否则不可信。
2.根据权利要求1所述的在区块链数据库上针对关键字key的索引方法,其特征在于:所述步骤2-4中,在最后一层分支节点根据如下4种情况***该节点:
情况1:如果该分支节点为空,该情况只在Merkleroot为空时出现,则对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建一个分支节点,并定义其关键值为key,左哈希为叶子结点哈希值,右哈希为0,形如(Hash(Tx),0,key);
情况2:如果待***数据key值小于该节点NodeKey值,应将该数据***到该节点左侧;首先对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建一个红色的分支节点,其关键字为待***节点key,左哈希为Hash(Tx),右哈希为原来分支节点的左哈希,即(Hash(Tx),Oldlefthash,key);记hash=Hash(Hash(Tx),Oldlefthash,key),则更新父节点为(hash,Oldrighthash,oldkey);
情况3:如果待***数据key值大于该节点NodeKey值,而且该节点右哈希为0,则对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后更新该分支节点为(Oldlefthash,Hash(Tx),Oldkey);
情况4:如果待***数据key值大于该节点NodeKey值而且该节点右哈希不为0,则先对交易进行Sha256双哈希操作,得到其哈希值Hash(Tx),然后新建红色分支节点,分支节点关键值为待***数据key值与原分支节点右孩子key值中的较小者,左孩子为待***数据与原分支节点右孩子中key值较小者,右孩子为较大者;最后更新其父节点右哈希为新建分支节点哈希。
3.根据权利要求2所述的在区块链数据库上针对关键字key的索引方法,其特征在于:所述步骤4中,在单个区块的查找方法为:从区块头的MerkleRoot进入到MerkleRBTree中,从MerkleRoot开始比较目标关键字key与当前节点关键字Ckey,若key小于等于Ckey,则查找其左孩子,并将右孩子和节点关键字压入到验证路径栈中,否则查找其右孩子,并将左孩子和节点关键字压入到验证路径栈中,依次执行直到叶子节点;如果叶子节点关键值key等于查询关键字key,则查询命中;根据最后在叶子节点查询到的交易哈希值Hash(Tx),以Hash(Tx)为k,在k-v数据库中查询到该交易对应在磁盘上的索引信息TxIndex,最后根据TxIndex在磁盘文件中读取到交易信息Tx;最后将验证路径栈和交易原信息返回给普通用户。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810971875.4A CN109165224B (zh) | 2018-08-24 | 2018-08-24 | 一种在区块链数据库上针对关键字key的索引方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810971875.4A CN109165224B (zh) | 2018-08-24 | 2018-08-24 | 一种在区块链数据库上针对关键字key的索引方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109165224A CN109165224A (zh) | 2019-01-08 |
CN109165224B true CN109165224B (zh) | 2021-02-19 |
Family
ID=64896704
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810971875.4A Active CN109165224B (zh) | 2018-08-24 | 2018-08-24 | 一种在区块链数据库上针对关键字key的索引方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109165224B (zh) |
Families Citing this family (52)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109766389B (zh) * | 2019-01-09 | 2020-09-22 | 华东师范大学 | 一种基于位图索引的区块链轻客户端验证查询方法 |
CN109885615B (zh) * | 2019-01-24 | 2020-09-22 | 华东师范大学 | 一种基于索引的面向区块链轻客户端的范围查询可验证查询方法 |
CN110059084B (zh) * | 2019-01-31 | 2023-08-01 | 创新先进技术有限公司 | 一种数据存储方法、装置及设备 |
CN109918375B (zh) * | 2019-02-26 | 2021-07-30 | 杭州云象网络技术有限公司 | 一种基于区块链和分布式存储的大文本存储、索引及检索方法 |
AU2019203849C1 (en) | 2019-03-04 | 2021-04-29 | Advanced New Technologies Co., Ltd. | Updating blockchain world state merkle patricia trie subtree |
CN111695885B (zh) * | 2019-03-14 | 2023-08-29 | 中国科学技术大学 | 基于减小交易输入的数字凭证区块链压缩方法 |
CN110083635A (zh) * | 2019-03-21 | 2019-08-02 | 深圳壹账通智能科技有限公司 | 基于区块链的数据查询及显示方法及装置 |
CN110059089B (zh) * | 2019-03-27 | 2021-01-22 | 深圳前海达闼云端智能科技有限公司 | 数据同步方法、装置、存储介质及电子设备 |
CN110162662B (zh) * | 2019-04-18 | 2023-02-28 | 创新先进技术有限公司 | 一种块链式账本中数据记录的验证方法、装置及设备 |
US10990705B2 (en) | 2019-04-18 | 2021-04-27 | Advanced New Technologies Co., Ltd. | Index creation for data records |
WO2020211569A1 (zh) * | 2019-04-18 | 2020-10-22 | 创新先进技术有限公司 | 一种数据记录的索引创建方法 |
CN110175840B (zh) * | 2019-04-19 | 2021-08-03 | 华中科技大学 | 联盟链中实现轻钱包机制的方法、客户端、联盟链及*** |
CN110263015A (zh) * | 2019-05-07 | 2019-09-20 | 深圳壹账通智能科技有限公司 | 基于区块链的数据溯源方法、装置、设备及可读存储介质 |
CN110231979A (zh) * | 2019-05-07 | 2019-09-13 | 深圳壹账通智能科技有限公司 | 基于区块链的事务处理方法、装置、设备及存储介质 |
SG11202001890UA (en) * | 2019-05-14 | 2020-03-30 | Alibaba Group Holding Ltd | Methods and devices for data traversal |
CN110096522B (zh) * | 2019-05-15 | 2023-07-28 | 西安电子科技大学 | 一种支持关系型检索的区块链数据处理方法、装置及设备 |
CN110175188B (zh) * | 2019-05-31 | 2021-05-11 | 杭州复杂美科技有限公司 | 一种区块链状态数据缓存和查询方法、设备及存储介质 |
CN110209675A (zh) * | 2019-06-18 | 2019-09-06 | 北京艾摩瑞策科技有限公司 | 在区块链上的信用数据查询方法及其装置 |
US11036720B2 (en) | 2019-06-28 | 2021-06-15 | Advanced New Technologies Co., Ltd. | Blockchain-based hierarchical data storage |
US10789222B2 (en) | 2019-06-28 | 2020-09-29 | Alibaba Group Holding Limited | Blockchain-based hierarchical data storage |
CN110334154B (zh) * | 2019-06-28 | 2020-07-21 | 阿里巴巴集团控股有限公司 | 基于区块链的分级存储方法及装置、电子设备 |
CN110442577A (zh) * | 2019-07-15 | 2019-11-12 | 杭州复杂美科技有限公司 | 一种状态数据存储、查询和管理方法、设备及存储介质 |
CN110688377B (zh) * | 2019-08-30 | 2020-07-17 | 阿里巴巴集团控股有限公司 | 一种更新状态默克树的方法及装置 |
US10992459B2 (en) | 2019-08-30 | 2021-04-27 | Advanced New Technologies Co., Ltd. | Updating a state Merkle tree |
CN110704428A (zh) * | 2019-09-06 | 2020-01-17 | 深圳壹账通智能科技有限公司 | 区块链的数据索引方法、装置、计算机设备和存储介质 |
CN110837505B (zh) * | 2019-11-06 | 2022-07-19 | 杭州复杂美科技有限公司 | 状态数据存储方法、状态数据同步方法、设备和存储介质 |
CN110874365B (zh) * | 2019-11-20 | 2023-11-17 | 深圳市迅雷网络技术有限公司 | 一种信息查询方法及其相关设备 |
CN110971393B (zh) * | 2019-11-29 | 2020-11-06 | 中南大学 | 基于区块链动态社交外包数据关键词查询验证方法及装置 |
CN111080298B (zh) * | 2019-12-26 | 2023-12-29 | 电子科技大学 | 一种适用于能源区块链的区块生成与交易验证方法 |
US11461362B2 (en) * | 2020-01-29 | 2022-10-04 | EMC IP Holding Company LLC | Merkle super tree for synchronizing data buckets of unlimited size in object storage systems |
US11455319B2 (en) * | 2020-01-29 | 2022-09-27 | EMC IP Holding Company LLC | Merkle tree forest for synchronizing data buckets of unlimited size in object storage systems |
US11711204B2 (en) * | 2020-01-29 | 2023-07-25 | EMC IP Holding Company LLC | Using sparse merkle trees for smart synchronization of S3 |
CN111488358A (zh) * | 2020-04-08 | 2020-08-04 | 北京瑞策科技有限公司 | 基于业务数据区块链的数据查询方法及装置 |
CN111680317B (zh) * | 2020-04-27 | 2021-05-25 | 华东师范大学 | 一种面向区块链的乐观并发保序编码方法 |
CN111581215B (zh) * | 2020-05-07 | 2020-12-15 | 钟士平 | 数组树数据储存方法、快速查找方法及可读储存介质 |
CN111596862B (zh) * | 2020-05-20 | 2022-11-01 | 南京如般量子科技有限公司 | 一种区块链历史交易数据自主优化方法及*** |
CN111639080B (zh) * | 2020-06-01 | 2021-07-27 | 腾讯科技(深圳)有限公司 | 一种数据处理方法、装置、节点设备及存储介质 |
CN111626680B (zh) * | 2020-06-02 | 2023-07-25 | 重庆云创科技有限公司 | 一种用于信誉评价的交易数据链式存储方法及区块链存储方法 |
CN111898164B (zh) * | 2020-07-02 | 2024-03-29 | 武汉纺织大学 | 一种支持标签区块链存储和查询的数据完整性审计方法 |
CN112487027B (zh) * | 2020-12-02 | 2022-08-23 | 山东浪潮科学研究院有限公司 | 基于区块链电子交易的高效数据查询实现方法 |
CN112765155B (zh) * | 2020-12-14 | 2022-05-31 | 杭州趣链科技有限公司 | 基于区块链的键值存储方法、装置、终端设备及介质 |
CN112800065A (zh) * | 2021-02-09 | 2021-05-14 | 北京工业大学 | 基于改进区块存储结构的高效数据检索方法 |
CN112966001B (zh) * | 2021-02-26 | 2023-08-04 | 东北大学 | 一种基于区块链的BCTkPQ查询方法 |
CN113468571B (zh) * | 2021-07-15 | 2023-05-12 | 湖北央中巨石信息技术有限公司 | 基于区块链的溯源方法 |
CN113901131B (zh) * | 2021-09-02 | 2024-06-07 | 北京邮电大学 | 基于索引的链上数据查询方法及装置 |
CN114153827B (zh) * | 2021-10-11 | 2023-01-10 | 北京天德科技有限公司 | 一种基于区块链***的交易数据移除方法 |
CN114020737B (zh) * | 2021-10-20 | 2024-06-18 | 大连理工江苏研究院有限公司 | 一种区块链数据高效可信索引方法 |
CN114519078B (zh) * | 2022-04-19 | 2022-08-09 | 北京理工大学 | 一种基于区块链的跨链可信查询方法及*** |
CN115037755B (zh) * | 2022-04-27 | 2023-04-07 | 东北大学 | 基于数据重分布和动态节点策略的区块链轻量存储方法 |
CN115052008B (zh) * | 2022-05-26 | 2023-07-25 | 南京邮电大学 | 基于云存储的区块链数据链下存储方法 |
CN115081031A (zh) * | 2022-07-26 | 2022-09-20 | 成都云智数安科技有限公司 | 一种防篡改的区块链数据存储方法及*** |
CN115065458B (zh) * | 2022-08-08 | 2022-11-15 | 山东鼎信数字科技有限公司 | 一种数据加密传输的电子商务交易*** |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106227833A (zh) * | 2016-07-26 | 2016-12-14 | 宁圣金融信息服务(上海)有限公司 | 区块链搜索引擎方法、***和装置 |
CN107729371A (zh) * | 2017-09-12 | 2018-02-23 | 深圳先进技术研究院 | 区块链的数据索引及查询方法、装置、设备及存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10691763B2 (en) * | 2016-11-11 | 2020-06-23 | International Business Machines Corporation | Trustable web searching verification in a blockchain |
-
2018
- 2018-08-24 CN CN201810971875.4A patent/CN109165224B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106227833A (zh) * | 2016-07-26 | 2016-12-14 | 宁圣金融信息服务(上海)有限公司 | 区块链搜索引擎方法、***和装置 |
CN107729371A (zh) * | 2017-09-12 | 2018-02-23 | 深圳先进技术研究院 | 区块链的数据索引及查询方法、装置、设备及存储介质 |
Non-Patent Citations (2)
Title |
---|
Formal Modeling and Verification of Blockchain System;Zhangbo DUAN等;《2018 Association for Computing Machinery》;20180110;全文 * |
区块链技术:架构及进展;邵奇峰等;《计算机学报》;20171231;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN109165224A (zh) | 2019-01-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109165224B (zh) | 一种在区块链数据库上针对关键字key的索引方法 | |
US11283616B2 (en) | Method for index-based and integrity-assured search in a blockchain | |
US20220414090A1 (en) | Blockchain data index method, blockchain data storage method and device | |
AU2020204053B2 (en) | Methods and apparatus for efficiently implementing a fast-copyable database | |
US11520780B2 (en) | Distributed database systems and structures | |
CN108039943B (zh) | 一种可验证的加密搜索方法 | |
CN102122285B (zh) | 一种数据缓存***中的数据查询***和数据查询方法 | |
US20220132213A1 (en) | Hybrid Blockchains and Streamchains Using Non-Crypto Hashes for Securing Audio-, Video-, Image-, and Speech-Based Transactions and Contracts | |
Niaz et al. | Merkle hash tree based techniques for data integrity of outsourced data. | |
US20210109917A1 (en) | System and Method for Processing a Database Query | |
US8316417B2 (en) | Method for dynamic secure management of an authenticated relational table in a database | |
CN111209591B (zh) | 一种按时间排序的存储结构与快速查询的方法 | |
CN102890678A (zh) | 一种基于格雷编码的分布式数据布局方法及查询方法 | |
CN114461673A (zh) | 一种基于链上-链下协同的区块链查询优化方法 | |
Zhang et al. | Verifiable fuzzy keyword search supporting sensitive information hiding for data sharing in cloud-assisted e-healthcare systems | |
Wei et al. | Integrity assurance for outsourced databases without DBMS modification | |
US20060106857A1 (en) | Method and system for assured document retention | |
Qian | Improved authenticated data structures for blockchain synchronization | |
US20240143569A1 (en) | Centralized database management system for database synchronization using invertible bloom filters | |
US12019651B2 (en) | Centralized database management system for database synchronization using same-size invertible bloom filters | |
CN115081031A (zh) | 一种防篡改的区块链数据存储方法及*** | |
CN116662329A (zh) | 一种针对多维数据的可查询验证的索引研究 | |
CN116701414A (zh) | 基于区块链的数据处理方法、装置、设备及可读存储介质 | |
WO2020223901A1 (zh) | 查询数据的方法和服务器 | |
Tian et al. | A Cross-Chain System Supports Verifiable Complete Data Provenance Queries |
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 |