本公开针对用于存储二进制大对象的方法、系统和技术。
背景技术:
区块链是分布在计算机节点上并且本质上可以抵抗损坏和篡改的数据库和/或应用程序执行引擎。尽管最初用于比特币,但是区块链的应用范围远远超出了比特币和整个金融服务行业。
技术实现要素:
根据第一方面,提供了一种用于存储二进制大对象的方法,该方法包括:在组成第一区块链的一部分的第一节点处接收二进制大对象;以及哈希二进制大对象;从第一节点向组成第一区块链的一部分的至少一个其他节点发送二进制大对象,而无需使用第一区块链,其中,发送包括将二进制大对象散布到至少达成共识所需的第一区块链上的多个节点的一部分;在将二进制大对象已经散布到至少达成共识所需的第一区块链上的多个节点数后,将二进制大对象的哈希存储在第一区块链上。
在第一区块链上存储二进制大对象的哈希可以包括:在至少达成共识所需的第一区块链上的多个节点中的每个节点处:接收所提出的二进制大对象的哈希;确定已散布到节点的二进制大对象的哈希;确定所提出的哈希是否等同于已散布到节点的二进制大对象的哈希;如果所提出的哈希等同于已散布到节点的二进制大对象的哈希则仅投票以将所提出的哈希存储在第一区块链上。
该方法还可以包括:在至少达成共识所需的第一区块链上的多个节点中的每个节点处:将已散布到节点的二进制大对象标记为临时文件;以及当所提出的哈希等同于已散布到节点的二进制大对象的哈希时,将作为临时文件的已散布到节点的二进制大对象标记为非临时文件。
该方法可以进一步包括:在第一节点处接收二进制大对象的路径;以及在已经将二进制大对象散布到至少达成共识所需的第一区块链上的多个节点之后,将二进制大对象的路径存储在第一区块链上。
该方法还可以包括:在将路径存储在第一区块链上之前,在至少达成共识所需的第一区块链上的多个节点中的每个节点处:接收所提出的二进制大对象的路径;确定所提出的路径是否有效;如果所提出的路径有效则仅投票以将所提出的路径存储在第一区块链上。
该方法还可以包括:从第一区块链向第二区块链发送二进制大对象的哈希;将二进制大对象的哈希存储在第二区块链上;在组成第一区块链的一部分的第一节点处从组成括第二区块链的一部分的第二节点处接收二进制大对象的哈希,而无需使用第一或第二区块链;在接收到二进制大对象的哈希后,确定二进制大对象的哈希是否已经发送到第二区块链;当二进制大对象的哈希已经发送到第二区块链时,将二进制大对象从第一节点发送到第二节点,而无需使用第一区块链或第二区块链。
从第一区块链向第二区块链发送二进制大对象的哈希包括从第一区块链向第二区块链发送:世系验证数据,其允许第二区块链验证第一区块链的至少一个区块的世系;使用至少一个区块存储的所有非报头数据的适当子集,其中,所有非报头数据的适当子集包括二进制大对象的哈希;以及有效性验证数据,其允许第二区块链验证从第一区块链发送到第二区块链的所有非报头数据的适当子集的有效性。
根据另一方面,提供了一种用于存储二进制大对象的方法,该方法包括:在第二节点处从第一节点接收二进制大对象,其中第一和第二节点中的每一个都组成第一区块链的一部分,并且在第二节点处接收二进制大对象,而无需使用第一区块链;在接收到整个二进制大对象之后,确定在第二节点处从第一节点接收到的二进制大对象的哈希;接收所提出的二进制大对象的哈希;确定所提出的哈希是否等同于在第二节点处从第一节点接收到的二进制大对象的哈希;如果所提出的哈希等同于在第二个节点处从第一节点接收到的二进制大对象的哈希则仅投票以将所提出的哈希存储在第一区块链上。
该方法还可以包括:将已散布到节点的二进制大对象标记为临时文件;以及当所提出的哈希等同于已散布到节点的二进制大对象的哈希时,将作为临时文件的已散布到节点的二进制大对象标记为非临时文件。
该方法可以进一步包括:接收所提出的二进制大对象的路径;以及确定所提出的路径是否有效;如果所提出的路径有效则仅投票以将所提出的路径存储在第一区块链上。
该方法可以进一步包括:在包括第二节点的第二区块链处从包括第一节点的第一区块链接收二进制大对象的哈希;将二进制大对象的哈希存储在第二区块链上;从第二节点向第一节点发送二进制大对象的哈希,而无需使用第一或第二区块链;从第一节点到第二节点接收二进制大对象,而无需使用第一或第二区块链。
在第二区块链处从第一区块链接收二进制大对象的哈希包括:在第二个区块链处从第一区块链接收:世系验证数据,其允许现有区块链验证第一区块链的至少一个区块的世系;使用至少一个区块存储的所有非报头数据的适当子集,其中,所有非报头数据的适当子集包括二进制大对象的哈希;有效性验证数据,其允许第二区块链验证从第一区块链发送到第二区块链的所有非报头数据的适当子集的有效性;使用世系验证数据来验证第一区块链的至少一个区块的世系;使用有效性验证数据来验证所有非报头数据的适当子集的有效性;向第二区块链中添加新区块,其中,新区块用于存储从第一区块链接收到的世系验证数据、所有非报头数据的恰当子集以及有效性验证数据。
根据另一方面,提供了一种用于存储二进制大对象的系统,该系统包括:用于与组成第一区块链的一部分的另一节点对接的网络接口硬件;在其上已经存储有第一区块链并用于存储二进制大对象的数据存储;以通信方式耦合到数据存储和网络接口硬件的处理器;以及通信地耦合到处理器并且在其上已经存储了计算机程序代码的存储器,计算机程序代码可由处理器执行,并且当由处理器执行时使处理器执行前述方面中任一项的方法及其适当的组合。
根据另一方面,提供了一种非暂时性计算机可读介质,在其上已经存储了可由处理器执行的计算机程序代码,并且计算机程序代码在由处理器执行时使处理器执行前述方面中任一项的方法及其适当的组合。
本发明内容不一定描述所有方面的整个范围。通过阅读以下对具体实施例的描述,其他方面、特征和优点对于本领域普通技术人员将是显而易见的。
附图说明
在说明一个或多个示例实施方式的附图中:
图1描绘了根据一个示例实施方式的用于促进区块链之间的数据传输的系统。
图2描绘了组成图1的系统的一部分的软件栈。
图3描绘了用于图1的系统的物理网络拓扑。
图4描绘了示出了根据图1的系统,使用归约器来执行动作以影响系统状态以及针对区块链达成共识的的流程图。
图5a和5b描绘了示出了根据图1的系统,两个区块链如何执行读联接的uml序列图。
图6描绘了示出了根据图1的系统,两个区块链如何执行写联接的框图。
图7a至7c描绘了示出了根据图6的框图,两个区块链如何执行写联接的uml序列图。
图8a描绘了根据另一示例实施方式的用于促进区块链之间的数据传输的系统。
图8b描绘了根据图8b的系统的管理程序和在其上运行的各种区块链的框图。
图9描绘了根据另一示例实施例的用于存储二进制大对象的方法。
图10描绘了根据另一示例实施例的用于从组成第一区块链的一部分的节点向组成第二区块链的一部分的节点发送二进制大对象的方法。
具体实施方式
区块链的物理层包括其上共同存储分布式数据库的计算机节点。该数据库被存储为一般线性的“区块”的链,链中的每个随后的区块以加密安全的方式直接链接到链中紧接在前面的区块。添加到区块链的新区块被称为在区块链中比在它之前添加到区块链中的区块“更高”。区块链中的第一或最低区块被称为“创世区块”。因为区块链中的每个区块直接链接到其紧接在前面的区块,所以区块链中的任何区块都可以直接或间接地被追溯到创世区块。这是一种任何一个节点都能够检查区块链的有效性的方式。
区块链可以通过多种方式实现。在一个用于比特币的区块链的示例实现中,区块链的每个区块包括那个区块的大小,以字节为单位;区块报头;交易计数器,表示存储在那个区块中的不同比特币交易的数量;以及交易数据,其是存储的交易。在相同的示例实现中,每个区块的区块报头包括版本信息;前一个区块哈希,其是对紧接在那个区块前面的区块的哈希的引用;merkle根,其是存储在那个区块中的交易的merkle根的哈希;时间戳,其是创建区块的时间;难度目标,其是在区块创建期间执行工作量证明操作时必须满足的最小难度;以及由工作量证明产生的随机数(nounce)。
在传统的区块链实现中,组成区块链一部分的不同节点通过执行至少满足每个新区块报头中指定的难度目标的工作量证明操作来竞争生成新区块。一旦生成,新区块就通过使用前一个区块哈希(以确认那个新区块的世系)和merkle根(以确认存储在那个新区块中的交易的有效性),被传播到区块链中的其他节点,并且其真实性被该其他节点独立地验证。一旦新区块已经被验证,它就被添加到区块链的顶部。典型地,区块链在任何给定时间都是具有由最高可能的累积工作量证明产生的区块的链。当节点关于哪个区块要被添加到区块链的顶部意见一致时,它们被称为已经达成“共识”。虽然区块链可能不时分叉,导致区块链的暂时竞争版本,但是每个区块都与其紧接在前面的区块加密链接的事实意味着远离区块链的顶部的区块实际上是不变的。
上述区块链的分布式和对等性质也与一些缺点相关联。例如,区块链的分布式性质的副作用是,组成区块链一部分的所有节点都可以访问存储在那个区块链上的所有数据,使得隐私保护变得困难。虽然区块链上的某些非报头数据可以被加密,但加密会带来技术开销,还会抑制可对数据做的事,例如将应用实现为智能合约。此外,当单个节点扩展并且同时是越来越多的区块链的节点时,那个节点所需的计算资源也线性地向上扩展,阻碍了该节点有效地成为大量区块链的成员的能力。
在此描述的实施方式在方法、系统和技术中描述以减轻至少一个前述问题。例如,在下面描述的至少一些实施方式中,数据可以通过在此称为“链联接”的过程在区块链之间安全地共享。使用联接,第一区块链可以与第二区块链安全地共享存储在第一区块链上的非报头数据的适当子集;这与被迫共享存储在第一区块链上的所有数据形成对比,这是组成第一区块链的所有节点之间所需要的。在此描述的至少一个实施方式中,当区块链用于实现比特币时,非报头数据代替存储在区块链上的交易数据。例如,在至少一些示例实施方式中,非报头数据包括由也作为被实现为智能合约并存储在区块链上的应用执行的动作,以及表示执行那个动作之后的结果应用状态的数据。在此描绘的实施方式中的每个动作包括json对象,尽管在不同的实施方式中,动作可以包括不同的数据结构。从第一区块链发送应用状态数据和由第一区块链执行导致应用状态的动作允许第二区块链独立地确定它从第一区块链接收的状态是否准确。
在至少一些示例实施方式中,区块链的非报头数据包括应用数据,该应用数据是与存储在区块链中的应用相关的数据,例如应用本身或应用状态数据。例如,在被配置为存储联系人列表的应用中,应用状态数据可以包括那些联系人的列表,应用状态数据的适当子集可以包括那个列表中的单个条目。在一些其他示例实施方式中,非报头数据可以与任何特定应用都无关,可以包括json对象或二进制文件。
此外,在下面描述的至少一些实施方式中,任何一个或多个节点在通过在一个或多个节点的每一个上运行的主机控制器来路由系统操作的同时,都可以使用管理程序来虚拟化(完全虚拟化或使用半虚拟化)一个或多个区块链。主机控制器本身可以是区块链(“主机区块链”)。主机控制器响应于来自在管理程序上运行的一个或多个区块链的请求来分配节点的至少一些硬件资源,主机控制器在该节点上运行;那些链中的每一个在此可互换地称为“客户区块链”。主机控制器基于例如资源可用性和任务优先级来执行资源分配。这允许不同的区块链有效地共享那个节点的硬件资源,从而便于扩展。此外,在包括主机区块链的实施方式中,客户区块链中的至少一个的计算机程序代码可以存储在主机区块链中。这允许主机区块链存储所有那些客户区块链的应用状态变化的列表,从而允许用户容易地将那些应用的状态改变为主机区块链中存储的任一先前状态。这对于调试和审计那个节点的活动中的至少一个可能特别有用。在包括主机区块链的实施方式中,客户区块链中的一个或多个可以存储在主机区块链中,而客户区块链中的不同的一个或多个可以存储在主机区块链之外;尽管如此所有客户区块链仍然都可以由主机区块链为它们分配资源,从而促进可扩展性。
现在参考图1,示出了根据一个示例实施方式的用于促进区块链之间的数据传输的系统100。系统100包括第一至第十二节点104a-1(概括来说,“节点104”),每个节点组成一个或多个区块链102a-g(概括来说,“区块链”或“链”102)的一部分。第一区块链102a包括第一至第四节点104a-d;第二区块链102b包括第五至第八节点104e-h;第三区块链包括第九至第十二节点104i-l。
如下文进一步详细讨论的,第一区块链102a“联接”到第四区块链102d(经由第二节点104b)和第五区块链102e(经由第三节点104c):这允许存储在第一区块链102a上的所有或一些数据被分别与第四和第五区块链102d、e安全共享。第二区块链102b类似地联接到第四区块链102e(经由第六节点104f)和第六区块链102f(经由第七节点104g),第三区块链102c类似地联接到第六区块链102f(经由第十节点104j)和第五区块链102e(经由第十一节点104k)。
同样如下面进一步详细讨论的,当第四区块链102d联接到第一和第二区块链102a、b时,第一和第二区块链102a、b可以经由第四区块链102d互相读写数据。类似地,第二和第三区块链102b、c可以经由第六区块链102f互相读写数据,第一和第三区块链102a、c可以经由第五区块链102e互相读写数据。因此,第四至第六区块链102d-f在此可互换地称为“传输区块链”,因为它们促进了第一至第三区块链102a-c之间的数据的选择性传输。
系统100中的第八区块链102g是“目录区块链”,其上存储了第一至第三区块链102a-c可自由访问的数据。
虽然在传统的比特币实现中,生成新区块包括应用工作量证明,但是在所描绘的实施方式中,在不应用工作量证明的情况下达成了共识。例如,在此所描绘的实施方式,共识是根据ethanbuchman的论文,2016年6月,universityofguelph,https://atrium.lib.uoguelph.ca/xmlui/handle/10214/9769中描述的方法来确定的。在不同的实施方式(未示出)中,共识可以使用工作量证明、利益证明或不同的方法来确定。
第二节点104b的结构在图1中突出显示了。系统100中的其他节点104a、c-l共享类似的结构,尽管在不同的实施方式(未示出)中,任何一个或多个节点104可以在结构上彼此不同。
现在参考图3,示出了图1的系统100的物理网络拓扑。系统100包括第一至第三局域网(“lan”)306a-c,每个局域网由各自的防火墙304a-c保护。局域网306a-c通过广域网(“wan”)302,例如因特网通信地耦合在一起。第一至第三区块链102a-c分别位于第一至第三lan306a-c的本地;第四至第七区块链102d-g中的每一个通过防火墙304a-c中的至少两个以及wan302进行通信。
回到图1,第二节点104b包括控制节点104b的整体操作的处理器106。处理器106通信地耦合到若干子系统并控制它们。这些子系统包括用户输入设备108,用户输入设备108可以包括例如键盘、鼠标、触摸屏、语音控制中的任何一个或多个;随机存取存储器(“ram”)110,其存储由处理器106在运行时执行的计算机程序代码;非易失性存储器112,其存储运行时由ram110执行的计算机程序代码,并且还存储第二节点104b是其一部分的区块链102a、d,如就图2进一步详细讨论的;显示控制器114,其通信地耦合到显示器116并控制它;以及促进与其他节点104a、c-l进行网络通信的网络控制器118。
现在参考图2,示出了组成图1的系统100的一部分的软件栈200。软件堆栈200可以表达为计算机程序代码并存储在非易失性存储器112中,处理器106可以在运行时根据需要将那计算机程序代码的一些或全部加载到ram110中。软件堆栈200是基于node.js的,并相应地使用javascript202,特别是javascriptexpress204、redux206和react208库。javascript202用于实现区块链。javascriptexpress204、redux206、react208以及html和css210被用作应用开发的框架。虽然在本示例实施方式中使用了javascript202及其相关联的库204、206、208,但是在不同的示例实施方式(未示出)中,它们中的任何一个或多个可以不用于实现。例如,在某些不同的实施方式中,即使javascriptexpress204、redux206和react208库都没有被使用,应用状态仍然可以使用可加密验证的json对象来跟踪。
应用作为智能合约在系统100中的任何一个区块链102上运行。图4描绘了示出了根据图1的系统100,使用归约器来由系统100执行动作以影响系统状态以及通过如上所述应用共识来针对区块链102中的任何一个达成共识的流程图400。在系统100中,redux206存储存储应用的状态树,因此类似于应用的ram。在框402处在用户空间中创建动作,例如响应于经由用户输入设备108中的一个的用户输入,并且在框404处使用redux206dispatch()方法的异步变体将该动作分派到区块链结构(即,借助于区块链的对等性质,自动分派到组成区块链102的其他节点104)。该动作在框406处从用户空间转移到区块链结构,并且在框408处通过组成区块链102的节点104来传播。因此,区块链102的节点104中的每一个在框410处最终接收该动作的副本,并且节点104中的每一个在框414处通过用归约器来执行该动作,独立地评估那个动作对应用的当前状态的影响,该应用的当前状态是节点104中的每一个在框412处检索的。一旦节点104在框414处执行该动作,区块链102就在框416处就区块链102的后续状态达成共识。由那个共识产生的后续状态在框418处被节点104接受为正确的后续状态,并在框420处被发送到用户空间。
图8a描绘了用于促进区块链102之间的数据传输的系统100的另一示例实施方式。图8a的系统100包括第十三节点104m,其同时是六个区块链102h-m的成员:主机区块链102h和第八至第十二区块链102i-m。第八至第十二区块链102i-m还分别包括附加节点104n-r。区块链102h-m中的每一个半虚拟化在第十三节点104m上,尽管在不同的实施方式(未示出)中,区块链102h-m可以是完全虚拟化的,或者如下文进一步详细讨论的,既不是完全虚拟化的也不是半虚拟化的。图8b描绘了用于那半虚拟化的管理程序800,并示出了在管理程序800上运行的区块链102h-m。
在图8b中,第八、第十一和第十二区块链102i、l、m嵌套在主机区块链102h内,第九和第十区块链102j、k嵌套在第八区块链102i内(因此也嵌套在主机区块链102h内)。当父区块链102执行创建嵌套区块链102的应用时,并且当父区块链102相应地可以终止该嵌套区块链102时,一个区块链102“嵌套”在另一个区块链102(“父区块链102”)内。在所描绘的实施方式中,父区块链102和嵌套区块链102在其他方面是等效的。
管理程序800经由负责输入/输出操作的计算机硬件(“i/o硬件”)与物理世界804对接,例如向管理程序800提供用户输入的用户输入设备108,以及执行磁盘访问和网络通信功能的磁盘访问和网络接口硬件808。硬件808与各种第三方组件806(例如提供外部服务的服务器、应用编程接口和数据库)对接。
管理程序800以javascript202实现,包括动作队列816、路由器818和区块链102h-m的各种操作环境。路由器818通信地串行耦合到第一至第六分派模块820a-f,第一至第六分派模块820a-f又分别通信地耦合到区块链102h-m。区块链102h-m每个分别包括应用的存储812a-f,每个存储812a-f有效地充当那个区块链102h-m上的应用的ram。在至少一些示例实施方式中,存储在区块链上的应用不止包括智能合约。例如,应用可以包括智能合约,其表示返回值的函数;saga,其执行除返回值以外的操作,例如与硬件的交互;以及与智能合约和saga交互的动作。saga执行的动作,是使用区块链请求而其实际执行无需区块链达成共识,在此称为“副作用”。虽然该副作用或动作的实际执行不受共识的影响,但区块链做出的执行该副作用的决定受共识的影响,区块链做出的接受该副作用的结果的决定也受共识的影响。存储812a-f中的每个应用包括归约器,该归约器执行确定区块链状态的动作。另外,可以由归约器执行那动作产生的副作用,例如区块链102和硬件之间的交互,分别由存储812a-f的副作用管理器814a-f处理。
在一个示例实施方式中,可以使用图8b的管理程序800来实现图4的方法,如下所述。通过经由用户设备108中的一个提供输入来创建动作的用户在框402处生成动作,该动作被放置在动作队列816中。动作队列816还从副作用管理器814a-f接收动作。动作队列816最终将用户生成的动作分派到路由器818,路由器818将它路由到与那个动作相关的区块链102i-m;对于本示例来说,第八区块链102i是唯一受该动作影响的区块链102。路由器818将动作直接路由到第三分派模块820c。这对应于图4中的框406。一旦动作从硬件转换成动作,主机区块链102h就捕捉该动作;i/o硬件(用户输入设备108或硬件808)与主机区块链102h交互,因此甚至在动作被发送到动作队列816之前动作就被记录在主机区块链102h中。路由器818将动作队列816中的动作路由到适当的分派模块812a-f。路由器818以动作在动作队列816中放置的顺序将那些动作发送到链102i-m中的任何一个给定的链;然而,不同区块链102i-m的动作可以无序地被发送到那些区块链102i-m的分派模块812a-f。例如,如果动作队列816接收第八区块链102i的第一动作,然后第九区块链102j的第二动作,然后第八区块链102i的第三动作,路由器818可以在将第二动作发送到第九区块链102j之前,将第一和第三动作发送到第八区块链102i。然而,路由器可以不在第一动作之前将第三动作发送到第八区块链102i。
一旦动作到达第八区块链102i,第十三节点104m就将动作广播到组成那个区块链102i的一部分的任何其他节点104,如图8a所示那个区块链102i包括附加节点104n;这对应于图4中的框408和410。第十三节点104m经由主机区块链102h通信,主机区块链102h按照需要与磁盘访问和网络接口硬件808对接以与附加节点104n通信。附加节点104n最终在框414处在其归约器处接收并执行该动作。回到第十三节点104m,组成第二存储812b的一部分的归约器执行该动作,并且再次经由主机区块链102h将它确定的新状态共享给附加节点104n。第八区块链102i最终达到共识,这对应于图4的框416,涉及管理程序800在其上运行的节点104m的通信经由主机区块链102h再次发生。一旦达到共识,第八区块链102i就在框418处稳定在它的新状态,并且经由用户输入硬件108再次经由主机区块链102h将这新状态中继给用户,这对应于框420。
归约器执行动作时,可能需要硬件操作形式的副作用。管理程序800响应于来自主机区块链108h的指令执行任何硬件操作;因此,主机区块链108h知道并记录其区块中的所有硬件操作和相关动作。主机区块链108h还记录执行那个动作的结果,这是接收到动作的区块链102的新应用状态。每个区块链108在执行动作后还返回“成功”或“失败”指示符,该指示符指示动作是否被成功执行,主机区块链108h也记录该指示符。
在所描绘的示例实施方式中,主机区块链108h还监视和处理用于满足处理器时间和处理器强度阈值中的至少一个的计算操作(不使用i/o硬件但确实需要节点104m的处理器的操作)的资源分配。这允许主机区块链108h为计算特别密集的任务,例如某些加密任务,分配和存储处理器资源。
虽然在图8a和8b中,第十三节点104m被描述为经由磁盘访问和网络接口硬件808与附加节点104n-r通信,但是在不同的实施方式中(未示出),通信可以在托管在相同的节点104上,甚至运行在相同的管理程序800上的区块链102之间进行。在那些示例实施方式中,与需要通过硬件808进行通信的时候相比,区块链102之间的通信可以以更低的等待时间和更低的传输时间来进行。
区块链102h-m上的应用被配置成使得与区块链102i-m中的任何一个的所有硬件交互都经由主机区块链102h发生。例如,经由磁盘访问和网络接口硬件808发生的所有网络通信以及经由用户输入设备108发生的用户交互,由第八至第十二区块链102i-m经由主机区块链102h来执行。主机区块链108h相应地被配置成按照嵌套在其中的任何区块链108i-m的指示与所有硬件交互。主机区块链102h在其区块中记录所有硬件操作(请求和响应,以及经由硬件传送的用户输入)和在那些嵌套的区块链102i-m中的每一个上运行的应用的应用状态。在一些不同的实施方式中(未示出),主机区块链102h可以记录涉及i/o硬件的操作中的一些而不是所有。主机区块链102h还记录至少借助于通过路由器818路由那些动作(并且如果那些动作需要使用i/o硬件,则也借助于那个方式)而被路由到区块链102i-m的所有动作。这允许用户访问所有那些嵌套区块链102i-m的整个状态历史和硬件操作。因此,那个用户能够恢复到区块链102i-m中任何一个的先前应用状态,并调整动作队列816中的动作顺序,以模拟管理程序800和区块链102i-m在动作以不同于它们实际接收的原始顺序的顺序到达时会如何反应;在一个示例用例中,这是在应用出错时进行的。这允许系统100借助于允许模拟系统100可能经历的不同定时错误而被彻底测试。嵌套区块链102i-m中的每个的区块是包含在主机区块链102h的区块内的数据的子集。在调试或测试期间,用户可以从动作队列816中选择任何一个动作,来经由路由器818路由到区块链102i-m,而不管动作队列818接收动作的顺序如何。输入/输出操作是程序化和确定性的;因此,硬件以相同的方式响应动作,而不管它何时接收到那个动作,这有助于在调试或测试期间改变动作的顺序。
另一个节点可以连接到主机区块链108h,并且可以响应于来自那另一个节点的输入来进行应用到较早状态的恢复。例如,这其他节点可以是提供技术支持的第三供应者的节点。
虽然所描绘的示例实施方式将区块链102h-m示为半虚拟化在管理程序800上,但是在不同的实施方式中(未示出),既不需要使用完全虚拟化也不需要使用半虚拟化。在这些不同实施方式中的一些实施方式中,一些节点104使用管理程序800完全虚拟化或半虚拟化区块链102h-m,而其他节点没有。此外,在其中节点104中的至少一个使用管理程序800进行完全虚拟化或半虚拟化的那些不同实施方式中的一些中,区块链102h-m中的一些或全部可以被完全虚拟化或半虚拟化。例如,虽然图4的流程图400可以使用图8b的管理程序800来实现,但是在不同的实施方式中(未示出),虚拟化不需要用于其实现。
链联接
虽然区块链102中任何一个给定的区块链上的所有节点104都可以访问存储在区块链102上的所有数据,但是不同的区块链102默认情况下不在彼此之间共享数据。下面描述的链联接方法允许数据在不同的区块链102之间共享。
图5a和5b描绘了示出了根据图1的系统100,两个区块链102a、b如何执行读联接的uml序列图500。虽然图500中使用了第一和第二区块链102a、b,但是可以在任何两个区块链102之间执行读联接。例如,虽然第一和第二区块链102a、b不共享任何节点104,但是可以在共享节点104以及,在一些示例实施方式中,使用例如管理程序800在相同节点104中的至少一些上虚拟化(完全或半虚拟化)的区块链102之间执行读联接。
在图500中,第二区块链102b从第一区块链102a读取数据;对于图500来说,第二区块链102b相应地可互换地称为“消费者链102b”,第一区块链相应地可互换地称为“供应者链102a”。
在操作502处,供应者链102a更新其联接管理例程。用户通过经由组成供应者链102a的节点104a-d中的一个的用户输入设备108中的一个提供输入来开始这事。路由器818将用户输入作为动作(“@@chain_share_state”)分派给那个节点104上的供应者链102a,以由那链102a的归约器来执行。该动作的净荷是数字签名的,因此它是可加密验证的(也就是说,任何篡改都可以被检测到)。动作的净荷包括消费者链102b的链标识符(“<chainid>”)、标识要由消费者链102b读取的供应者链102a的状态数据的适当子集的路径(“statepath:‘/foo/’”)、以及标识这特定链联接的别名(“joinname:‘foojoin’”)。在图500中,供应者链102a可用的状态信息使用目录树来表示。具有路径“/”的树的根代表供应者链102a可用的所有状态数据;子目录,例如“/foo/”,表示那状态数据的适当子集或“切片”。
链标识符是唯一的,是通过对值进行数字签名生成的,该值组成被修改为包含随机种子的供应者链102a的创世区块。随机种子确保唯一性。在读联接期间的任何时间,供应者链102a都可以使用链标识符来确认消费者链102b的身份,并且仅当确认那身份的尝试成功时,才向消费者链102b发送状态数据切片。
在操作504处,相同或不同的用户经由组成消费链102b的节点104e-h中的一个的用户输入设备108中的一个提供输入。路由器818将用户输入作为动作(“@@chain_read_state”)分派给那个节点104上的消费者链102b,以由那链102b的归约器来执行。动作的净荷是供应者链102a的加密安全链标识符(“<chainid>”)、标识状态数据要被存储在哪里的路径(“mount:‘/mnt/foo’”,由消费者链102b读取的状态数据是使用所安装的文件系统的模型来存储的)、标识这特定链联接的别名(“joinname:‘foojoin’”)以及用于读联接的各种选项。示例选项包括数据年龄限制,该数据年龄限制要求正经由读联接传输的数据小于某个年龄,以可用于所有或一些操作;频率阈值,其定义多快读联接将重复以更新消费链102b上的状态数据;和最大大小限制,如果读联接传输的数据超过最大限制其设置标志。
一旦操作502和504已经执行,读联接就初始化。操作502和504可以同时执行,或者操作502、504中的一个可以在操作502、504中的另一个之前执行。
一旦读联接初始化,供应者链102a就进入包括操作506和508的循环,该循环对链102a上的每个区块执行。每次向供应者链102a添加新区块时,都会生成动作(“@@chain_block_created”)。新区块创建包括供应者链102a应用决定创建块,这触发副作用,该副作用在使用管理程序800时是由副作用管理器814处理的。该动作的净荷是那个新区块的区块高度(“currentblockheight:1234”)、那个新区块报头的哈希(“currentblockhash:block1234hash”)和标识那个区块创建的时间的时间戳(“currentblocktime:12374433543”)。在一些示例实施方式中,时间戳被省略。在操作508处,供应者链102a向消费者链102b发送@@chain_block_created动作的形式的更新,通知消费者链102b新区块已经创建。更新包括那个新区块的高度和报头哈希。消费者链102b可以选择接受并接收由新创建的区块存储的状态数据切片的副本,或者跳过更新。
当消费者链102b选择从供应者链102a接收更新时,对每个更新执行操作510、512、514和516。在框510处,消费者链102b生成动作(“@@read_join_diff_req”),该动作具有净荷,该净荷包含由数据传输将在其处开始的供应者链102a的起始区块高度(“startblockheight:1200”),消费者链102b从操作504(上次设置它)中知道该起始区块高度并且消费者链102b将在如下所述的操作516处更新该起始区块高度;起始区块高度处的区块报头的哈希(图5b中未示出);以及该联接的别名(“joinnames:[foojoin]”)。在操作512处,消费者链102b通过向供应者链102a发送@@read_join_dif_req动作,向供应者链102a请求更新的状态数据切片。
响应于该请求,供应者链102a执行动作(“@@read_join_diff_resp”)来生成对该请求的响应。响应于该动作,供应者链102a检索每个区块的报头(不管是否从那个区块发送状态数据切片,因为报头用于验证世系)(区块1200至1234)。每个报头包括链102a中紧接在前面的区块的报头的哈希(“previousblockhash:‘block1199hash’”);那个块整个应用状态的哈希,即使只传输那状态数据的切片(“payloadhash:‘payloadhash’”);第一区块链的节点的用来确定针对那个区块达到共识的足够数量的数字签名;以及指示链配置的方面是否已经改变的标志(即,当影响验证区块世系的能力的方面改变时),例如当加密方法(例如,哈希类型)已经改变时,当有权就共识投票的节点列表改变时,当使用的数字签名改变时,以及当报头格式改变时(“configchanged:false”)。该动作也会生成区块报头的哈希(“blockhash:‘block1200hash”),该区块报头的哈希不组成报头本身的一部分。链102a还确定从起始区块高度(1200)到当前区块高度(1234)的状态数据上的差异(“statediff:{//providercreatesdifffrom1200to1234}”),从而避免向消费者链102b发送不必要的数据。供应者链102a还确定merkle证明(“merkleproof”),该merkle证明包括一个或多个哈希值,该一个或多个哈希值被选择来允许消费者链102b确定merkle路径,该merkle路径是从被发送到第二区块链的应用数据的哈希到merkle根的,在本示例中,该merkle证明在payloadhash字段中。在操作514处,供应者链102a向消费者链102b发送响应于@@read_join_diff_resp动作而生成的数据。
在本示例实施方式中,该应用数据的哈希是merkle根,包括用于制作区块的所有动作以及由应用按顺序执行所有那些动作产生的最后状态。在不同的示例实施方式中,该区块可以存储由执行每个动作产生的每个状态,或者那些状态的子集。对于每个正被传输的区块,那个区块的哈希和紧接在那个区块下面的区块的报头的哈希、那个区块的应用数据的哈希和数字签名的哈希共同表示世系验证数据的一个示例,消费者链102b可以使用该世系验证数据来验证回到链的创世区块的那个区块的世系。
在本示例实施方式中,merkleproof字段是有效性验证数据的一个示例,该有效性验证数据允许消费者链102b验证它从供应者链102a接收的应用数据的有效性。虽然在本示例中使用了merkle树,但merkle树只是加密证明的一种示例形式。还有其他可能的方法。该证明机制允许单个根哈希,以及在某些结构中使用的一系列其他哈希,从而允许通过将一段数据关联回根哈希来验证该数据,而不泄露任何不打算共享的其他数据。例如,可以使用的其他数据结构包括patricia树、radix树和分块连接。
消费者链102b随后在操作516处验证它接收的数据的真实性。更具体地,它使用世系验证数据来验证所传输的区块的世系,使用有效性验证数据来验证它接收的状态数据的适当子集的有效性,并且将新区块添加到消费者链102b。更具体地,消费者链102b验证供应者链102a的数字签名;使用哈希的报头信息验证每个所传输的区块的世系;使用数据的merkle树检查所传输的状态数据的有效性;验证使用的共识方法的类型,该类型可以使用如上所述的configchange字段进行更改;通过检查投票赞成共识的节点的签名,验证足够数量的节点104已经就该区块的共识做出了贡献;以及根据链102a使用的加密方法验证该区块的加密有效性。
然后消费者链102b更新其存储状态信息的安装目录(/mnt/foo),该状态信息本身组成用新区块的非报头数据向它自己添加那个新区块的消费者链102b,那个新区块的非报头数据包括从供应者链102a接收的数据(即世系验证数据、状态数据的适当子集和有效性验证数据)。
总之,读联接允许消费者链102b的用户读取存储在供应者链102a上的状态数据切片,就好像那数据被本地安装在消费者链102b上一样。
现在参考图6,描绘了示出了根据图1的系统100,两个区块链如何执行写联接的框图600。与图5a和5b一样,尽管在图6的示例中使用了第一和第二区块链102a、b,但是可以在任何两个区块链102之间执行写联接,而不管它们是否具有重叠的节点104,也不管是否有任何节点是使用管理程序800的虚拟化链。在图6中,第一区块链102a将数据写入第二区块链102b;第一区块链102a相应地可互换地称为“发送者链”102a,第二区块链102b相应地可互换地称为“接收者链”102b。
发送者链102a包括分派模块802a,分派模块802a将动作分派给归约器602a。如下面就图7a至7c进一步详细讨论的,归约器602a将某些动作的执行委托给联接管理器604b,联接管理器604b控制哪些动作在未决动作队列606a中排队以传输到接收者链102b。动作经由读联接被发送到接收者链102b。发送者链102a还包括,经由读联接,读取接收者链102b已经完成的动作的列表的动作状态队列608a。
接收者链102b类似地包括经由读联接从发送者链102a的未决动作队列606a接收动作的未决动作队列606b。接收的动作被发送到联接管理器604b,联接管理器604b将它们转发到分派模块820b并更新动作状态队列608b以指示动作是未决的。分派模块820b将那些动作转发给归约器602b,归约器602b执行它们,从而改变接收者链102b的状态数据并执行写操作。联接管理器604b还在归约器602b执行动作之后,更新动作状态队列608b以指示动作已经完成。动作状态队列608b中的状态经由读联接被发送到发送者链102a的动作状态队列。因此,图6的写联接是使用两个读联接来实现的。
图7a至7c描绘了示出了根据图6的框图600系统,两个区块链102a、b如何执行写联接的uml序列图700。图中的对象是发送者和接收者链102a、b、发送者链102b的联接管理器604a和接收者链102b的联接管理器604b。虽然联接管理器604a、b被示为不同于链102a、b的对象,但是这样做仅仅是为了方便,并且管理器604a、b组成由链102a、b执行的应用逻辑的一部分。
在操作702处,接收者链102b的联接管理器604b执行具有净荷的动作(“@@chain_authorize_actions”),该净荷包括标识发送者链102a的加密安全链标识符(“<senderchainid>”),并枚举了允许发送者链102a让接收者链102b执行的动作(“permittedactions:[‘create_foo’;‘create_bar’]”)。加密安全的链标识符以类似于图5a的链标识符的方式生成。此后,接收者链102b的未决动作队列606b能够从发送者链102a的未决动作队列606a读取动作,并且发送者链102a的动作状态队列608a能够从接收者链102b的动作状态队列608b读取动作的状态。在队列606a、b和608a、b能够通信之后,写联接建立。在所描述的实施方式中,发送者链102a默认被授权执行从接收者链102b接收的某些动作,因此授权没有在图7a至7c中明确示出。
对于发送者链102a希望发送给接收者链102的每个动作,发送者链102a执行操作704和706。对于每个动作,发送者链102a创建允许的枚举类型中的一个的动作(“type:‘create_foo’”)。归约器602a创建的动作可以与分派给它的动作相同或不相同。然后,归约器602a在操作704处将动作委托给联接管理器604a,随后联接管理器604a在操作706处生成那个动作的标识符并将它放置在未决动作队列606a中。该动作在操作708处,经由读联接,从发送者链102a的未决动作队列606a传输到接收者链102b的未决动作队列606b。
为了有效利用伴随每个读联接的开销,例如密码检查和共识所需的开销,多个动作可以在发送者链102a的未决动作队列606a中排队并经由单个读联接来传输。
对于接收者链102b接收的每个动作,它执行操作710、711、712、714和716。接收者链102b的联接管理器604b在操作710处从未决动作队列606b中移除未决动作,在操作711处将该动作分派给归约器602b,并更新动作状态队列608b以指示该动作正在进行中。归约器602b执行该动作,在操作714处通知联接管理器604b,并且联接管理器604b在操作716处更新动作状态队列608b以指示该动作完成。
在操作717处,发送者链102a的动作状态队列608a经由读联接被更新以与接收者链102b的动作状态队列608b一致。
对于每个更新的动作状态,发送者链102a执行操作718、720和722。在操作718处,联接管理器604a将动作状态队列608a中的动作状态与该动作的先前状态进行比较。在操作720处它更新最初将该动作分派给归约器602a的分派,向用户返回在该动作完成后要返回的任何信息(例如,给用户的指示动作已经完成的通知)。然后,联接管理器604a在操作722处从未决动作队列606a中移除完成的动作。
在操作724处,链102a、b的未决动作队列606a、b使用读联接来同步,随后接收者链102b的联接管理器604b从未决动作队列606b中移除该动作。在该动作被移除之后,动作状态队列608a、b在操作728处使用读联接来同步。
发送者链102a经由读联接从接收者链102b接收动作,该读联接是该动作在接收者链102b处是未决的(操作717)以及该动作已经由接收者链102b执行了(操作728)。对于每个读联接,发送者链102a还接收类似于上面就图5a和5b所述的世系验证数据和有效性验证数据。
图7a至7c的图500、700描绘了动作在链102之间传输。尽管在那些图中没有明确示出,但是每个动作是在第一链102已经达到共识的区块中发送的,所以接收该动作的第二链102可以验证该动作实际上来自第一链并且没有被篡改。
有效负载层
在至少一些示例实施例中,可能期望在区块链上存储大二进制文件(以下可互换地称为“二进制大对象”或“blob”)。但是,按照惯例,将blob存储在区块链上需要在能够将文件完全添加到区块链中之前先将blob传播到区块链的节点,当blob具有一定大小时,这可能会花费大量时间。例如,在最大块大小为2mb的区块链中,需要2秒才能将区块添加到区块链中,而将100mb的blob添加到区块链中则需要100秒。在此等待时间段期间,在常规实现中,使用区块链存储与blob无关的数据的能力实际上受到了限制。
在本文的某些示例实施例中,在区块链的每个节点上运行的有效负载层用于将blob分配给相同区块链的其他节点,不同区块链的节点或两者。使用有效负载层分配blob不需要使用区块链本身以使用链联接来共享blob,也不需要将blob本身存储在区块链上。而是,在至少一些示例实施例中,blob的哈希和路径被存储在区块链上。与blob本身的大小相比,blob的哈希和路径是相对少量的数据,其通常可以快速存储在区块链的单个区块中。可以使用有效负载层将blob本身传播到区块链的节点,而无需实际垄断区块链,从而避免了如上所述在许多不同区块之间划分blob并将它们全部添加到区块链的延迟。
另外,在至少一些示例实施例中,链联接可以用于允许第一区块链将许多blob的路径和哈希发送到第二区块链。通过将该blob的哈希发送到组成第一区块链的一部分的节点的有效负载层,然后,第二区块链上的节点,使用有效负载层(即,不使用第一或第二区块链,因此不进行链联接),可以请求这些blob中的一个。然后,该第一区块链节点的有效负载层将blob发送到该第二区块链节点,再次不使用第一或第二区块链。
现在参考图9和图10,其根据其他示例实施例示出了用于存储blob的方法900和用于将blob从组成第一区块链的一部分的节点发送到组成第二区块链的一部分的节点的方法1000。在图9和图10中,第一区块链102a和第二区块链102b被用作示例区块链,并且组成第一区块链102a的一部分的第一节点104a和组成第二区块链102b的一部分的第五节点104e被用作示例节点。然而,在不同的示例实施例中,除这些以外的区块链和节点可以用于实现图9和图10的方法900、1000。方法900、1000中的每一个都可以表示为计算机程序代码并且存储在非暂时性计算机可读介质上,例如非易失性存储112,以供节点104的处理器106执行。更具体地,在至少一些示例实施例中,计算机程序代码本身或对计算机程序代码的引用中的一个或两个可以存储在区块链102上,执行动作的现有区块链102的引用来自执行该计算机程序代码的至少一部分的处理器106。使用组成区块链的一部分的区块存储或由其引用的代码可用于控制有效负载层。
现在参考图9,方法900在框902处开始,并进行到框904,其中,第一节点104a的有效负载层从例如正在上传blob并指定路径的系统100的用户接收blob和blob的路径。该路径可以采用任何适当的格式,例如目录图或目录树结构。目录树格式的示例路径包括blob的目录和文件名,例如“drive:\directory_level1\directory_level2\blob_filename.blob”。第一节点104a可以在已经接收到整个blob之后接收路径;可选地,第一节点104a可以在其接收blob时或开始接收blob之前接收路径。当有效负载层接收blob时,其将blob存储在路径处的非易失性存储器112和ram110中的一个或两者中,并将blob与“临时标记”相关联,直到blob被如下所述验证为止。
一旦第一节点104a在框904处已经接收到该blob和路径,则第一节点104a在框906处对该blob进行哈希。在对该blob进行哈希之后,在框908处,第一节点104a使该blob至少被散布到达成共识所需的组成第一区块链102a的一部分的多个节点104b-d。这是通过使用有效负载层而不使用第一区块链102a来完成的;例如,第一节点102a的有效负载层可以将blob发送到每个其他节点104b-d上的有效负载层。这可以使用任何合适的对等文件传输协议(例如bittorrenttm)来完成。经由其有效负载层接收blob的节点104b-d中的每一个一旦接收到整个blob就确定blob的哈希。当第二到第四节点104b-d中的每一个的有效负载层在框908处接收到blob时,它会将blob存储在路径处的非易失性存储112和ram110中的一个或两个中,并将blob与“临时”标志,直到它能够验证blob,如下所述。
在节点104b-d通过它们的有效负载层接收到blob,并各自独立地确定blob的哈希之后,则方法900进行到框910,节点104a-d试图将blob的哈希值和路径存储在第一区块链102a上。在框910处,每个节点104b-d从第一节点104a接收由第一节点104a获得的blob的路径和哈希。第一节点104a通过提出对路径和哈希值进行共识,使用第一区块链102a将该数据发送到第二至第四节点104b-d。从第二至第四节点104b-d中的每一个的角度,从第一区块链102a接收的哈希和路径分别仅是提出的哈希和所提出的路径,直到它们已经由每个节点104b-d验证。为了验证所提出的哈希,每个节点104b-d确定在框908处散布给它的blob的哈希,确定所提出的哈希是否等于独立地确定的哈希,并且如果第一区块链从第一节点104a接收到的所提出的哈希与它独立确定的哈希相等,则仅投票来将所提出的哈希存储在第一区块链上,作为blob的实际哈希。如果提议的和独立确定的哈希匹配,则每个节点104b-d还将blob的标志从“临时”更改为“非临时”或“永久”。
类似地,每个节点104b-d独立地验证其从第一节点104a接收的所提出的路径。节点104b-d中的每一个都可以应用任何合适的验证方法;例如,节点104b-d可以要求路径排除某些字符或具有一定长度是有效的。
如果节点104b-d验证所提出的哈希和所提出的路径,则其投票以在共识过程期间将所提出的哈希和所提出的路径分别添加到第一区块链102a。尽管在此特定示例实施例中第一节点104a将哈希和路径发送到其他节点10bb-d,但是在不同的示例实施例(未示出)中可以仅发送哈希和路径可以在不指定的情况下被推定。例如,所有节点104a-d可以是默认地将blob存储在诸如下载目录的预配置目录中。
如果足够多的节点104a-d投票赞成共识,则在区块910处将包括blob哈希和路径的新区块添加到区块链102a。
方法900随后在框912处结束。
一旦将blob转移到区块链102a的所有其他节点104b-d,并且区块链102a在其上存储了blob哈希和路径,通过访问区块链102a上的适当区块,区块链102a上的任何节点104a-d都可以访问blob的路径。该路径指向存储在区块链102a之外的blob,从而允许经由区块链102a访问blob,而无需将blob本身存储在区块链102a上。此外,由于将blob哈希存储在区块链102a上并且每个节点104a-d将blob存储在其有效负载层中,因此节点104a-d中的任何一个都能够访问整个blob,确定其哈希并比较该哈希与存储在区块链102a上的blob哈希。即使blob本身没有存储在区块链102a上,这也允许节点104a-d中的任何一个验证blob的真实性。
可使用图10的方法1000将blob从第一区块链102a共享到第二区块链102b,该方法1000采用链联接。在图10的框1002处,第一区块链102a将在框910处存储在第一区块链102a上的blob的路径和哈希发送至第二区块链102b。使用链联接来做到这一点,第一区块链102a用作图5a的供应者链,第二区块链102b用作图5a的消费者链。虽然图10示出了从第一区块链102a发送到第二区块链102b的单个blob哈希和路径,但是在至少一些示例实施例(未示出)中,可以从第一区块链102a向第二区块链102b发送多个blob的路径和哈希。第二区块链102b上的区块可以仅为单个blob存储路径和哈希,或者可以用于存储许多blob的路径和哈希。作为链联接过程的一部分,在框1004处,将路径和哈希存储在第二区块链102b上的新区块中。
组成第二区块链102b的一部分的节点之一(在此示例实施例中是第五节点104e),然后选择存储在第二区块链102b上并且已从第一区块链102a接收到的哈希之一,其对应于第五节点104e期望访问的blob。在框1006处,第五节点104e将该哈希发送到组成第一区块链102a的一部分的节点,在该示例实施例中,该节点是第一节点104a。在框1006处,第一和第五节点104a、e之间的通信是使用每个节点104a、e上的有效负载层来完成的;即,不使用链联接或区块链102a、e。在框1008和1010处,第一节点104a确定在第一节点104a从第五节点104e接收哈希之前第一区块链102a是否发送了第一节点104a从第五节点104e接收的哈希。如果否,则方法1000结束。如果是,则方法1000进行到框1012,第一区块链102a的第一节点104a上的有效负载层发送与第五节点104e发送到第一节点104a的哈希相对应的blob。链联接不用于发送blob;相反,如上所述,使用第一和第五节点104a、e的有效负载层。一旦将blob转移到第五节点104e,方法1000结束。
一旦第五节点104e接收到该blob,它就将该blob存储在该路径处的非易失性存储器112和ram112中的一个或两个中,并且以类似于在框906处第一节点104a如何将blob传播到组成第一区块链102a的一部分的其他节点104b-d的方式将该blob发送给组成第二区块链102b的其他节点104f-h。
以上已经参考方法、装置、系统和计算机程序产品的流程、序列和框图描述了实施方式。在这点上,所描绘的流程、序列和框图说明了各种实施方式的实现的架构、功能和操作。例如,流程和框图的每个框以及序列图中的操作可以表示代码的模块、段或部分,其包括用于实现指定动作的一个或多个可执行指令。在一些替代实施方式中,在那个框或操作中提到的动作可以以与那些图中提到的顺序不同的顺序发生。例如,在一些实施方式中,连续示出的两个框或操作可以基本上同时执行,或者这些框或操作有时可以以相反的顺序执行,这取决于所涉及的功能。前面已经提到了一些前述具体的示例,但是那些提到的示例不一定是仅有的示例。流程图和框图的每个框以及序列图的操作,以及这些框和操作的组合,可以由执行指定功能或行为的基于专用硬件的系统,或者专用硬件和计算机指令的组合来实现。
在此使用的术语仅仅是为了描述特定的实施方式,而不是旨在限制。因此,如在此所使用的,单数形式“一”、“一个”和“该”旨在也包括复数形式,除非上下文清楚地另有指示。还要理解的是,当在本说明书中使用时,术语“包括(comprises)”和“包括(comprising)”指定一个或多个所述特征、整数、步骤、操作、元件和组件的存在,但是不排除一个或多个其他特征、整数、步骤、操作、元件、组件和组的存在或添加。诸如“顶部”、“底部”、“向上”、“向下”、“垂直”和“横向”之类的方向性术语在以下描述中仅用于提供相对参考的目的,并不旨在对任何物品在使用期间如何定位、如何安装在组合中或如何相对于环境提出任何限制。此外,除非另有说明,否则本说明书中使用的术语“耦合”及其变形如“耦合(coupled)”、“耦合(couples)”和“耦合(coupling)”旨在包括间接和直接连接。例如,如果第一设备耦合到第二设备,则该耦合可以是通过直接连接或者通过经由其他设备和连接的间接连接的。类似地,如果第一设备通信地耦合到第二设备,则通信可以是通过直接连接或者通过经由其他设备和连接的间接连接的。
可以预期的是,本说明书中讨论的任何方面或实施方式的任何部分都可以实现或与本说明书中讨论的任何其他方面或实施方式的任何部分结合。
在解释权利要求时,要理解的是,至少在权利要求中肯定地陈述了计算机设备的存在或使用的情况下使用那个计算机设备,例如处理器,来实现在此描述的实施方式是必要的。还要理解的是,实现区块链固有地需要计算机设备,例如用于创建和认证新区块的处理器、用于存储区块链的存储器以及用于允许节点之间的通信的网络接口,这是达成共识所必需的。
一个或多个示例实施方式已经通过只是说明的方式描述了。本说明书是出于说明和描述的目的而提出的,而不是旨在是无遗漏的或受限于所公开的形式。对于本领域技术人员来说显而易见的是,许多变化和修改可以在不脱离权利要求书的范围的情况下做出。