区块链节点数据存储方法和系统、终端及区块链系统与流程

文档序号:18744273发布日期:2019-09-21 02:09阅读:445来源:国知局
区块链节点数据存储方法和系统、终端及区块链系统与流程

本发明属于互联网技术领域,具体涉及一种区块链全节点数据存储方法及系统。



背景技术:

在区块链系统中,由于网络延迟等多方面原因,无法在区块链系统中完全避免分叉的发生,而分叉链上的区块又极有可能打包了大量重复交易,当这些区块先后被持久化到磁盘时,又浪费了存储空间。图1是现有技术的区块传播示意图,如图1所示,现有技术的区块传播流程为:接收节点B(Node B)接收交易数据(txn),txn可以来自于发送节点A(Node A)或其他节点C(Node C);当发送节点A(Node A)收到区块(block)后,将区块头(block headers)转发给Node B;Node B对block headers查重,若认为block是新区块,则向Node A发出请求(get data);Node A将block发送给Node B;Node B对block进行共识验证,若通过共识验证则将block持久化存储至本地(insert block)。可以看出,Node B在持久化存储block时即持久化存储了txn,区块链发生分叉后,区块链全节点也需要持久化存储分叉链block,而分叉链block包含与主链block部分相同或全部相同的txn,从而导致txn被大量重复存储,造成存储空间浪费。

致密区块中继(Compact block relay),即比特币改进提议(BIP152),提出了一种能够减少P2P网络节点广播区块所需的带宽数量的方案,利用全节点之间已共享许多相同内存池(mempool)内容,仅发送致密区块,以减少将新区块广播至全节点所需的带宽。致密区块的技术方案核心包括:发送节点向接收节点发出致密区块“概要内容”,概要内容包含:1、对应区块的80字节区块头;2、缩短交易标识符(txids),其目的是为防止拒绝式服务攻击;3、一些发送节点预测的,但接受对等节点不具备的完整交易。接收节点将尝试使用接收到的信息,以及在其内存池(memory pool)当中保存的交易数据,来重新构建整个区块。如果接收节点仍然缺失某些交易数据,它将请求发送节点发送缺失的交易数据。图2是BIP152的致密区块传播示意图,如图2所示,致密区块传播流程为:接收节点B(Node B)接收交易数据(txn),txn可以来自于发送节点A(Node A)或其他节点C(Node C);当发送节点A(Node A)收到区块(block)后,将区块头(block headers)转发给Node B;Node B对block headers查重,若认为block是新区块,则向Node A发出致密区块获取请求(get data(compact));Node A将致密区块(compact block)发送给Node B;Node B从compact block中筛选出本地内存池中不存在的交易信息(txids),并向Node A发出请求获取这些缺失的交易数据(get missing txn);NodeA将缺失的交易数据(missing txn)发送给Node B;Node B根据致密区块和本地交易数据组装完整区块(assemble block);Node B对assemble block进行共识验证,若通过共识验证则将assemble block持久化存储至本地(insert block)。

BIP152中的致密区块使用方法,可以提升节点的带宽使用效率,但是仍未解决交易数据本地重复存储的问题,特别是区块链的分叉可能使得存储区块的全节点要打包大量重复区块,甚至在部分共识系统中会使用到分叉块,导致很多交易数据会被存储多次,造成存储空间的浪费。



技术实现要素:

针对现有技术中存在的问题,本发明利用致密区块技术,通过对全节点存储的交易数据进行去重操作,以减少全节点存储空间的浪费。

具体来说,该方法包括:交易数据获取步骤,接收第一交易数据,获取该第一交易数据的交易信息构建为第一交易信息集;致密区块获取步骤,获取发送节点发送的致密区块,从该致密区块中提取交易信息构建为第二交易信息集;交易数据补充步骤,以该第一交易信息集关于该第二交易信息集的相对补集为补充信息集,以该补充信息集对应的交易数据为补充交易数据,从该发送节点获取该补充交易数据;当前区块验证步骤,以该第二交易信息集对应的交易数据为第二交易数据,将该致密区块与该第二交易数据生成当前区块,并进行共识验证;区块数据存储步骤,若该当前区块通过共识验证,则将该致密区块和该第二交易数据分别存储至本地存储空间。

本发明所述的区块链节点数据存储方法,其中该致密区块获取步骤之前还包括:区块接收查重步骤,接收该发送节点发送的当前区块的区块头,并对该区块头进行查重以判断该当前区块是否为新区块,若是则从该发送节点获取该当前区块的致密区块的,反之则丢弃该区块头。

