拍摄区块链数据的快照的制作方法

文档序号:20957328发布日期:2020-06-02 20:29阅读:156来源:国知局
本文涉及拍摄区块链数据的快照。
背景技术
::分布式账本系统(dls),也可称为共识网络和/或区块链网络,使得参与的实体能够安全且不可篡改地存储数据。在不引用任何特定用例的情况下,dls通常被称为区块链网络。区块链网络的类型的示例可以包括公有区块链网络、私有区块链网络和联盟区块链网络。联盟区块链网络针对选择的实体组群提供,该实体组群控制共识处理,并且联盟区块链网络包括访问控制层。基于区块链的程序可以由分布式计算平台执行。例如,分布式计算平台可以包括提供用于执行智能合约的运行时环境的虚拟机。区块链计算平台可以被视为基于交易的状态机。平台中的状态数据可以被组装(assemble)为称为世界状态的全局共享状态。世界状态包括账户地址和账户状态之间的映射。世界状态可以被存储在例如默克尔帕特里夏树(merklepatriciatree,mpt)的内容寻址树结构中。内容寻址状态树本质上是增量式的。即,通过添加新的树结构而不是更新现有状态树的值来反映账户状态的变化。因此,随着新交易不断进入区块链,内容寻址状态树的大小可能会增长得非常大。在一些dls中,每个节点都存储世界状态的完整副本,这可能会占用大量存储空间。这是因为,即使与历史区块关联的某些状态数据很少被访问,所有区块数据和状态数据也都存储到记录在区块链的第一个交易中。此外,由于每个区块链节点负责处理整个区块链网络的交易量,因此对于具有大量节点的区块链网络,每个区块链节点的计算和存储负担可能会非常高。因此,希望区块链节点能够选择性地存储与更频繁被访问的区块相关联的状态数据。还希望区块链节点负责处理和选择性地仅存储区块链网络的一部分交易数据。这样,可以节省区块链网络的存储开销,而不会显著影响系统性能和数据完整性。技术实现要素:所描述的主题的实施例可以单独或组合地包括一个或多个特征。例如,在一个实施例中,公开了一种计算机实现的由区块链节点执行的用于存储区块链数据的方法。该方法包括在创建区块链的区块期间生成与固定深度默克尔树(fdmt)相关联的当前状态树的快照,其中,当前状态树存储与区块链的最新区块相对应的状态信息,并存储当前状态树的快照。在一些实施例中,可以使用系统、方法或计算机程序,或者系统、方法和计算机程序的任何组合来实现这些一般和特定方面。前述和其他描述的实施例可以各自可选地包括一个或多个以下方面:在一些实施例中,fdmt包括存储与区块链的每个区块相对应的状态信息的历史状态树。在一些实施例中,历史状态树包括键值对(kvp),其中,kvp中的键是kvp中的相应值的哈希值。在一些实施例中,当前状态树包括kvp,其中,kvp中的键包括与当前状态树的节点相对应的节点标识(id)和与最新区块相对应的区块id。在一些实施例中,当前状态树与合约账户相关联,并且其中,当前状态树是对合约账户的存储内容进行编码的树。在一些实施例中,快照包括与合约账户相关联的merkle路径,该merkle路径被包括在与最新区块相关联的世界状态树中。在一些实施例中,所述方法还包括:添加与最新区块相关联的区块id作为快照的id。在一些实施例中,所述方法还包括:接收用于检索与最新区块相对应的状态信息的请求;基于快照的id通过本地调用确定存在状态信息的快照;以及响应于该请求,基于快照提供状态信息。在一些实施例中,所述方法还包括在存储了快照之后,删除与fdmt相关联的历史状态树。在一些实施例中,快照是基于rocksdb中的检查点功能生成的。在另一实施例中,公开了另一种计算机实现的由区块链节点执行的用于存储区块链数据的方法。所述方法包括:将标记消息从区块链网络的第一分片中的第一区块链节点发送至区块链网络的中继链中的第二区块链节点,从第二区块链节点接收标记区块,其中,标记区块与中继链相关联并且包括标记消息,创建与第一分片相关联的第一区块,该第一区块包括与中继链相关联的、紧接在标记区块之前的区块,创建与第一分片相关联的、包括标记区块的第二区块,在创建与第一分片相关联的第二区块期间,生成与第一分片关联的最新区块相对应的状态信息的快照,以及存储状态信息的快照。在一些实施例中,可以使用系统,方法或计算机程序,或者系统、方法和计算机程序的任何组合来实现这些一般和特定方面。前述和其他描述的实施例可以各自可选地包括一个或多个以下方面:在一些实施例中,与最新区块相对应的状态信息被存储在mpt中。在一些实施例中,与最新区块相对应的状态信息被存储在与fdmt相关联的当前状态树中。在一些实施例中,fdmt包括存储与区块链的每个区块相关联的状态信息的历史状态树。在一些实施例中,所述方法还包括在存储了状态信息的快照之后,删除历史状态树。在一些实施例中,历史状态树包括kvp,其中,kvp中的键是kvp中的相应值的哈希值。在一些实施例中,当前状态树包括kvp,其中,kvp中的键包括与当前状态树的节点相对应的节点id和与最新区块相对应的区块id。在一些实施例中,当前状态树与合约账户相关联,并且其中,当前状态树是对合约账户的存储内容进行编码的树。在一些实施例中,快照包括与合约账户相关联的merkle路径,该merkle路径被包括在与最新区块相关联的世界状态树中。在一些实施例中,所述方法还包括添加与标记区块相关联的区块id或与最新区块相关联的区块id,以作为快照的id。在一些实施例中,所述方法还包括接收用于检索与最新区块相对应的状态信息的请求;基于快照的id通过本地调用确定存在状态信息的快照;以及响应于该请求,基于快照提供状态信息。在一些实施例中,标记区块包括在区块链网络的第一分片和第二分片之间通信的一个或多个消息。在一些实施例中,快照是基于rocksdb中的检查点功能生成的。应当理解的是,根据本文的方法可包括本文描述的方面和特征的任何组合。也就是说,根据本文的方法不限于本文具体描述的方面和特征的组合,还包括所提供的方面和特征的任何组合。在附图和以下描述中阐述了本文的一个或多个实施例的细节。根据说明书和附图以及权利要求书,本文的其他特征和优点将显现。附图说明图1描绘了可用于执行本文实施例的环境的示例。图2描绘了根据本文实施例的架构的示例。图3描绘了根据本文实施例的固定深度默克尔树(fdmt)的示例。图4描绘了根据本文实施例的用于存储区块链数据的数据库的示例。图5描绘了根据本文实施例的使用共享存储的区块链网络的示例。图6描绘了可以根据本文的实施例执行的处理的示例。图7描绘了根据本文的实施例的装置的模块的示例。图8描绘了根据本文实施例的在采用分片技术的区块链网络中执行快照的示例。图9描绘了根据本文实施例的采用分片技术的区块链网络的示例。图10描绘了可根据本文实施例执行的处理的另一示例。图11描绘了根据本文实施例的装置的模块的另一示例。各附图中的相同附图标记和名称表示相同的元件。具体实施方式本文描述了用于拍摄区块链数据的快照的技术。在一些区块链网络中,区块链的状态信息可以存储在内容寻址树结构中,例如默克尔帕特里夏树(merklepatriciatree,mpt)或固定深度默克尔树(fdmt)数据结构下的历史状态树。内容寻址状态树本质上是增量式的。即,通过添加新的树结构而不是更新现有状态树的值来反映账户状态的变化。因此,当区块被不断追加到区块链中时,mpt或历史状态树可以增长得很大。因为大多数历史状态数据与不频繁被访问的历史区块相关联。就存储资源的使用而言,存储所有历史状态数据可能效率很低。在一些实施例中,可以实现快照技术以策略性地捕获与所选区块相关联的状态信息。例如,智能合约可以包括用于拍摄与新追加的区块相关联的状态信息的快照的指令,使得不再存储与不频繁被访问的区块或历史区块相关联的状态信息,从而节省存储空间。快照技术不仅可以在常规的区块链网络中实现,而且可以在已划分为单独的分片的区块链网络中实现。对于每个分片,单独的一组区块链节点可以独立执行共识,并生成与其特定分片相关联的状态信息。快照可以在不同的分片之间进行协调,使得整个区块链的完整状态信息被捕获。本文中描述的技术产生若干技术效果。与存储与当前区块关联的当前状态信息和与区块链的所有区块关联的历史状态信息两者相比,存储与区块链的选定区块相关联的状态信息的快照可以节省大量的存储空间开销。在一些实施例中,可以使用分片技术将区块链网络中的区块链节点划分为多个分片。通过使用分片技术,区块链节点不再负责处理整个网络的交易量。而是,区块链节点仅维护与其自己的分片有关的信息。这样,可以在整个区块链网络上分散计算和存储工作量。每个区块链节点的计算和存储负担可以显著降低。此外,通过对区块链网络的每个分片实施快照技术,状态信息可以由区块链节点策略性地选择,以实现附加的存储节省,而不会显著影响每个分片的数据完整性。为本文的实施例提供进一步的背景,如上所述,分布式账本系统(dls),其也可以称为共识网络(例如,由点对点节点组成)和区块链网络,使参与的实体能够安全地且不可篡改地进行交易和存储数据。尽管术语“区块链”通常与特定网络和/或用例相关联,但是在不参考任何特定用例的情况下,本文使用“区块链”来一般地指代dls。区块链是以交易不可篡改的方式存储交易的数据结构。因此,区块链上记录的交易是可靠且可信的。区块链包括一个或多个区块。链中的每个区块通过包含在链中紧邻其之前的前一区块的加密哈希值(cryptographichash)链接到该前一区块。每个区块还包括时间戳、自身的加密哈希值以及一个或多个交易。已经被区块链网络中的节点验证的交易经哈希处理并编入默克尔(merkle)树中。merkle树是一种数据结构,在该树的叶节点处的数据是经哈希处理的,并且在该树的每个分支中的所有哈希值在该分支的根处级联(concatenated)。此过程沿着树持续一直到整个树的根,在整个树的根处存储了代表树中所有数据的哈希值。可通过确定哈希值是否与树的结构一致而可快速验证该哈希值是否为存储在该树中的交易的哈希值。区块链是用于存储交易的去中心化或至少部分去中心化的数据结构,而区块链网络是通过广播、验证和确认交易等来管理、更新和维护一个或多个区块链的计算节点的网络。如上所述,区块链网络可作为公有区块链网络、私有区块链网络或联盟区块链网络被提供。本文参考联盟区块链网络更详细地描述了本文的实施例。然而,可以预期,本文的实施例可以在任何适当类型的区块链网络中实现。通常,联盟区块链网络在参与实体间是私有的。在联盟区块链网络中,共识处理由可被称为共识节点的授权的节点集控制,一个或多个共识节点由相应的实体(例如,金融机构、保险公司)操作。例如,由10个实体(例如,金融机构、保险公司)组成的联盟可以操作联盟区块链网络,每个实体操作联盟区块链网络中的至少一个节点。在一些示例中,在联盟区块链网络内,全局区块链被提供为跨所有节点复制的区块链。也就是说,对于全局区块链,所有的共识节点处于完全状态共识状态。为了实现共识(例如,同意将区块添加到区块链),在联盟区块链网络内实现共识协议。例如,联盟区块链网络可以实现实用拜占庭容错(pbft)共识,下面将进一步详细描述。图1是示出了可用于执行本文实施例的环境100的示例的示图。在一些示例中,环境100使得实体能够参与至联盟区块链网络102中。环境100包括计算系统106、108和网络110。在一些示例中,网络120包括局域网(lan)、广域网(wan)、因特网或其组合,并且连接网站、用户设备(例如,计算设备)和后端系统。在一些示例中,可以通过有线和/或无线通信链路访问网络120。在一些示例中,网络110使得能够与联盟区块链网络102通信或在联盟区块链网络102内通信。通常,网络110表示一个或多个通信网络。在一些情况下,计算系统106、108可以是云计算系统(未示出)的节点,或者每个计算系统106、108可以是单独的云计算系统,其包括通过网络互连并且用作分布式处理系统的多个计算机。在所描绘的示例中,计算系统106、108可以各自包括能够作为节点参与至联盟区块链网络102中的任何适当的计算设备。示例计算设备包括但不限于服务器、台式计算机、膝上型计算机、平板计算设备以及智能电话。在一些示例中,计算系统106、108承载一个或多个由计算机实施的服务,用于与联盟区块链网络102进行交互。例如,计算系统106可以承载第一实体(例如,用户a)的计算机实施的、例如交易管理系统的服务,例如第一实体使用该交易管理系统管理其与一个或多个其他实体(例如,其他用户)的交易。计算系统108可以承载第二实体(例如,用户b)的由计算机实施的、例如交易管理系统的服务,例如,第二实体使用该交易管理系统管理其与一个或多个其他实体(例如,其他用户)的交易。在图1的示例中,联盟区块链网络102被表示为节点的点对点网络(peer-to-peernetwork),并且计算系统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)值和时间戳。通常,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的id1-1、id2-1等)相关联而不考虑其内容。当前状态树304的节点的kvp可以表示为<nodeid,nodevalue>。在一些情况下,键还可以包括与节点值相关联的相应区块id。在这种情况下,节点id可以用作键的前缀,而区块id可以用作键的后缀。然后可以将当前状态树304的kvp表示为<nodeid+blockid,nodevalue>。历史状态树302可以是内容寻址状态树。对于内容寻址状态树,每个账户值都可以具有一个内容地址,该内容地址与该值唯一地关联到信息内容本身。例如,可以通过对节点的值进行哈希处理来生成节点的键。为了从历史状态树302中检索信息,可以提供内容标识,从内容标识中可以确定并检索账户值的位置。类似于默克尔帕特里夏树(mpt),历史状态树302的每个节点可以包括指向树的下一个节点的指针的哈希值(例如,历史状态树302下的hash1、hash2和hash3)。沿着指针的路径,叶节点具有与哈希值的末端部分相对应的键(例如,历史状态树302下的hash4,hash5,hash6和hash7)以及与该键配对的值。历史状态树302的kvp可以表示为<hash(nodevalue),nodevalue>。由于节点键取决于内容寻址树的节点值,因此可以将新状态信息作为附加树结构添加到历史状态树302中而不是对现有树进行更改,从而保留现有树结构并提高数据存储/检索效率。图4描绘了根据本文实施例的存储与区块链的合约账户的状态信息相关联的示例400。数据库可以是例如键值数据库,例如leveldb或rocksdb。数据库可以在fdmt数据结构下存储数据,该fdmt数据结构包括用于存储历史状态树的历史数据库410和用于存储当前状态树的当前数据库412。在图4中描绘的四个区块中,区块i-2402、区块i-1404和区块i406是先前追加到区块链的历史区块,而区块i+1408是当前区块。每个区块可以具有区块头和区块体。区块头可以包括诸如世界状态下的合约账户的存储根(storageroot)的信息。存储根可以用作合约账户状态树的安全且唯一的标识。换句话说,存储根可以加密地取决于账户状态。区块体可以包括区块的相应账户的已确认交易。如所描述的,历史数据库410可以存储历史状态树,而当前数据库412可以存储当前状态树。历史状态树和当前状态树可以分别存储历史账户状态和当前账户状态。账户状态可以包括有关区块链账户的信息(例如,账户发送的交易数量)。每个账户可以具有一个账户状态。例如,以太坊区块链账户可以包括外部拥有的账户和合约账户。外部拥有的账户可以由私钥控制,并且不与任何用于执行智能合约的代码关联。合约账户可以通过其合约代码进行控制,该代码可用于执行智能合约。以太坊账户的状态可以包括四个组分:随机值、余额、代码哈希值和存储根。如果该账户是外部拥有的账户,则随机数可以表示从该账户地址发送的交易的数量。余额可以代表该账户拥有的数字资产。代码哈希值可以是空字符串的哈希值。存储根可以为空。如果该账户是合约账户,则随机数可以表示该账户创建的合约数量。余额可以代表该账户拥有的数字资产。代码哈希值可以是与账户关联的虚拟机代码的哈希值。存储根可以存储与存储树或合约状态树相关联的根哈希。合约状态树可以存储合约数据。合约状态树也可以具有包括当前状态树和历史状态树的fdmt结构。历史状态树可以包括始于创世区块的区块链账户状态的完整副本,并且可以根据交易执行进行更新。例如,存储在先前区块i-1404中的根哈希值是在区块i-1404完成时世界状态的根哈希值。世界状态与存储在区块i-1404以及在区块i-1404之前的区块中的所有交易相关联。类似地,存储在当前区块i+1408中的根哈希值是与存储在区块i+1408和区块i+1408之前的区块中的所有交易关联的世界状态的根哈希值。当前状态树可以包括由于交易被新添加到当前区块i+1408而被更新或添加的状态信息。如在图3的描述中所讨论的,历史状态树可以将状态信息存储为表示为<hash(nodevalue),nodevalue>的kvp,使得节点值可以是内容可寻址的。在一些实施例中,可以基于一个或多个与位置相关的id来对当前状态树进行位置寻址。例如,当前状态树可以将状态信息存储为表示为<nodeid,nodevalue>的kvp,其中节点值可以基于其相应节点id来寻址。作为另一示例,kvp中的键可以是节点id和与节点值的对应的区块id的组合。节点id可以用作键的前缀,而区块id可以用作键的后缀,以用于遍历fdmt或mpt的值。图5描绘了根据本文的实施例的在智能合约中执行快照的示例500。在高层级,快照技术可以用于操作系统或存储技术。快照可以是特定时间点(或检查点)的数据集的完整副本。在一些情况下,快照可以记录在拍摄快照时系统的完整状态。快照可以轻松回滚以恢复原始数据。如前所述,mpt和fdmt的历史状态树是内容寻址状态树。内容寻址状态树本质上是增量式的。即,通过添加新的树结构而不是更新现有状态树的值来反映账户状态的变化。因此,当区块被不断追加到区块链中时,历史状态树可以增长得很大。此外,当前区块的状态数据被分别存储在当前状态树和历史状态树中。因为与历史区块相对应的大多数状态数据是不频繁被访问的历史状态数据,所以就存储资源使用而言,存储所有历史状态数据可能效率很低。在一些实施例中,快照技术可以在诸如rocksdb、leveldb或statedb等的数据库中实现。例如,rocksdb中的检查点功能(checkpointfeature)可以被用于拍摄正在运行的rocksdb数据库的快照,并将快照保存在特定目录中。可以将检查点与快照的时间点相关联。在一些实施例中,检查点功能可以用于实现可快照合约(snapshotablecontract)。可快照合约可以是智能合约,其中包括用于拍摄区块链状态信息的快照的指令。例如,智能合约可以包括用于在区块1和区块h的共识期间拍摄与合约账户相关联的当前状态树的快照的指令。在区块1的共识期间,智能合约可以触发第一快照。因为在区块1的共识期间区块1的当前状态树尚未完成,所以第一快照可以是区块0的当前状态树的快照。类似地,在区块h的共识期间拍摄的第二快照可以是区块h-1的当前状态树的快照。拍摄快照后,可以将它们存储在数据库的特定目录中。在一些实施例中,可以策略性地针对与选定的频繁被访问的区块相关联的状态信息拍摄快照。在一些情况下,状态数据被存储在fdmt中。在这种情况下,可以在存储快照后从区块链节点删除与相应合约账户关联的fdmt的历史状态树,以节省区块链节点上的存储空间。在一些实施例中,与合约状态树相关联的快照还可以包括世界状态树下的合约状态树的存储根的merkle路径,使得可以在访问快照时提供简单支付验证(spv)证明。在一些实施例中,快照id可以与快照相关联。例如,快照id可以是相应的当前状态树被捕获在快照中的区块的区块id。在一些实施例中,快照id可以是在创建期间被拍摄了快照的区块的区块id。在一些实施例中,还可以提供被指示要在智能合约下拍摄的快照的列表,使得可以容易地确定是否存在区块的状态信息的快照。在一些实施例中,如果进行本地调用以检索与快照不可用的区块相关联的状态信息,则可以提供失败消息。与存储与当前区块相关联的当前状态树和与区块链的所有区块相关联的历史状态树相比,存储与区块链中的选定区块相关联的状态信息的快照可以节省大量的存储空间开销。图6描绘了可以根据本文实施例执行的处理600的示例。为方便起见,处理600将被描述为由位于一个或多个位置的、并根据本文被适当地编程的一个或多个计算机的系统执行。例如,计算系统(例如,图1的计算系统106、108)中被适当编程的计算设备可以执行处理600。在602,区块链节点在创建区块链的区块期间生成与fdmt相关联的当前状态树的快照,其中,当前状态树存储与区块链的最新区块相对应的状态信息。在一些实施例中,fdmt包括存储与区块链的每个区块相对应的状态信息的历史状态树。在一些实施例中,历史状态树包括kvp,其中,kvp中的键是kvp中的相应值的哈希值。在一些实施例中,当前状态树包括kvp,其中,kvp中的键包括与当前状态树的节点相对应的节点id和与最新区块相对应的区块id。在一些实施例中,当前状态树与合约账户相关联,并且其中,当前状态树是对合约账户的存储内容进行编码的树。在一些实施例中,快照包括与合约账户相关联的merkle路径,该merkle路径被包括在与最新区块相关联的世界状态树中。在一些实施例中,处理600还包括添加与最新区块相关联的区块id以作为快照的id。在一些实施例中,快照是基于rocksdb中的检查点功能生成的。在604,区块链节点存储当前状态树的快照。在一些实施例中,处理600还包括在存储了快照之后,删除与fdmt相关联的历史状态树。在一些实施例中,处理600还包括:接收用于检索与最新区块相对应的状态信息的请求;基于快照的id通过本地调用确定存在状态信息的快照;响应于该请求,基于快照提供状态信息。图7描绘了根据本文的实施例的装置700的模块的示例。装置700可以是被配置为存储和处理区块链数据的区块链节点的实施例的示例。装置700可以对应于上述实施例,并且装置700包括以下:生成模块702,用于在创建区块链的区块期间生成与fdmt相关联的当前状态树的快照,其中,当前状态树存储与区块链的最新区块相对应的状态信息,以及存储模块704,用于存储当前状态树的快照。在一些实施例中,fdmt包括存储与区块链的每个区块相对应的状态信息的历史状态树。在一些实施例中,历史状态树包括kvp,其中,kvp中的键是kvp中的相应值的哈希值。在一些实施例中,当前状态树包括kvp,其中,kvp中的键包括与当前状态树的节点相对应的节点id和与最新区块相对应的区块id。在一些实施例中,当前状态树与合约账户相关联,并且当前状态树是对合约账户的存储内容进行编码的树。在一些实施例中,快照包括与合约账户相关联的merkle路径,该merkle路径被包括在与最新区块相关联的世界状态树中。在一些实施例中,装置700还包括添加子模块,用于添加与最新区块相关联的区块id以作为快照的id。在一些实施例中,装置700还包括:接收子模块,用于接收用于检索与最新区块相对应的状态信息的请求;确定子模块,用于基于快照的id通过本地调用确定存在状态信息的快照,以及提供子模块,用于响应于该请求,基于快照提供状态信息。在一些实施例中,装置700还包括删除子模块,用于在存储了快照之后,删除与fdmt相关联的历史状态树。在一些实施例中,快照是基于rocksdb中的检查点功能生成的。图8描绘了根据本文实施例的在采用分片技术的区块链网络中执行快照的示例800。分片技术可用于将区块链网络中的区块链节点划分为中继链(phosphor)和多个分片。这样,可以在整个区块链网络上分散计算和存储工作量。更具体地说,通过使用分片技术,区块链节点不再负责处理整个网络的交易量。而是,区块链节点仅维护与其自己的分片有关的信息。中继链中的区块链节点可用于服务分片中的区块链节点。不同分片中的区块链节点只能通过中继链中的区块链节点相互通信。在图9中描绘了适用于该示例800的区块链网络的高层级结构。图9描绘了根据本文实施例的采用分片技术的区块链网络的示例900。在所描绘的示例900中,区块链网络包括中继链802和两个分片:分片804和分片806。中继链802和分片各自可以包括多个区块链节点。在一些区块链网络中,根据本文的实施例,区块链节点可以形成两个以上的分片。中继链802可以连接分片804和分片806以形成“辐条-中心”结构。分片804和分片806彼此隔离,并且可以通过中继链802中的一个或多个预定的区块链节点彼此通信。每个分片包括单独的区块链账户集,每个分片针对各自的区块链账户集独立运行共识和智能合约。与一个分片相关联的账户无法被另一分片中的区块链节点查看或访问。区块链节点一次只能参与一个分片的操作。在一些实施例中,每个分片中的区块链节点可以由中继链802基于智能合约来确定和维护。如果交易涉及分片804和分片806两者的账户,则可以在每个分片中串行执行用于完成交易的任务。交易的状态(例如,进行中、已提交或已取消)可以由中继链802维护。例如,当交易完成时,发起交易的账户可以通过中继链802向参与交易的所有账户广播更新的账户状态。作为另一示例,当交易失败时,分片中的区块链节点可以通知与该交易相关联的其他分片中的区块链节点回滚到交易开始之前的原始状态。再次参考图8,在所描绘的示例800中,分片804中的区块链节点可以向中继链802发送标记消息,以标记拍摄与合约账户相关联的当前状态信息的快照的时间点。中继链802中的区块链节点从分片804和分片806中的区块链节点接收标记消息以及在标记消息之前和之后的其他消息812和816。中继链802中的区块链节点可以运行对消息的共识以生成与中继链802相关联的中继链区块追加到区块链。包括标记消息814的中继链区块可以被称为标记区块810。中继链802中的区块链节点然后可以将中继链区块作为消息广播到分片804和分片806中的区块链节点。接收到中继链区块之后,每个分片中的区块链节点运行与中继链区块有关的共识,以生成分片804和806各自对应的分片区块。因为分片804和分片806中的区块链节点可以以不同的速度运行共识,并且每个分片中的分片区块的大小可以不同,所以包括标记区块810的分片区块在每个分片中可以不同。在所描绘的示例800中,分片804中的区块链节点在对区块92的共识期间接收标记区块810。分片806中的区块链节点在对区块81的共识期间接收标记区块810。在一些实施例中,分片804和806中的区块链节点可以确定标记区块810是否是分片区块的第一区块。可选地,分片中的区块链节点可以确定紧接在标记区块810之前的中继链区块是否在区块链的与相应分片相关联的最新区块中。例如,分片804中的区块链节点可以确定紧接在标记区块810之前的中继链区块99是否包括在分片区块91中。分片区块91是在创建包括标记区块810的分片区块92期间的最新区块。如果是,则分片804中的区块链节点可以调用检查点函数(checkpointfunction)以拍摄分片区块91的当前状态树的快照。否则,需要在创建分片区块93期间拍摄分片区块92的当前状态树的快照。这是因为标记区块810用作其之前所有交易的断点。例如,如果中继链区块99和标记区块810都被包括在分片区块92中,则在创建分片92期间拍摄的快照将不包括中继链区块99中的消息。另一方面,如果分片区块81从标记区块810开始,则在创建分片区块81期间拍摄的快照将包括中继链区块99中的消息。在这种情况下,分片804和分片806的快照可能包括区块链网络的不完整状态信息,因为中继链区块99仅包括在分片806的快照中。然而,如果分片804中的区块链节点确定中继链区块99和标记区块810都包括在分片区块92中并且在创建分片区块93期间拍摄快照,则中继链区块99的状态信息可以经由标记区块810被捕获并且标记在分片804的快照中。分片804和分片806的快照然后可以形成在标记区块810之前的交易的完整状态信息。如上所述,分片区块的快照至少需要包括紧邻标记区块810之前的中继链区块,以便捕获与区块链网络相关联的全部当前状态信息。在一些实施例中,当分片中的区块链节点接收到标记区块810时,它们可以创建包括紧接在标记区块810之前的中继链区块、但不包括标记区块810本身的分片区块。区块链节点随后可以创建包括标记区块810的另一分片区块。例如,分片804中的区块链节点可以在接收到标记区块810之后创建包括中继链区块99的分片区块91。区块链节点然后可以创建分片区块92以包括标记区块810。可以在创建包括标记区块810的分片区块92期间拍摄与分片804相关联的快照。这样,分片804的快照可以包括与分片804的最新区块相关联的状态信息。分片804的最新区块包括标记区块810之前的消息。类似地,分片806中的区块链节点可以创建包括中继链区块99的分片区块80和包括标记区块810的分片区块81。可以在创建分片区块81期间拍摄与分片806相关联的快照。这样,分片806的快照可以包括与分片806的最新区块相关联的状态信息。分片806的最新区块包括标记区块810之前的消息。因此,分片804和分片806的快照然后可以形成标记区块810之前的交易的完整状态信息。在一些情况下,状态数据被存储在fdmt中。在这样的情况下,可以在存储了选定的当前状态树的快照之后,删除fdmt的历史状态树,以节省存储空间。在一些情况下,分片804和分片806的快照的快照id可以是标记区块810的区块id,或当前状态树被捕获在快照中的相应分片区块的区块id。图10描绘了可以根据本文的实施例执行的处理1000的示例。为方便起见,处理1000将被描述为由位于一个或多个位置并根据本文被适当地编程的一个或多个计算机的系统执行。例如,计算系统(例如,图1的计算系统106、108)中适当编程的计算设备,可以是执行处理1000的区块链节点。在1002,区块链节点将标记消息从区块链网络的第一分片中的第一区块链节点发送到区块链网络的中继链中的第二区块链节点。在1004,区块链节点从第二区块链节点接收标记区块,其中,标记区块与中继链相关联并且包括标记消息。在一些实施例中,标记区块包括在区块链网络的第一分片和第二分片之间通信的一个或多个消息。在1006,区块链节点创建与第一分片相关联的第一区块,该第一区块包括与中继链相关联的、紧接在标记区块之前的区块。在1008,区块链节点创建与第一分片相关联的、包括标记区块的第二区块。在1010,区块链节点在创建与第一分片相关联的第二区块期间,生成与第一分片关联的最新区块相对应的状态信息的快照。在一些实施例中,快照包括与合约账户相关联的merkle路径,该merkle路径被包括在与最新区块相关联的世界状态树中。在一些实施例中,处理1000还包括添加与标记区块相关联的区块id或与最新区块相关联的区块id以作为快照的id。在1012,区块链节点存储状态信息的快照。在一些实施例中,与最新区块相对应的状态信息被存储在mpt中。在一些实施例中,与最新区块相对应的状态信息被存储在与fdmt相关联的当前状态树中。在一些实施例中,fdmt包括存储与区块链的每个区块相关联的状态信息的历史状态树。在一些实施例中,快照是基于rocksdb中的检查点功能生成的。在一些实施例中,处理1000还包括在存储了状态信息的快照之后,删除历史状态树。在一些实施例中,历史状态树包括kvp,其中,kvp中的键是kvp中的相应值的哈希值。在一些实施例中,当前状态树包括kvp,其中,kvp中的键包括与当前状态树的节点相对应的节点id和与最新区块相对应的区块id。在一些实施例中,当前状态树与合约账户相关联,并且当前状态树是对合约账户的存储内容进行编码的树。在一些实施例中,处理1000还包括:接收用于检索与最新区块相对应的状态信息的请求;基于快照的id通过本地调用确定存在状态信息的快照;响应于该请求,基于快照提供状态信息。图11描绘了根据本文的实施例的装置1100的模块的示例。装置1000可以是被配置为存储和处理区块链数据的区块链节点的实施例的示例。装置1100可以对应于上述实施例,装置1100包括以下:发送模块1102,用于将标记消息从区块链网络的第一分片中的第一区块链节点发送到区块链网络的中继链中的第二区块链节点,接收模块1104,用于从第二区块链节点接收标记区块,其中,标记区块与中继链相关联并且包括标记消息;创建模块1106,用于创建与第一分片相关联的第一区块,该第一区块包括与中继链相关联的、紧接在标记区块之前的区块,以及创建与第一分片相关联的、包括标记区块的第二区块,生成模块1108,用于在创建与第一分片相关联的第二区块期间,生成与第一分片关联的最新区块相对应的状态信息的快照,以及存储模块1110,用于存储状态信息的快照。在一些实施例中,与最新区块相对应的状态信息被存储在mpt中。在一些实施例中,与最新区块相对应的状态信息被存储在与fdmt相关联的当前状态树中。在一些实施例中,fdmt包括存储与区块链的每个区块相关联的状态信息的历史状态树。在一些实施例中,装置1100还包括删除子模块,用于在存储了状态信息的快照之后,删除历史状态树。在一些实施例中,历史状态树包括kvp,其中,kvp中的键是kvp中的相应值的哈希值。在一些实施例中,当前状态树包括kvp,其中,kvp中的键包括与当前状态树的节点相对应的节点id和与最新区块相对应的区块id。在一些实施例中,当前状态树与合约账户相关联,并且其中,当前状态树是对合约账户的存储内容进行编码的树。在一些实施例中,快照包括与合约账户相关联的merkle路径,该merkle路径被包括在与最新区块相关联的世界状态树中。在一些实施例中,装置1100还包括添加子模块,用于添加与标记区块相关联的区块id或与最新区块相关联的区块id以作为快照的id。在一些实施例中,装置1100还包括接收子模块,用于接收用于检索与最新区块相对应的状态信息的请求;基于快照的id通过本地调用确定存在状态信息的快照,以及提供子模块,用于响应于该请求,基于快照提供状态信息。在一些实施例中,标记区块包括在区块链网络的第一分片和第二分片之间通信的一个或多个消息。在一些实施例中,快照是基于rocksdb中的检查点功能生成的。前述实施例中示出的系统、装置、模块或单元可以通过使用计算机芯片或实体来实施,或者可以通过使用具有特定功能的产品来实施。典型的实施例设备是计算机,计算机可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能手机、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或这些设备的任意组合。对于装置中每个模块的功能和作用的实施例处理,可以参考前一方法中相应步骤的实施例处理。为简单起见,这里省略了细节。由于装置实施基本上对应于方法实施,对于相关部件,可以参考方法实施中的相关描述。先前描述的装置实施仅是示例。被描述为单独部分的模块可以或不是物理上分离的,并且显示为模块的部分可以是或不是物理模块,可以位于一个位置,或者可以分布在多个网络模块上。可以基于实际需求来选择一些或所有模块,以实现本文方案的目标。本领域的普通技术人员无需付出创造性劳动就能理解和实现本申请的实施例。再次参见图7至图11,它可以被解释为示出了区块链节点的内部功能模块和结构。执行主体本质上可以是电子设备,并且该电子设备包括以下:一个或多个处理器;以及被配置为存储一个或多个处理器的可执行指令的一个或多个计算机可读存储器。在一些实施例中,一个或多个计算机可读存储器耦接至一个或多个处理器且其上存储有编程指令,所述编程指令能够由所述一个或多个处理器执行以执行如本文中所述的算法、方法、函数、处理、流程和程序。本文还提供了一个或多个非暂态计算机可读存储介质,其耦接到一个或多个处理器并且具有存储在其上的指令,当由一个或多个处理器执行时,该指令使得一个或多个处理器根据这里提供的方法的实施例执行操作。本文还提供了用于实现本文提供的方法的系统。该系统包括一个或多个处理器,以及耦接到一个或多个处理器的计算机可读存储介质,其上存储有指令,当由一个或多个处理器执行时,该指令使得一个或多个处理器根据这里提供的方法的实施例执行操作。本文中描述的主题、动作和操作的实施可以在数字电子电路、有形体现的计算机软件或固件、计算机硬件中实施,包括本文中公开的结构及其结构等同物,或者它们中的一个或多个的组合。本文中描述的主题的实施可以实现为一个或多个计算机程序,例如,编码在计算机程序载体上的一个或多个计算机程序指令模块,用于由数据处理装置执行或控制数据处理装置的操作。例如,计算机程序载体可以包括一个或多个计算机可读存储介质,其上编码或存储有指令。载体可以是有形的非暂态计算机可读介质,诸如磁盘、磁光盘或光盘、固态驱动器、随机存取存储器(ram)、只读存储器(rom)或其他类型的介质。可选地或附加地,载体可以是人工生成的传播信号,例如,机器生成的电信号、光信号或电磁信号,其被生成来编码信息用于传输到合适的接收器装置以供数据处理装置执行。计算机存储介质可以是或可以部分是机器可读存储设备、机器可读存储基板、随机或串行访问存储器设备或它们中的一个或多个的组合。计算机存储介质不是传播信号。计算机程序,也可以被称为或描述为程序、软件、软件应用程序、app、模块、软件模块、引擎、脚本或代码,可以以任何形式的编程语言编写,包括编译或解释性语言、或声明或程序性语言;它可以配置为任何形式,包括作为独立程序,或作为模块、组件、引擎、子程序或适合在计算环境中执行的其他单元,该环境可包括由数据通信网络互连的一个或多个位置上的一台或多台计算机。计算机程序可以但非必须对应于文件系统中的文件。计算机程序可以存储在:保存其他程序或数据的文件的一部分中,例如,存储在标记语言文档中的一个或多个脚本;专用于所讨论的程序的单个文件中;或者多个协调文件中,例如,存储一个或多个模块、子程序或代码部分的多个文件。用于执行计算机程序的处理器包括:例如,通用和专用微处理器两者,和任意种类的数字计算机的任意一个或多个处理器。通常,处理器将接收用于执行的计算机程序的指令以及来自耦接至处理器的非暂态计算机可读介质的数据。术语“数据处理装置”包括用于处理数据的所有种类的装置、设备和机器,例如包括可编程处理器、计算机或多个处理器或计算机。数据处理设备可以包括例如fpga(现场可编程门阵列),asic(专用集成电路)或gpu(图形处理单元)的专用逻辑电路。除了硬件,该装置还可以包括为计算机程序创建执行环境的代码,例如,构成处理器固件、协议栈、数据库管理系统、操作系统或者它们中一个或多个的组合的代码。本文中描述的处理和逻辑流程可以由执行一个或多个计算机程序的一台或多台计算机或处理器执行,以通过对输入数据进行操作并生成输出来执行操作。处理和逻辑流程也可以由例如fpga、asic或gpu等的专用逻辑电路或专用逻辑电路与一个或多个编程计算机的组合来执行。适合于执行计算机程序的计算机可以基于通用和/或专用微处理器,或任何其他种类的中央处理单元。通常,中央处理单元将从只读存储器和/或随机存取存储器接收指令和数据。计算机的元件可包括用于执行指令的中央处理单元和用于存储指令和数据的一个或多个存储设备。中央处理单元和存储器可以补充有专用逻辑电路或集成在专用逻辑电路中。通常,计算机还将包括或可操作地耦接至一个或多个存储设备,以从一个或多个存储设备接收数据或向一个或多个存储设备传送数据。大容量存储设备可以是例如,磁盘、磁光盘或光盘、固态驱动器或任何其他类型的非暂态计算机可读介质。但是,计算机不必需这样的设备。因此,计算机可以耦接到例如一个或多个存储器的本地和/或远程的一个或多个大容量存储设备。例如,计算机可以包括作为计算机的组成部件的一个或多个本地存储器,或者计算机可以耦接到云网络中的一个或多个远程存储器。此外,计算机可以嵌入在另一设备中,例如移动电话、个人数字助理(pda)、移动音频或视频播放器、游戏控制台、全球定位系统(gps)接收器或例如通用串行总线(usb)闪存驱动器的便携式存储设备,这里仅举几例。组件可以通过直接或经由一个或多个中间件例如电连接或光连接地彼此连接通信而彼此“耦接”。如果部件中的一个部件被集成到另一个中,则部件也可以被彼此“耦接”。例如,集成到处理器中的大容量存储组件(例如,l2高速缓存组件)被“耦接到”处理器。为了提供与用户的交互,本文中描述的主题的实施例可以在计算机上实现或配置为与该计算机通信,该计算机具有:显示设备,例如,lcd(液晶显示器)监视器,用于向用户显示信息;以及输入设备,用户可以通过该输入设备向计算机提供输入,例如键盘和例如鼠标、轨迹球或触摸板等的指针设备。其他类型的设备也可用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的感官反馈,例如视觉反馈、听觉反馈或触觉反馈;并且可以接收来自用户任何形式的输入,包括声音、语音输入或触觉输入。此外,计算机可以通过向用户使用的设备发送文档和从用户使用的设备接收文档来与用户交互;例如,通过向用户设备上的web浏览器发送web页面以响应从web浏览器收到的请求,或者通过与例如智能电话或电子平板电脑等的用户设备上运行的应用程序(app)进行交互。此外,计算机可以通过向个人设备(例如,运行消息收发应用程序的智能手机)轮流发送文本消息或其他形式的消息来并且从用户接收响应消息来与用户交互。本文使用与系统,装置和计算机程序组件有关的术语“配置为”。对于被配置为执行特定操作或动作的一个或多个计算机的系统,意味着系统已经在其上安装了在操作中使得系统执行该操作或动作的软件、固件、硬件或它们的组合。对于被配置为执行特定操作或动作的一个或多个计算机程序,意味着一个或多个程序包括被数据处理装置执行时促使该装置执行该操作或动作的指令。对于被配置为执行特定操作或动作的专用逻辑电路,意味着该电路具有执行所述操作或动作的电子逻辑。虽然本文包含许多具体实施细节,但是这些细节不应被解释为由权利要求本身限定的对要求保护的范围的限制,而是作为对特定实施例的具体特征的描述。在本文中单个实施例的上下文中描述的多个特征也可以在单个实施例中组合实现。相反,在单个实施方式的上下文中描述的各种特征也可以单独地或以任何合适的子组合在多个实施方式中实现。此外,尽管上面的特征可以描述为以某些组合起作用并且甚至最初如此要求保护,但是在一些情况下可以从要求保护的组合中删除该组合的一个或多个特征,并且可以要求保护指向子组合或子组合的变体。类似地,虽然以特定顺序在附图中描绘了操作并且在权利要求中叙述了操作,但是这不应该被理解为:为了达到期望的结果,要求以所示的特定顺序或依次执行这些操作,或者要求执行所有示出的操作。在某些情况下,多任务和并行处理可能是有利的。此外,上述实施例中的各种系统模块和组件的划分不应被理解为在所有实施例中都要求如此划分,而应当理解,所描述的程序组件和系统通常可以一起集成在单个软件产品中或打包成多个软件产品。已经描述了主题的特定实施方式。其他实施方式在以下权利要求的范围内。例如,权利要求书中记载的动作可以以不同的顺序执行并且仍然实现所期望的结果。作为一个示例,附图中描绘的处理无需要求所示的特定顺序或次序来实现期望的结果。在一些情况下,多任务和并行处理可能是有利的。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1