具体实施方式
本文描述了基于纠错码(ECC)处理用于存储的区块链数据的技术。这些技术通常涉及:接收用于对区块链的一个或多个区块执行纠错编码(ECC)的请求,基于从区块链网络的至少一个区块链节点接收的区块链数据获得所述一个或多个区块,并对所述一个或多个区块执行ECC以生成一个或多个编码区块,其中,所述一个或多个编码区块的编码率等于所述区块链网络所需的最小诚实区块链节点数和所述区块链网络的区块链节点的总数。
如本文所述,区块链网络可以存储不同类型的数据,例如状态数据、区块数据和索引数据。区块数据包括区块链网络中的所有交易,由于新区块不断被添加到区块链中,因此会占用大量存储空间。对于区块链节点来说,每个区块链节点存储所有区块数据、尤其是不经常被访问的区块(例如,很久以前添加到区块链中的区块),这可能是低效率的。因此,本文的实施例设定每个区块链节点存储区块中经常被访问的部分,并且当需要时从其他区块链节点检索剩余区块数据,以降低存储消耗。但是,如果区块链网络中存在故障节点或不可靠节点,则检索到的数据不能被信任,并且可能会发生数据丢失。
在一些实施例中,区块链节点可以执行ECC诸如纠删编码(erasure coding)以对不经常访问的区块进行编码。然后,可以将ECC编码区块划分为多个数据集。多个数据集可以被编入索引并分配给不同的区块链节点,以基于数据存储方案进行存储。当区块链节点需要来自不经常访问的区块的数据以执行智能合约时,区块链节点可以基于索引从其他区块链节点检索对应的数据集,以形成ECC编码区块并恢复原始区块。通过共享ECC编码区块,即使存在不可信数据或发生数据丢失,只要诚实的区块链节点的百分比大于或等于ECC的编码率,就可以恢复原始区块数据。
在一些实施例中,新区块链节点作为全节点被添加到区块链网络。新添加的全节点存储其他节点未共享的附加区块副本。所述附加区块副本可以在存储方面增加区块链网络的冗余。本文的实施例提供了对区块再次执行ECC并与其他区块链节点共享编码区块以降低存储消耗的技术。可以当CPU使用率低时由区块链节点再次执行ECC,以更好地利用计算资源。
本文中描述的技术产生若干技术效果。例如,本主题的实施例减轻了区块链网络的存储资源的负担,同时维持了区块链节点的计算效率和数据平等性。对于不经常访问的区块(例如,较旧的区块),可以通过在每个区块链节点上仅保存一部分纠错编码(ECC)编码区块(本文也称为编码区块)并当需要时从其他区块链节点检索所述编码区块的剩余区块来节省区块链节点的存储资源。
在一些实施例中,可以将ECC编码区块划分为多个数据集。区块链节点可以存储多个数据集的选择部分以及与剩余数据集相对应的哈希值。该选择可以基于区块链网络的区块链节点同意的数据存储方案。可以通过与ECC编码区块相关联的区块ID来索引多个数据集和哈希值。当区块链节点需要访问来自区块的数据时,它可以从其他区块链节点检索剩余数据集。所述区块链节点可以向其他区块链节点发送相应的哈希值,以检索剩余数据集。由于哈希值是不可逆的,因此区块链节点可以通过对接收的数据进行哈希处理并将该哈希值与本地存储的哈希值进行比较来验证接收的数据是否可信。这样,可以确保数据安全性并可以识别故障节点。即使区块链节点从故障区块链节点接收不可信数据,只要不可信数据的百分比小于或等于ECC允许的错误位或丢失位的最大比例,相应的区块可以被恢复。
在某些情况下,新区块链节点作为全节点被添加到区块链网络。新添加的全节点存储其他节点未共享的附加区块副本。所述附加区块副本在存储方面增加区块链网络的冗余。在这种情况下,对具有较高编码率的区块可以再次执行ECC,以降低冗余和存储消耗。可以当CPU使用率低时再次执行ECC,以便更好地利用计算资源。
为本文的实施例提供进一步的背景,如上所述,分布式账本系统(DLS),也可以称为共识网络(例如,由点对点(Peer-to-Peer)节点组成)和区块链网络,使参与实体能够安全且不可篡改地进行交易并存储数据。尽管术语“区块链”通常与特定网络和/或用例相关,但本文所使用的区块链一般指在不参考任何特定用例的情况下的DLS。
区块链是以交易是不可篡改的方式存储交易的数据结构。因此,记录在区块链上的交易是可靠和值得信赖的。区块链包括一个或多个区块。链中的每个区块通过包括紧邻其之前的前一区块的加密哈希值(cryptographic hash)链接到该前一区块。每个区块还包括时间戳、自身的加密哈希值以及一个或多个交易。已经由区块链网络的节点验证的交易经哈希处理并编码成默克尔(Merkle)树。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)和时间戳。
通常,PBFT提供容忍拜占庭故障(例如,故障节点、恶意节点)的实用拜占庭状态机复制。这通过在PBFT中假设将发生故障(例如,假设存在独立节点故障和/或由共识节点发送的操纵消息)而实现。在PBFT中,以包括主共识节点和备共识节点的序列提供共识节点。主共识节点被周期性地改变,通过区块链网络内的所有共识节点对区块链网络的全局状态达成一致,将交易添加到区块链中。在该处理中,消息在共识节点之间传输,并且每个共识节点证明消息是从指定的对等节点(peer node)接收的,并验证在传输期间消息未被修改。
在PBFT中,共识协议是在所有共识节点以相同的状态开始的情况下分多个阶段提供的。首先,客户端向主共识节点发送调用服务操作(例如,在区块链网络内执行交易)的请求。响应于接收到请求,主共识节点将请求多播到备共识节点。备共识节点执行请求,并且各自向客户端发送回复。客户端等待直到接收到阈值数量的回复。在一些示例中,客户端等待直到接收到f+1个回复,其中f是区块链网络内可以容忍的故障共识节点的最大数量。在PBFT中,故障共识节点的最大数量必须小于共识节点总数的1/3。最终结果是,足够数量的共识节点就将记录添加到区块链的顺序达成一致,并且该记录或被接受或被拒绝。
在一些区块链网络中,实施密码学来维护交易的隐私。例如,如果两个节点想要保持交易隐私,以使得区块链网络中的其他节点不能够看出交易的细节,则这两个节点可以对交易数据进行加密处理。加密处理的示例包括但不限于对称加密和非对称加密。对称加密是指使用单个密钥既进行加密(从明文生成密文)又进行解密(从密文生成明文)的加密过程。在对称加密中,同一密钥对于多个节点可用,因此每个节点都可以对交易数据进行加密/解密。
非对称加密使用密钥对,每个密钥对包括私钥和公钥,私钥仅对于相应节点是已知的,而公钥对于区块链网络中的任何或所有其他节点是已知的。节点可以使用另一个节点的公钥来加密数据,并且加密的数据可以使用其他节点的私钥被解密。例如,再次参考图2,参与者A可以使用参与者B的公钥来加密数据,并将加密的数据发送给参与者B。参与者B可以使用其私钥来解密该加密的数据(密文)并提取原始数据(明文)。使用节点的公钥加密的消息只能使用该节点的私钥解密。
非对称加密用于提供数字签名,这使得交易中的参与者能够确认交易中的其他参与者以及交易的有效性。例如,节点可以对消息进行数字签名,而另一个节点可以根据参与者A的该数字签名来确认该消息是由该节点发送的。数字签名也可以用于确保消息在传输过程中不被篡改。例如,再次参考图2,参与者A将向参与者B发送消息。参与者A生成该消息的哈希值,然后使用其私钥加密该哈希值以提供作为加密哈希值的数字签名。参与者A将该数字签名附加到该消息上,并将该具有数字签名的消息发送给参与者B。参与者B使用参与者A的公钥解密该数字签名,并提取哈希值。参与者B对该消息进行哈希处理并比较哈希值。如果哈希值相同,则参与者B可以确认该消息确实来自参与者A,且未被篡改。
图3描绘了根据本文的实施例的区块数据的编码和哈希处理300的示例。在此示例中,描绘了4个区块链节点的区块链网络,4个区块链节点是区块链节点302、304、306和308。以区块链节点302为例来说明编码和哈希处理300,区块链节点302可以将区块链网络的区块数据存储到区块312的区块体中。在所示的示例中,区块数据被存储在区块100中。之后,区块链节点302可以与其他区块链节点304、306和308一起参与共识处理。在共识处理中,区块链节点302可执行共识算法,例如工作量证明(PoW)或权益证明(PoS),以在区块链上创建相应的区块。
在一些实施例中,区块链节点302可以识别一个或多个不经常访问的区块。实际上,区块已经创建的时间越长,对应的区块数据为执行诸如智能合约的操作所需要的可能性就越小。当本地存储的区块是针对预定时间量已经在区块链上创建的历史区块时,区块链节点302可以确定本地存储的区块不常被访问。例如,预定时间量可以是创建区块的平均时间的一倍或两倍。在一些示例中,当区块中的区块数据在预定时间量内没有被检索用以执行智能合约时,该区块也可以被确定为不经常被访问。
在识别不经常访问的区块之后,区块链节点302可以对每个不经常被访问的区块的区块体中的区块数据执行ECC 314。通过向数据添加冗余位(也称为冗余),ECC可用于控制不可靠传输中的数据错误或丢失。冗余位可以是许多原始信息位的复杂函数。冗余使得数据的错误或丢失可以被纠正,而无需再次发送数据。原始信息可能会或可能不会真正地出现在编码输出中。编码输出中包括未修改的原始信息的ECC代码被称为系统ECC代码,而那些不包括的被称为非系统ECC代码。可以通过ECC纠正的错误或丢失位的最大比例由ECC代码的设计确定。因此,不同的纠错码用于不同的条件。通常,更强的ECC代码会引起更多的冗余,这会增加代码的存储消耗,并降低通信效率,如果要传输编码的信息的话。
ECC的一个示例可以是纠删编码。使用纠删编码,可以将k个符号的消息编码为具有n个符号的码字,其中k和n是自然数,并且k<n。该消息可以从n-符号码字的子集中被恢复。分数r=k/n是纠删码的编码率。
通过使用ECC,每个区块链节点可以存储一部分编码区块数据,并在需要时从其他区块链节点检索剩余的编码区块数据。在一些实施例中,可以当区块链节点302的计算资源的利用率低于预定值(例如40%)时执行ECC。这样,可以减少对区块链节点302上的其他计算操作的干扰。在一些实施例中,可以当区块链节点302的存储空间的使用率大于或等于预定百分比时执行ECC,使得在ECC之后,编码区块数据的某些部分可以被删除以释放存储空间。
再次以区块100为例,假设区块链节点302将区块100确定为不经常访问的区块并执行ECC 314,则ECC编码数据可以基于数据存储方案被划分为多个数据集。可以将数据存储方案提供为一组计算机可执行指令,这些指令定义了将数据存储在区块链网络中的位置和/或方式。在一些示例中,数据存储方案可以由具有权限证明的可信节点提供并由区块链节点同意。在一些示例中,数据存储方案可以由区块链节点通过共识来被同意。通常,数据存储方案可以包括一个或多个预定规则,用于基于区块链网络中的区块链节点的数量将编码数据划分为多个数据集。所述数据存储方案还可以包括要由每个区块链节点存储或进行哈希处理的多个数据集中的一个或多个数据集的分配。为了确保数据同等,数据存储方案可以包括要由区块链网络的每个区块链节点存储的至少一个数据集的分配。
在图3所示的示例中,区块100的编码区块数据被分为四个数据集,分别是Data1、Data2、Data3和Vdata1,每个数据集将由区块链节点302、304、306和308中的一个节点存储。Vdata1可以代表用于纠错的ECC的冗余位。根据数据存储方案,Data1经选择由区块链节点302存储。Data2、Data3和Vdata1经选择分别进行哈希处理316以分别产生哈希值Dhash2、Dhash3和Vhash1。根据本文的实施例,当区块链网络具有四个以上的节点时,可以将编码数据划分为四个以上数据集。在一些示例中,每个区块链节点可以存储一个以上数据集,并对分配给其他节点存储的剩余数据集进行哈希处理。
现在参考图4,图4描绘了根据本文的实施例的数据存储方案400的示例。如前所述,根据数据存储方案400,Data1经选择由区块链节点302存储。基于数据存储方案400,区块链节点304存储Data2并分别对Data1、Data3和Vdata1进行哈希处理以分别生成哈希值Dhash1、Dhash3和Vhash1。区块链节点306存储Data3并分别对Data1、Data2和Vdata1进行哈希处理,以分别生成哈希值Dhash1、Dhash2和Vhash1。区块链节点308存储Vdata1并分别对Data1、Data2和Data3进行哈希处理以分别生成哈希值Dhash1、Dhash2和Dhash3。
再次参考图3,因为哈希值对应于相同区块的编码数据集,所以它们可以通过该区块的区块ID被索引。例如,区块链节点302可以用区块ID 100索引与区块100相关联的Data1、Dhash1、Dhash2和Vhash1。这样,区块链节点302可以使用索引的区块ID将哈希值映射到其对应的区块。在图6的描述中讨论了索引数据集和哈希值的更详细的示例。
应当理解,根据数据存储方案,可以为区块链节点302、304、306和308做出其他数据存储方案。在一些示例中,可以将区块100的编码区块数据划分为四个以上数据集。应当理解,根据数据存储方案,可以为区块链节点502、504、506和508做出其他数据存储方案。
在生成并存储Dhash2、Dhash3和Vhash1之后,区块链节点302可以从存储中删除Data2、Data3和Vdata1以节省存储空间。这样,对于每个区块,区块链节点302仅存储一个ECC编码数据集(即,Data1)和三个哈希值(即,Dhash2、Dhash3和Vhash1),而不是整个区块。这样,可以大大减少存储空间。类似于区块100,可以对由区块链节点304、306和308存储的其他不经常访问的区块执行编码和哈希处理。
当区块链节点302确定执行智能合约需要区块100的区块数据时,它可以根据数据存储方案分别从区块链节点304、306和308检索Data2、Data3和Vdata1。为了从其他区块链节点304、306和308检索数据集,区块链节点302可以根据数据存储方案发送与将要检索的数据集相对应的哈希值。
例如,为了检索Data2,区块链节点302可以向区块链节点304发送Dhash2。如果区块链节点304存储有Data2,则其可以响应于接收Dhash2而将Data2发送回区块链节点302。接收到来自区块链节点304的Data2之后,区块链节点302可以对接收的数据集进行哈希处理,并比较哈希值与Dhash2。如果哈希值与Dhash2相同,则区块链节点302可以确定接收的数据集是可信的。否则,可以确定接收的数据集是不可信的。当接收的数据集被确定为不可信时,区块链节点302可以报告区块链节点304为故障节点(或拜占庭节点)。如果区块链节点302接收的不可信数据的百分比小于或等于可以由ECC校正的错误或丢失位的最大比例,则可以从本地存储和接收的数据集恢复区块100。
如上所述,区块链网络可以存储不同类型的数据,例如状态数据、区块数据和索引数据。状态数据通常存储为内容寻址状态树,例如MPT或固定深度默克尔树(FDMT)。内容寻址状态树本质上是增加的。即,通过添加新的树结构而不是仅更新现有状态树的值来反映账号状态的变化。因此,当将区块连续添加到区块链时,内容寻址状态树的大小会变得非常大。在FDMT存储方案下,状态数据可以被分为与当前区块关联的当前状态数据和与区块链的所有区块关联的历史状态数据。FDMT中的大多数数据是不经常使用的历史状态数据。就存储资源的使用而言,将所有历史状态数据存储在每个共识节点中可能效率很低。
在一些实施例中,类似于编码和共享区块数据,ECC诸如纠删编码可以用于编码历史状态数据。区块链网络中的每个共识节点仅存储部分历史状态数据,并从其他节点检索剩余的历史状态数据以减少存储消耗。通过共享ECC编码的历史状态数据而不是原始历史状态数据,即使存在不可信数据或发生数据丢失,只要不可信数据或数据丢失的百分比小于或等于能够由ECC纠正的错误或丢失位的最大比例,就可以恢复原始历史状态数据。
图5描绘了根据本文的实施例的区块数据的编码和哈希处理500的另一示例。在此示例中,描绘了4个区块链节点的区块链网络,4个区块链节点是区块链节点502、504、506和508。以区块链节点502为例来说明编码及哈希处理500,当新的区块数据被添加至区块512时,区块链节点502可执行ECC 514以对区块数据进行编码。与在图3的描述中讨论的编码和哈希处理300相比,当区块数据被写入区块时,区块链节点502对区块数据执行ECC。这样,区块链节点502不需要存储整个区块,而是可以基于数据存储方案存储ECC编码区块数据的选定部分和与剩余的编码区块数据相对应的哈希值。该编码和哈希处理500可以特别适合于区块链节点502具有低磁盘空间的情况。
在一些实施例中,代替将数据存储为区块,区块链节点502可以存储预写日志(WAL)文件或其他类似的前滚日志文件(roll-forward journal file)。预写日志文件可以记录已经被区块链节点502提交但尚未被存储的区块数据。使用预写日志文件,原始的区块链数据可以被保存在数据库文件中,而区块链数据的更改可以被写入单独的预写日志文件中。能够利用更改提交前滚,而无需写入原始区块链数据。这种安排允许在更改被提交至预写日志文件时继续进行区块链数据的操作。通过使用预写日志文件存储通过编码和哈希处理500进行的更改,区块链节点502可以指示其具有用于共识的区块数据,同时在适当的时候在后台执行ECC。这样,当区块链节点502的计算资源的利用率较低时可以执行ECC,以降低对对计算效率的影响或者共识处理的延时。
在一些实施例中,区块链节点502可以将区块数据存储在缓冲器中。当数据的大小大于预定阈值或当缓冲器已满时,区块链节点502可以对缓冲器中存储的区块数据执行ECC。在执行ECC之后,区块链节点502可以遵循编码和哈希处理500以存储编码区块数据和哈希值,如以下描述中所讨论的。
再次以区块100为例,在执行ECC之后,可以基于数据存储方案将编码区块数据划分为多个数据集。类似于图3的描述中讨论的示例,区块100的编码区块数据可以被分为四个数据集,分别是Data1、Data2、Data3和Vdata1,每个数据集将由区块链节点502、504、506和508中的一个节点存储。Vdata1可以代表ECC的冗余位。根据数据存储方案,Data1经选择由区块链节点502存储。Data2、Data3和Vdata1经选择分别进行哈希处理516以分别产生哈希值Dhash2、Dhash3和Vhash1。
哈希值可以通过哈希值的对应区块的区块ID被索引。例如,区块链节点502可以用区块ID 100索引与区块100相关联的Data1、Dhash1、Dhash2和Vhash1。这样,区块链节点502可以使用索引的区块ID将哈希值映射到其对应的区块。在图6的描述中讨论了索引数据集和哈希值的更详细的示例。
应当理解,根据数据存储方案,可以为一个或多个区块链节点502、504、506和508做出其他数据存储方案。例如,可以将区块100的编码区块数据划分为四个以上数据集。区块链节点502、504、506和508中的每一个可以存储一个以上数据集,并对其他节点存储的剩余数据集进行哈希处理。
在生成Dhash2、Dhash3和Vhash1之后,区块链节点502可以存储Data1、Dhash2、Dhash3和Vhash1并从存储中删除Data2、Data3和Vdata1以节省存储空间。这样,对于区块链中的每个区块,区块链节点502仅存储ECC编码区块数据的一个数据集(即,Data1)和三个哈希值(即,Dhash2、Dhash3和Vhash1),而不是存储原始区块数据,从而节省存储空间。当区块链节点502确定执行智能合约需要区块100的区块数据时,它可以根据数据存储方案分别从区块链节点504、506和508检索Data2、Data3和Vdata1。
为了从其他区块链节点504、506和508检索数据集,区块链节点502可以根据数据存储方案发送与将要检索的数据集相对应的哈希值。例如,为了检索Data2,区块链节点502可以向区块链节点504发送Dhash2。如果区块链节点504存储有Data2,则其可以响应于接收Dhash2而将Data2发送回区块链节点502。接收到来自区块链节点504的Data2之后,区块链节点502可以对接收的数据集进行哈希处理,并比较哈希值与Dhash2。如果哈希值与Dhash2相同,则区块链节点502可以确定接收的数据集是可信的。否则,接收的数据集可以被确定为不可信。当接收的数据集被确定为不可信时,区块链节点502可以报告区块链节点504为故障节点(或拜占庭节点)。如果区块链节点502接收的不可信数据的百分比小于或等于可以由ECC校正的错误或丢失位的最大比例,则可以从本地存储和接收的数据集恢复区块100。
如前所述,通过执行编码和哈希处理,区块链数据可以被ECC编码并被划分为多个数据集。为了节省存储空间,每个区块链节点可以基于数据存储方案存储多个数据集中的一个或多个以及剩余数据集的哈希值。存储的数据集和哈希值可以使用区块ID进行索引,以便区块链节点从其他节点检索数据集以恢复原始数据。
图6描绘了根据本文的实施例的向区块链网络添加区块链节点的示例600。如前所述,可以执行编码和哈希处理以有效降低区块链网络的存储消耗。在PBFT共识协议下,如果区块链节点总数由N表示,故障区块链节点的数量由f表示,则N>3f必须满足区块链网络是拜占庭容错的。例如,在4节点区块链网络中,在PBFT共识协议下,区块链网络可容忍的最大故障节点数为1。因此,如果区块链节点以不大于3/4的编码率(即原始数据的比例不超过总编码数据的3/4)对原始区块链数据(或原始数据)执行ECC,并且每个区块链节点存储1/4的编码区块链数据(或编码数据),即使区块链节点之一是故障节点,也可以恢复原始数据。冗余率可以定义为由区块链网络的区块链节点存储的编码数据和原始数据的总量除以原始数据的副本的量。在该示例中,由于没有区块链节点存储原始数据,因此冗余率是编码率(即编码数据量除以原始数据)的倒数,即4/3。
在所描绘的示例600中,假设当生成区块1至100时,在区块链网络中存在4个区块链节点,节点1、节点2、节点3和节点4。在PBFT共识协议下,区块链网络所需的最小诚实区块链节点数为3。如在图3和图5的描述中所讨论的,应用编码和哈希处理,可以以3/4的最大编码率对区块1至100分别进行编码。每个编码区块可以被划分为3个原始数据集和1个冗余位数据集,以由4个区块链节点存储。
在生成区块101期间,节点5作为全节点被添加到区块链网络中。也就是说,节点5存储区块1-100的整个副本,但是从生成区块101开始,节点5与4个现有区块链节点一起参与编码和哈希处理。假设在生成区块101-200期间,区块链网络有5个区块链节点,那么在PBFT共识协议下,区块链网络所需的最小诚实区块链节点数为4。这样,可以以4/5的最大编码率对区块101-200分别进行编码。每个编码区块可以划分为4个原始数据集和1个冗余位数据集,以由区块链网络中的5个区块链节点存储。
在生成区块201期间,节点6作为全节点被添加到区块链网络中。也就是说,节点6存储区块1-200的整个副本,但是自区块201生成以来,节点6与区块链网络的其他区块链节点一起参与编码和哈希处理。假设在生成区块201-300期间,区块链网络有6个区块链节点,那么在PBFT共识协议下,区块链网络所需的最小诚实区块链节点数为5。这样,可以以5/6的最大编码率对区块201-300分别进行编码。每个编码区块可以划分为4个原始数据集和2个冗余位数据集,以由区块链网络中的6个区块链节点存储。
在生成区块301期间,节点7作为全节点被添加到区块链网络中。也就是说,节点7存储区块1-300的整个副本,但是自区块301生成以来,节点7与区块链网络的其他区块链节点一起参与编码和哈希处理。假设在生成区块301-400期间,区块链网络有7个区块链节点,那么在PBFT共识协议下,区块链网络所需的最小诚实区块链节点数为5。这样,可以以5/7的最大编码率对区块301-400分别进行编码。每个编码区块可以划分为5个原始数据集和2个冗余位数据集,以由区块链网络中的7个区块链节点存储。
在生成区块401期间,节点8作为全节点被添加到区块链网络中。也就是说,节点8存储区块1-400的整个副本,但是自区块401生成以来,节点8与区块链网络的其他区块链节点一起参与编码和哈希处理。假设在生成区块401-500期间,区块链网络有8个区块链节点,那么在PBFT共识协议下,区块链网络所需的最小诚实区块链节点数为6。这样,可以以3/4的最大编码率对区块401-500分别进行编码。每个编码区块可以划分为6个原始数据集和2个冗余位数据集,以由区块链网络中的8个区块链节点存储。
在生成区块501期间,节点9作为全节点被添加到区块链网络中。也就是说,节点9存储区块1-500的整个副本,但是自区块501生成以来,节点9与区块链网络的其他区块链节点一起参与编码和哈希处理。
区块ID |
冗余率 |
容错能力 |
1-100 |
5+(3+1)/3 |
6/9 |
101–200 |
4+(4+1)/4 |
5/9 |
201–300 |
3+(5+1)/5 |
4/9 |
301–400 |
2+(5+2)/5 |
4/9 |
401–500 |
1+(6+2)/6 |
3/9 |
表1
表1显示了根据上述示例600的具有9个区块链节点的区块链网络下的区块1-500的冗余率和容错能力。节点1、2、3和4存储从ECC编码区块1-100划分的数据集。节点5、6、7、8和9存储原始区块1-100。由于用于编码区块1-100的编码率为3/4,因此节点1、2、3和4存储原始区块的4/3副本。节点5、6、7、8和9各自存储原始区块的一个副本。因此,存储区块1-100的冗余率为5+4/3。容错能力是区块链网络可以容忍的故障区块链节点的比例。由于节点5、6、7、8和9存储原始区块1-100,只要它们中的任何一个是诚实区块链节点,它就可以将原始区块提供给区块链网络的其他区块链节点。如果节点5、6、7、8和9均为故障区块链节点,则存储数据集的节点1、2、3和4中的3个节点必须是诚实节点才能恢复原始区块的副本。因此,9个区块链节点中最多6个节点可以是故障区块链节点。容错能力为2/3。
对于区块101-200,节点1、2、3、4和5存储从ECC编码区块101-200划分的数据集。节点6、7、8和9存储原始区块。由于用于编码区块101-200的编码率为4/5,因此节点1、2、3、4和5存储原始区块的5/4副本。节点6、7、8和9各自存储原始区块的一个副本。因此,存储区块101-200的冗余率为4+5/4。9个区块链节点中最多5个节点可以是故障区块链节点。容错能力为5/9。
对于区块201至300,节点1、2、3、4、5和6存储从ECC编码区块201-300划分的数据集。节点7、8和9存储原始区块。由于用于编码区块201-300的编码率为2/3,因此节点1、2、3、4、5和6存储原始区块的6/5副本。节点7、8和9各自存储原始区块的一个副本。因此,存储区块201-300的冗余率为3+6/5。9个区块链节点中最多4个节点可以是故障区块链节点。容错能力为4/9。
对于区块301至400,节点1、2、3、4、5、6和7存储从ECC编码区块301-400划分的数据集。节点8和9存储原始区块。由于用于编码区块301-400的编码率为5/7,因此节点1、2、3、4、5、6和7存储原始区块的7/5副本。节点8和9各自存储原始区块的一个副本。因此,存储区块301-400的冗余率为2+7/5。9个区块链节点中最多4个节点可以是故障区块链节点。容错能力为4/9。
对于区块401-500,节点1、2、3、4、5、6、7和8存储从ECC编码区块301-400划分的数据集。节点9存储原始区块。由于用于编码区块401-500的编码率为3/4,因此节点1、2、3、4、5、6、7和8存储原始区块的4/3副本。节点9存储原始区块的一个副本。因此,存储区块401-500的冗余率为1+7/5。9个区块链节点中最多3个节点可以是故障区块链节点。容错能力为1/3。
如果区块链节点同意对区块1-500再次执行ECC编码,则由于9个区块链节点的区块链网络可容忍的最大故障区块链节点数为2,ECC的最大编码率为7/9。执行编码和哈希处理之后,容错能力降低到2/9。另一方面,冗余率降低到9/7,这显著低于再次执行该处理之前的冗余率。因此,当将原始区块存储在至少一个区块链节点中时,再次执行编码和哈希处理可有效降低系统的冗余率和存储消耗。
在一些情况下,区块链节点可以确定其存储的区块链数据超过预定数据量阈值。在这种情况下,区块链节点可以向其他区块链节点发起请求,以对一个或多个区块再次执行编码和哈希处理,以降低区块链网络的冗余率。在一些情况下,诸如响应于确定区块链网络的冗余率大于预定阈值,用于再次执行编码和哈希处理的请求可以由区块链网络外部的可信节点发起。例如,对于如示例600所示的具有9个区块链节点的区块链网络,PBFT协议下的最小冗余率是9/7。当一个或多个区块的冗余率超过2时,可信节点可以发起请求。在一些实施例中,所述区块可以基于它们的冗余率被选择以再次执行编码和哈希处理。由于存储上节省更多,具有较高冗余率的区块可以以较高优先级被选择。
用于再次执行编码和哈希处理的请求可以包括用于执行ECC的最大编码率,该最大编码率考虑了可容忍的最大故障区块链节点数(即,f/(3f+1))。所述请求还可以包括将一个或多个编码区块中的每个编码区块划分为多个数据集并将多个数据集分配给区块链网络的区块链节点的指令。例如,所述指令可以指示将每个编码区块划分为九个数据集,每个数据集被分配给9个区块链节点之一。在某些情况下,所述指令由在图3至图5的描述中所讨论的数据存储方案提供。
如果所述请求是由区块链节点发起的,则区块链网络可以根据所述请求中包括的指令完成PBFT算法的三个阶段处理(预准备、准备和提交阶段)以达成再次执行ECC的共识。发起所述请求的区块链节点可以充当用于执行PBFT算法的主区块链节点。任何接收所述请求的区块链节点都可以从主区块链节点中识别并检索一个或多个区块。
如果接收到来自具有权限证明的可信节点的所述请求,则区块链节点还可以根据所述指令直接再次执行ECC。在这种情况下,所述请求还可包括识别存储一个或多个区块的至少一个区块链节点的标识。然后,接收所述请求的区块链节点可以基于所述请求识别存储所述一个或多个区块的区块链网络的至少一个区块链节点,并从至少一个区块链节点之一中检索一个或多个区块。
为了检索一个或多个区块,区块链节点可以向至少一个区块链节点之一发送一个或多个区块的哈希值。在一些示例中,哈希值被存储在区块链的区块头中。在接收一个或多个区块之后,区块链节点可以通过比较接收的一个或多个区块的哈希值与其发送的对应哈希值来确定接收的一个或多个区块是否是经认证的。如果哈希值相同,则可以确定接收的一个或多个区块是可信的。否则,区块链节点可以报告从其接收一个或多个区块的区块链节点为故障节点。
然后,区块链节点可以基于该请求中提供的编码率执行一个或多个区块的ECC,以生成一个或多个编码区块。在图6所示的示例中,对于一个或多个编码区块中的每个编码区块,区块链节点可以根据指令将编码区块划分为九个数据集,并根据指令存储分配给区块链节点的九个数据集中的至少一个数据集。然后,区块链节点可以对多个数据集中的剩余八个数据集进行哈希处理,以生成与剩余八个数据集相对应的哈希值,存储哈希值,并删除一个或多个区块。此后,一个或多个区块的编码和哈希处理便完成。
对于所有可用区块完成编码和哈希处理之后,如果区块链网络的冗余率仍然超过预定数据存储阈值,或者区块链节点的存储消耗大于预定数据存储阈值,则区块链节点可以通知其他区块链节点响应于要添加到区块链网络的新区块链节点而触发另一轮编码和哈希处理。例如,如果在添加节点9之前8个区块链节点对区块1-400执行编码和哈希处理,并且区块链节点的存储消耗仍大于节点8的存储容量的90%,则节点8可以向节点1-7发送通知,以对添加节点8之后生成的区块执行另一轮编码和哈希处理。
图7描绘了可以根据本文的实施例执行的处理700的示例。为了方便起见,将处理700描述为由区块链节点执行。区块链节点可以是位于一个或多个位置并根据本文被适当编程的计算机或者是一台或多台计算机的系统。例如,区块链节点可以是计算系统(例如,图1的计算系统106、108)中的计算设备,其被适当地编程,可以执行处理700。
在702,区块链节点接收用于对区块链的一个或多个区块执行ECC的请求。在某些情况下,该请求包括编码率和指令,该指令用于将一个或多个编码区块分别划分为多个数据集,并将该多个数据集分配给区块链网络的区块链节点。
在704,区块链节点基于从区块链网络的至少一个区块链节点接收的区块链数据获得一个或多个区块。在某些情况下,从至少一个区块链节点接收的区块链数据是从所述一个或多个区块的ECC编码版本划分的多个数据集,并且区块链节点通过以下步骤获得所述一个或多个区块:识别在区块链节点中本地存储的从所述一个或多个区块的ECC编码版本划分的一个或多个数据集,并基于本地存储的一个或多个数据集以及从至少一个区块链节点接收的多个数据集,对所述一个或多个区块进行解码。
在一些情况下,所述至少一个区块链节点是至少一个全区块链节点,并且所述区块链节点通过从所述至少一个全区块链节点检索所述一个或多个区块来获得所述一个或多个区块。
在706,区块链节点对一个或多个区块执行ECC以生成一个或多个编码区块,其中,一个或多个编码区块的编码率等于区块链网络所需的最小诚实区块链节点数和区块链网络的区块链节点的总数。
在一些情况下,所述一个或多个区块是一个或多个第一区块,并且检索一个或多个第一区块还包括:向至少一个全区块链节点发送一个或多个第一区块的哈希值,从至少一个全区块链节点接收一个或多个第二区块,以及如果一个或多个第二区块的哈希值与一个或多个第一区块的哈希值相同,则确定一个或多个第二区块是可信的。
在一些情况下,对于一个或多个编码区块中的每个编码区块,所述区块链节点可以进一步根据指令将编码区块划分为多个数据集,并根据指令存储分配给区块链节点的多个数据集中的至少一个数据集。
在一些情况下,所述区块链节点可以进一步:对除分配给所述区块链节点的多个数据集中的至少一个数据集之外的所述多个数据集的剩余部分进行哈希处理,以生成与所述多个数据集的剩余部分相对应的哈希值;存储哈希值;并删除所述一个或多个区块以及所述多个数据集的剩余部分。
在一些情况下,所述请求是第一请求,并且所述一个或多个编码区块是一个或多个第一编码区块,所述区块链节点可以进一步:响应于存储一个或多个区块的新区块链节点被添加到区块链网络中,接收用于对区块链的一个或多个区块执行ECC的第二请求;从新区块链节点检索一个或多个区块;以及对一个或多个区块执行ECC以生成一个或多个第二编码区块,其中,一个或多个第二编码区块的编码率等于所述区块链网络所需的最小诚实区块链节点数和添加所述新区块链节点后的区块链节点的总数。
在一些情况下,新区块链节点是存储区块链的副本的全节点。在一些情况下,当所述区块链节点的计算资源的利用率小于或等于预定值时,执行ECC。在某些情况下,ECC是通过向一个或多个区块添加冗余位来执行的纠删编码。
图8是根据本文的实施例的装置800的模块的示例的图。装置800可以是被配置为存储和处理区块链数据的区块链节点的实施例的示例。装置800可以对应于上述实施例,装置800包括以下:接收模块802,接收用于对区块链的一个或多个区块执行ECC的请求;获得模块804,基于从区块链网络的至少一个区块链节点接收的区块链数据,获得该一个或多个区块;和编码模块806,对该一个或多个区块执行ECC以生成一个或多个编码区块,其中,一个或多个编码区块的编码率等于区块链网络所需的最小诚实区块链节点数和区块链网络的区块链节点的总数。
在一些实施例中,从至少一个区块链节点接收的区块链数据是从一个或多个区块的ECC编码版本划分的多个数据集,并且获得模块804还执行:识别在区块链节点中本地存储的从一个或多个区块的ECC编码版本划分的一个或多个数据集;并基于本地存储的一个或多个数据集以及从至少一个区块链节点接收的多个数据集,对一个或多个区块进行解码。
在一些实施例中,至少一个区块链节点是至少一个全区块链节点,并且获得模块还执行从至少一个全区块链节点检索一个或多个区块。
在一些实施例中,所述一个或多个区块是一个或多个第一区块,并且检索一个或多个第一区块还包括:向至少一个全区块链节点发送一个或多个第一区块的哈希值;从至少一个全区块链节点接收一个或多个第二区块;以及如果一个或多个第二区块的哈希值与一个或多个第一区块的哈希值相同,则确定一个或多个第二区块是可信的。
在一些实施例中,所述请求包括编码率和指令,该指令用于将一个或多个编码区块分别划分为多个数据集,并将所述多个数据集分配给所述区块链网络的区块链节点。
在一些实施例中,对于一个或多个编码区块中的每个编码区块,装置800还包括:划分子模块,用于根据指令将编码区块划分为多个数据集;以及存储子模块,用于根据指令存储分配给区块链节点的多个数据集中的至少一个数据集。
在一些实施例中,装置800还包括哈希处理子模块,用于对除分配给区块链节点的多个数据集中的至少一个数据集之外的多个数据集的剩余部分进行哈希处理,以生成与所述多个数据集的剩余部分相对应的哈希值;存储子模块,用于存储哈希值;和删除子模块,用于删除一个或多个区块以及所述多个数据集的剩余部分。
在一些实施例中,所述请求是第一请求,并且所述一个或多个编码区块是一个或多个第一编码区块,所述接收模块802还响应于存储一个或多个区块的新区块链节点被添加到区块链网络中,接收用于对区块链的一个或多个区块执行ECC的第二请求;所述检索子模块还从新区块链节点检索一个或多个区块;以及编码模块806还对一个或多个区块执行ECC以生成一个或多个第二编码区块,其中,一个或多个第二编码区块的编码率等于所述区块链网络所需的最小诚实区块链节点数和添加所述新区块链节点后的区块链节点的总数。
在一些实施例中,新区块链节点是存储区块链的副本的全节点。在一些实施例中,当所述区块链节点的计算资源的利用率小于或等于预定值时,执行ECC。在一些实施例中,ECC是通过向一个或多个区块添加冗余位来执行的纠删编码。
在先前实施中示出的系统、装置、模块或单元可以通过使用计算机芯片或实体来实现,或者可以通过使用具有特定功能的产品来实现。典型的实施例设备是计算机,计算机可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件接收和发送设备、游戏控制台、平板电脑、可穿戴设备或这些设备的任意组合。
对于装置中每个模块的功能和角色的实施例过程,可以参考前一方法中相应步骤的实施例过程。为了简单起见,这里省略了细节。
由于装置实施例基本上与方法实施例相对应,因此对于相关部分,可以参考方法实施例中的相关描述。前述装置实施例仅仅是示例。被描述为单独部分的模块可以是或可以不是物理上分离的,并且显示为模块的部分可以是或可以不是物理模块,可以位于一个位置,或者可以分布在多个网络模块上。可以基于实际需求来选择一些或所有模块,以实现本文方案的目标。本领域普通技术人员在无需付出创造性努力的情况下就能理解和实现本申请的实施例。
再次参考图8,可以解释为示出了内部功能模块和区块链节点的结构。本质上,执行主体可以是电子设备,该电子设备包括:一个或多个处理器;被配置为存储一个或多个处理器的可执行指令的一个或多个计算机可读存储器。在一些实施例中,一个或多个计算机可读存储器耦接至一个或多个处理器且其上存储有编程指令,所述编程指令能够由所述一个或多个处理器执行以执行如本文中所述的算法、方法、函数、处理、流程和程序。本文还提供了耦接至一个或多个处理器并且其上存储有指令的一个或多个非暂时性计算机可读存储介质,当所述指令由所述一个或多个处理器执行时,所述指令将促使所述一个或多个处理器按照本文提供的方法的实施例执行操作。
本文还提供了用于实施本文提供的所述方法的系统。所述系统包括一个或多个处理器以及耦接到所述一个或多个处理器并且其上存储有指令的计算机可读存储介质,当所述指令由所述一个或多个处理器执行时,所述指令将促使所述一个或多个处理器按照本文提供的方法的实施例执行操作。
本文中描述的主题、动作和操作的实施例可以在数字电子电路中、有形体现的计算机软件或固件中、包括本文中公开的结构及其结构等同物的计算机硬件中,或者它们中的一个或多个的组合中实现。本文中描述的主题的实施例可以实现为一个或多个计算机程序,例如,一个或多个计算机程序指令模块,编码在计算机程序载体上,用于由数据处理装置执行或控制数据处理的操作。例如,计算机程序载体可以包括具有编码在其上或存储在其上的指令的一个或多个计算机可读存储介质。载体可以是有形的非暂态计算机可读介质,例如磁盘、磁光盘或光盘、固态驱动器、随机存取存储器(RAM)、只读存储器(ROM)或其他介质类型。可选地或附加地,载体可以是人工生成的传播信号,例如,机器生成的电、光或电磁信号,其被生成为对信息进行编码用于传输到合适的接收器装置以供数据处理装置执行。计算机存储介质可以是或可以部分是机器可读存储设备、机器可读存储基板、随机或串行存取存储器设备或它们中的一个或多个的组合。计算机存储介质不是传播信号。
计算机程序也可以被称为或描述为程序、软件、软件应用程序、app、模块、软件模块、引擎、脚本或代码,可以以任何形式的编程语言编写,包括编译或解释语言、说明或程序性语言;它可以被配置为任何形式,包括作为独立程序,或者作为模块、组件、引擎、子程序或适合在计算环境中执行的其他单元,该环境可以包括由数据通信网络互连的在一个或多个位置的一台或多台计算机。
计算机程序可以但非必须对应于文件系统中的文件。计算机程序可以存储在:保存其他程序或数据的文件的一部分中,例如,存储在标记语言文档中的一个或多个脚本;专用于所讨论的程序的单个文件;或者多个协调文件,例如,存储一个或多个模块、子程序或代码部分的多个文件。
举例来说,用于执行计算机程序的处理器包括通用和专用微处理器,以及任何类型的数字计算机的任何一个或多个处理器。通常,处理器将从耦接到处理器的非暂态计算机可读介质接收用于执行的计算机程序的指令并且接收数据。
术语“数据处理装置”包括用于处理数据的所有类型的装置、设备和机器,包括例如可编程处理器、计算机或多个处理器或计算机。数据处理装置可以包括例如FPGA(现场可编程门阵列),ASIC(专用集成电路)或GPU(图形处理单元)的专用逻辑电路。除了硬件,该装置还可以包括为计算机程序创建执行环境的代码,例如,构成处理器固件、协议栈、数据库管理系统、操作系统、或者它们中的一个或多个的组合的代码。
本文中描述的处理和逻辑流程可以由一台或多台计算机或处理器执行一个或多个计算机程序进行,以通过对输入数据进行运算并生成输出来执行操作。过程和逻辑流程也可以由例如FPGA、ASIC或GPU等的专用逻辑电路或专用逻辑电路与一个或多个编程计算机的组合来执行。
适合于执行计算机程序的计算机可以基于通用和/或专用微处理器,或任何其他种类的中央处理单元。通常,中央处理单元将从只读存储器和/或随机存取存储器接收指令和数据。计算机的元件可以包括用于执行指令的中央处理单元和用于存储指令和数据的一个或多个存储设备。中央处理单元和存储器可补充有专用逻辑电路或集成在专用逻辑电路中。
通常,计算机还将包括或可操作地耦接为从一个或多个存储设备接收数据或将数据传输到一个或多个存储设备。存储设备可以是例如磁盘、磁光盘或光盘、固态驱动器或任何其他类型的非暂态计算机可读介质。然而,计算机不需要具有这样的设备。因此,计算机可以耦接到本地和/或远程的例如一个或多个存储器的一个或多个存储设备。例如,计算机可以包括作为计算机的集成组件的一个或多个本地存储器,或者计算机可以耦接到云网络中的一个或多个远程存储器。此外,计算机可以嵌入在另一个设备中,例如移动电话,个人数字助理(PDA),移动音频或视频播放器,游戏控制台,全球定位系统(GPS)接收器或例如通用串行总线(USB)闪存驱动器的便携式存储设备,仅举几例。
组件可以通过诸如直接地连接、或经由一个或多个中间组件彼此电学连接或光学连接可通信地连接而彼此“耦接”。如果其中一个组件被集成到另一个组件中,组件也可以彼此“耦接”。例如,集成到处理器中的存储组件(例如,L2高速缓存组件)“耦接到”处理器。
为了提供与用户的交互,本文中所描述的主题的实施例可以在计算机上实现或配置为与该计算机通信,该计算机具有:显示设备,例如,LCD(液晶显示器)监视器,用于向用户显示信息;以及输入设备,用户可以通过该输入设备向该计算机提供输入,例如键盘和例如鼠标、轨迹球或触摸板等的指针设备。其他类型的设备也可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的感觉反馈,例如视觉反馈、听觉反馈或触觉反馈;并且可以接收来自用户的任何形式的输入,包括声音、语音或触觉输入。此外,计算机可以通过向用户使用的设备发送文档和从用户使用的设备接收文档来与用户交互;例如,通过响应于从用户设备上的web浏览器收到的请求,向web浏览器发送web页面,或者通过与例如智能电话或电子平板电脑等的用户设备上运行的应用程序(app)进行交互。此外,计算机可以通过向个人设备(例如,运行消息应用的智能手机)发送文本消息或其他形式的消息并作为回应接收来自用户的响应消息来与用户交互。
本文使用与系统,装置和计算机程序组件有关的术语“配置为”。对于被配置为执行特定操作或动作的一个或多个计算机的系统,意味着系统已经在其上安装了在运行中促使该系统执行所述操作或动作的软件、固件、硬件或它们的组合。对于被配置为执行特定操作或动作的一个或多个计算机程序,意味着一个或多个程序包括当被数据处理装置执行时促使该装置执行所述操作或动作的指令。对于被配置为执行特定操作或动作的专用逻辑电路,意味着该电路具有执行所述操作或动作的电子逻辑。
尽管本文包含许多具体实施例细节,但这些不应被解释为对由权利要求书本身限定的请求保护的范围的限制,而是作为对特定实施例的具体特征的描述。在本文单独实施例的上下文中描述的某些特征也可以在单个实施例中组合实现。相反,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合在多个实施例中实现。此外,尽管上面的特征可以被描述为以某些组合起作用并且甚至最初被如此请求保护,但是在一些情况下,可以从请求保护的组合中删除来自该组合的一个或多个特征,并且权利要求书可以涉及子组合或子组合的变体。
类似地,虽然以特定顺序在附图中描绘了操作并且在权利要求书中叙述了操作,但是这不应该被理解为:为了达到期望的结果,要求以所示的特定顺序或序列顺序执行这些操作,或者要求执行所有示出的操作。在某些情况下,多任务和并行处理可能是有利的。此外,上述实施例中的各种系统模块和组件的划分不应被理解为所有实施例中都要求如此划分,而是应当理解,所描述的程序组件和系统通常可以一起集成在单个软件产品中或打包成多个软件产品。
已经描述了主题的特定实施例。其他实施例在以下权利要求书的范围内。例如,权利要求书中记载的动作可以以不同的顺序执行并且仍然实现期望的结果。作为一个示例,附图中描绘的过程无需要求所示的特定顺序或序列顺序来实现期望的结果。在一些情况下,多任务和并行处理可能是有利的。