本发明所述的区块链节点数据存储方法,其中该区块接收查重步骤之后还包括当前区块转发步骤,当判断该当前区块为新区块后转发该区块头;该致密区块获取步骤之后还包括致密区块发送步骤,在接收到获取致密区块的请求后,向发出请求的节点发送该致密区块;该交易数据补充步骤之后还包括交易数据发送步骤,在接收到获取交易数据的请求后,向发出请求的节点发送请求的交易数据。

本发明所述的区块链节点数据存储方法,其中该交易数据获取步骤还包括:交易数据查重步骤,对该第一交易数据进行查重,若判断该第一交易数据为新交易数据,则提取该第一交易数据的交易信息,反之则丢弃该第一交易数据;交易数据转发步骤,对判断为新交易数据的第一交易数据进行转发。

本发明所述的区块链节点数据存储方法,其中该致密区块包括该当前区块的区块头,以及该当前区块包含的交易数据对应的缩短交易识别符。

本发明所述的区块链节点数据存储方法,其中该交易信息为缩短交易识别符。

本发明还提出一种区块链节点数据存储系统,包括:交易数据获取模块,用于接收第一交易数据,获取该第一交易数据的交易信息构建为第一交易信息集;致密区块获取模块,用于获取发送节点发送的致密区块,从该致密区块中提取交易信息构建为第二交易信息集;交易数据补充模块,用于以该第一交易信息集关于该第二交易信息集的相对补集为补充信息集,以该补充信息集对应的交易数据为补充交易数据,从该发送节点获取该补充交易数据;当前区块验证模块,用于以该第二交易信息集对应的交易数据为第二交易数据,将该致密区块与该第二交易数据生成当前区块,并进行共识验证;区块数据存储模块,用于当该当前区块通过共识验证时,将该致密区块和该第二交易数据分别存储至本地存储空间。

本发明所述的区块链节点数据存储系统,还包括:区块接收查重模块,用于接收该发送节点发送的当前区块的区块头,并对该区块头进行查重以判断该当前区块是否为新区块,若是则从该发送节点获取该当前区块的致密区块的,反之则丢弃该区块头;当前区块转发模块,用于当判断该当前区块为新区块后转发该区块头;致密区块发送模块,用于在接收到获取致密区块的请求后,向发出请求的节点发送该致密区块;交易数据发送模块,用于在接收到获取交易数据的请求后,向发出请求的节点发送请求的交易数据。

本发明所述的区块链节点数据存储系统,其中该交易数据获取模块还包括:交易数据查重模块,用于对该第一交易数据进行查重,若判断该第一交易数据为新交易数据,则提取该第一交易数据的交易信息,反之则丢弃该第一交易数据;交易数据转发模块,用于对判断为新交易数据的第一交易数据进行转发。

本发明所述的区块链节点数据存储系统,其中该致密区块包括该当前区块的区块头,以及该当前区块包含的交易数据对应的缩短交易识别符。

本发明所述的区块链节点数据存储系统,其中该交易信息为缩短交易识别符。

本发明还提出一种可读存储介质,存储有可执行指令,该可执行指令用于执行前述的区块链节点数据存储方法。

本发明还提出一种区块链全节点终端,包括:如权利要求13所前述的可读存储介质;处理器,用于调取并执行该可读存储介质中的可执行指令,以控制内存池接收交易数据和当前区块的致密区块,以该致密区块和该致密区块对应的交易数据生成该当前区块以进行共识验证;若该当前区块通过共识验证,则对该致密区块和该致密区块对应的交易数据分别持久化存储至存储装置;内存池,连接于该处理器、通信装置和存储装置,用于接收并临时存储该致密区块和交易数据;存储装置,连接于该处理器,用于持久化存储该致密区块和该致密区块对应的交易数据;通信装置,为该终端的对外通信接口,用于接收和转发该区块头、该致密区块和该交易数据。

本发明所述的区块链全节点终端,其中该处理器还用于对该区块头和该交易数据进行查重操作,并进行该区块头、该致密区块和该交易数据的转发操作。

本发明还提出一种区块链系统,包括:多个如前述的区块链全节点终端,该区块链全节点终端相互之间通信连接,用于生成、广播及存储区块链的交易数据。

