发明内容
本发明实施例提供了一种区块链存储及通讯方法、系统及其相关组件,旨在解决现有技术中记账节点重新获取完整区块而增加网络通讯开销的问题。
第一方面,本发明实施例提供了一种区块链存储及通讯方法,包括:
利用区块链的出块节点将交易进行封装,得到所述交易对应的交易块;
利用出块节点对所述交易块进行区块标记,并计算具有所述区块标记的每一交易块的交易哈希以及所有交易块的默克尔根哈希,并将所述交易哈希、交易默克尔根哈希以及区块元数据封装为区块头,并将所述交易块和区块头分别广播至记账节点;所述区块元数据包括:区块高度、区块生成时间、上一个区块哈希以及当前区块交易总数;
所述记账节点验证所述交易块的交易信息与所述区块头中记录的交易信息是否一致;所述交易信息包括:数据格式、交易内容、交易签名以及交易哈希;
若所述交易块的交易信息与所述区块头中记录的交易信息一致,则将所述区块头和交易块重新组合为区块写入账本内。
第二方面,本发明实施例提供了一种区块链存储及通讯系统,其包括:
交易块获取单元,用于利用区块链的出块节点将交易进行封装,得到所述交易对应的交易块;
区块头获取单元,用于利用出块节点对所述交易块进行区块标记,并计算具有所述区块标记的每一交易块的交易哈希以及所有交易块的默克尔根哈希,并将所述交易哈希、交易默克尔根哈希以及区块元数据封装为区块头,并将所述交易块和区块头分别广播至记账节点;所述区块元数据包括:区块高度、区块生成时间、上一个区块哈希以及当前区块交易总数;
交易信息验证单元,用于所述记账节点验证所述交易块的交易信息与所述区块头中记录的交易信息是否一致;所述交易信息包括:数据格式、交易内容、交易签名以及交易哈希;
账本写入单元,用于若所述交易块的交易信息与所述区块头中记录的交易信息一致,则将所述区块头和交易块重新组合为区块写入账本内。
第三方面,本发明实施例又提供了一种计算机设备,其包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述第一方面所述的区块链存储及通讯方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其中所述计算机可读存储介质存储有计算机程序,所述计算机程序当被处理器执行时使所述处理器执行上述第一方面所述的区块链存储及通讯方法。
本发明实施例提供了一种区块链存储及通讯方法、系统及其相关组件,该方法包括:利用区块链的出块节点将交易进行封装,得到所述交易对应的交易块;利用出块节点对所述交易块进行区块标记,并计算具有所述区块标记的每一交易块的交易哈希以及所有交易块的默克尔根哈希,并将所述交易哈希、交易默克尔根哈希以及区块元数据封装为区块头,并将所述交易块和区块头分别广播至记账节点;所述区块元数据包括:区块高度、区块生成时间、上一个区块哈希以及当前区块交易总数;所述记账节点验证所述交易块的交易信息与所述区块头中记录的交易信息是否一致;所述交易信息包括:数据格式、交易内容、交易签名以及交易哈希;若所述交易块的交易信息与所述区块头中记录的交易信息一致,则将所述区块头和交易块重新组合为区块写入账本内。本发明实施例通过将交易块和区块头分发给记账节点,并在记账节点内将区块头与对应的交易块组合成一个区块写入账本,这种将区块头和交易块分发的方式,使的需要重新获取完整区块时,仅需获取缺失的交易块或区块头,减少了传输过程中的网络开销,提高了传输效率。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
应当理解,当在本说明书和所附权利要求书中使用时,术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
还应当理解,在此本发明说明书中所使用的术语仅仅是出于描述特定实施例的目的而并不意在限制本发明。如在本发明说明书和所附权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。
还应当进一步理解,在本发明说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
请参阅图1,图1为本发明实施例提供的一种区块链存储及通讯方法的流程示意图,该方法包括步骤S101~S104。
S101、利用区块链的出块节点将交易进行封装,得到所述交易对应的交易块;
S102、利用出块节点对所述交易块进行区块标记,并计算具有所述区块标记的每一交易块的交易哈希以及所有交易块的默克尔根哈希,并将所述交易哈希、交易默克尔根哈希以及区块元数据封装为区块头,并将所述交易块和区块头分别广播至记账节点;所述区块元数据包括:区块高度、区块生成时间、上一个区块哈希以及当前区块交易总数;
S103、所述记账节点验证所述交易块的交易信息与所述区块头中记录的交易信息是否一致;所述交易信息包括:数据格式、交易内容、交易签名以及交易哈希;
S104、若所述交易块的交易信息与所述区块头中记录的交易信息一致,则将所述区块头和交易块重新组合为区块写入账本内。
在本实施例中,利用出块节点封装交易,得到交易块,然后对交易块进行区块标记,并计算具有相同区块标记的所有交易块各自的交易哈希以及所有交易块的默克尔根哈希(即所有交易块总哈希),然后将交易哈希、默克尔根哈希和区块元数据一起封装为区块头,然后将交易块和区块头同步分发至记账节点内,所述记账节点验证接收到的交易块和区块头的交易信息的一致性,若一致则将所述交易块和区块头组合为区块写入账本内。
所述出块节点对交易进行封装,并标记所述交易的所属区块,以及所述交易在区块内的序列号,并对所述交易块进行签名。所述出块节点对区块元数据进行封装,封装内容包括:当前区块的上一个区块的哈希、本区块的默克尔根哈希、交易个数、交易总大小、区块生成时间以及区块高度,然后出块节点对封装好的区块头进行签名。
交易由区块链节点签名后,被保存至交易池中,然后经过一轮共识后选举得到出块节点,所述出块节点可以从所述交易池中选择相应的交易进行封装,也可以从全网中获取交易进行封装。每一个交易块内只包含一个交易,所述交易块的组成包括:交易的所属区块、交易的发生时间、交易在区块中的排序序号、交易内容、交易创建者对交易的签名信息以及出块节点签名信息。所述交易块可由所述出块节点广播至记账节点,所述记账节点接收到交易块后,在众多的交易块中选择与区块头对应的交易块进行重组,以得到区块。
所述区块头包括:前一个区块的哈希、当前区块所有交易排序后计算得出的默克尔根哈希、打包的交易个数、总交易大小、区块打包时间以及出块节点签名等信息。所述区块头可用于验证交易存在于区块内,非全量节点验证交易时,需要向全量节点索要交易的邻居哈希,并计算默克尔根哈希,将计算得到的默克尔根哈希与区块头记录的默克尔根哈希进行比较,如果一致,则认为交易存在于本区块内。
所述区块头可用于保证区块链数据的一致性和有效性。当前区块记录前一个区块的哈希,后一个区块又会包含本区块的哈希,形成链式结构,后一个链接的区块是对前一个区块有效性的承若和证明,如果认为区块非法,就不会在他后面继续形成区块。
在一实施例中,所述利用区块链的出块节点将交易进行封装,得到所述交易对应的交易块,包括:
所述出块节点获取所述交易的交易签名,并验证所述交易的交易签名和所述交易对应的发起节点的签名是否一致;
若一致,则将所述交易进行封装,得到所述交易块。
在本实施例中,所述出块节点通过验证所述交易的交易签名是否与发起节点的签名一致,从而判定所述交易是否进行封装,若一致则进行封装,若不一致则重新从交易池中获取交易。所述出块节点进行封装时,每次封装一个交易,得到一个交易块。
在一实施例中,所述记账节点验证所述交易块的交易信息与所述区块头中记录的交易信息是否一致,包括:
获取所述区块头中当前区块交易总数,并结合每一个所述交易块在所述区块头中的序号,计算当前默克尔根哈希,并将所述当前默克尔根哈希与所述记录在所述区块头中的交易默克尔根哈希进行比较。
在本实施例中,所述记账节点按照区块头中记录的当前区块交易总数以及每一个交易块在区块头内的序号,计算当前默克尔根哈希,然后将所述当前默克尔根哈希与记录在所述区块头中的交易默克尔根哈希进行比较,从而验证所述交易块中的交易信息与区块头中记录的交易信息的一致性。
在一实施例中,所述将所述交易块和区块头分别广播至记账节点,包括:
判断所述交易块和区块头是否存在报文缺失的情况,若存在,则获取报文缺失信息;
若所述报文缺失信息为区块头报文缺失信息,则向所述出块节点重新获取对应的新的区块头;
若所述报文缺失信息为交易块报文缺失信息,则向全网广播重新获取对应的新的交易块。
在本实施例中,在记账节点接收到交易块和区块头的同时,记账节点还将获得交易块和区块头的报文,并根据交易块和区块头的报文判断所述交易块和区块头是否存在报文缺失的情况,若存在则获取报文缺失信息,并判断所述报文缺失信息是区块头报文缺失信息还是交易块报文缺失信息,根据判断结果决定重新获取区块头或者交易块。获取区块头时,直接向出块节点进行获取;获取交易块时,则向全网获取,而不仅仅是向出块节点获取所需的交易块,从而达到减轻所述出块节点的工作负担的作用。
在一实施例中,所述若所述报文缺失信息为交易块报文缺失信息,则向全网广播重新获取对应的新的交易块,包括:
判断所述新的交易块的出块节点签名与所述区块头的出块节点签名是否为同一出块节点的签名;
若是同一出块节点的签名,则验证所述新的交易块的交易哈希与所述区块头中记录的交易哈希是否一致,若一致则将所述新的交易块作为缺失的交易块保存至所述区块内。
在本实施例中,在获取到新的交易块后,对所述新的交易块进行验证,判断所述新的交易块是否为所需交易块,若为所需交易块,则保存至所述新的区块内。由于获取交易块是向全网进行获取,而在全网中存在部分作恶节点,作恶节点会向所述记账节点发送虚假交易块,因此所述记账节点需要对接收到的所述新的交易块进行验证。首先是验证所述新的交易块中保存的出块节点签名与所述区块头中的出块节点签名是否一致,若一致则进一步验证所述新的交易块的交易哈希与所述区块头中记录的交易块的交易哈希是否一致。
具体的,当记账节点接收到全网发送的第一个交易块时,先验证第一个交易块的出块节点签名与所述区块头中保存的出块节点签名是否为同一出块节点,然后再进一步验证第一个交易块的交易哈希与区块头中记录的交易头的交易哈希是否一致,若以上验证均通过,则将第一个交易块作为需求交易块与所述区块头保存至新的区块内;若以上验证中存在未通过的情况,则获取下一个交易块,重新进行以上验证,直至得到两种验证均通过的交易块为止。
在一实施例中,所述判断所述新的交易块的出块节点签名与所述区块头的出块节点签名是否为同一出块节点的签名,包括:
若所述新的交易块的出块节点签名与所述区块头的出块节点签名不为同一出块节点的签名,则将所述新的交易块和所述新的交易块对应的发送节点通知至钓鱼人节点;
所述钓鱼人节点验证所述新的交易块和发送节点的区块链签名是否一致,若不一致,则对所述发送节点执行惩罚机制。
在本实施例中,当所述新的交易块的出块节点签名与所述区块头的出块节点签名不一致时,则说明所述新的交易块为不诚实的交易块,将所述新的交易块和向所述记账节点发送所述新的交易块的发送节点通知给钓鱼人节点,并由所述钓鱼人节点对所述新的交易块和发送节点进行验证,以判断是否对所述发送节点进行惩罚。
所述钓鱼人节点对所述新的交易块和发送节点进行验证,若确认所述交易块不诚实,则举证并发起对所述发送节点进行惩罚的投票,由所有的钓鱼人节点进行投票表决,当收集到进行惩罚的票数超过预设比例时,则执行惩罚。为了防止所述记账节点恶意召唤钓鱼人节点,为每个记账节点提供一定数量的令牌,每次举报将扣除记账节点的一个令牌,若被举报的交易块和发送节点被确定为不诚实交易块和不诚实发送节点,则在对所述不诚实发送节点进行惩罚后,向所述记账节点返回令牌;若所述记账节点为恶意举报,则令牌将按约定的延时策略进行返回,比如第一次恶意举报,延时100个区块后再将令牌返回,连续第二次恶意举报,延时200个区块后返回令牌,连续第三次恶意举报延时400个区块,连续第四次恶意举报延时800个,以此递增。当记账节点令牌不足时,可以继续记账,但无法进行举报操作,会减弱区块链网络不诚实节点恶意攻击被发现的概率。
在一实施例中,所述将所述区块头和交易块重新组合为区块写入账本内之后,包括:
所述记账节点记录所述区块头,得到轻量节点;
或者,所述记账节点记录所述区块头和所有交易块,得到全量节点;
或者,所述记账节点记录所述区块头和部分交易块,得到普通节点。
在本实施例中,所述记账节点可选择性存储交易块,所述记账节点可选择只记录区块头成为轻量节点,也可选择记录区块头和所有交易块成为全量节点,也可选择记录区块头和部分交易块成为普通节点。只要区块头信息和全网最新信息保持一致,并且历史区块头信息记录齐全即可。
请参阅图2,图2为本发明实施例提供的一种区块链存储及通讯系统的示意性框图,该区块链存储及通讯系统200包括:
交易块获取单元201,用于利用区块链的出块节点将交易进行封装,得到所述交易对应的交易块;
区块头获取单元202,用于利用出块节点对所述交易块进行区块标记,并计算具有所述区块标记的每一交易块的交易哈希以及所有交易块的默克尔根哈希,并将所述交易哈希、交易默克尔根哈希以及区块元数据封装为区块头,并将所述交易块和区块头分别广播至记账节点;所述区块元数据包括:区块高度、区块生成时间、上一个区块哈希以及当前区块交易总数;
交易信息验证单元203,用于所述记账节点验证所述交易块的交易信息与所述区块头中记录的交易信息是否一致;所述交易信息包括:数据格式、交易内容、交易签名以及交易哈希;
账本写入单元204,用于若所述交易块的交易信息与所述区块头中记录的交易信息一致,则将所述区块头和交易块重新组合为区块写入账本内。
在一实施例中,所述交易块获取单元201包括:
出块节点验证单元,用于所述出块节点获取所述交易的交易签名,并验证所述交易的交易签名和所述交易对应的发起节点的签名是否一致;
交易封装单元,用于若一致,则将所述交易进行封装,得到所述交易块。
在一实施例中,所述交易信息验证单元203包括:
默克尔根哈希比较单元,用于获取所述区块头中当前区块交易总数,并结合每一个所述交易块在所述区块头中的序号,计算当前默克尔根哈希,并将所述当前默克尔根哈希与所述记录在所述区块头中的交易默克尔根哈希进行比较。
在一实施例中,所述区块头获取单元202包括:
报文缺失信息获取单元,用于判断所述交易块和区块头是否存在报文缺失的情况,若存在,则获取报文缺失信息;
区块头重获单元,用于若所述报文缺失信息为区块头报文缺失信息,则向所述出块节点重新获取对应的新的区块头;
交易块重获单元,用于若所述报文缺失信息为交易块报文缺失信息,则向全网广播重新获取对应的新的交易块。
在一实施例中,交易块重获单元包括:
出块节点签名判断单元,用于判断所述新的交易块的出块节点签名与所述区块头的出块节点签名是否为同一出块节点的签名;
缺失交易块替换单元,用于若是同一出块节点的签名,则验证所述新的交易块的交易哈希与所述区块头中记录的交易哈希是否一致,若一致则将所述新的交易块作为缺失的交易块保存至所述区块内。
在一实施例中,所述出块节点签名判断单元包括:
钓鱼人节点通知单元,用于若所述新的交易块的出块节点签名与所述区块头的出块节点签名不为同一出块节点的签名,则将所述新的交易块和所述新的交易块对应的发送节点通知至钓鱼人节点;
节点惩罚单元,用于所述钓鱼人节点验证所述新的交易块和发送节点的区块链签名是否一致,若不一致,则对所述发送节点执行惩罚机制。
在一实施例中,账本写入单元204包括:
轻量节点获取单元,用于所述记账节点记录所述区块头,得到轻量节点;
全量节点获取单元,用于或者,所述记账节点记录所述区块头和所有交易块,得到全量节点;
普通节点获取单元,用于或者,所述记账节点记录所述区块头和部分交易块,得到普通节点。
本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上所述的区块链存储及通讯方法。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的区块链存储及通讯方法。
说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
还需要说明的是,在本说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的状况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。