CN109508334B - 针对区块链数据库的数据压缩方法、访问方法和系统 - Google Patents
针对区块链数据库的数据压缩方法、访问方法和系统 Download PDFInfo
- Publication number
- CN109508334B CN109508334B CN201811405827.5A CN201811405827A CN109508334B CN 109508334 B CN109508334 B CN 109508334B CN 201811405827 A CN201811405827 A CN 201811405827A CN 109508334 B CN109508334 B CN 109508334B
- Authority
- CN
- China
- Prior art keywords
- key
- data
- value
- hash table
- level
- 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
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种针对区块链数据库的数据压缩方法、访问方法和系统,数据压缩方法包括:从key‑value数据库中已存储key‑value条目的value域数据中抽取用户地址数据,统计平均用户key‑value条目数量;在平均用户key‑value条目数量高于预定阈值时,创建二级哈希表来存储各条目中的用户地址数据,使得用户地址数据相同的条目对应同一个二级哈希表;截取各条目的完整key域数据的部分字节生成简化key域数据;将各条目的value域数据中的用户地址数据替换为指向相应二级哈希表的指针,生成简化value域数据;基于简化key域数据和简化value域数据生成一级哈希表来替换初始哈希表;利用线性数据表存储存在哈希映射地址冲突和一级哈希表简化key值冲突的key‑value数据,该数据包括完整key域数据和value域数据。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及面向区块链应用的数据处理技术,更具体地涉及一种针对区块链数据库的数据压缩方法、访问方法和系统。
背景技术
区块链是随着比特币等数字加密货币的日益普及而逐渐兴起的一种全新技术,它提供了一种去中心化的、无需信任积累的信用建立范式,目前已经引起金融行业、科研机构、政府部门和投资公司的高度重视与广泛关注。
区块链起源于比特币,作为比特币的底层技术,本质上是一个去中心化的数据库。区块链技术是一种不依赖第三方、通过自身分布式节点进行网络数据的存储、验证、传递和交流的一种技术方案。区块链技术被认为是互联网发明以来最具颠覆性的技术创新,它依靠密码学和数学巧妙的分布式算法,在无法建立信任关系的互联网上,无需借助任何第三方中心的介入就可以使参与者达成共识,以极低的成本解决了信任与价值的可靠传递难题。
在区块链中,节点通过特定的共识算法以及交易验证算法实现去中心化交易。交易数据被分为两类,一类是块数据(block),里面包含了已经被确认的交易,这类数据以区块的形式存储至数据库中,区块以链的方式组成区块链;另一类数据是未花费交易数据(UTXO,Unspent Transaction Output),它是块数据的子集,是专门为提高交易验证速度而设立的数据。交易数据都被存储在数据库中,交易数据在写入区块前需要执行一系列的验证过程,在这些过程中需要访问和更新数据库,因此数据库的效率,尤其是存储UTXO的数据库效率,对区块链的交易性能至关重要。
UTXO数据是验证交易签名的必不可少的数据,大多数区块链系统采用key-value数据库来存储UTXO数据,key-value数据库包括key域数据和value域数据,其中key域数据与交易ID相关,value域数据与节点地址相关,每一个(key,value)对(可简称为(K,V)对、(K,V)数据)被称为一个key-value条目或一条key-value数据,区块链系统可以根据key值(简称K)快速映射到存储对应(key,value)条目中的节点地址(用户地址)。以比特币为例,其key域数据由交易ID和输出索引组成,其value域数据由节点地址、交易金额等组成。key-value条目可以以哈希表的形式存储在key-value数据库中。对应key-value数据库,如果其数据在内存中,则可以很快的存取数据(~20us/opr),但如果数据在硬盘中,其访存速度会变得降低接近3个数量级(~10ms/opr),由于区块链巨大的交易量,数据库所存储的UTXO数据已达到3GB左右,而且还在继续增长,目前的内存容量越来越难以满足UTXO数据的增长,导致部分数据被放置于硬盘中,从而极大地降低了数据库的访存性能。
另外,由于key-value数据库的地址映射机制(哈希映射),在数据访存时会有一定数量的冲突产生,即不同key值的条目会被映射到相同的地址。这种冲突主要通过开放地址法或链表法解决,但是如果冲突率过高,数据库处理冲突的事件开销就会增大,从而也会降低数据库的访存性能。
如何提高区块链数据库的访存性能,是一个有待解决的问题。
发明内容
鉴于此,本发明实施例提供了一种key-value数据库中的数据压缩方法、装置和系统,以消除或改善现有技术中存在的一个或更多个缺陷。
本发明的技术方案如下:
根据本发明的一方面,提供一种针对区块链数据库的数据压缩方法,该方法包括以下步骤:
从key-value数据库中的多个已存储key-value条目的value域数据中抽取用户地址数据,基于用户地址数据统计平均用户key-value条目数量;
在所述平均用户key-value条目数量高于预定阈值时,在key-value数据库中创建二级哈希表来存储各key-value条目的初始哈希表中的用户地址数据,使得用户地址数据相同的key-value条目对应同一个二级哈希表;
截取各key-value条目的初始哈希表中完整key域数据的部分字节生成简化key域数据,并将各key-value条目的初始哈希表的value域数据中的用户地址数据替换为指向相应二级哈希表中的用户地址数据的指针,生成简化的value域数据,基于简化key域数据和简化的value域数据生成一级哈希表替换初始哈希表存储在key-value数据库中;以及
利用线性数据表存储存在哈希映射地址冲突和简化key值冲突的key-value数据,所存储的key-value数据包括完整key域数据和对应的value域数据。
优选地,各key-value条目的初始value域数据中的用户地址数据作为对应二级哈希表中的key域数据,二级哈希表中的value域数据为空。
优选地,所述完整key域数据包括交易ID和输出索引,所述截取各key-value条目的初始哈希表中完整key域数据的部分字节生成简化key域数据的步骤包括:将完整key域数据中的交易ID的字节数m0和/或输出索引的字节数n0缩短,得到简化key域数据,使得简化key域数据中的字节数满足m+n<m0+n0,其中,m和n分别为简化key域数据中交易ID的字节数m0和输出索引的字节数。
优选地,基于如下公式确定m和n:
其中,E1为哈希映射相关的平均碰撞次数,E2为线性数据表大小,2s为用于存储key-value数据的数据桶的数量,t为要存储的key-value数据的条目数量。
优选地,所述key-value条目为区块链交易数据中的未花费交易数据UTXO;所述m被设置为大于n。
优选地,所述key-value数据库中的数据和所述线性数据表存储在内存中;所述存在哈希映射地址冲突和简化key值冲突的key-value数据包括具有不同的完整key值,被哈希映射到相同的地址,且对应相同的简化key值的多条key-value数据。
优选地,针对要存入key-value数据库的key-value条目,所述方法还包括:对要存储的key-value条目中的初始key值进行哈希运算,得到key-value数据库中与一级哈希表对应的数据桶的地址;
截取存储的key-value条目的初始哈希表中完整key域数据的部分字节生成简化key域数据;
在数据桶内没有数据的情况下,则将简化key域数据、指向二级哈希表中的用户地址数据的指针以及非用户地址数据存储在对应数据桶中;在数据桶内有数据的情况下,将简化key域数据的简化key值与对应数据桶中的简化key值相比较,如果对应数据桶中不存在相同的简化key值,则按照预定的冲突解决法寻找新的用于存储一级哈希表的存储地址,如果对应数据桶中存在相同的简化key值,则将要存储的初始key-value数据存储在线性数据表中,然后在一级哈希表的存储地址存储简化key域数据、指向二级哈希表中的用户地址数据的指针以及非用户地址数据;
将要存储的key-value条目中的value域数据分解为用户地址数据和非用户地址数据,将用户地址数据作为二级哈希表的key域数据存储在key-value数据库中创建的二级哈希表中,并在所述二级哈希表的存储地址有更新时相应更新一级哈希表中的指针。
优选地,所述将用户地址数据存储在key-value数据库中创建的二级哈希表中的步骤包括:对要存储的key-value条目的二级哈希表的key值进行哈希运算,得到二级哈希表所对应的数据桶的地址,如果数据桶中已经存在数据,则将当前用户地址数据和已存在的地址数据进行比较,如果二者一致,将数据桶中当前二级哈希表作为要存储的key-value数据对应的二级哈希表;如果二者不一致,则按照预定的冲突解决法寻找新的用于存储二级哈希表的存储地址。
根据本发明的另一方面,提供一种针对区块链数据库的数据存储方法,该方法包括以下步骤:
利用一级哈希表和二级哈希表来在key-value数据库中存储多个key-value条目;
其中,具有相同用户地址数据的key-value条目对应同一个二级哈希表,各key-value条目的初始value域数据中的用户地址数据作为对应二级哈希表中的key域数据存储在二级哈希表中,所述二级哈希表中的value域数据为空;并且
每个key-value条目对应一个一级哈希表,各一级哈希表中的key域数据为对应key-value条目中的初始key值,各一级哈希表中的value域数据包括指向对应二级哈希表中的用户地址数据的指针以及非用户地址数据。
优选地,针对要存入key-value数据库的key-value条目,所述利用一级哈希表和二级哈希表来在key-value数据库中存储多个key-value条目的步骤包括:对要存储的key-value条目中的初始key值进行哈希运算,得到key-value数据库中与一级哈希表对应的数据桶的地址,如果数据桶内有数据,则按照预定的冲突解决法寻找新的用于存储一级哈希表的存储地址,并将要存储的key-value条目中的value域数据分解为用户地址数据和非用户地址数据,将用户地址数据存储在key-value数据库中创建的二级哈希表中,并将指向用户地址数据的指针以及非用户地址数据存储在对应的一级哈希表中。
优选地,所述将用户地址数据存储在key-value数据库中创建的二级哈希表中的步骤包括:如果当前二级哈希表中已经存在数据,则将当前用户地址数据和二级哈希表中的地址数据进行比较,如果二者一致,将当前二级哈希表作为要存储的key-value数据对应的二级哈希表;如果二者不一致,则按照预定的冲突解决法寻找新的用于存储二级哈希表的存储地址。
优选地,所述一级哈希表和所述二级哈希表存储在内存中。
根据本发明是另一方面,还提供一种基于如前所述的数据存储方法的数据访问方法,该数据访问方法包括以下步骤:对给定的完整key值进行哈希映射,得到key-value数据库中一级哈希表对应的数据桶的地址;在对应的数据桶中存在数据的情况下,查找线性数据表中是否记录有该给定的完整key值,如果线性数据表中没有记录该给定的完整key值,则根据一级哈希表中的指针指向的地址,从二级哈希表中获得用户地址数据,将获得的用户地址数据和一级哈希表中的非用户地址数据组合成所述给定的key值对应的value值,如果线性数据表中记录有当前给定的完整key值,则从所述线性数据表中获得该完整key值对应的value值。
优选地,在对应的数据桶中不存在一级哈希表的情况下,返回访问结果为空。
根据本发明的另一方面,还提供一种存储区块链数据的数据库系统,该系统包括处理器和存储器,所述存储器包括内存和硬盘,所述存储器存储有key-value数据库和线性数据表,所述存储器还用于存储计算机指令,所述处理器用于执行所述存储器中存储的计算机指令,当所述计算机指令被处理器执行时该系统实现如前所述数据存储方法和/或数据访问方法的步骤。
根据本发明的另一方面,还提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如前所述方法的步骤。
本发明实施例的方法和系统,能够利用系统的存储空间存储更多的key-value数据(如UTXO),从而可以改善key-value数据库的访存性能。
本领域技术人员将会理解的是,能够用本发明实现的目的和优点不限于以上具体所述,并且根据以下详细说明将更清楚地理解本发明能够实现的上述和其他目的。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。在附图中:
图1为本发明一实施例中key-value数据库的数据压缩方法的示例性流程。
图2为本发明一实施例中的key域数据压缩方法图。
图3示出了本发明实施例的数据库系统中一级哈希表和二级哈希表的示意图。
图4为本发明一实施例中的线性数据表图。
图5为本发明另一实施例中数据库系统存入操作流程图。
图6为本发明一实施例中数据库系统的示意图。
图7为本发明一实施例中数据库系统访问操作流程图。
图8为本发明一实施例中数据库系统的示意性框图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施方式和附图,对本发明做进一步详细说明。在此,本发明的示意性实施方式及其说明用于解释本发明,但并不作为对本发明的限定。
在此,还需要说明的是,为了避免因不必要的细节而模糊了本发明,在附图中仅仅示出了与根据本发明的方案密切相关的结构和/或处理步骤,而省略了与本发明关系不大的其他细节。
应该强调,术语“包括/包含”在本文使用时指特征、要素、步骤或组件的存在,但并不排除一个或更多个其它特征、要素、步骤或组件的存在或附加。
在此,还需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互结合。
本发明实施例提供了一种针对区块链key-value数据库的数据压缩方法,如图1所示,本方法可以对现有key-value数据库中的key-value条目进行压缩,以使得相同的系统空间能够存储更多的key-value条目。该数据压缩方法包括以下步骤:
步骤S110,从key-value数据库中的多个已存储key-value条目的value域数据中抽取用户地址数据,基于用户地址数据统计平均用户key-value条目数量。
key-value数据库的多个已存储key-value条目可以指现有的key-value数据库中存储的传统格式的key-value条目,它们具备初始哈希表而不具备二级哈希表。下文将区块链比特币中UTXO条目作为key-value条目的示例,但本发明并不限于此,key-value条目还可以是其他类型的数据,如物联网区块链中的交易数据。
对于这些key-value条目,本步骤可从其value域的数据中抽取出用户地址数据,相同的用户地址数据合并,统计平均用户key-value条目数量,表示平均每用户的key-value条目数量。本实施例中平均用户key-value条目数量为平均用户UTXO条目数量,即UTXO条目数量/用户地址数量。
步骤S120,在平均用户key-value条目数量高于预定阈值时,在key-value数据库中创建二级哈希表来存储各key-value条目的初始哈希表中的用户地址数据,使得用户地址数据相同的key-value条目对应同一个二级哈希表。
因为value域数据压缩会带来一定内存开销,这部分开销在平均用户UTXO条目数量较低时带来的压缩效果较差,因此可以先判断平均用户UTXO条目数量是否高于某一阈值,如果高于该阈值,则执行压缩,否则,则不执行压缩。
以比特币为例,其在数据库中的UTXO条目数量约50M,用户地址数量约23M,平均用户UTXO条目数量约为2.2。可假设阈值为2,由于平均用户UTXO条目数量2.2大于阈值,则比特币的UTXO条目可以执行value域数据压缩。在此,阈值2仅为示例,在不同的区块链应用中,可以合理设置不同的阈值。
在本步骤中,将步骤S110中的用户地址数据作为key值,NULL作为value值(即value值为空),建立新的哈希表,在本发明中称之为二级哈希表,二级哈希表的构造方法和哈希函数可以和初始哈希表一致,也可以采取独立配置。对二级哈希表中的key值哈希,变可以得到二级哈希表的数据桶的位置。以比特币为例,其用户地址数据是长度为20字节的数据,相应地在新建的二级哈希表中,该20字节的用户地址数据作为key值,NULL作为value值。
由于平均用户UTXO条目数量约为2.2,即用户地址数据存在重复,因此本发明实施例中,将二级哈希表用于存储原UTXO中重复的数据,即用户地址数据。通过将重复用户地址合并,每个用户地址数据都是唯一的,然后将唯一的用户地址数据作为key域数据存储在二级哈希表中,这样做的目的是提高读写的速度,而二级哈希表中的value域数据被设为空(NULL),这样可以避免不必要的内存开销。也就是说,本发明中,用户地址数据相同的不同key-value条目可对应同一个二级哈希表,从而可以节约内存开销从而提高系统访问性能。
步骤S130,截取各key-value条目的初始哈希表中完整key域数据的部分字节生成简化key域数据。
本步骤为数据压缩操作,即截取初始key-value数据(或称key-value条目)中完整key域数据的部分字节生成简化key域数据,截取的字节顺序和字节位置可以自行设定。截取前完整key域数据具有完整key值K,截取字节后得到的简化key域数据具有简化key值K′,简化key值小于完整key值,即K′<K。
作为示例,初始key-value数据为区块链比特币应用中的UTXO条目,但本发明并不限于此,还可适于在key-value数据库中存储的其他类型的key-value数据。
通常,诸如UTXO条目之类的key-value数据的key域数据包括交易ID和输出索引,在这种情况下,本步骤可以包括:
1、将key域中的交易ID缩短为简化交易ID。该简化交易ID的操作包括:截取交易ID中的部分(m)字节作为简化交易ID,截取的字节顺序和字节位置可以自行设定。
以典型应用比特币为例,比特币中的交易ID是交易信息的哈希(HASH)值,共32字节,因此截取字节的位置和顺序可以任意选取,例如,可以简单地截取交易ID的最高位的m个字节作为简化交易ID。
2、将key域中的输出索引数据缩短为简化索引。该简化输出索引的操作包括:截取索引数据的部分(n)字节作为简化索引,截取的字节顺序和字节位置可以自行设定。
仍以比特币为例,它的输出索引为4字节,一般的索引值较小,本发明中可截取索引数据的低n位字节作为简化索引。
简化交易ID和简化输出索引组合成为新的key域数据,如图2所示。简化前的初始的key-value数据可简称为(K,V)数据,简化后的key-value数据可简称为(K′,V)数据。
如上描述的是将初始key域数据中交易ID的字节数(m0)和输出索引的字节数(n0)均进行缩短,得到简化key域数据。在本发明另选实施例中,还可以将交易ID的字节数(m0)和输出索引的字节数(n0)中的任一个进行缩短。
总之,简化key域数据中的字节数要满足m+n<m0+n0,其中m≤m0,n≤n0。
本步骤可以用于对key-value数据库中原有的key-value数据进行压缩,也可以对将要存入key-value数据库的key-value进行压缩。
步骤S140,将各key-value条目的初始哈希表的value域数据中的用户地址数据替换为指向相应二级哈希表中的用户地址数据的指针,生成简化的value域数据。
即,将初始哈希表的value域中的用户地址数据提取并替换为指针,该指针实际上指向用户地址数据在内存中的地址。初始哈希表的value域中包括用户地址数据和非用户地址数据(如交易金额、区块高度等)。在将value域中的用户地址数据替换为指针后,该指针和非用户地址数据组合成为新的value域数据,即简化的value域数据。
以比特币为例,其用户地址数据是长度为20字节的数据,其非用户地址数据为8字节,包括金额,区块高度等。本实施例中,指向用户地址数据的指针例如可以是4字节或8字节的数据。这种情况下,初始哈希表的value域数据包括20字节的用户地址数据和8字节的非用户地址数据,改动value值后的简化的value域数据可包括4或8字节的指针和8字节的非用户地址数据,节约了内存空间。
步骤S150,基于简化key域数据和简化的value域数据生成一级哈希表替换初始哈希表存储在key-value数据库中。
本步骤中,可将初始哈希表中的完整key域数据替换为简化key域数据,将完整value域数据替换为简化value域数据,更新后的初级哈希表作为一级哈希表存储在key-value数据库中。
即,在将用户地址数据替换为指针后,该指针和非用户地址数据组合成为新的value域数据,和简化key值组合成新的一级哈希表存储在key-value数据库中。
上述可见,一级哈希表存储原UTXO条目的非重复数据,包括简化key值和改动的value值,改动value值包括:指向用户地址数据的指针以及非用户地址数据。以比特币为例,包含32字节的交易ID和4字节的输出索引的完整key值被缩减为包括3字节的交易ID和1字节的输出索引的简化key值,包含20字节的用户地址数据和8字节的非用户地址数据的完整value值被简化为包含4字节的指针和8字节的非用户地址数据的简化value值,组成的一级哈希表的key域和value域数据分别仅包含4字节和12字节,与初始哈希表相比,大大节约了内存空间。
本发明实施例中一级哈希表和二级哈希表的形式如图3所示,每个key-value条目对应一个一级哈希表,一级哈希表中的key域数据为对初始哈希表中的初始key值缩减后得到的简化key值,value域数据包括指向对应二级哈希表中的用户地址数据的指针以及非用户地址数据。在一级哈希表中,具有相同用户地址数据的条目其指针将指向二级哈希表中的相同地址。每个二级哈希表中包括的用户地址数据都是唯一的,具有相同用户地址数据的key-value条目对应同一个二级哈希表。
步骤S160,利用线性数据表存储存在哈希映射地址冲突和简化key值冲突的key-value数据,所存储的key-value数据包括完整key域数据和对应的value域数据。
使用简化的key域数据虽然会降低内存占有空间,但会造成现有的冲突处理方法在特定情况下失效,该特定情况为:当不同的完整key值被哈希映射到相同的地址而同时又具有相同的简化key值,即存在哈希映射地址冲突和简化key值冲突。这是因为现有的冲突处理算法都是根据key值区分冲突,而在上述情况中,不同完整key值的简化key值一致会导致算法无法区分冲突的条目。
为此,本发明的方法中,针对存在哈希映射地址冲突和简化key值冲突的key-value数据,创建了线性数据表。具体地,将被哈希映射到相同的地址而同时又具有相同的简化key值而导致发生冲突的key-value条目存储在该线性数据表中,当系统访问和改写这些冲突的数据时将被定位到新数据表中的对应条目。本发明的线性数据表中存储的是key-value条目的完整数据而不是简化数据,如图4所示。
进一步地,本发明的方法中,可以通过合理确定简化后字节位数(m+n)来保证或提高数据库系统的访存性能。这是因为,key域数据压缩后的字节位数m和n会影响压缩后的key-value数据在数据库中的碰撞率,m和n过大使得数据压缩效果不明显,数据库性能的提高有限。而m和n过小会导致碰撞率过高从而使数据库访问缓慢,另一方面也会增加线性数据表的大小,过大的数据表同样会降低数据表的访问性能。因此,m和n可以根据需要参考碰撞次数和线性数据表的尺寸来决定。一般而言,因为线性数据表尺寸对性能的影响更大,根据线性数据表的大小来决定m和n即可。一实施例中,m和n可以基于如下公式确定:
其中,E1为哈希映射相关的平均碰撞次数,E2为线性数据表大小,2s为用于存储key-value数据的数据桶的数量,t为要存储的key-value数据的条目数量。
根据上述公式可以由m和n得到对应的碰撞次数E1和数据表尺寸E2,同理地,如果设定E1和E2的数值,利用上述公式可以确定m和n的值。以比特币为例,设定E2的大小不能多于100个条目,同时给定t=50M,s=32,同时因为原交易ID长度大于索引长度,可尽量使m比n大,则最后计算得出的满足要求的m和n值分别为m=3,n=1,此时线性数据表大小为32。合理地确定了m和n的数值或m+n的数值,可以防止线性数据表过大而大大降低数据库访存性能。
如上确定m和n的方式仅为示例,本发明并不限于此。
本发明实施例中,一级哈希表和二级哈希表优选地存储在内存中,同样存储空间的内存可以存储更多的key-value数据条目,从而可以大大提高数据的访存速度。
针对数据库中的每一key-value条目,在通过一级哈希表和二级哈希表对条目压缩后,针对后续的未压缩的key-value条目,系统可以判断其用户地址数据是否与已有的二级哈希表中的用户地址数据重复,如果是重复的,压缩过程中就无需建立新的二级哈希表,仅需将一级哈希表中的指针指向相应的二级哈希表即可。
基于如上所述的key-value数据库中的数据压缩方法,本发明相应提供了一种key-value数据库中的数据存储方法,即利用一级哈希表和二级哈希表来在key-value数据库中存储多个key-value条目,其中一级哈希表和二级哈希表的形式如前所述。该方法不限于比特币应用,还可以是其它将用到key-value数据库的新的应用。基于本发明实施例的数据存储方法,在事先已知用户地址数据重复率较高的情况下,即key-value条目数量高于预定阈值的情况下,基于该存储方法存储的key-value条目将占用更少的内存,从而使同样的内存空间可以存储更多的key-value条目,提高了数据库的访存性能。
图5示出了本发明一实施例中向key-value数据库存入key-value条目的示意性流程图。如图5所示,给定key值K和value值V,将该(K,V)数据存储到数据库系统中的存入操作流程包括:
在步骤S501,截取要存储的(K,V)数据中完整key域数据的部分字节生成简化key域数据。该步骤的具体实现同前述步骤S130,在此不再赘述。
在步骤S502,对K哈希,得到一级哈希表中对应数据桶的地址。如果桶里没有数据(步骤S503的是),说明对于K没有冲突,可在步骤S512存储简化key域数据、指针与非用户地址数据到数据桶中,在此指针的初始值可以是指向二级哈希表对应的数据桶地址的数据,二级哈希表对应的数据桶地址可以通过对其key值哈希得到。如果一级哈希表的桶里有数据(步骤S503的是),说明发生了哈希映射地址冲突,可在步骤S504将简化key值K′与对应数据桶中的key值相比较,如果对应数据桶中不存在相同的简化key值(步骤S504中的否),则根据开放地址法等传统冲突处理算法将一级哈希表定位到新的内存地址上(步骤S505),如果对应数据桶中存在相同的简化key值(步骤S504中的是),则在步骤S511将要存储的初始key-value数据存储在线性数据表中。本发明一实施例中存储有key-value数据库和线性数据表的数据库系统如图6所示。然后,在步骤S506,将带存储的(K,V)数据中value值V分解成用户地址数据和非用户地址数据,并通过指针获取到二级哈希表对应的数据桶的地址,以把用户地址数据存储在二级哈希表中。对于二级哈希表,如果对应内存地址(数据桶内)没有数据,即数据桶为空(步骤S507的是),则直接将用户地址数据作为二级哈希表的key值存储至该数据桶中(步骤S508),如果对应内存地址(对应数据桶内)已有数据,说明可能发生冲突,进一步进入步骤S509,比较用户地址数据和已有数据(桶内二级哈希表的key值),如果比较结果一致,说明没有发生冲突,并且数据桶内已有二级哈希表,此时可不进行任何操作或者存储用户地址数据至桶内,如果比较结果不一致,说明发生冲突,需要在步骤S510根据开放地址法等冲突处理算法将二级哈希表的数据写在新的内存地址上。用户地址数据在二级哈希表上存储后,将其内存地址反馈到一级哈希表,该内存地址实际上就是用户地址数据的指针,将该指针和V中的非用户地址数据组合写在一级哈希表的value域,即更新一级哈希表的value域(步骤S512)。
图7示出了本发明实施例中的基于如上所述的数据压缩方法和/或数据存储方法的数据访问操作。如图7所示,针对给定的完整key值K,想要从数据库系统中获取对应的value值,具体的数据访问操作包括:在步骤S701,对完整key值K哈希,得到一级哈希表中对应的桶的地址。如果对应桶里没有数据(步骤S702中的是),说明对于K没有条目被记录,访问操作返回空(步骤S709);在对应的数据桶中存在数据的情况下(步骤S702中的否),则查找线性数据表中是否记录有该给定的完整key值(步骤S703),如果线性数据表中没有记录该给定的完整key值(步骤S704中的否),则从一级哈希表中抽取用户地址指针(步骤S705),根据一级哈希表中的指针指向的地址,从二级哈希表中获得用户地址数据(步骤S706),将获得的用户地址数据和一级哈希表中的非用户地址数据组合成给定的key值对应的value值(步骤S707),如果线性数据表中记录有当前给定的完整key值,则从线性数据表中获得该完整key值对应的value值(步骤S708)。
通过如上所述的针对区块链key-value数据库的数据压缩方法,在key-value数据库中存储相同数量的key-value数据条目,如UTXO条目,将占用更少的存储空间,这意味着同样存储空间的内存可以存储更多的key-value数据条目,从而可以大大提高数据的访存速度。
本公开的方法不仅适于区块链中比特币交易数据,同样可以应用于适于在key-value数据库中存储的其他类型的数据,如物联网区块链中的交易数据。
与前述方法相应地,本发明还提供一种存储区块链数据的数据库系统,该系统包括处理器和存储器,所述存储器包括内存和硬盘,存储器存储有key-value数据库和线性数据表,该存储器还用于存储计算机指令,该处理器用于执行存储器中存储的计算机指令,当计算机指令被处理器执行时该系统实现如前所述各个方法步骤。本系统中,创建的一级哈希表和二级哈希表优选存储在内存中。
在本公开的一些实施例中,数据压缩系统可以包括收发单元,该收发单元可包括接收器和发送器,如图8所示,处理器、存储器、接收器和发送器可通过总线系统连接,处理器可控制收发单元收发key-value数据。
作为一种实现方式,本发明中接收器和发送器的功能可以考虑通过收发电路或者收发的专用芯片来实现,处理器可以考虑通过专用处理芯片、处理电路或通用芯片实现。
作为另一种实现方式,可以将实现处理器,接收器和发送器功能的程序代码存储在存储器中,通用处理器通过执行存储器中的代码来实现处理器,接收器和发送器的功能。
本公开还涉及存储介质,其上可以存储有计算机程序代码,当程序代码被执行时可以实现本发明的方法的各种实施例,该存储介质可以是有形存储介质,诸如光盘、U盘、软盘、硬盘等。
本领域普通技术人员应该可以明白,结合本文中所公开的实施方式描述的各示例性的组成部分、系统和方法,能够以硬件、软件或者二者的结合来实现。具体究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。当以硬件方式实现时,其可以例如是电子电路、专用集成电路(ASIC)、适当的固件、插件、功能卡等等。当以软件方式实现时,本发明的元素是被用于执行所需任务的程序或者代码段。程序或者代码段可以存储在机器可读介质中,或者通过载波中携带的数据信号在传输介质或者通信链路上传送。“机器可读介质”可以包括能够存储或传输信息的任何介质。机器可读介质的例子包括电子电路、半导体存储器设备、ROM、闪存、可擦除ROM(EROM)、软盘、CD-ROM、光盘、硬盘、光纤介质、射频(RF)链路,等等。代码段可以经由诸如因特网、内联网等的计算机网络被下载。
还需要说明的是,本发明中提及的示例性实施例,基于一系列的步骤或者装置描述一些方法或系统。但是,本发明不局限于上述步骤的顺序,也就是说,可以按照实施例中提及的顺序执行步骤,也可以不同于实施例中的顺序,或者若干步骤同时执行。
本发明中,针对一个实施方式描述和/或例示的特征,可以在一个或更多个其它实施方式中以相同方式或以类似方式使用,和/或与其他实施方式的特征相结合或代替其他实施方式的特征。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (11)
1.一种针对区块链数据库的数据压缩方法,其特征在于,该方法包括以下步骤:
从key-value数据库中的多个已存储key-value条目的value域数据中抽取用户地址数据,基于用户地址数据统计平均用户key-value条目数量;
在所述平均用户key-value条目数量高于预定阈值时,在key-value数据库中创建二级哈希表来存储各key-value条目的初始哈希表中的用户地址数据,使得用户地址数据相同的key-value条目对应同一个二级哈希表,其中,各已存储key-value条目的初始value域数据中的用户地址数据作为对应二级哈希表中的key域数据,二级哈希表中的value域数据为空;
截取各key-value条目的初始哈希表中完整key域数据的部分字节生成简化key域数据;
将各key-value条目的初始哈希表的value域数据中的用户地址数据替换为指向相应二级哈希表中的用户地址数据的指针,生成简化的value域数据;
基于简化key域数据和简化的value域数据生成一级哈希表替换初始哈希表存储在key-value数据库中;以及
利用线性数据表存储存在哈希映射地址冲突和简化key值冲突的key-value数据,所存储的key-value数据包括完整key域数据和对应的value域数据。
2.根据权利要求1所述的方法,其特征在于,所述完整key域数据包括交易ID和输出索引,所述截取各key-value条目的初始哈希表中完整key域数据的部分字节生成简化key域数据的步骤包括:
将完整key域数据中的交易ID的字节数m0和/或输出索引的字节数n0缩短,得到简化key域数据,使得简化key域数据中的字节数满足m+n<m0+n0,
其中,m和n分别为简化key域数据中交易ID的字节数m0和输出索引的字节数。
3.根据权利要求2所述的方法,其特征在于,基于如下公式确定m和n:
其中,E1为哈希映射相关的平均碰撞次数,E2为线性数据表大小,2s为用于存储key-value数据的数据桶的数量,t为要存储的key-value数据的条目数量。
4.根据权利要求2所述的方法,其特征在于:
所述key-value条目为区块链交易数据中的未花费交易数据UTXO;
所述m被设置为大于n。
5.根据权利要求1所述的方法,其特征在于:
所述key-value数据库中的数据和所述线性数据表存储在内存中;
所述存在哈希映射地址冲突和简化key值冲突的key-value数据包括具有不同的完整key值,被哈希映射到相同的地址,且对应相同的简化key值的多条key-value数据。
6.根据权利要求1所述的方法,其特征在于,针对要存入key-value数据库的key-value条目,所述方法还包括:
截取要存储的key-value条目中完整key域数据的部分字节生成简化key域数据;
对要存储的key-value条目中的初始key值进行哈希运算,得到key-value数据库中与一级哈希表对应的数据桶的地址;
在数据桶内没有数据的情况下,则将简化key域数据、指向二级哈希表中的用户地址数据的指针以及非用户地址数据存储在对应数据桶中;在数据桶内有数据的情况下,将简化key域数据的简化key值与对应数据桶中的简化key值相比较,如果对应数据桶中不存在相同的简化key值,则按照预定的冲突解决法寻找新的用于存储一级哈希表的存储地址,并在一级哈希表的存储地址存储简化key域数据、指向二级哈希表中的用户地址数据的指针以及非用户地址数据,如果对应数据桶中存在相同的简化key值,则将要存储的初始key-value数据存储在线性数据表中;
将要存储的key-value条目中的value域数据分解为用户地址数据和非用户地址数据,将用户地址数据作为二级哈希表的key域数据存储在key-value数据库中创建的二级哈希表中,并在所述二级哈希表的存储地址有更新时相应更新一级哈希表中的指针。
7.根据权利要求6所述的方法,其特征在于,所述将用户地址数据存储在key-value数据库中创建的二级哈希表中的步骤包括:
对要存储的key-value条目的二级哈希表的key值进行哈希运算,得到二级哈希表所对应的数据桶的地址,如果数据桶中已经存在数据,则将当前用户地址数据和已存在的地址数据进行比较,如果二者一致,将数据桶中当前二级哈希表作为要存储的key-value数据对应的二级哈希表;如果二者不一致,则按照预定的冲突解决法寻找新的用于存储二级哈希表的存储地址。
8.根据权利要求1所述的方法,其特征在于,所述一级哈希表和所述二级哈希表存储在内存中。
9.一种基于如权利要求1-8中任意一项所述的方法的数据访问方法,其特征在于,该数据访问方法包括以下步骤:
对给定的完整key值进行哈希映射,得到key-value数据库中一级哈希表对应的数据桶的地址;
在对应的数据桶中存在数据的情况下,查找线性数据表中是否记录有该给定的完整key值,如果线性数据表中没有记录该给定的完整key值,则根据一级哈希表中的指针指向的地址,从二级哈希表中获得用户地址数据,将获得的用户地址数据和一级哈希表中的非用户地址数据组合成所述给定的key值对应的value值,如果线性数据表中记录有当前给定的完整key值,则从所述线性数据表中获得该完整key值对应的value值。
10.一种存储区块链数据的数据库系统,该系统包括处理器和存储器,所述存储器包括内存和硬盘,其特征在于,所述存储器存储有key-value数据库和线性数据表,所述存储器还用于存储计算机指令,所述处理器用于执行所述存储器中存储的计算机指令,当所述计算机指令被处理器执行时该系统实现权利要求1-9中任意一项所述方法的步骤。
11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1至9中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811405827.5A CN109508334B (zh) | 2018-11-23 | 2018-11-23 | 针对区块链数据库的数据压缩方法、访问方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811405827.5A CN109508334B (zh) | 2018-11-23 | 2018-11-23 | 针对区块链数据库的数据压缩方法、访问方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109508334A CN109508334A (zh) | 2019-03-22 |
CN109508334B true CN109508334B (zh) | 2019-10-11 |
Family
ID=65750302
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811405827.5A Active CN109508334B (zh) | 2018-11-23 | 2018-11-23 | 针对区块链数据库的数据压缩方法、访问方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109508334B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110175758A (zh) * | 2019-05-08 | 2019-08-27 | 杭州宇链科技有限公司 | 一种基于区块链的链上多层自动分润方法 |
CN110222051B (zh) * | 2019-05-16 | 2022-09-13 | 南京理工大学 | 以太坊区块链的智能合约压缩方法 |
US11580533B2 (en) * | 2019-12-10 | 2023-02-14 | Mastercard International Incorporated | Method and system for optimization of data storage for distributed ledgers |
CN111221827B (zh) * | 2020-01-15 | 2023-05-26 | 成都量子象云计算科技有限公司 | 基于图形处理器的数据库表连接方法、装置、计算机设备和存储介质 |
CN112202936B (zh) * | 2020-09-24 | 2023-12-19 | 广东九河云计算有限公司 | 一种账户地址坐标化方法与系统 |
CN112231367B (zh) * | 2020-12-14 | 2021-03-09 | 腾讯科技(深圳)有限公司 | 基于人工智能的业务处理方法、装置及电子设备 |
CN112685422A (zh) * | 2020-12-31 | 2021-04-20 | 卓尔智联(武汉)研究院有限公司 | 一种处理utxo数据库的方法、装置及电子设备 |
CN113268544B (zh) * | 2021-05-31 | 2023-06-27 | 新华三技术有限公司 | 一种数据处理方法及装置 |
CN113821536B (zh) * | 2021-11-23 | 2022-03-18 | 腾讯科技(深圳)有限公司 | 基于区块链的数据处理方法、装置、设备及可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105512197A (zh) * | 2015-11-27 | 2016-04-20 | 广州宝钢南方贸易有限公司 | 一种文档数字化归档的装置及其归档和查询方法 |
US10114980B2 (en) * | 2016-07-21 | 2018-10-30 | Acronis International Gmbh | System and method for verifying data integrity using a blockchain network |
CN108829697A (zh) * | 2018-04-18 | 2018-11-16 | 中国地质大学(武汉) | 一种基于区块链的时间序列数据组织记录方法及系统 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103106144B (zh) * | 2011-11-15 | 2015-10-28 | 北京新媒传信科技有限公司 | 一种内存索引压缩方法和装置 |
CN110419036B (zh) * | 2016-09-30 | 2022-04-12 | 华为技术有限公司 | 数据压缩方法、设备与计算设备 |
CN107094145B (zh) * | 2017-05-02 | 2019-09-17 | 北京汇通金财信息科技有限公司 | 基于区块链的数据处理方法、服务器及系统 |
CN107292181B (zh) * | 2017-06-20 | 2020-05-19 | 无锡井通网络科技有限公司 | 基于区块链的数据库系统及使用该系统的使用方法 |
CN107728941B (zh) * | 2017-09-28 | 2019-09-24 | 中国银行股份有限公司 | 一种区块链数据压缩方法及系统 |
CN107918666B (zh) * | 2017-11-24 | 2020-05-12 | 中钞信用卡产业发展有限公司杭州区块链技术研究院 | 一种区块链上的数据同步方法和系统 |
CN108563796A (zh) * | 2018-05-04 | 2018-09-21 | 蔷薇信息技术有限公司 | 区块链的数据压缩处理方法、装置及电子设备 |
-
2018
- 2018-11-23 CN CN201811405827.5A patent/CN109508334B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105512197A (zh) * | 2015-11-27 | 2016-04-20 | 广州宝钢南方贸易有限公司 | 一种文档数字化归档的装置及其归档和查询方法 |
US10114980B2 (en) * | 2016-07-21 | 2018-10-30 | Acronis International Gmbh | System and method for verifying data integrity using a blockchain network |
CN108829697A (zh) * | 2018-04-18 | 2018-11-16 | 中国地质大学(武汉) | 一种基于区块链的时间序列数据组织记录方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109508334A (zh) | 2019-03-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109508334B (zh) | 针对区块链数据库的数据压缩方法、访问方法和系统 | |
CN109165224B (zh) | 一种在区块链数据库上针对关键字key的索引方法 | |
CN111339106B (zh) | 一种区块链数据索引的方法 | |
US11799660B2 (en) | Optimizations for verification of interactions system and method | |
CN107368259A (zh) | 一种向区块链系统中写入业务数据的方法和装置 | |
US11442920B2 (en) | Graph database system | |
CN103345472B (zh) | 基于有限二叉树布隆过滤器的去冗文件系统及其构建方法 | |
CN110321344A (zh) | 关联数据的信息查询方法、装置、计算机设备及存储介质 | |
WO2020167887A1 (en) | Hybrid blockchains and streamchains using non-crypto hashes for securing audio-, video-, image-, and speech-based transactions and contracts | |
US20210203477A1 (en) | Method and device for blockchain full sharding based on a p2p storage network and a multi-layer architecture | |
CN109583861A (zh) | key-value数据库中的数据压缩方法、访问方法和系统 | |
CN106407224B (zh) | 一种键值存储系统中文件压实的方法和装置 | |
KR102455870B1 (ko) | 암호화폐 지갑 주소의 클러스터링 기법 | |
CN108228649A (zh) | 用于数据访问的方法和设备 | |
CN108134775A (zh) | 一种数据处理方法和设备 | |
CN109194646A (zh) | 一种基于区块链的安全认证数据存取方法 | |
CN110569245A (zh) | 重复数据删除系统中基于强化学习的指纹索引预取方法 | |
CN113553380A (zh) | 面向信誉-行为关联双区块链的数据溯源系统 | |
CN109542908B (zh) | key-value数据库中的数据压缩方法、存储方法、访问方法和系统 | |
CN107766258A (zh) | 内存存储方法与装置、内存查询方法与装置 | |
CN108733584B (zh) | 用于优化数据缓存的方法和设备 | |
CN115310137B (zh) | 一种智能结算系统的保密方法及相关装置 | |
CN111465929B (zh) | 用于内容不可知文件标引的方法及系统 | |
CN103609091B (zh) | 一种数据传输的方法和装置 | |
CN110928923A (zh) | 一种基于区块链的数据存储方法及系统 |
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 |