本发明的区块链节点数据存储方法,将现有技术中需要存储的区块转化为致密区块和交易数据的松散结合,使不同分叉上的区块使用同一组交易数据,有效的避免了交易数据的重复存储,大大降低了全节点存储空间的浪费。

附图说明

图1是现有技术的区块传播示意图。

图2是BIP152的致密区块传播示意图。

图3是本发明的致密区块和交易数据传播示意图。

图4是本发明的区块链节点数据存储方法流程图。

图5是本发明的区块链节点数据存储系统结构示意图。

图6是本发明的区块链全节点终端结构示意图。

图7是本发明的区块链系统结构示意图。

图8A是现有技术区块链分叉后全节点存储示意图。

图8B是本发明的区块链分叉后全节点存储示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

区块链本质上是一个对等网络(peer-to-peer)的分布式账本数据库,区块链网络上的交易记录(交易数据),会保存在区块中。每个区块一般包括区块头(header)和区块体(body),区块头封装了当前的版本号(Version)、前一区块地址(Parent Hash)、时间戳(Timestamp)、随机数(Nonce)、当前区块的目标哈希值(Bits)、Merkle树的根植(Merkle-root)等信息,区块体中则包含交易计数和交易数据,区块体中的Merkle树将每一笔交易数据进行数字签名,区块体中的所有交易数据都通过Merkle树的散列(Hash)过程产生的唯一Merkle根值记入区块头。在工作量证明(ProofofWork,PoW)的共识机制中,区块是通过挖矿过程产生。所谓挖矿,实际上是穷举随机数算法,把上一个区块的散列值加上区块生成周期(通常为10分钟)内发生的全部交易数据打包,再加上一个随机数,算出一个256为的字符串散列值,输入的随机数Nonce使散列值满足预设条件就获得对这个区块的交易记账权。

由于会出现不同地区的两个矿工几乎同时“挖出”两个新区块加以链接的区块,此时必然会出现区块链主链“分叉”。对于分叉问题,区块链系统并不会马上确认哪个区块不合理,而是约定后续矿工总是选择累积工作量证明最大的链(长链),即挖掘后续区块的矿工将通过计算和比较,将其区块链连接到当前累计工作量证明最大化的备选链(长链)上,形成新主链,并自动抛弃分叉处的短链,从而解决分叉问题。但这就意味着,矿工需要保存所有的区块,特别是分叉后的所有链(所有长链和短链)上的区块,也导致一个交易数据,可能包含在分叉后的一长链的区块内,同时也包含在分叉后的一短链的区块内,这样就导致这个交易数据被多次保存,从而造成矿工节点(保存所有区块的全节点)存储空间的浪费。

本发明的区块链节点数据存储方法,是在致密区块技术的技术上,将本地保存的区块,转化为致密区块与交易数据的松散结合,通过对交易数据的去重,使任何交易数据在本地仅保存一次,当需要对区块进行共识验证或检索查询时,以致密区块和根据致密区块从本地存储空间内选取的交易数据组装完整的区块,或仅通过致密区块检索查询对应的交易数据。图3是本发明的致密区块和交易数据传播示意图。如图3所示,本发明的区块链节点数据存储方法与BIP152的致密区块传播方式,在获取缺失的交易数据之前都是相同的,即接收节点B(Node B)接收交易数据(txn)并存储至本地内存池,txn可以来自于发送节点A(Node A)或其他节点C(Node C);当发送节点A(Node A)收到区块(block)后,将区块头(block headers)转发给Node B;Node B对接收的block headers进行查重操作,若判断block是新区块,则向Node A发出致密区块(compact block)获取请求(get data(compact));NodeA将compact block发送给Node B;Node B从compact block中筛选出本地存储(包括本地内存池和本地存储空间)中不存在的交易信息(txids),并向NodeA发出请求获取这些缺失的交易数据(get missing txn);Node A将缺失的交易数据(missing txn)发送给Node B。与BIP152的致密区块传播方式不同之处在于,Node B接收到missing txn后,首先将missing txn保存至本地内存池,然后根据致密区块和本地交易数据组装完整区块以进行共识验证;若通过共识验证则将compact block和致密区块对应的txn分别持久化存储至本地(insert compact block)。

图4是本发明的区块链节点数据存储方法流程图。如图4所示,具体来说,本发明的区块链节点数据存储方法包括:

步骤S01,接收节点接收其他节点生成并广播或转发的交易数据(以下称之为第一交易数据),于本发明的实施例中,接收节点为全节点,存储了从创世区块以来所有的区块链数据,全节点可以独立完成数据校验或更新等操作,但对硬件成本要求较高;

