一种更新状态默克树的方法及装置制造方法及图纸

技术编号:23099201 阅读:21 留言:0更新日期:2020-01-14 20:36
本说明书实施例提供一种更新状态默克树的方法和装置,其中状态默克树用于存储区块链网络中账户的状态。方法包括以下步骤:首先,确定状态默克树中由账户的状态变化导致需要更新的待更新节点;然后,根据待更新节点,从状态默克树中提取出第一子树和M个第二子树,第一子树包含状态默克树的根节点,每个第二子树的根节点为待更新节点,且为第一子树中最底层节点的子节点。然后,将M个第二子树分配给N个工作线程,使得N个工作线程至少部分并行地处理M个第二子树,得到更新后的各个第二子树;于是,至少基于更新后的各个第二子树的根节点的哈希值,更新第一子树,从而得到更新后的状态默克树。

A method and device for updating Merck tree

【技术实现步骤摘要】
一种更新状态默克树的方法及装置
本说明书一个或多个实施例涉及区块链
,尤其涉及更新区块链中用于记录账户状态的状态默克树的方法及装置。
技术介绍
在新一代区块链中,例如在以太坊中,新增了账户的概念,相应地,用户可以通过区块链平台创建账户。在这样的场景中,区块链平台作用为区块链网络中的节点,用户创建的账户为以太坊中的外部账户。此外,诸如以太坊的许多区块链平台支持智能合约,来执行更为丰富的交易。智能合约可以由用户创建,在创建之后也具有对应的合约账户。如此,区块链网络中的账户可以包括外部账户和合约账户。在区块链网络的各个节点中,在节点本地的数据库中以状态默克树(Merkletree)的形式维持区块链中全部账户(包括外部账户和合约账户)的状态数据。随着区块链中交易的执行,账户状态会发生变化,这就需要更新状态默克树。由于区块链网络中账户众多,交易执行频繁,因此,常常需要频繁地对状态默克树进行更新。因此,需要一种有效的方案,能够更加高效地对记录账户状态的状态默克树进行更新,以提升区块链网络的整体性能。
技术实现思路
本说明书一个或多个实施例描述了一种更新状态默克树的方法及装置,通过并行处理的方式,提高状态默克树的更新效率,提升区块链网络的整体性能。根据第一方面,提供了一种更新状态默克树的方法,所述状态默克树用于存储区块链网络中账户的状态,所述方法通过区块链网络中任意节点执行,包括:确定所述状态默克树中由所述账户的状态变化导致需要更新的待更新节点;根据所述待更新节点,从所述状态默克树中提取出一个第一子树和M个第二子树,所述第一子树包含所述状态默克树的根节点,所述M个第二子树两两之间没有交集,每个所述第二子树的根节点为待更新节点,且为所述第一子树中最底层节点的子节点;其中M为大于1的整数;将所述M个第二子树分配给N个工作线程,使得所述N个工作线程至少部分并行地处理所述M个第二子树,得到更新后的各个第二子树;其中N为大于1的整数;至少基于所述更新后的各个第二子树的根节点的哈希值,更新所述第一子树,从而得到更新后的状态默克树。根据一种实施方式,在确定状态默克树中由所述账户的状态变化导致需要更新的待更新节点之前,上述方法还包括,执行交易集合中的各条交易,确定所述各条交易涉及的账户的状态变化。进一步的,在一个实施例中,上述交易集合可以为从本地交易池中选定的多条交易构成的集合;在这样的情况下,在得到更新后的状态默克树之后,可以将所述交易集合打包到待生成的第一区块中,并将所述更新后的状态默克树的根节点的哈希值记录到所述第一区块中。在另一实施例中,上述交易集合可以为待验证区块中包含的交易构成的集合;在这样的情况下,在得到更新后的状态默克树之后,可以将所述更新后的状态默克树的根节点的哈希值与所述待验证区块中记录的状态根的值进行比较,以验证所述待验证区块。根据一种实施方式,通过以下方式确定所述状态默克树中的待更新节点:在所述状态默克树中,从状态发生变化的各个账户所对应的各个叶节点向根节点回溯,将回溯路径上经过的所有节点确定为所述待更新节点。在一个实施例中,通过以下方式提取第一子树:在所述状态默克树中,提取从根节点到预定层数的节点,作为所述第一子树。在另一实施例中,通过以下方式提取第一子树:在所述状态默克树中,从根节点开始按照宽度优先逐层遍历,如果当前层中待更新节点的数目大于或等于第一预设阈值,则提取从根节点到当前层的节点作为所述第一子树。根据一种实施方式,通过以下方式提取第二子树:获取所述第一子树的最底层节点中的待更新节点,作为第一节点集合;获取第一节点集合中各个节点的子节点中的待更新节点,作为第二节点集合;分别将第二节点集合中各节点作为起始节点,获取从各个起始节点直到叶节点的子树作为所述M个第二子树。根据另一种实施方式,通过以下方式提取第一子树和第二子树:在所述状态默克树中,从根节点开始按照宽度优先逐层遍历,如果当前层中待更新节点的数目大于或等于第二预设阈值,则提取从根节点到当前层的上一层的节点作为所述第一子树,并将当前层中各个待更新节点作为起始节点,获取从各个起始节点直到叶节点的子树作为所述M个第二子树。在一个实施例中,通过以下方式将M个第二子树分配给N个工作线程:分别对所述M个第二子树和所述N个工作线程进行编号,使得各个第二子树具有对应的第一编号,各个工作线程具有对应的第二编号;对于所述M个第二子树中任意的第二子树,确定其对应的第一编号对N取模的结果,将其分配给第二编号为该取模结果的工作线程。根据第二方面,提供了一种更新状态默克树的装置,所述状态默克树用于存储区块链网络中账户的状态,所述装置部署在区块链网络中任意节点中,包括:节点确定单元,配置为确定所述状态默克树中由所述账户的状态变化导致需要更新的待更新节点;子树提取单元,配置为根据所述待更新节点,从所述状态默克树中提取出一个第一子树和M个第二子树,所述第一子树包含所述状态默克树的根节点,所述M个第二子树两两之间没有交集,每个所述第二子树的根节点为待更新节点,且为所述第一子树中最底层节点的子节点;其中M为大于1的整数;并行处理单元,配置为将所述M个第二子树分配给N个工作线程,使得所述N个工作线程至少部分并行地处理所述M个第二子树,得到更新后的各个第二子树;其中N为大于1的整数;综合更新单元,配置为至少基于所述更新后的各个第二子树的根节点的哈希值,更新所述第一子树,从而得到更新后的状态默克树。根据第三方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面的方法。根据第四方面,提供了一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面的方法。根据本说明书实施例提供的方法和装置,在需要更新状态默克树时,将状态默克树中需要更新的部分划分为位于上层的根子树,以及根子树以下多个相互独立的脏子树;然后利用多个工作线程并行对多个脏子树进行更新处理;最后基于各个工作线程对脏子树的更新结果,更新根子树,从而更新整个状态默克树。相比于传统的从叶节点逐层向上串行进行更新处理的方式,并行处理多个脏子树再进行汇总的方式可以显著提高状态默克树的更新效率,进而提高整个区块链网络的系统性能。附图说明为了更清楚地说明本专利技术实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本专利技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。图1是在一个实施例中区块结构示意图;图2示出状态默克树的一个具体示例;图3示出根据一个实施例的更新状态默克树的方法流程图;图4示出在一个实施例中确定脏节点的示意图;图5示出根据一个实施例提本文档来自技高网...

