一种按时间排序的存储结构与快速查询的方法与流程

文档序号:20919089发布日期:2020-05-29 13:54阅读:396来源:国知局
一种按时间排序的存储结构与快速查询的方法与流程

本发明属于计算机信息安全领域,涉及数据加密、存储及信息查询等内容和方法,使用区块链技术中merkletree存储结构建按照时间排序的数据管理列表,并在merkletree结构上进行快速数据查询,特别涉及一种基于merkletree时间排序的存储结构与快速查询的方法。



背景技术:

区块链是由多个独立节点参与的分布式数据库系统,也可以说是一种分布式记账机制。区块链技术有去中心化的特点,这可以让区块链在不拥有第三方信任机构的情况下进行点对点的信任构建的有价值的信息传播,这种传播方式有助于降低信息的交易成本,提高点对点的交互效率,因此区块链的应用场景非常之广。最早使用区块链技术的是中本聪,他在2008年提出了一种叫比特币的数字加密货币,这种货币和传统的货币不同,他不需要像中央银行一样的银行机构来发行,它的货币产生是靠“矿工们”不停地进行比特币的交易数据的挖掘而得到的奖励。这种机制可以有效地保证交易的安全的进行,并保护用户的个人隐私,一旦相关数据被记录在区块链的区块中后,信息就几乎不可能被更改。