步骤S02,将第一交易数据与本地已经存储的交易数据进行比对,以对第一交易数据进行查重操作,若第一交易数据为已经保存的交易数据,则丢弃该第一交易数据,若第一交易数据为新交易数据,则进行步骤S03;

步骤S03,将第一交易数据存储至本地内存池(mempool),并提取第一交易数据的交易信息构建为第一交易信息集,其中第一交易数据的交易信息为第一交易数据的缩短交易识别符;进行步骤S04以及步骤S31;

步骤S31,转发第一交易数据,使第一交易数据可以在区块链网络内扩散;

步骤S04,当发送节点发送当前区块的区块头时,接收区块头,并进行步骤S05;

步骤S05,对区块头进行查重操作;致密区块中包含有对应区块的80字节区块头信息,通过接收节点保存的致密区块中包含的区块头信息,与接收到的区块头进行比对,以确定接收到的区块头对应的当前区块是否为新区块,若当前区块为新区块,则进行步骤S06和步骤S51,若当前区块为已处理区块,则丢弃接收到的区块头,返回步骤S04,等待接收下一个区块的区块头;

步骤S51,转发区块头,使区块头可以在区块链网络内扩散;

步骤S06,向发送区块头的发送节点请求当前区块的致密区块,接收致密区块后,将致密区块存储至本地内存池,并进行步骤S07和步骤S61;

步骤S61,当有区块链节点请求致密区块时,按请求将致密区块转发至发出请求的节点;

步骤S07,读取致密区块中包含的交易信息,构建第二交易信息集,其中第二交易信息集的交易信息为致密区块对应区块中包含的交易数据的缩短交易识别符;以第一交易信息集关于第二交易信息集的相对补集,向发送节点请求本地存储缺失的交易数据(以下称之为补充交易数据),获取到补充交易数据后,将补充交易数据保存至本地内存池,并进行步骤S08和步骤S71;

步骤S71,当有区块链节点请求致密区块对应的交易数据时,按请求将本地存储(包括本地存储空间内存储和本地内存池存储)的交易数据转发至发出请求的节点;

步骤S08,以致密区块和第二交易信息集对应的交易数据(以下称之为第二交易数据)生成完整的当前区块,由于致密区块包含了对应区块的区块头信息和交易数据的缩短交易标识符,因此通过致密区块和第二交易数据即可生成与当前区块完全一致的完整区块;

步骤S09,以共识机制对完整区块进行验证,若共识验证不通过,则丢弃当前区块对应的致密区块,若共识验证通过,则进行步骤S10;

步骤S10,将当前区块对应的致密区块和第二交易数据分别保存至本地存储空间,以完成对当前区块的记账,并释放第二交易数据在本地内存池所占用的内存空间。

与区块链节点数据存储方法向对应的,本发明还提出一种区块链节点数据存储系统,图5是本发明的区块链节点数据存储系统结构示意图,如图5所示,本发明的区块链节点数据存储系统包括:交易数据获取模块、区块接收查重模块、致密区块获取模块、交易数据补充模块、当前区块验证模块和区块数据存储模块,以及当前区块转发模块、致密区块发送模块和交易数据发送模块,其中,交易数据获取模块用于接收节点(Node B)接收其他节点(如发送节点NodeA和/或其他节点Node C)生成并广播或转发的第一交易数据,对第一交易数据查重后保存至本地内存池,并提取第一交易数据的交易信息构建为第一交易信息集;交易数据获取模块中包括交易数据查重模块和交易数据转发模块,交易数据查重模块用于将第一交易数据与本地已经存储(包括本地存储空间内存储和本地内存池存储)的交易数据进行比对,以对第一交易数据进行查重操作,若第一交易数据为已经保存的交易数据,则丢弃该第一交易数据,若第一交易数据为新交易数据,则提取第一交易数据的交易信息构建为第一交易信息集,调用交易数据转发模块,并等待区块接收查重模块的响应,交易数据转发模块用于转发第一交易数据,使第一交易数据可以在区块链网络内快速扩散;区块接收查重模块用于接收发送节点(NodeA)发送当前区块的区块头,对区块头进行查重操作,以确定接收到的区块头对应的当前区块是否为新区块,若当前区块为新区块,则调用致密区块获取模块和当前区块转发区块;当前区块转发区块用于转发区块头,使区块头可以在区块链网络内快速扩散;致密区块获取模块用于向NodeA请求当前区块的致密区块,接收致密区块后,调用交易数据补充模块,并等待致密区块发送模块的响应;致密区块发送模块用于当有区块链节点请求致密区块时,按请求将致密区块转发至发出请求的节点;交易数据补充模块用于读取致密区块中包含的交易信息,构建第二交易信息集,以第一交易信息集关于第二交易信息集的相对补集,向NodeA请求补充交易数据,获取到补充交易数据后,将补充交易数据保存至本地内存池,调用当前区块验证模块,并等待交易数据发送模块的响应;交易数据发送模块用于当有区块链节点请求致密区块对应的交易数据时,按请求将本地存储(包括本地存储空间内存储和本地内存池存储)的交易数据转发至发出请求的节点;当前区块验证模块用于以致密区块和第二交易数据生成完整的当前区块,并以共识机制对完整的当前区块进行验证;区块数据存储模块用于在当前区块通过共识验证后,将致密区块和第二交易数据分别持久化存储至本地存储空间,以完成对当前区块的记账,同时释放第二交易数据在本地内存池的占用空间。