【技术保护点】
1.一种更新状态默克树的方法,所述状态默克树用于存储区块链网络中账户的状态,所述方法通过区块链网络中任意节点执行,包括:/n确定所述状态默克树中由所述账户的状态变化导致需要更新的待更新节点;/n根据所述待更新节点,从所述状态默克树中提取出一个第一子树和M个第二子树,所述第一子树包含所述状态默克树的根节点,所述M个第二子树两两之间没有交集,每个所述第二子树的根节点为待更新节点,且为所述第一子树中最底层节点的子节点;其中M为大于1的整数;/n将所述M个第二子树分配给N个工作线程,使得所述N个工作线程至少部分并行地处理所述M个第二子树,得到更新后的各个第二子树;其中N为大于1的整数;/n至少基于所述更新后的各个第二子树的根节点的哈希值,更新所述第一子树,从而得到更新后的状态默克树。/n

【技术特征摘要】
1.一种更新状态默克树的方法,所述状态默克树用于存储区块链网络中账户的状态,所述方法通过区块链网络中任意节点执行,包括:
确定所述状态默克树中由所述账户的状态变化导致需要更新的待更新节点;
根据所述待更新节点,从所述状态默克树中提取出一个第一子树和M个第二子树,所述第一子树包含所述状态默克树的根节点,所述M个第二子树两两之间没有交集,每个所述第二子树的根节点为待更新节点,且为所述第一子树中最底层节点的子节点;其中M为大于1的整数;
将所述M个第二子树分配给N个工作线程,使得所述N个工作线程至少部分并行地处理所述M个第二子树,得到更新后的各个第二子树;其中N为大于1的整数;
至少基于所述更新后的各个第二子树的根节点的哈希值,更新所述第一子树,从而得到更新后的状态默克树。