在区块链的应用中,比特币使用了最简单的二叉树merkletree,它是上个世纪由ralphmerkle提出来的,用于生成数字证书目录的摘要(见文献:merklerc.protocolsforpublickeycryptosystems//ieeesymposiumonsecurity&privacy.dblp,1980:122-134)。二叉树在比特币中用于保存交易的哈希列表。比特币通过建立这种哈希列表,把交易数据安全地记录到merkletree树上,并且可以通过列表一层一层的去查找记录的交易。但是在数据查找交易的时候,往往需要一层一层往下找交易,而且在极端情况下需要查找所有树叶上的交易,才可以查找到自己需要查找的交易,这样会浪费大量的时间。



技术实现要素:

为解决现有技术的不足,提供一种基于merkletree时间排序的存储结构与快速查询的方法,这种方法可以按“时间”来快速查找到自己想要的交易数据活信息数据,节约查询时间,提高交易效率。

为实现上述目的,本发明采用以下技术方案:

一种按时间排序的存储结构与快速查询的方法,包括以下步骤:

步骤一,根据输入数据进行merkletree数据列表的建立

步骤1.1,收到发送过来的数据信息,对数据信息中的隐私数据进行解密,解密后通过椭圆曲线算法ecdsa对隐私数据进行验证;

步骤1.2,验证成功后,把验证者的签名写入数据验证者(verifier)信息栏,再使用随机数生成算法把随机数写入到随机数nonce;

步骤1.3,对这一条完整的数据用不可逆的单向散列算法sha256进行加密,得到这这条数据的哈希值,再把这条数据信息以[key(hashdata),value]的形式存入leveldb数据库,再按照顺序存入到交易池中;

步骤1.4,收到下一条信息数据,重复步骤1.1到步骤1.3,

步骤1.5,打包开始后之后,根据发送数据的时间的merkletree生成算法生成子节点哈希值信息,再把这条数据信息根据[key(hashdata),value]的数据新式存入leveldb数据库中;

步骤1.6,在没有结束之前一直重复第1.1步到第1.5步;在规定的打包时间结束后,使用了merkletree生成算法得到了唯一的merkletree的根的哈希值roothash,把这个哈希值记录到当前准备打包的区块的merkleroot这个属性的数据栏中,并完成区块链的区块数据输入和生成;

versionnumber:区块链区块的版本号;

timetamp:区块链区块生成的时间戳;

previousblock:存储前一块区块的hash值;

nonce:是一组随机数字,为了增加修改区块的难度;

merkleroot:存放这个区块的merkle根的hash值;

sendtransactiontime:在这个区块中交易的transmittime的最大和最小值和这个区块的交易数量;

步骤2,在merkeltree存储结构生成的区块链中快速查询数据的信息

步骤2.1,根据区块链上每一个区块上的发送交易时间区间[earliesttime,latesttime],这个区块的交易的transmittime的最小值为“earliesttime”、交易的transmittime的最大值为“latesttime”,确定查询的交易所在之区块;

步骤2.2,选择一个区块,已知这个区块中有sumt条交易,需要查询的交易发送的时间,即这条交易的transmittime为qtime,计算出选择查询编号chooseno:

chooseno=[(qtime-earliesttime)/(latesttime-earliesttime)*sumt]

步骤2.3,查询第chooseno条交易信息,如果查询的这条数据的信息是需要的这条信息,输出这条具体的信息数据,如果不是需要的信息:

情况1:

如果

chooseno_time<qtime<latesttime

chooseno_time是第chooseno条交易信息的发送数据的时间,先计算sumty=sumt-chooseno:

chooseno=[(qtime-chooseno_time)/(latesttime-chooseno_time)*sumty]+chooseno再进入步骤3;

情况2:

如果

earliesttime<qtime<chooseno_time

先计sumty=chooseno,chooseno_time是第chooseno条交易信息的发送数据的时间:

chooseno=[(qtime-earliesttime)/(chooseno_time-earliesttime)*sumty]

再回到进入步骤3;

步骤3,按照发送数据的时间的merkletree生成算法;

步骤3.1,从交易池中取出一条判断这一条需要进入merkletree的数据的发送的时间是否迟于前一条已经进入merkletree的数据的发送的时间,如果迟于之前发送的时间,进行后面的步骤;如果早于之前的时间,跳过这条信息,返回步骤1,从交易池中抽取交易并检验,直到满足条件为止;

步骤3.2,对merkletree的结构进行操作;

情况1:

如果是第一条数据,创建初始跟节点及一个叶子节点,并把交易写入这个节点中;记录最早一条交易的传入的时间信息;

之后设置子节点左边的值sonsleft的节点值即sonsleft={hash,pathvalue},pathvalue为叶子节点的路径,hash为这个这个叶子节点的hash值,更新跟节点pathvalue等待下一条信息传入;

情况2:

如果数据编号number是偶数,创建一个叶子节点并把交易写入这个节点中;

设置子节点右边的值sonright,即sonright={hash,pathvalue},更新这个节点的上层所有相关的节点,等待下一条信息传入;

情况3:

如果传入的数据编号number是奇数,先建立一个叶子节点,并把交易写入这个节点中;再根据建树原则由叶子节点向根节点创建子节点;更新这个节点的上层所有相关的节点,等待下一条信息传入;

其中建树原则如下:

如果这个数据编号number是满足

n-1<log2number<n(1)

n为不比number大的最大2n的一个整数

继续满足条件

number-2n==1(2)

原来根中root=false,再更新pathvalue,之后创建一个新的根,根中的属性为这4个值,左边的子节点sonleft,右边的子节点sonright,是否是跟节点root,存储的key的pathvalue,新的根节点的sonleft=旧的pathvalue;

接下来补充的子节点数量为n;

这个奇点后的下m个奇点补充的子节点数量为n-m;

如果出现一个奇点不满足公式1后重新计算得到达到条件的n,重启原则;

步骤3.3,当merkletree的生成要结束时,即达到一定的数量或者在一定的时间内,记录最后一条进入merkletree的交易传入时间;全部节点更新完成后,把earliesttime和latesttime值输入到区块链中;

步骤1.6中merkleroot:存放这个区块的merkle根的hash值,这个hash值也就是可以在leveldb中检索merkletree的起始key。

本发明的有益效果:

1.本发明可以让交易信息或者传输的数据按照时间序列存储到区块上面,保证数据具有时间次序,方便日后交易或者传输的数据的查找。

2.本发明通过使用时间戳的查询算法,缩短交易或者传输的数据的查询时间,提高了查询效率。

3.本发明可以把交易数据统一存储到区块链上,让交易不可能丢失和篡改。

附图说明

图1构建好完整的merkletree。

图2构建merkletree的插入示例。

图3完成构建merkletree后的区块链区块头。

图4对区块中数据查询示例。

具体实施方式

参照附图,本发明是一种在leveldb数据库中使用区块链merkletree技术在数据上树期间对数据进行列表管理和查询,其具体实施方案将结合某医院的病人医疗数据进行具体描述。

某天,病人张三去某市的第一人民医院病。张三到了医院后去某门诊看病,医生李四,给张三看好病后,医生在电脑上写好了张三的病情,开好了处方药,之后医生让张三先确认后星期正确后用手机扫码签名自己的以疗信息确。

在这里后台根据输入的病人张三的医疗数据进行merkletree数据列表的建立

介绍下待处理病人张三的数据的格式,病人数据主要分为两部分:病人的隐私数据和病人的非隐私数据。

隐私数据,输入的数据在输入之前已经加密处理,病人的隐私数据中最重要的几类类型的数据:病人的身份数据(id)(本人的身份证,姓名,手机,家庭住址等等)、病人的病例数据(detail)(当前病人的患病情况和病人的药品情况)、病人的数据签名(sign)(在病人扫码确认后获得)、病人的公钥(qublickey)(在病人扫码确认后获得)、病人数据生成时间(generatetime)(在病人扫码确认后获得)和病人发送数据的时间(transmittime)(在病人扫码确认后发送信息后获得)。

病人的非隐私数据,在输入的数据中这一部分是以明文的形式出现,其中的数据属性有:随机数(nonce)、隐私数据验证完成时刻(timestump)、数据验证者(verifier)

第一步,收到发送过来的数据信息(这边是与医院合作的提供区块链服务的公司),对数据信息中的隐私数据进行解密,解密后通过椭圆曲线算法ecdsa对隐私数据进行验证(数据在发送之前已经使用椭圆曲线算法ecdsa对隐私数据进行签名得到“病人的数据签名”)。

第二步,验证成功后,分别完成对病人非隐私数据的输入(nonce、timestump、verifier)。

第三步,对这一条完整的数据进行不可逆的单向散列算法sha256,得到这这条数据的哈希值(hashdata)。再把这条数据信息存入leveldb数据库以[key(hashdata),value]的形式,最后按照顺序存入到交易池中。

第四步,收到下一条信息数据,重复第一步到第四步,

第五步,打包开始后之后把哈,根据按照发送数据的时间的merkletree生成算法生成子节点哈希值信息,再把这条数据信息存入leveldb数据库以[key(hashdata),value]的形式。

第六步,在没有结束之前一直重复第一步到第五步。在时间结束后,由于使用了merkletree生成算法得到了唯一的merkletree的根的哈希值(roothash),然后把这个哈希值记录到当前准备打包的这个区块的merkleroot上,并完成区块链的区块的生成。

2)病人张三,在几年后想要查看自己几年前的病情情况,但是找不到病历本,病人张三可以通过区块链服务器快速查找自己的病例情况。具体操作,选择自己的看病时间(已经与病人的transmittime联立),系统会把这条消息发送到服务器当中。服务器收到病人的请求后,先通过时间确定交易在区块链中大致的位置,再根据发明内容2)中的查找算法快速搜索到这条病人信息的具体内容,最后把这条病人信息返还给病人。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1