图6是本发明的区块链全节点终端结构示意图。如图6所示,本发明还提出一种区块链全节点终端,包括处理器、内存池、存储装置、通信装置和可读存储介质,其中处理器通过读取可读存储介质存储的可执行指令,以进行交易数据的生成、广播、接收、暂存、转发和存储操作,进行完整区块的生成和共识验证操作,进行致密区块的发送、接收、暂存和存储操作;内存池分别与处理器、存储装置和通信装置通信连接,用于暂存区块链全节点终端接收的交易数据和致密区块;存储装置与处理器通信连接,用于持久化存储区块链全节点终端接收的交易数据和致密区块;通信装置为区块链全节点终端的对外接口,通过通信装置从区块链网络中接收或发送交易数据和区块;可读存储介质存储有可执行指令,可执行指令被处理器执行时,实现上述区块链节点数据存储方法。本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件(例如处理器)完成,所述程序可以存储于可读存储介质中,如只读存储器、磁盘或光盘等。上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块可以采用硬件的形式实现,例如通过集成电路来实现其相应功能,也可以采用软件功能模块的形式实现,例如通过处理器执行存储于存储器中的程序/指令来实现其相应功能。本发明实施例不限制于任何特定形式的硬件和软件的结合。

图7是本发明的区块链系统结构示意图。如图7所示,本发明的区块链系统包括多个区块链全节点终端,本发明的区块链系统中,区块链全节点终端存储了从创世区块以来所有的区块链数据,进行数据校验时不需要依靠别的节点,仅依靠自身就可以独立完成数据校验或更新等操作,但缺点对硬件成本(如存储装置)要求较高;在一些实施例中,本发明的区块链系统还包括多个区块链轻量级节点终端,轻量级节点只存储部分数据,例如是致密区块,当需要交易数据时可以通过简易支付方式(Simplified Payment Verification,SPV)向邻近节点请求所需数据来完成验证更新;各区块链节点终端(包括区块链全节点终端和区块链轻量级节点终端)之间相互通信连接并互为路由,以构成区块链系统的P2P网络。

图8A是现有技术区块链分叉后全节点存储示意图,图8B是本发明的区块链分叉后全节点存储示意图。考虑一种典型的PoW共识场景,主链选择采用最长链规则,由于没有100%的区块确认规则,所以节点在收到分叉链上的区块时,也需要做持久化,以避免分叉链的算力暴增变成了主链。假设各个区块包含的交易数据如下:A:[①,②,③]、B:[④,⑤,⑥,⑦]、C:[⑧]、D:[⑨,⑩]、F:[⑧,⑨]、G:[⑩]、I:[⑩,]、如图8A所示,按照现有技术的非紧致区块方式存储,接收节点将会存储:

1.存储A~J的区块头blockheaders各一次;

2.存储交易数据①~各一次;

3.重复存储交易数据⑧和⑨一次,重复存储交易数据一次,重复存储交易数据⑩~两次。

然而,如果按照本发明提出的数据方法,如图8B所示,接收节点只需存储:

1.存储A~J的区块头block headers各一次;

2.存储交易数据①~的交易txns各一次。

相对于现有技术的数据存储方式,本发明的数据存储方式,在存储空间上节省了(2*1+1+3*2)/(13+(2*1+1+3*2))=40%,在交易量大的区块链系统中,节约的存储成本将会非常可观。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

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