2.根据权利要求1所述的方法,还包括,在确定所述状态默克树中由所述账户的状态变化导致需要更新的待更新节点之前,执行交易集合中的各条交易,确定所述各条交易涉及的账户的状态变化。


3.根据权利要求2所述的方法,其中,所述交易集合为从本地交易池中选定的多条交易构成的集合;
所述方法还包括,在得到更新后的状态默克树之后,将所述交易集合打包到待生成的第一区块中,并将所述更新后的状态默克树的根节点的哈希值记录到所述第一区块中。


4.根据权利要求2所述的方法,其中,所述交易集合为待验证区块中包含的交易构成的集合;
所述方法还包括,在得到更新后的状态默克树之后,将所述更新后的状态默克树的根节点的哈希值与所述待验证区块中记录的状态根的值进行比较,以验证所述待验证区块。


5.根据权利要求1所述的方法,其中,确定所述状态默克树中由所述账户状态的变化导致需要更新的待更新节点,包括:
在所述状态默克树中,从状态发生变化的各个账户所对应的各个叶节点向根节点回溯,将回溯路径上经过的所有节点确定为所述待更新节点。


6.根据权利要求1所述的方法,其中,根据所述待更新节点,从所述状态默克树中提取出一个第一子树和M个第二子树,包括:
在所述状态默克树中,提取从根节点到预定层数的节点,作为所述第一子树。


7.根据权利要求1所述的方法,其中,根据所述待更新节点,从所述状态默克树中提取出一个第一子树和M个第二子树,包括:
在所述状态默克树中,从根节点开始按照宽度优先逐层遍历,如果当前层中待更新节点的数目大于或等于第一预设阈值,则提取从根节点到当前层的节点作为所述第一子树。


8.根据权利要求6或7所述的方法,其中,根据所述待更新节点,从所述状态默克树中提取出一个第一子树和M个第二子树包括:
获取所述第一子树的最底层节点中的待更新节点,作为第一节点集合;
获取第一节点集合中各个节点的子节点中的待更新节点,作为第二节点集合;
分别将第二节点集合中各节点作为起始节点,获取从各个起始节点直到叶节点的子树作为所述M个第二子树。


9.根据权利要求1所述的方法,其中,根据所述待更新节点,从所述状态默克树中提取出一个第一子树和M个第二子树包括:
在所述状态默克树中,从根节点开始按照宽度优先逐层遍历,如果当前层中待更新节点的数目大于或等于第二预设阈值,则提取从根节点到当前层的上一层的节点作为所述第一子树,并将当前层中各个待更新节点作为起始节点,获取从各个起始节点直到叶节点的子树作为所述M个第二子树。


10.根据权利要求1所述的方法,其中,将所述M个第二子树分配给N个工作线程包括:
分别对所述M个第二子树和所述N个工作线程进行编号,使得各个第二子树具有对应的第一编号,各个工作线程具有对应的第二编号;
对于所述M个第二子树中任意的第二子树,确定其对应的第一编号对N取模的结果,将其分配给第二编号为该取模结果的工作线程。


11.一种更新状态默克树的装置,所述状态默克树用于存储区块链网络中账户的状...

【专利技术属性】
技术研发人员:陆钟豪
申请(专利权)人:阿里巴巴集团控股有限公司
类型:发明
国别省市:开曼群岛;KY

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1