账户模型下的分布式区块链数据存储
技术领域
本文涉及账户模型下的分布式区块链数据存储。
背景技术
分布式账本系统(DLS),还可被称为共识网络和/或区块链网络,使参与的实体能够安全地且不可篡改地存储数据。在不引用任何特定用例的情况下,DLS通常被称为区块链网络。区块链网络的类型示例可以包括公有区块链网络、私有区块链网络和联盟区块链网络。联盟区块链网络被提供用于选定的实体组群,该实体组群控制共识处理,联盟区块链网络还包括访问控制层。
基于区块链的程序可以由分布式计算平台执行。例如,分布式计算平台可以包括提供用于执行智能合约的运行时环境的虚拟机。区块链计算平台可以被视为基于交易的状态机。平台中的状态数据可以集合成一个被称为世界状态的全局共享状态。世界状态包括账户地址和账户状态之间的映射。世界状态可以存储在诸如默克尔帕特里夏树(MerklePatricia tree,MPT)的内容寻址的树结构中。
内容寻址状态树本质上是增量的。即,通过添加新的树结构而不是更新现有状态树的值来反映账户状态的变化。因此,随着新交易不断进入区块链,内容寻址状态树的大小可能会变得非常大。在某些DLS中,每个节点都存储世界状态的完整副本,这可能会占用大量存储空间。这是因为,所有区块数据和状态数据以回溯到记录在区块链的第一个交易的方式被存储,即使很少访问与历史区块相关联的某些状态数据。
而且,由于每个区块链节点负责处理整个区块链网络的交易负载,因此对于节点数量众多的区块链网络,每个区块链节点的计算和存储负担可能会非常高。大量的区块链节点也可能导致账户状态的树结构具有很高的高度,这会显著降低遍历状态树的效率。
因此,期望有效地遍历区块链的状态树以用于账户状态验证或更新。还希望容易地添加现有树结构的新状态数据。这样,可以节省区块链网络的存储和计算成本,而不会显著影响系统性能和数据完整性。
发明内容
所描述的主题的实施例可以单独地或以组合的形式包括一个或多个特征。
例如,在一个实施例中,公开了一种计算机实现的由区块链节点执行的用于存储区块链数据的方法。所述方法包括:基于与区块链网络相关联的交易来识别所述交易中涉及的区块链账户的账户标识(ID),其中,所述交易被包括在要基于执行共识算法追加到与所述区块链网络相关联的区块链上的当前区块中;在当前区块被追加到区块链之后,在当前状态对象数据库中基于区块链交易将与区块链账户的账户ID相对应的账户状态更新为更新的账户状态;对更新的账户状态进行哈希处理以生成更新的账户状态的哈希值;在当前状态数据库中基于区块链账户的账户ID识别与区块链账户相对应的账户状态的哈希值;在当前状态数据库中将账户状态的哈希值更新为更新的账户状态的哈希值。
在一些实施例中,当前状态对象数据库为区块链网络的每个区块链账户存储账户ID和相应区块链账户的账户状态之间的映射。
在一些实施例中,共识算法基于工作量证明(PoW)、权益证明(PoS)、以及实用拜占庭容错(PBFT)之一。
在一些实施例中,当前状态数据库将相应区块链账户的账户状态的哈希值存储在状态树中,并且账户ID和账户状态的相应哈希值被存储为键值对。
在一些实施例中,状态树可以是位置寻址状态树。
在一些实施例中,位置寻址状态树是固定深度默克尔树(FDMT)的当前状态树或存储桶树。
在一些实施例中,账户ID标识在状态树的相应层处的分支节点或叶节点的相对位置,以定位账户状态的哈希值。
在一些实施例中,与区块链账户相对应的账户状态的哈希值是第一哈希值,叶节点存储与多个区块链账户相关联的账户状态的多个哈希值,并且账户ID还标识在叶节点中存储的哈希值中第一哈希值的相对位置。
在一些实施例中,共识算法是在验证交易的存在、有效性和真实性中的一项或多项之后执行的。
在另一实施例中,公开了另一种计算机实现的由区块链节点执行的用于存储区块链数据的方法。所述方法包括:接收与区块链网络相关联的交易;在交易被执行之后,确定交易中涉及的区块链账户的更新的账户状态;在基于执行共识算法将当前区块追加到与区块链网络相关联的区块链之后,将更新的账户状态、更新的账户状态的哈希值、区块链账户的账户ID和当前区块的区块ID添加到历史状态对象数据库中;以及基于账户状态的哈希值、账户ID和区块ID,更新存储在历史状态数据库中的状态树。
在一些实施例中,历史状态对象数据库存储区块链网络的每个区块链账户的账户ID、区块ID、账户状态的哈希值以及账户状态与相应区块链账户的账户状态之间的映射。
在一些实施例中,共识算法基于PoW、PoS和PBFT之一。
在一些实施例中,状态树可以是内容寻址状态树。
在一些实施例中,内容寻址状态树是FDMT的历史状态树或MPT。
在一些实施例中,更新状态树包括在与当前区块相关联的状态根下添加一个或多个分支节点和叶节点,并将更新的账户状态的哈希值、账户ID存储在叶节点中。
在一些实施例中,叶节点存储与区块链网络的多个区块链账户相对应的账户状态的哈希值和账户ID。
在一些实施例中,账户ID标识存储在叶节点中的多个区块链账户的账户状态的相应哈希值的相对位置。
在一些实施例中,叶节点的地址是基于与多个区块链节点相对应的账户状态而生成的哈希值。
在一些实施例中,共识算法是在验证交易的存在、有效性和真实性中的一项或多项之后执行的。
可理解的是,根据本文的方法可以包括本文描述的方面和特征的任意结合。也就是,根据本文的方法不限于本文具体描述的方面和特征的结合,而是包括所提供的方面和特征的任意结合。
在以下附图和描述中阐述了本文的一个或多个实施例的细节。本文的其他特征和优点将从描述和附图以及权利要求而显见。
附图说明
图1描绘了可用于执行本文实施例的环境的示例。
图2描绘了根据本文实施例的架构的示例。
图3描绘了根据本文实施例的固定深度默克尔树(FDMT)数据结构的示例。
图4描绘了根据本文实施例的用于存储区块链数据的数据库的示例。
图5描绘了根据本文实施例的用于存储当前区块数据的数据库的示例。
图6描绘了可以根据本文实施例执行的处理的示例。
图7描绘了根据本文实施例的装置的模块的示例。
图8描绘了根据本文实施例的用于存储历史区块数据的数据库的示例。
图9描绘了可以根据本文实施例执行的处理的另一示例。
图10描绘了根据本文实施例的装置的模块的另一示例。
各附图中的相同附图标记和名称表示相同的元件。
具体实施方式
本文描述了用于存储区块链数据的技术。在一些区块链网络中,区块链的状态信息可以存储在位置寻址的树结构或内容寻址的树结构中。例如,位置寻址的树结构可以包括存储桶(bucket)树或固定深度默克尔树(FDMT)数据结构下的当前状态树。内容寻址的树结构可以包括默克尔帕特里夏树(MPT)、解析默克尔树(SMT)、或FDMT数据结构下的历史状态树。由于每个区块链节点负责处理整个区块链网络的交易负载,因此对于节点数量众多的区块链网络,每个区块链节点的计算和存储负担可能会非常高。大量的区块链节点还可能导致用于存储账户状态的复杂树结构。此外,内容寻址状态树本质上是增量的。即,通过添加新的树结构而不是更新现有状态树的值来反映账户状态的变化。因此,当将区块连续追加到区块链时,MPT或历史状态树的大小可能会变大。这样,随着状态树的大小增加,遍历和更新状态树中的值的效率降低。
本文描述了用于在两个单独的数据库中存储状态数据的技术。第一数据库将账户状态或智能合约存储为位置可寻址的键值对(KVP)的值。键可以是相应区块链账户的唯一标识(ID)。第二数据库存储与用于存储状态数据的传统树结构(例如,存储桶树或MPT)相似的树结构。但是,代替直接在叶节点中存储账户状态,第二数据库中的叶节点存储相应账户状态的哈希值,从而可以减少状态数据的存储消耗。
本文中描述的技术产生若干技术效果。通过将状态信息作为KVP存储在位置寻址的数据库中,可以有效地检索或更新KVP,尤其是当区块链网络包含大量账户时。此外,由于账户状态的哈希值的大小与实际账户状态的大小相比小得多,因此通过将哈希值存储在状态树的叶节点中,可以显著减少状态树的存储消耗。
在一些实施例中,状态树的叶节点可以进一步将KVP存储在存储桶中。即,代替存储与账户状态的哈希值相对应的一个KVP,可以将与多个账户状态的哈希值相对应的多个KVP存储在作为KVP存储桶的叶节点中。这样,可以减少存储哈希值所需的叶节点的数量。相应地,可以降低状态树的高度和复杂度,以允许更快地遍历和更新值。当在区块链网络中存在大量账户(例如,数亿个)时,特别适合将KVP存储在存储桶中,以提高数据处理效率。
在一些实施例中,可以使用单独的数据库来存储不经常访问的账户信息。不经常访问的账户信息可以存储在具有较低存储成本的较低级存储介质中,并且可以加载到成本较高的数据库中,以根据需要进行更新。这样,可以改善遍历和更新整体账户状态的效率,并且可以降低存储成本。
为提供本文的实施例的进一步上下文,并且如上所述,分布式账本系统(DLS),又可以被称为共识网络(例如,由点对点节点组成)和区块链网络,使参与的实体能够安全地、不可篡改地进行交易和存储数据。尽管术语区块链通常与特定网络和/或用例相关联,但是本文使用区块链来一般地指代DLS而不涉及任何特定用例。
区块链是以交易不可篡改的方式存储交易的数据结构。因此,区块链上记录的交易是可靠且可信的。区块链包括一个或多个区块。链中的每个区块通过包含在链中紧邻其之前的前一区块的加密哈希值(cryptographic hash)链接到该前一区块。每个区块还包括时间戳、自身的加密哈希值以及一个或多个交易。已经被区块链网络中的节点验证的交易经哈希处理并编入默克尔(Merkle)树中。默克尔树是一种数据结构,在该树的叶节点处的数据是经哈希处理的,并且在该树的每个分支中的所有哈希值在该分支的根处连接。此过程沿着树持续一直到整个树的根,在整个树的根处存储了代表树中所有数据的哈希值。声称存储在树中的交易的哈希值可以通过确定哈希值是否与树的结构一致而被快速验证。
区块链是用于存储交易的去中心化或至少部分去中心化的数据结构,而区块链网络是通过广播、验证和确认交易等来管理、更新和维护一个或多个区块链的计算节点的网络。如上所述,区块链网络可作为公有区块链网络、私有区块链网络或联盟区块链网络被提供。在本文中,本文的实施例参考联盟区块链网络进一步详细描述。然而,可预期的是,本文的实施例可以在任何适当类型的区块链网络中实现。
一般而言,联盟区块链网络是参与实体之间私有的。在联盟区块链网络中,共识处理由授权的节点集控制,所述节点可以称为共识节点,一个或多个共识节点由各自的实体(例如,金融机构、保险公司)操作。例如,十(10)个实体(例如,金融机构、保险公司)的联盟可以运行一个联盟区块链网络,每个实体操作联盟区块链网络中的至少一个节点。
在一些示例中,在联盟区块链网络内,提供作为跨所有节点复制的区块链的全局区块链。也就是说,所有共识节点关于全局区块链都处于完美的状态共识。为了达成共识(例如,同意向区块链添加区块),在联盟区块链网络内实施共识协议。例如,联盟区块链网络可以实现实用拜占庭容错(PBFT)共识,下面将进一步详细描述。
图1是示出了可用于执行本文实施例的环境100的示例的示图。在一些示例中,环境100使实体能够参与联盟区块链网络102。环境100包括计算系统106、108和网络110。在一些示例中,网络110包括局域网(LAN)、广域网(WAN)、因特网或其组合,并且连接网站、用户设备(例如,计算设备)和后端系统。在一些示例中,可以通过有线和/或无线通信链路访问网络110。在一些示例中,网络110使得与联盟区块链网络102通信以及在联盟区块链网络102内部通信成为可能。通常,网络110表示一个或多个通信网络。在一些情况下,计算系统106、108可以是云计算系统(未示出)的节点,或者每个计算系统106、108可以是包括通过网络互连的多个计算机并且充当分布式处理系统的单独的云计算系统。
在所描绘的示例中,计算系统106、108可以各自包括能够作为节点参与至联盟区块链网络102中的任何适当的计算设备。计算设备的示例包括但不限于服务器、台式计算机、笔记本电脑、平板电脑和智能手机。在一些示例中,计算系统106、108承载一个或多个由计算机实施的服务,用于与联盟区块链网络102进行交互。例如,计算系统106可以承载第一实体(例如,用户A)的由计算机实施的、例如交易管理系统的服务,第一实体使用该交易管理系统管理其与一个或多个其他实体(例如,其他用户)的交易。计算系统108可以承载第二实体(例如,用户B)的由计算机实施的、例如交易管理系统的服务,第二实体使用该交易管理系统管理其与一个或多个其他实体(例如,其他用户)的交易。在图1的示例中,联盟区块链网络102被表示为节点的点对点网络(Peer-to-Peer network),并且计算系统106、108分别提供参与联盟区块链网络102的第一实体和第二实体的节点。
图2描绘了根据本文的实施例的架构200的示例。示例性概念架构200包括分别对应于参与者A、参与者B和参与者C的参与者系统202、204、206。每个参与者(例如,用户、企业)参与到作为点对点网络提供的区块链网络212中,该点对点网络包括多个节点214,至少一些节点将信息不可篡改地记录在区块链216中。如图中进一步详述,尽管在区块链网络212中示意性地描述了单个区块链216,但是在区块链网络212上提供并维护了区块链216的多个副本。
在所描绘的示例中,每个参与者系统202、204、206分别由参与者A、参与者B和参与者C提供或代表参与者A、参与者B和参与者C,并且在区块链网络中作为各自的节点214发挥作用。如这里所使用的,节点通常是指连接到区块链网络212且使相应的参与者能够参与到区块链网络中的个体系统(例如,计算机、服务器)。在图2的示例中,参与者对应于每个节点214。然而,可以预期,一个参与者可以操作区块链网络212内的多个节点214,和/或多个参与者可以共享一个节点214。在一些示例中,参与者系统202、204、206使用协议(例如,超文本传输协议安全(HTTPS))和/或使用远程过程调用(RPC)与区块链网络212通信或通过区块链网络212进行通信。
节点214可以在区块链网络212内具有不同的参与程度。例如,一些节点214可以参与共识处理(例如,作为将区块添加到区块链216的矿工节点),而其它节点214不参与此共识处理。作为另一示例,一些节点214存储区块链216的完整的副本,而其他节点214仅存储区块链216的一部分的副本。例如,数据访问特权可以限制相应的参与者在其相应系统内存储的区块链数据。在图2的示例中,参与者系统202、204和206存储区块链216的相应的完整副本216'、216”和216”'。
区块链(例如,图2的区块链216)由一系列区块组成,每个区块存储数据。数据的示例包括代表两个或更多个参与者之间的交易的交易数据。尽管本文通过非限制性示例使用了“交易”,但是可以预期,任何适当的数据可以存储在区块链中(例如,文档、图像、视频、音频)。交易的示例可以包括但不限于有价物(例如,资产、产品、服务、货币)的交换。交易数据不可篡改地存储在区块链中。也就是说,交易数据不能改变。
在将交易数据存储在区块中之前,对交易数据进行哈希处理。哈希处理是将交易数据(作为字符串数据提供)转换为固定长度哈希值(也作为字符串数据提供)的过程。不可能对哈希值进行去哈希处理(un-hash)以获取交易数据。哈希处理可确保即使交易数据轻微改变也会导致完全不同的哈希值。此外,如上所述,哈希值具有固定长度。也就是说,无论交易数据的大小如何,哈希值的长度都是固定的。哈希处理包括通过哈希函数处理交易数据以生成哈希值。示例性哈希函数包括但不限于输出256位哈希值的安全哈希算法(SHA)-256。
多个交易的交易数据被哈希处理并存储在区块中。例如,提供两个交易的哈希值,并对它们本身进行哈希处理以提供另一个哈希值。重复此过程,直到针对所有要存储在区块中的交易提供单个哈希值为止。该哈希值被称为Merkle根哈希值,并存储在区块的头中。任何交易中的更改都会导致其哈希值发生变化,并最终导致Merkle根哈希值发生变化。
通过共识协议将区块添加到区块链。区块链网络中的多个节点参与到共识协议中并执行工作以将区块添加到区块链。这种节点被称为共识节点。如上介绍的,PBFT用作共识协议的非限制性示例。共识节点执行共识协议以向区块链添加交易并更新区块链网络的整体状态。
进一步详细地,共识节点生成区块头,对区块中的所有交易进行哈希处理,并将所得的哈希值成对地组合以生成进一步的哈希值,直到为区块中的所有交易提供单个哈希值(Merkle根哈希值)为止。将此哈希值添加到区块头中。共识节点还确定区块链中最新区块(即,添加到区块链的最后区块)的哈希值。共识节点还向区块头添加随机值(nonce value)和时间戳。
通常,PBFT提供容忍拜占庭故障(例如,故障节点、恶意节点)的实用拜占庭状态机复制。这在PBFT中是通过假设故障会发生来实现的(例如,假设存在独立节点故障,和/或由共识节点发送的操纵消息)。在PBFT中,共识节点按照包括主共识节点和备共识节点的顺序来提供。主共识节点周期性更改。区块链网络内的所有共识节点将交易添加到区块链,就区块链网络的世界状态达成一致。在此处理中,消息在共识节点之间传输,并且每个共识节点证明从指定的对等节点接收消息,并验证在传输期间消息未被修改。
在PBFT中,共识协议是在所有共识节点以同一状态开始的情况下分多个阶段提供的。首先,客户端向主共识节点发送请求以调用服务操作(例如,在区块链网络内执行交易)。响应于接收所述请求,主共识节点将所述请求多播到备共识节点。备共识节点执行该请求,并且各自向客户端发送回复。客户端等待,直到接收到阈值数量的回复。在一些示例中,客户端等待接收f+1回复,其中f是区块链网络内可以容忍的故障共识节点的最大数量。最终结果是,足够数量的共识节点就要被添加到区块链的记录的顺序达成一致,以及该记录被接受或被拒绝。
图3描绘了根据本文的实施例的FDMT数据结构300的示例。在FDMT下,账户状态可以作为键值对(KVP)存储在历史状态树302和当前状态树304的结构中。KVP中的键与唯一标识区块链账户值的地址相对应。历史状态树302可以包括区块链的可用状态信息的完整副本。当前状态树304可以包括当前区块的状态信息。当新区块被创建时,利用与新区块相关联的状态信息来更新当前状态树304。因此,当前状态树304的大小可以明显小于历史状态树302的大小。
在一些实施例中,当前状态树304可以是位置寻址状态树。对于位置寻址状态树,可以基于唯一地标识当前状态树304的相应节点的键(例如,节点ID)来检索当前状态树304的节点值。当新节点被添加到当前状态树304时,可以将节点值与其唯一节点ID(例如,当前状态树304的ID 1-1、ID 2-1等)相关联而不考虑其内容。当前状态树304的节点的KVP可以表示为<node ID,node value>。
在一些情况下,键还可以包括与节点值相关联的相应区块ID。在这种情况下,节点ID可以用作键的前缀,而区块ID可以用作键的后缀。然后可以将当前状态树304的KVP表示为<node ID+block ID,node value>。
历史状态树302可以是内容寻址状态树。对于内容寻址状态树,每个账户值都可以具有一个内容地址,该内容地址与账户值自身唯一地关联。例如,可以通过对节点的值进行哈希处理来生成节点的键。为了从历史状态树302中检索信息,可以提供内容标识,从内容标识中可以确定并检索账户值的位置。类似于默克尔帕特里夏树(MPT),历史状态树302的每个节点可以包括指向树的下一个节点的指针的哈希值(例如,历史状态树302下的Hash1、Hash2和Hash3)。沿着指针的路径,叶节点具有与哈希值的末端部分相对应的键(例如,历史状态树302下的Hash4,Hash5,Hash6和Hash7)以及与该键配对的值。历史状态树302的KVP可以表示为<hash(node value),node value>。
由于节点键取决于内容寻址树的节点值,因此可以将新状态信息作为附加树结构添加到历史状态树302中而不是对现有树进行更改,从而保留现有树结构并提高数据存储/检索效率。
图4描绘了根据本文实施例的存储与区块链的合约账户相关联的状态信息的示例400。数据库可以是例如键值数据库,例如LevelDB或RocksDB。数据库可以在FDMT数据结构下存储数据,该FDMT数据结构包括用于存储历史状态树的历史数据库410和用于存储当前状态树的当前数据库412。在图4中描绘的四个区块中,区块i-2 402、区块i-1 404和区块i406是先前追加到区块链的历史区块,而区块i+1 408是当前区块。每个区块可以具有区块头和区块体。区块头可以包括诸如世界状态下的合约账户的存储根(storageRoot)的信息。存储根可以用作合约账户状态树的安全且唯一的标识。换句话说,存储根可以加密地取决于账户状态。区块体可以包括区块的相应账户的已确认交易。
如所描述的,历史数据库410可以存储历史状态树,而当前数据库412可以存储当前状态树。历史状态树和当前状态树可以分别存储历史账户状态和当前账户状态。账户状态可以包括有关区块链账户的信息(例如,账户发送的交易数量)。每个账户可以具有一个账户状态。例如,以太坊区块链账户可以包括外部拥有的账户和合约账户。外部拥有的账户可以由私钥控制,并且不与任何用于执行智能合约的代码关联。合约账户可以通过其合约代码进行控制,该代码可用于执行智能合约。
以太坊账户的状态可以包括四个组分:随机数、余额、代码哈希值和存储根。如果账户是外部拥有的账户,则随机数可以表示从账户地址发送的交易的数量。余额可以表示所述账户拥有的数字资产。代码哈希值可以是空字符串的哈希值。存储根可以为空。如果账户是合约账户,则随机数可以表示账户创建的合约的数量。余额可以表示所述账户拥有的数字资产。代码哈希值可以是与账户相关联的虚拟机代码的哈希值。存储根可以存储与存储树或合约状态树相关联的根哈希。合约状态树可以存储合约数据。合约状态树也可以具有包括当前状态树和历史状态树的FDMT结构。
历史状态树可以包括始于创世区块的区块链账户状态的完整副本,并且可以根据交易的执行进行更新。例如,存储在先前区块i-1 404中的根哈希值是在区块i-1 404完成时世界状态的根哈希值。世界状态与存储在区块i-1 404以及在区块i-1 404之前的区块中的所有交易相关联。类似地,存储在当前区块i+1 408中的根哈希值是与存储在区块i+1408和区块i+1 408之前的区块中的所有交易关联的世界状态的根哈希值。
当前状态树可以包括由于交易被新添加到当前区块i+1 408而被更新或添加的状态信息。如在图3的描述中所讨论的,历史状态树可以将状态信息存储为表示为<hash(nodevalue),node value>的KVP,使得节点值可以是内容可寻址的。在一些实施例中,可以基于一个或多个与位置相关的ID来对当前状态树进行位置寻址。例如,当前状态树可以将状态信息存储为表示为<node ID,node value>的KVP,其中节点值可以基于其相应节点ID来寻址。作为另一示例,KVP中的键可以是节点ID和与节点值的对应的区块ID的组合。节点ID可以用作键的前缀,而区块ID可以用作键的后缀,以用于遍历FDMT或MPT的值。
图5描绘了根据本文实施例的用于存储当前区块数据的数据库的示例。在高层级,区块链502的当前状态数据存储在当前状态对象数据库504和当前状态数据库506中。例如,当前状态对象数据库504或当前状态数据库506可以是RocksDB或LevelDB。如前所述,当前状态是与要存储在区块链502的当前区块中的交易相关联的账户状态。当前状态对象数据库504是存储KVP的键值数据库。KVP的值是与区块链502相关联的账户的账户状态(或状态对象)。键是对应于值的唯一ID。
当前状态数据库506存储可用于遍历当前状态数据的状态树。在一些示例中,存储在当前状态数据库506中的状态树可以是FDMT的当前状态树。在一些示例中,状态树可以是存储桶树。当前状态数据库506中的状态树的节点存储同样是位置寻址的KVP。KVP的键是状态树的节点ID。存储在叶节点中的值是相应账户状态的哈希值。与在叶节点中存储实际账户状态的传统状态树相比,存储账户状态的哈希值可以减少状态树消耗的存储空间。
在一些实施例中,叶节点可以进一步将KVP存储在存储桶中。即,代替存储与账户状态的哈希值相对应的一个KVP,可以将与多个账户状态的哈希值相对应的多个KVP存储在作为KVP存储桶的叶节点中。这样,可以减少存储哈希值所需的叶节点的数量。相应地,可以降低状态树的高度和复杂度,以允许更快地遍历和更新值。当在区块链网络中存在大量账户(例如,数亿个)时,特别适合将KVP存储在存储桶中,以提高数据处理效率。
在一些实施例中,可以在账户模型(或余额模型)下保存账户状态。在账户模型中,跟踪每个用户的账户余额作为全局状态。代替在未花费交易输出(UTXO)模型下记录交易,在账户模型下通过共识执行交易后记录更新的账户状态。在共识节点执行共识算法以将交易记录在区块中之前,可以执行预验证处理。执行预验证处理以筛选攻击者可能用来刷新区块链网络的恶意交易。例如,对于每个交易,在预验证处理期间检查花费的账户的余额以确保余额大于或等于交易金额。预验证处理还可以包括诸如验证交易、验证数字签名以及验证账户存在等操作。
在通过预验证确认了交易之后,共识节点可以执行共识算法以将相应的区块添加到区块链502。达成共识后,执行交易并相应地更新交易中涉及的账户的相应账户状态。
更新账户状态可以包括更新当前状态对象数据库504和当前状态数据库506。如前所述,每个状态对象(值)对应一个唯一的ID(键)。换句话说,状态对象与其唯一ID之间存在一对一的映射关系。当前状态对象数据库504存储映射关系。为了更新状态对象,区块链节点可以基于唯一ID直接定位交易中涉及的账户,并根据映射关系更新状态对象。
在一些实施例中,可以使用单独的数据库来存储附加账户信息。附加账户信息可以包括那些不经常访问的、过时的账户数据或与无效账户相关联的数据。可以将附加账户信息加载到当前状态对象数据库504,以根据需要进行更新。在一些实施例中,与当前状态对象数据库504或当前状态数据库506相比,用于存储附加账户信息的数据库还可以具有较低的存储成本。这样,可以减少当前状态对象数据库504和当前状态数据库506的存储负担,可以提高遍历和更新整体账户状态的效率,并且可以降低存储成本。
更新的状态对象的哈希值可用于更新当前状态数据库506。当前状态数据库506存储状态对象的树结构和哈希值。例如,假设状态对象2与最新区块中包括的交易相关联。可以将与状态对象2相对应的ID2表示为“0x122”。ID2的表达式提供了用于导航经过存储在当前状态数据库506中的状态树以定位与ID2相关联的KVP的地址。“0x”表示ID以十六进制格式构造。为了更新与ID2相关联的KVP,导航可以从当前状态数据库506中的当前状态树的一个且唯一的根节点开始。“0x”之后的第一位数“1”表示定位KVP的下一个节点是树的第二层中两个节点中的第一个(即节点2-1)。第二位数“2”表示定位KVP的下一个节点是两个叶节点中的第二个(即节点3-2)。在此示例中,节点3-2存储具有六个KVP的存储桶。第三位数“2”表示待更新的KVP是存储桶中的第二个KVP。在识别KVP之后,旧状态对象2的现有哈希值可以在交易执行之后被基于新状态对象2计算的哈希值替换。这样,新状态对象2在当前状态对象数据库504和当前状态数据库506中都被更新。
图6描绘了可以根据本文实施例执行的处理600的示例。为了方便,处理600将被描述为由位于一个或多个位置处并根据本文被适当地编程的一个或多个计算机的系统执行。例如,计算系统(例如,图1的计算系统106、108)中被适当编程的计算设备可以是执行处理600区块链节点。
在602,区块链节点基于与区块链网络相关联的交易来识别交易中涉及的区块链账户的账户ID,其中该交易被包括在要基于执行共识算法追加到与区块链网络相关联的区块链上的当前区块中。在一些实施例中,共识算法基于PoW、PoS和PBFT之一。在一些实施例中,共识算法是在验证交易的存在、有效性和真实性中的一项或多项之后执行的。
在604,在当前区块被追加到区块链之后,区块链节点在当前状态对象数据库中基于区块链交易将与区块链账户的账户ID相对应的账户状态更新为更新的账户状态。在一些实施例中,当前状态对象数据库为区块链网络的每个区块链账户存储账户ID和相应区块链账户的账户状态之间的映射。
在一些实施例中,当前状态数据库将相应区块链账户的账户状态的哈希值存储在状态树中,并且账户ID和账户状态的相应哈希值被存储为键值对。在一些实施例中,状态树可以是位置寻址状态树。在一些实施例中,位置寻址状态树是FDMT的当前状态树或存储桶树。
在606,区块链节点对更新的账户状态进行哈希处理以生成更新的账户状态的哈希值。
在608,区块链节点在当前状态数据库中基于区块链账户的账户ID识别与区块链账户相对应的账户状态的哈希值。在一些实施例中,账户ID标识在状态树的相应层处的分支节点或叶节点的相对位置,以定位账户状态的哈希值。
在610,区块链节点在当前状态数据库中将账户状态的哈希值更新为更新的账户状态的哈希值。在一些实施例中,与区块链账户相对应的账户状态的哈希值是第一哈希值,叶节点存储与多个区块链账户相关联的账户状态的多个哈希值,并且账户ID还标识在叶节点中存储的哈希值中第一哈希值的相对位置。
图7描绘了根据本文实施例的装置700的模块的示例。装置700可以是被配置为存储区块链数据的区块链节点的实施例的示例。装置700可以对应于上述实施例,装置700包括:识别模块702,用于识别交易中涉及的区块链账户的账户ID,其中该交易被包括在要基于执行共识算法追加到与区块链网络相关联的区块链上的当前区块中;更新模块704,用于在当前区块被追加到区块链之后,在当前状态对象数据库中基于区块链交易将与区块链账户的账户ID相对应的账户状态更新为更新的账户状态;哈希模块706,用于对更新的账户状态进行哈希处理以生成更新的账户状态的哈希值;识别模块702,用于在当前状态数据库中基于区块链账户的账户ID识别与区块链账户相对应的账户状态的哈希值;以及更新模块704,在当前状态数据库中将账户状态的哈希值更新为更新的账户状态的哈希值。
在一些实施例中,当前状态对象数据库为区块链网络的每个区块链账户存储账户ID和相应区块链账户的账户状态之间的映射。在一些实施例中,共识算法基于PoW、PoS和PBFT之一。
在一些实施例中,当前状态数据库将相应区块链账户的账户状态的哈希值存储在状态树中,并且账户ID和账户状态的相应哈希值被存储为键值对。
在一些实施例中,状态树可以是位置寻址状态树。在一些实施例中,位置寻址状态树是FDMT的当前状态树或存储桶树。在一些实施例中,账户ID标识在状态树的相应层处的分支节点或叶节点的相对位置,以定位账户状态的哈希值。
在一些实施例中,与区块链账户相对应的账户状态的哈希值是第一哈希值,叶节点存储与多个区块链账户相关联的账户状态的多个哈希值,并且账户ID还标识在叶节点中存储的哈希值中第一哈希值的相对位置。在一些实施例中,共识算法是在验证交易的存在、有效性和真实性中的一项或多项之后执行的。
图8描绘了根据本文实施例的用于存储历史区块数据的数据库的示例。在高层级,区块链802的历史状态数据存储在历史状态对象数据库804和历史状态数据库806中。例如,历史状态对象数据库804或历史状态数据库806可以是RocksDB或LevelDB。如前所述,历史数据可以存储在诸如FDMT的历史状态树或MPT的数据结构中。历史状态数据包括对应于区块链中自从创世区块以来的每个区块的状态数据。例如,如果账户是基于区块50中包括的交易来更新的,则可以通过遍历与区块50相对应的根节点直到存储该账户状态的叶节点来验证或更新账户状态。
历史状态对象数据库804是存储KVP的键值数据库。KVP的值是与区块链802相关联的历史账户状态(或历史状态对象)。键是相应的历史账户状态的哈希值。
历史状态数据库806存储与区块链的每个区块相对应的状态数据的树结构。历史状态数据库806中的状态树存储内容可寻址的KVP。用于分支节点的KVP是值,其哈希值类似于MPT。
叶节点的值可以是存储在存储桶中的KVP,如图5的描述中所述。即,与被存储为KVP存储桶的多个账户状态相对应的多个KVP。可以基于KVP存储桶来生成叶节点的键。例如,键可以是KVP存储桶中KVP的所有值的组合的哈希值。对于存储在KVP存储桶中的KVP,这些值是相应账户状态的哈希值。键是与相应账户相关联的账户ID。
与当前状态数据类似,历史状态数据可以在账户模型下保存。在对区块达成共识之前,区块链节点可以执行预验证处理。
在对区块达成共识后,将更新的账户状态添加到历史状态对象数据库804和历史状态数据库806中。对于历史状态对象数据库804,可以将更新的账户状态及其相应哈希值直接添加为KVP。例如,如果在最新区块中包括的交易中更新了状态对象2,则可以将状态对象2的哈希值和状态对象2添加为KVP,其可以表示为<StateObject2hash,StateObject2>。
相应的更新的状态对象的哈希值可用于更新历史状态数据库806。例如,假设状态对象1至状态对象6与包括在追加到区块链802的最新区块中的交易相关联,则可以将由它们的相应账户ID和更新的状态对象的哈希值形成的KVP添加到新的KVP存储桶中。可以生成新的KVP存储桶的哈希值,以用作与最新区块相对应的根节点808之下的叶节点的键。例如,可以通过对StateObject1Hash、StateObject2Hash、StateObject3Hash、StateObject4Hash、StateObject5Hash和StateObject6Hash的组合进行哈希处理来生成叶节点的键。因为历史状态数据库806中的状态树是内容寻址的,所以可以基于类似于MPT的内容可寻址的性质来添加根节点808下的树结构。
图9描绘了可以根据本文实施例执行的处理900的另一示例。为方便起见,处理900将被描述为由位于一个或多个位置并根据本文适当编程的一台或多台计算机的系统执行。例如,计算系统(例如,图1的计算系统106、108)中适当编程的计算设备,可以是执行处理900的区块链节点。
在902,区块链节点接收与区块链网络相关联的交易。在904,在交易被执行之后,区块链节点确定交易中涉及的区块链账户的更新的账户状态。
在906,在基于执行共识算法将当前区块追加到与区块链网络相关联的区块链之后,区块链节点将更新的账户状态、更新的账户状态的哈希值、区块链账户的账户ID和当前区块的区块ID添加到历史状态对象数据库中。在一些实施例中,共识算法基于PoW、PoS和PBFT之一。在一些实施例中,共识算法是在验证交易的存在、有效性和真实性中的一项或多项之后执行的。
在908,区块链节点基于账户状态的哈希值、账户ID和区块ID来更新存储在历史状态数据库中的状态树。在一些实施例中,状态树可以是内容寻址状态树。在一些实施例中,历史状态对象数据库存储区块链网络的每个区块链账户的账户ID、区块ID、账户状态的哈希值以及账户状态与相应区块链账户的账户状态之间的映射。在一些实施例中,内容寻址状态树是FDMT的历史状态树或MPT。在一些实施例中,更新状态树包括在与当前区块相关联的状态根下添加一个或多个分支节点和叶节点,并将更新的账户状态的哈希值、账户ID存储在叶节点中。在一些实施例中,叶节点存储与区块链网络的多个区块链账户相对应的账户状态的哈希值和账户ID。在一些实施例中,账户ID标识存储在叶节点中的多个区块链账户的账户状态的相应哈希值的相对位置。在一些实施例中,叶节点的地址是基于与多个区块链节点相对应的账户状态而生成的哈希值。
图10描绘了根据本文实施例的另一装置1000的模块的示例。装置1000可以是被配置为存储区块链数据的区块链节点的实施例的示例。装置1000可以对应于上述实施例,装置1000包括以下:接收模块1002,用于接收与区块链网络相关联的交易;确定模块1004,用于在交易被执行之后,确定交易中涉及的区块链账户的更新的账户状态;添加模块1006,用于在基于执行共识算法将当前区块追加到与区块链网络相关联的区块链之后,将更新的账户状态、更新的账户状态的哈希值、区块链账户的账户ID和当前区块的区块ID添加到历史状态对象数据库中;以及更新模块1008,用于基于账户状态的哈希值、账户ID和区块ID,更新存储在历史状态数据库中的状态树。
在一些实施例中,历史状态对象数据库存储区块链网络的每个区块链账户的账户ID、区块ID、账户状态的哈希值以及账户状态与相应区块链账户的账户状态之间的映射。
在一些实施例中,共识算法基于PoW、PoS和PBFT之一。在一些实施例中,状态树可以是内容寻址状态树。
在一些实施例中,内容寻址状态树是FDMT的历史状态树或MPT。在一些实施例中,更新状态树包括在与当前区块相关联的状态根下添加一个或多个分支节点和叶节点,并将更新的账户状态的哈希值、账户ID存储在叶节点中。
在一些实施例中,叶节点存储与区块链网络的多个区块链账户相对应的账户状态的哈希值和账户ID。在一些实施例中,账户ID标识存储在叶节点中的多个区块链账户的账户状态的相应哈希值的相对位置。
在一些实施例中,叶节点的地址是基于与多个区块链节点相对应的账户状态而生成的哈希值。在一些实施例中,共识算法是在验证交易的存在、有效性和真实性中的一项或多项之后执行的。
在先前实施中示出的系统、装置、模块或单元可以通过使用计算机芯片或实体来实现,或者可以通过使用具有特定功能的产品来实现。典型的实施例设备是计算机,计算机可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件接收和发送设备、游戏控制台、平板电脑、可穿戴设备或这些设备的任意组合。
对于装置中每个模块的功能和角色的实施例过程,可以参考前一方法中相应步骤的实施例过程。为了简单起见,这里省略了细节。
由于装置实施例基本上与方法实施例相对应,因此对于相关部分,可以参考方法实施例中的相关描述。前述装置实施例仅仅是示例。被描述为单独部分的模块可以是或可以不是物理上分离的,并且显示为模块的部分可以是或可以不是物理模块,可以位于一个位置,或者可以分布在多个网络模块上。可以基于实际需求来选择一些或所有模块,以实现本文方案的目标。本领域普通技术人员在无需付出创造性努力的情况下就能理解和实现本申请的实施例。
再次参见图7和图10,它可以被解释为示出了区块链节点的内部功能模块和结构。执行主体实质上可以是电子设备,该电子设备包括以下:一个或多个处理器;以及被配置为存储一个或多个处理器的可执行指令的一个或多个计算机可读存储器。在一些实施例中,一个或多个计算机可读存储器耦接至一个或多个处理器且其上存储有编程指令,所述编程指令能够由所述一个或多个处理器执行以执行如本文中所述的算法、方法、函数、处理、流程和程序。本文还提供了耦接到一个或多个处理器并且其上存储有指令的一个或多个非暂态计算机可读存储介质,当所述指令由所述一个或多个处理器执行时,促使所述一个或多个处理器执行根据本文提供的方法的实施例的操作。
本文还提供一种用于实现本文提供的方法的系统。该系统包括一个或多个处理器以及耦接到所述一个或多个处理器并且其上存储有指令的计算机可读存储介质,当所述指令由所述一个或多个处理器执行时,促使所述一个或多个处理器执行根据本文提供的方法的实施例的操作。
本文中描述的主题、动作和操作的实施例可以在数字电子电路中、有形体现的计算机软件或固件中、包括本文中公开的结构及其结构等同物的计算机硬件中,或者它们中的一个或多个的组合中实现。本文中描述的主题的实施例可以实现为一个或多个计算机程序,例如,一个或多个计算机程序指令模块,编码在计算机程序载体上,用于由数据处理装置执行或控制数据处理的操作。例如,计算机程序载体可以包括具有编码在其上或存储在其上的指令的一个或多个计算机可读存储介质。载体可以是有形的非暂态计算机可读介质,例如磁盘、磁光盘或光盘、固态驱动器、随机存取存储器(RAM)、只读存储器(ROM)或其他介质类型。可选地或附加地,载体可以是人工生成的传播信号,例如,机器生成的电、光或电磁信号,其被生成为对信息进行编码用于传输到合适的接收器装置以供数据处理装置执行。计算机存储介质可以是或可以部分是机器可读存储设备、机器可读存储基板、随机或串行存取存储器设备或它们中的一个或多个的组合。计算机存储介质不是传播信号。
计算机程序也可以被称为或描述为程序、软件、软件应用程序、app、模块、软件模块、引擎、脚本或代码,可以以任何形式的编程语言编写,包括编译或解释语言、说明或程序性语言;它可以被配置为任何形式,包括作为独立程序,或者作为模块、组件、引擎、子程序或适合在计算环境中执行的其他单元,该环境可以包括由数据通信网络互连的在一个或多个位置的一台或多台计算机。
计算机程序可以但非必须对应于文件系统中的文件。计算机程序可以存储在:保存其他程序或数据的文件的一部分中,例如,存储在标记语言文档中的一个或多个脚本;专用于所讨论的程序的单个文件;或者多个协调文件,例如,存储一个或多个模块、子程序或代码部分的多个文件。
举例来说,用于执行计算机程序的处理器包括通用和专用微处理器,以及任何类型的数字计算机的任何一个或多个处理器。通常,处理器将从耦接到处理器的非暂态计算机可读介质接收用于执行的计算机程序的指令并且接收数据。
术语“数据处理装置”包括用于处理数据的所有类型的装置、设备和机器,包括例如可编程处理器、计算机或多个处理器或计算机。数据处理装置可以包括例如FPGA(现场可编程门阵列),ASIC(专用集成电路)或GPU(图形处理单元)的专用逻辑电路。除了硬件,该装置还可以包括为计算机程序创建执行环境的代码,例如,构成处理器固件、协议栈、数据库管理系统、操作系统、或者它们中的一个或多个的组合的代码。
本文中描述的处理和逻辑流程可以由一台或多台计算机或处理器执行一个或多个计算机程序进行,以通过对输入数据进行运算并生成输出来执行操作。过程和逻辑流程也可以由例如FPGA、ASIC或GPU等的专用逻辑电路或专用逻辑电路与一个或多个编程计算机的组合来执行。
适合于执行计算机程序的计算机可以基于通用和/或专用微处理器,或任何其他种类的中央处理单元。通常,中央处理单元将从只读存储器和/或随机存取存储器接收指令和数据。计算机的元件可以包括用于执行指令的中央处理单元和用于存储指令和数据的一个或多个存储设备。中央处理单元和存储器可补充有专用逻辑电路或集成在专用逻辑电路中。
通常,计算机还将包括或可操作地耦接为从一个或多个存储设备接收数据或将数据传输到一个或多个存储设备。存储设备可以是例如磁盘、磁光盘或光盘、固态驱动器或任何其他类型的非暂态计算机可读介质。然而,计算机不需要具有这样的设备。因此,计算机可以耦接到本地和/或远程的例如一个或多个存储器的一个或多个存储设备。例如,计算机可以包括作为计算机的集成组件的一个或多个本地存储器,或者计算机可以耦接到云网络中的一个或多个远程存储器。此外,计算机可以嵌入在另一个设备中,例如移动电话,个人数字助理(PDA),移动音频或视频播放器,游戏控制台,全球定位系统(GPS)接收器或例如通用串行总线(USB)闪存驱动器的便携式存储设备,仅举几例。
组件可以通过诸如直接地连接、或经由一个或多个中间组件彼此电学连接或光学连接可通信地连接而彼此“耦接”。如果其中一个组件被集成到另一个组件中,组件也可以彼此“耦接”。例如,集成到处理器中的存储组件(例如,L2高速缓存组件)“耦接到”处理器。
为了提供与用户的交互,本文中所描述的主题的实施例可以在计算机上实现或配置为与该计算机通信,该计算机具有:显示设备,例如,LCD(液晶显示器)监视器,用于向用户显示信息;以及输入设备,用户可以通过该输入设备向该计算机提供输入,例如键盘和例如鼠标、轨迹球或触摸板等的指针设备。其他类型的设备也可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的感觉反馈,例如视觉反馈、听觉反馈或触觉反馈;并且可以接收来自用户的任何形式的输入,包括声音、语音或触觉输入。此外,计算机可以通过向用户使用的设备发送文档和从用户使用的设备接收文档来与用户交互;例如,通过响应于从用户设备上的web浏览器收到的请求,向web浏览器发送web页面,或者通过与例如智能电话或电子平板电脑等的用户设备上运行的应用程序(app)进行交互。此外,计算机可以通过向个人设备(例如,运行消息应用的智能手机)发送文本消息或其他形式的消息并作为回应接收来自用户的响应消息来与用户交互。
本文使用与系统,装置和计算机程序组件有关的术语“配置为”。对于被配置为执行特定操作或动作的一个或多个计算机的系统,意味着系统已经在其上安装了在运行中促使该系统执行所述操作或动作的软件、固件、硬件或它们的组合。对于被配置为执行特定操作或动作的一个或多个计算机程序,意味着一个或多个程序包括当被数据处理装置执行时促使该装置执行所述操作或动作的指令。对于被配置为执行特定操作或动作的专用逻辑电路,意味着该电路具有执行所述操作或动作的电子逻辑。
尽管本文包含许多具体实施例细节,但这些不应被解释为对由权利要求书本身限定的请求保护的范围的限制,而是作为对特定实施例的具体特征的描述。在本文单独实施例的上下文中描述的某些特征也可以在单个实施例中组合实现。相反,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合在多个实施例中实现。此外,尽管上面的特征可以被描述为以某些组合起作用并且甚至最初被如此请求保护,但是在一些情况下,可以从请求保护的组合中删除来自该组合的一个或多个特征,并且权利要求书可以涉及子组合或子组合的变体。
类似地,虽然以特定顺序在附图中描绘了操作并且在权利要求书中叙述了操作,但是这不应该被理解为:为了达到期望的结果,要求以所示的特定顺序或序列顺序执行这些操作,或者要求执行所有示出的操作。在某些情况下,多任务和并行处理可能是有利的。此外,上述实施例中的各种系统模块和组件的划分不应被理解为所有实施例中都要求如此划分,而是应当理解,所描述的程序组件和系统通常可以一起集成在单个软件产品中或打包成多个软件产品。
已经描述了主题的特定实施例。其他实施例在以下权利要求书的范围内。例如,权利要求书中记载的动作可以以不同的顺序执行并且仍然实现期望的结果。作为一个示例,附图中描绘的过程无需要求所示的特定顺序或序列顺序来实现期望的结果。在一些情况下,多任务和并行处理可能是有利的。