技术领域
[0001] 本公开涉及一种创建覆盖在区块链上的树结构的不同版本的方法,以及一种访问树结构的版本的方法。
相关背景技术
[0002] 区块链是指一种分布式数据结构,其中在分布式对等(P2P)网络(以下称为“区块链网络”)中的多个节点中的每个节点处维护区块链的副本,并且广泛公开该副本。区块链包括一系列数据区块,其中每个区块包括一个或多个事务(transaction)。除所谓的“coinbase事务”外,每个事务都指向序列中的先前事务,该序列可以跨越一个或多个区块,回到一个或多个coinbase事务。coinbase事务将在下文进一步讨论。提交给区块链网络的事务包括在新区块中。新区块的创建过程通常称为“挖掘”,该过程涉及多个节点中的每个节点争相执行“工作证明”,即,基于等待被包括在区块链的新区块中的一组定义的有序且核实有效的未决事务的表示解决加密难题。应当注意的是,区块链可以在一些节点处被修剪(prune),并且区块的发布可以通过仅发布区块头来实现。
[0003] 区块链中的事务可用于以下目的中的一个或多个:传送数字资产(即,一定数量的数字通证);对虚拟化分类账或注册表中的一组条目进行排序;接收和处理时间戳条目;和/或对索引指针按时间排序。也可利用区块链实现区块链上的层级附加功能。例如,区块链协议可允许在事务中存储附加的用户数据或数据索引。能够存储在单个事务中的最大数据容量没有预先指定的限制,因此可以并入越来越复杂的数据。例如,这可用于在区块链中存储电子文档、音频或视频数据。
[0004] 区块链网络的节点(通常称为“矿工”)执行分布式事务注册和验证过程,这将后续更详细地描述。总之,在该过程中,节点核实事务并将这些事务插入到区块模板中,这些事务尝试为该区块模板标识有效的工作证明解。一旦找到有效的解,新区块便会被传播到网络的其它节点,从而使得每个节点能够在区块链上记录新区块。为了将事务记录在区块链中,用户(例如,区块链客户端应用程序)将该事务发送到网络中的节点中的一个节点进行传播。接收该事务的节点可以争相寻找将核实有效的事务并入新区块的工作证明解。每个节点被配置为执行相同的节点协议,该协议将包括用于确认事务有效的一个或多个条件。无效事务将不会传播或并入到区块中。假定事务已经核实有效,从而在区块链上被接受,则该事务(包括任何用户数据)将因此在区块链网络中的每个节点上作为不可改变的公共记录进行注册和索引。
[0005] 成功解决工作证明难题可创建最新区块的节点通常被奖励一个称为“coinbase事务”的新事务,该事务分发数字资产数额,即通证数量。无效事务的检测和拒绝是通过竞争节点的行动来执行的,这些竞争节点充当网络的代理并且通过激励报告和阻止不正当行为。信息的广泛发布使得用户可以连续地审计节点的性能。仅发布区块头使得参与者可以确保区块链具有持续完整性。
[0006] 在“基于输出的”模型(有时称为基于UTXO的模型)中,给定事务的数据结构包括一个或多个输入和一个或多个输出。任何可花费输出包括指定数字资产数额的元素,该元素可从进行中的事务序列导出。可花费输出有时称为UTXO(“未花费事务输出”)。输出还可以包括锁定脚本,该锁定脚本指定输出的未来赎回条件。锁定脚本是限定核实和传送数字通证或资产所必需的条件的谓词。事务(除coinbase事务之外)的每个输入包括指向先前事务中的此类输出的指针(即引用),并且还可以包括解锁脚本,用于解锁指向输出的锁定脚本。因此,考虑一对事务,将其称为第一事务和第二事务(或“目标”事务)。第一事务包括指定数字资产数额的至少一个输出,并且包括定义解锁该输出的一个或多个条件的锁定脚本。第二目标事务包括至少一个输入和解锁脚本,该至少一个输入包括指向第一事务的输出的指针;该解锁脚本用于解锁第一事务的输出。
[0007] 在此类模型中,当第二目标事务被发送到区块链网络以在区块链中传播和记录时,在每个节点处应用的有效性条件之一将是解锁脚本满足在第一事务的锁定脚本中定义的一个或多个条件中的所有条件。另一条件将是第一事务的输出尚未被另一早期有效事务赎回。根据这些条件中的任何一个条件发现目标事务无效的任何节点都不会传播该事务(作为有效事务,但可能注册无效事务),也不将该事务包括在要记录在区块链中的新区块中。
[0008] 另一种事务模型是基于账户的模型。在这种情况下,每个事务均不通过参考过去事务序列中先前事务的UTXO来定义转移的数额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由节点单独存储到区块链中,并不断更新。
[0009] 区块链网络本身属于覆盖在底层网络(例如,互联网Internet)上的覆盖网络。然而,也可以在区块链上覆盖另一层覆盖网络。Metanet(元网)便是此方面的示例。Metanet的每个节点都是区块链上的不同事务(应当注意的是,“节点”现在用于指代不同的含义,即并非指代区块链网络的节点,而是指代Metanet的节点)。数据内容和Metanet元数据存储在每个此类事务的有效载荷(payload)中,通过OP_RETURN或通过诸如OP_PUSHDATA等其它方式存储在事务的不可花费输出中。数据内容是Metanet存储的实际用户内容,例如文本、图像、视频或音频内容等;而元数据定义了Metanet节点之间的链接。Metanet节点之间的链接或边不一定对应于区块链层的花费边。即,如果给定Metanet事务的输入指向区块链层的另一资金事务的输出,则Metanet层的相同事务或Metanet节点的父节点不一定与资金事务相同。相反,Metanet层的链接或边定义了Metanet的数据内容之间的链接。
具体实施方式
[0033] 示例性系统概述
[0034] 图1示出了一种用于实现区块链150的示例性系统100。系统100可以包括分组交换网络101,通常是诸如互联网的广域互联网。分组交换网络101包括多个区块链节点104,该多个区块链节点可以被设置成在分组交换网络101内形成对等(P2P)网络106。虽然未示出,但是区块链节点104可以被设置为近完全图。因此,每个区块链节点104高度连接到其它区块链节点104。
[0035] 每个区块链节点104包括对等体的计算机设备,不同的节点104属于不同的对等体。每个区块链节点104包括处理装置,该处理装置包括一个或多个处理器,例如一个或多个中央处理单元(CPU)、加速器处理器、专用处理器和/或现场可编程门阵列(FPGA),以及其它设备,例如专用集成电路(ASIC)。每个节点还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。存储器可包括一个或多个存储器单元,其采用一个或多个存储器介质,例如诸如硬盘等磁介质、诸如固态硬盘(SSD)、闪存或电可擦可编程只读存储器(EEPROM)等电子媒介和/或诸如光盘驱动器等光学介质。
[0036] 区块链150包括一系列数据区块151,其中在分布式或区块链网络106中的多个区块链节点104中的每个节点处维护区块链150的相应副本。如上所述,维护区块链150的副本不一定意味着完全存储区块链150。相反,只要每个区块链节点150存储每个区块151的区块头(下面讨论),区块链150就可以进行数据修剪。区块链中的每个区块151均包括一个或多个事务152,其中该上下文中的事务是指一种数据结构。数据结构的性质将取决于用作事务模型或计划的一部分的事务协议类型。给定的区块链全程使用一个特定的事务协议。在一种常见的事务协议中,每个事务152的数据结构至少包括一个输入和至少一个输出。每个输出指定将数字资产的数量表示为财产的数额,其一个示例是输出被密码锁定到的用户103(需要该用户的签名或其它解进行解锁,从而进行赎回或花费)。每个输入指向先前事务152的输出,从而链接这些事务。
[0037] 每个区块151还包括区块指针155,其指向区块链中先前创建的区块151,以定义区块151的顺序。每个事务152(除coinbase事务之外)包括指向先前事务的指针,以定义事务序列的顺序(注:事务152的序列可进行分支)。区块151的区块链一直追溯到创始区块(Gb)153,该创始区块是区块链中的第一区块。区块链150中早期的一个或多个原始事务152指向创始区块153,而非先前事务。
[0038] 每个区块链节点104被配置为将事务152转发到其它区块链节点104,从而使得事务152在整个网络106中传播。每个区块链节点104被配置为创建区块151,并将相同区块链150的相应副本存储在其相应的存储器中。每个区块链节点104还维护等待并入到区块151中的事务152的有序集(或“池”)154。有序池154通常称为“内存池”。在本文中,该术语并不意在限制于任何特定的区块链、协议或模型。该术语是指节点104已接受为有效的有序事务集,并且对于该有序事务集,强制节点104不接受试图花费相同输出的任何其它事务。
[0039] 在给定的当前事务152j中,输入(或每个输入)包括指针,该指针引用事务序列中先前事务152i的输出,指定该输出将在当前事务152j中被赎回或“花费”。通常,先前事务可以是有序集154或任何区块151中的任何事务。尽管为了确保当前事务有效,将需要存在先前事务152i并核实其有效,但是在创建当前事务152j甚至向网络106发送当前事务152j时,不必存在先前事务152i。因此,在本文中,“先前”是指由指针链接的逻辑序列中的前任,而不一定是时间序列中的创建时间或发送时间,因此,不一定排除无序创建或发送事务152i、152j的情况(参见下面关于孤立事务的讨论)。先前事务152i同样可以称为先行事务或前任事务。
[0040] 当前事务152j的输入还包括输入授权,例如先前事务152i的输出被锁定到的用户103a的签名。反过来,当前事务152j的输出可以加密锁定到新用户或实体103b。因此,当前事务152j可将先前事务152i的输入中定义的数额转移到当前事务152j的输出中定义的新用户或实体103b。在某些情况下,事务152可具有多个输出,以在多个用户或实体间分割输入数额(其中一个可以是原始用户或实体103a,以便进行变更)。在某些情况下,事务还可以具有多个输入,将一个或多个先前事务的多个输出中的数额汇总在一起,并重新分配到当前事务的一个或多个输出。
[0041] 根据基于输出的事务协议,例如比特币,当诸如个体用户或组织这类的一方103希望颁布新的事务152j时(由该方采用的自动程序或人为地),该颁布方将该新事务从其计算机终端102发送到接收者。颁布方或接收者将最终向网络106的一个或多个区块链节点104(现在通常是服务器或数据中心,但原则上也可以是其它用户终端)发送该事务。另外还不排除颁布新事务152j的一方103可以将事务直接发送到一个或多个区块链节点104,并且在一些示例中,可以不将事务发送到接收者。接收事务的区块链节点104根据在每个区块链节点104处应用的区块链节点协议来检查事务是否有效。区块链节点协议通常要求区块链节点104检查新事务152j中的加密签名是否与预期签名相匹配,这取决于事务152的有序序列中的先前事务152i。在这种基于输出的事务协议中,这可以包括检查新事务152j的输入中包括的一方103的密码签名或其它授权是否与新事务分配的先前事务152i的输出中定义的条件匹配,其中该条件通常包括至少检查新事务152j的输入中的密码签名或其它授权是否解锁新事务的输入所链接到的先前事务152i的输出。条件可以至少部分地由包括在先前事务152i的输出中的脚本来定义。或者,这可仅由区块链节点协议单独确定,或可通过其组合确定。无论采用哪种方式,如果新事务152j有效,区块链节点104会将其转发到区块链网络106中的一个或多个其它区块链节点104。这些其它区块链节点104根据相同的区块链节点协议应用相同的测试,并因此将新事务152j转发到一个或多个其它节点104等等。通过这种方式,新事务在区块链节点104的整个网络中进行传播。
[0042] 在基于输出的模型中,给定输出(例如,UTXO)是否分配(例如,花费)的定义是,根据区块链节点协议,其是否通过另一个随后事务152j的输入有效赎回。事务有效的另一个条件是其试图赎回的先前事务152i的输出尚未被另一个事务赎回。同样,如果无效,则事务152j将不会在区块链150中传播(除非被标记为无效并且被传播用于提醒)或记录。这可防止重复花费,即事务处理者对同一个事务的输出分配超过一次。另一方面,基于账户的模型通过保持账户余额防止重复花费。因为同样存在定义的事务顺序,账户余额在任何时候均具有单一定义的状态。
[0043] 除了核实事务有效之外,区块链节点104还争相成为在通常称为挖矿的过程中创建事务区块的第一个节点,而该过程由“工作证明”支持。在区块链节点104处,新事务被添加到尚未出现在记录在区块链150上的区块151中的有效事务的有序池154。然后,区块链节点争相通过尝试解决加密难题以组装有序事务集154中事务152的新有效事务区块151。通常情况下,这包括搜索“随机数”值,从而当随机数与未决事务有序池154的表示并置且进行哈希处理时,哈希值的输出满足预定条件。例如,预定条件可以是哈希值的输出具有某个预定义的前导零(leading zero)。注意,这仅仅是一种特定类型的工作证明难题,并且不排除其它类型。哈希函数的特性是,相对于其输入,其具有不可预测的输出。因此,该搜索只能通过强力执行,从而在试图解决难题的每个区块链节点104处消耗大量的处理资源。
[0044] 解决难题的第一区块链节点104在网络106上宣布难题解决,提供解决方案作为证明,然后网络中的其它区块链节点104则可以轻松检查该解决方案(一旦给出哈希值的解决方案,就可以直接检查该解决方案是否使哈希值的输出满足条件)。第一区块链节点104将一个区块传播到接受该区块的其它节点达成阈值共识,从而执行协议规则。然后,有序事务集154被每个区块链节点104记录为区块链150中的新区块151。区块指针155还分配给指向该区块链中先前创建的区块151n‑1的新区块151n。创建工作证明解所需的大量工作(例如采用哈希的形式)发出信号通知第一节点104的意图以遵循区块链协议。这些规则包括如果它分配与先前核实有效的事务相同的输出,则不接受事务为有效,否则称之为重复花费。一旦创建,区块151就不能修改,因为它在区块链网络106中的每个区块链节点104处进行标识和维护。区块指针155还向区块151施加顺序。由于事务152记录在网络106中每个区块链节点104处的有序区块中,因此提供了事务的不可改变公共分类账。
[0045] 应当注意的是,在任何给定时间争相解决难题的不同区块链节点104可以基于在任何给定时间尚未发布的事务的池154的不同快照来这样做,具体取决于它们何时开始搜索解或接收事务的顺序。解决相应难题的人员首先定义新区块151n中包括的事务152及其顺序,并且更新当前的未发布事务池154。然后,区块链节点104继续争相从新定义的未发布事务有序池154中创建区块,等等。此外,还存在解决可能出现的任何“分叉”的协议,其中两个区块链节点104彼此在很短的时间内解决难题,从而在节点104之间传播区块链的冲突视图。简言之,分叉方向最长的成为最终区块链150。应当注意的是,这不会影响网络的用户或代理,因为同一事务将出现在两个分叉中。
[0046] 根据比特币区块链(和大多数其它区块链),成功构造新区块104的节点被授予在分配附加限定数量数字资产的新特殊类型事务中新分配附加的、接受的数额的数字资产的能力(与代理间或用户间事务相反,该事务将一定数量的数字资产从一个代理或用户转移到另一个代理或用户)。这种特殊类型的事务通常称为“coinbase事务”,但是也可以称为“启动事务”或“产生事务”。它通常形成新区块151n的第一事务。工作证明发出信号通知构造新区块的节点的意图以遵循协议规则,从而允许稍后赎回该特定事务。在可以赎回该特殊事务之前,区块链协议规则可能需要成熟期,例如100个区块。通常,常规(非生成)事务152还将在其输出中的一个输出中指定附加事务费用,以进一步奖励创建其中发布该事务的区块151n的区块链节点104。该费用通常称为“事务费用”,并在下文中讨论。
[0047] 由于事务核实和发布中涉及的资源,通常至少每个区块链节点104采用包括一个或多个物理服务器单元的服务器的形式,或者甚至整个数据中心。但是,原则上来说,任何给定区块链节点104均可采用一个用户终端或联网在一起的一组用户终端的形式。
[0048] 每个区块链节点104的存储器均存储被配置为在区块链节点104的处理装置上运行的软件,以根据区块链节点协议执行其相应的角色并处理事务152。应当理解的是,在本文中归因于区块链节点104的任何动作均可通过在相应计算机设备的处理装置上运行的软件执行。节点软件可以在应用层或诸如操作系统层或协议层的较低层或这些层任意组合的一个或多个应用中实现。
[0049] 扮演消费用户角色的多方103中的每一方的计算机设备102也连接到网络101。这些用户可以与区块链网络106交互,但不参与核实事务或构造区块。其中一些用户或代理103可以充当事务中的发送者和接收者。其它用户可以与区块链150交互,而不必充当发送者或接收者。例如,一些当事方可以充当存储区块链150的副本(例如,已经从区块链节点
104获得区块链的副本)的存储实体。
[0050] 各方103中的一些或所有当事方可以作为不同网络的一部分连接,例如覆盖在区块链网络106之上的网络。区块链网络的用户(经常称为“客户端”)可以被称为是包含区块链网络106的系统的一部分;然而,这些用户不是区块链节点104,因为它们不执行区块链节点所需的角色。相反,每一方103可以与区块链网络106交互,从而通过连接到区块链节点106(即,与区块链节点106通信)来利用区块链150。出于说明目的,示出了双方103及其相应的设备102:第一方103a及其相应的计算机设备102a,以及第二方103b及其相应的计算机设备102b。应当理解的是,更多此类当事方103及其相应的计算机设备102可能存在并参与系统100,但为了方便起见,未进行说明。每一方103均可以是个人或组织。仅出于说明目的,在本文中,第一方103a称为爱丽丝,第二方103b称为鲍勃,但应当理解的是,这并不仅限于爱丽丝或鲍勃,且本文对爱丽丝或鲍勃的任何引用均可分别用“第一方”和“第二方”替换。
[0051] 每一方103的计算机设备102包括相应的处理装置,其包括一个或更多个处理器,例如一个或更多个CPU、图形处理单元(GPU)、其他加速器处理器、特定应用程序处理器和/或FPGA。每一方103的计算机设备102还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。该存储器可包括一个或更多个存储器单元,其采用一个或更多个存储器介质,例如诸如硬盘等磁介质、诸如SSD、闪存或EEPROM等电子媒介和/或诸如光盘驱动器等的光学介质。每一方103的计算机设备102上的存储器存储软件,其包括被设置为在处理装置上运行的至少一个客户端应用程序105的相应实例。应当理解的是,在本文中归因于给定方103的任何行动均可通过在相应计算机设备102的处理装置上运行的软件执行。每一方103的计算机设备102包括至少一个用户终端,例如台式或笔记本电脑、平板电脑、智能手机或诸如智能手表等的可穿戴设备。给定方103的计算机设备102还可包括一个或更多个其他网络资源,诸如通过用户终端访问的云计算资源。
[0052] 客户端应用程序105最初可通过例如从服务器下载的适当计算机可读存储介质,或通过诸如可移动SSD、闪存密钥、可移动EEPROM、可移动磁盘驱动器、软盘或磁带等的可移动存储设备、诸如CD或DVD ROM等的光盘或可移动光驱等提供至任何给定方103的计算机设备102。
[0053] 客户端应用程序105至少包括“钱包”功能。这有两个主要功能。其中一个功能是使相应方103能够创建、授权(例如签名)事务152并将其发送到一个或多个位比特币节点104,然后在区块链节点104的网络中传播,从而包括在区块链150中。另一个功能是向相应方汇报其目前拥有的数字资产数额。在基于输出的系统中,该第二功能包括整理分散在区块链150中属于相关方的各种事务152的输出中定义的数额。
[0054] 注意:虽然各种客户端功能可以描述为集成到给定客户端应用程序105中,但这不一定是限制性的,相反,在本文中所描述的任何客户端功能可以在由两个或更多个不同应用程序组成的套件中实现,例如经由API进行接口连接或一个应用程序作为另一个应用程序的插件。更通俗地说,客户端功能可以在应用层或诸如操作系统的较低层或这些层的任意组合实现。下面将根据客户端应用程序105进行描述,但应当理解的是,这不是限制性的。
[0055] 每个计算机设备102上的客户端应用程序或软件105的实例可操作地耦合到网络106的区块链节点104中的至少一个。这可以启用客户端105的钱包功能,以将事务152发送至网络106。客户端105还可联络区块链节点104,以在区块链150中查询相应方103作为接收者的任何事务(或实际上在区块链150中检查其它方的事务,因为在实施例中,区块链150是在某种程度上通过其公开可见性提供事务信任的公共设施)。每个计算机设备102上的钱包功能被配置为根据事务协议制定和发送事务152。如上所述,每个区块链节点104运行软件,该软件被配置为根据区块链节点协议核实事务152并转发事务152以便在区块链网络106中传播。事务协议和节点协议相互对应,给定事务协议和给定节点协议一起实现给定的事务模型。相同的事务协议用于区块链150中的所有事务152。网络106中的所有节点104使用相同的节点协议。
[0056] 当给定方103(比方说爱丽丝)希望发送拟包含在区块链150中的新事务152j时,她将根据相关事务协议(使用其客户端应用程序105中的钱包功能)制定新事务。然后,她将事务152从客户端应用程序105发送到她所连接的一个或多个区块链节点104。例如,这可能是与爱丽丝的计算机102最佳连接的区块链节点104。当任何给定区块链节点104接收新事务152j时,其将根据区块链节点协议及其相应的角色进行处理。这包括首先检查新接收的事务152j是否满足变为“有效”的特定条件,具体示例稍后将详细讨论。在一些事务协议中,有效条件可通过事务152中包含的脚本在每个事务的基础上进行配置。或者,条件可仅仅是节点协议的内置功能,或通过组合脚本和节点协议进行定义。
[0057] 如果新接收的事务152j通过有效性测试(即:“有效”的条件下),接收事务152j的任何区块链节点104将向在区块链节点104处维护的有序事务集154中添加新的核实有效事务152。进一步地,接收事务152j的任何区块链节点104随后将核实有效事务152传播至网络106中的一个或多个其它区块链节点104。由于每个区块链节点104应用相同的协议,因此假定事务152j有效,这意味着事务很快将在整个网络106中传播。
[0058] 一旦进入在给定区块链节点104处维护的未决事务有序池154,该区块链节点104将开始争相解决其各自的包含新事务152的池154的最新版本上的工作证明难题(请记住,其它区块链节点104可以尝试基于不同的事务池154来解决难题。但是,首先解决难题的人将定义包括在最新区块151中的事务集合。最终,区块链节点104将解决有序池154的一部分的难题,该有序集154包括爱丽丝的事务152j)。一旦包括新事务152j的池154完成工作证明,其将不可变地成为区块链150中区块151中的一个区块的一部分。每个事务152包括指向早前事务的指针,因此事务的顺序也被不可变地记录下来。
[0059] 不同的区块链节点104可以首先接收给定事务的不同实例,并且因此在一个实例被发布到新区块151中之前具有关于哪个实例“有效”的冲突视图,此时所有区块链节点104同意所发布的实例是唯一的有效实例。如果区块链节点104将一个实例接受为有效实例,然后发现第二实例已记录在区块链150中,则区块链节点104必须接受这一点,并将丢弃(即,视为无效)其最初接受的实例(即,在区块151中尚未公布的实例)。
[0060] 作为基于账户的事务模型的一部分,由一些区块链网络操作的另一种类型的事务协议可称为“基于账户的”协议。在基于账户的情况下,每个事务均不通过参考过去事务序列中先前事务的UTXO来定义转移的数额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由网络的节点单独存储到区块链中,并不断更新。在此类系统中,事务使用账户的运行事务记录(也称为“头寸”)进行排序。该值由发送者签名作为其加密签名的一部分,并作为事务引用计算的一部分进行哈希处理。此外,可选的数据字段也可以在事务中签名。例如,如果数据字段中包含先前事务的ID,该数据字段可指向先前事务。
[0061] 基于UTXO的模型
[0062] 图2示出了示例性事务协议。这是基于UTXO的协议的示例。事务152(简称“Tx”)是区块链150的基本数据结构(每个区块151包括一个或多个事务152)。下面将通过参考基于输出或基于“UTXO”的协议进行描述。但这并不限于所有可能的实施例。应当注意的是,虽然参考比特币描述了示例性基于UTXO的协议,但是它同样可以在其它示例区块链网络上实现。
[0063] 在基于UTXO的模型中,每个事务(“Tx”)152包括数据结构,其包括一个或多个输入202和一个或多个输出203。每个输出203可包括未花费事务输出(UTXO),其可用作另一新事务的输入202的来源(如果UTXO尚未赎回)。UTXO包括指定数字资产数额的值。这表示分布式分类账上的一组通证。UTXO还可包含其来源事务的事务ID以及其它信息。事务数据结构还可包括标头201,其可包括输入字段202和输出字段203的大小指示符。标头201还可包括事务的ID。在实施例中,事务ID是事务数据(不含事务ID本身)的哈希值,且存储在提交至节点
104的原始事务152的标头201中。
[0064] 比方说爱丽丝103a希望创建转移相关数字资产数额至鲍勃103b的事务152j。在图2中,爱丽丝的新事务152j标记为“Tx1”。该新事务获取在序列中先前事务152i的输出203中锁定至爱丽丝的数字资产数额,并至少将此类数额中的一部分转移至鲍勃。在图2中,先前事务152i标记为“Tx0”。Tx0和Tx1只是任意的标记,其不一定意味着Tx0指区块链151中的第一事务且Tx1指池154中的后续事务。Tx1可指向仍具有锁定至爱丽丝的未花费输出203的任何先前(即先行)事务。
[0065] 当爱丽丝创建其新事务Tx1时,或至少在她将该新事务发送至网络106时,先前事务Tx0可能已经有效并包括在区块链150的区块151中。该事务此时可能已包括在区块151中的一个区块中,或者可能仍在有序集154中等待,在这种情况下,该事务将很快包括在新区块151中。或者,Tx0和Tx1可以创建并一起发送至网络106;或者,如果节点协议允许缓冲“孤立”事务,Tx0甚至可以在Tx1之后发送。本文事务序列上下文中使用的“先前”和“后续”一词是指由事务中指定的事务指针定义的序列中的事务顺序(哪个事务指向哪个其他事务等等)。它们同样可以替换为“前任”和“继任”、“先行”和“后代”或“父项”和“子项”等。这不一定指其创建、发送至网络106或到达任何给定区块链节点104的顺序。然而,指向先前事务(先行事务或“父事务”)的后续事务(后代事务或“子事务”)不会有效除非父事务有效。在父事务之前到达区块链节点104的子事务被视为孤立事务。根据节点协议和/或节点行为,其可被丢弃或缓冲一段时间,以等待父事务。
[0066] 先前事务Tx0的一个或更多个输出203中的一个包括特定的UTXO,标记为UTXO0。每个UTXO包括指定UTXO表示的数字资产数额的值以及锁定脚本,该锁定脚本定义后续事务的输入202中的解锁脚本必须满足的条件,以使后续事务有效,从而成功赎回UTXO。通常情况下,锁定脚本将数额锁定至特定方(该数额的事务的受益人)。即,锁定脚本定义解锁条件,该解锁条件通常包括以下条件:后续事务的输入中的解锁脚本包括先前事务被锁定到的一方的加密签名。
[0067] 锁定脚本(亦称scriptPubKey)是节点协议识别的域特定语言中写入的一段代码。此类语言的特定示例称为“脚本(Script)”(S大写),其可由区块链网络所使用。锁定脚本指定花费事务输出203所需的信息,例如爱丽丝签名的要求。解锁脚本出现在事务的输出中。
解锁脚本(亦称scriptSig)是提供满足锁定脚本标准所需信息的域特定语言中写入的一段代码。例如,其可包含鲍勃的签名。解锁脚本出现在事务的输入202中。
[0068] 因此在示出的示例中,Tx0的输出203中的UTXO0包括锁定脚本[Checksig PA],该锁定脚本需要爱丽丝的签名Sig PA,以赎回UTXO0(严格来说,是为了使试图赎回UTXO0的后续事务有效)。[Checksig PA]包含爱丽丝的公私密钥对中的公钥PA的表示(即哈希)。Tx1的输入202包括指向Tx1的指针(例如,通过其事务ID(TxID0),其在实施例中是整个事务Tx0的哈希值)。Tx1的输入202包括在Tx0中标识UTXO0的索引,以在Tx0的任何其他可能输出中对其进行标识。Tx1的输入202进一步包括解锁脚本,该解锁脚本包括爱丽丝的加密签名,该签名由爱丽丝通过将其密钥对中的私钥应用于预定的部分数据(有时在密码学中称为“消息”)创建。爱丽丝需要签名以提供有效签名的数据(或“消息”)可通过锁定脚本、节点协议或其组合进行定义。
[0069] 当新事务Tx1到达区块链节点104时,该节点应用节点协议。这包括一起运行锁定脚本和解锁脚本,以检查解锁脚本是否满足锁定脚本中定义的条件(其中该条件可包括一个或更多个标准)。在实施例中,这涉及并置两个脚本:
[0071] 其中“||”表示并置,“<…>”表示将数据放在堆栈上,“[…]”表示由锁定脚本组成的函数(在该示例中指基于堆栈的语言)。同样,脚本可以使用公共堆栈一个接一个地运行,而不是并置脚本。无论采用哪种方式,当一起运行时,脚本使用爱丽丝的公钥PA(包括在Tx0的输出的锁定脚本中),以认证Tx1的输入中的解锁脚本是否包含爱丽丝签名预期部分的数据时的签名。也需要包括预期的部分数据本身(“消息”),以便执行此认证。在实施例中,签名的数据包括整个Tx1(因此不需要包括一个单独的元素来明文指定签名的部分数据,因为其本身便已存在)。
[0072] 本领域技术人员将熟悉通过公私密码进行验证的细节。基本上而言,如果爱丽丝已使用其私钥加密签署消息,则给定爱丽丝的公钥和明文中的消息,诸如节点104等其它实体可验证消息必须已经由爱丽丝签名。签署通常包括对消息进行哈希,签署哈希值和将此标记到消息作为签名,从而使公钥的任何持有者能够验证签名。因此,应当注意的是,在实施例中,在本文中对签名特定数据片段或事务部分等的任何引用可以意味着对该数据片段或事务部分的哈希值进行签名。
[0073] 如果Tx1中的解锁脚本满足Tx0的锁定脚本中指定的一个或多个条件(因此,在所示示例中,如果在Tx1中提供了爱丽丝的签名并进行验证),则区块链节点104认为Tx1有效。这意味着区块链节点104会将Tx1添加到待定事务有序池154。区块链节点104还会将事务Tx1转发到网络106中的一个或多个其它区块链节点104,以便其会在整个网络106中传播。一旦Tx1有效并包括在区块链150中,这会将UTXO0从Tx0定义为已花费。应当注意的是,Tx1仅在花费未花费事务输出203时才有效。如果其试图花费另一事务152已经花费的输出,则即使满足所有其它条件,Tx1也将无效。因此,区块链节点104还需要检查先前事务Tx0中引用的UTXO是否已经花费(即,其是否已经形成另一有效事务的有效输入)。这是为何区块链150对事务152施加定义的顺序很重要的原因之一。在实践中,给定区块链节点104可维护单独的数据库,标记已花费事务152的UTXO 203,但最终定义UTXO是否已花费取决于是否在区块链150中形成了另一有效事务的有效输入。
[0074] 如果给定事务152的所有输出203中指定的总数额大于其所有输入202所指向的总数额,则这是大多数事务模型中的另一失效依据。因此,此类事务不会传播或包括在区块151中。
[0075] 请注意,在基于UTXO的事务模型中,给定UTXO需要作为一个整体使用。不能“留下”UTXO中定义为已花费的一部分数额,而同时又花费另一部分。但UTXO的数额可以在后续事务的多个输出之间分割。例如,Tx0的UTXO0中定义的数额可以在Tx1中的多个UTXO之间分割。因此,如果爱丽丝不想将UTXO0中定义的所有数额都给鲍勃,她可以使用剩余部分在Tx1的第二输出中自己找零,或者支付给另一方。
[0076] 在实践中,爱丽丝通常还需要包括用于比特币节点104的费用,该比特币节点104在区块151中成功包含爱丽丝的事务104。如果爱丽丝未包括此类费用,则Tx0可能会被区块链节点104拒绝,并且因此尽管在技术上有效,但可能不会传播并且包括在区块链150中(如果区块链节点104不希望接受事务152,节点协议不强迫区块链节点104接受)。在一些协议中,事务费用不需要其自身的单独输出203(即不需要单独的UTXO)。相反,输入202指向的总数额与给定事务152的输出203指定的总数额之间的任何差额都将自动提供给发布事务的区块链节点104。例如,假设指向UTXO0的指针是Tx1的唯一输入,并且Tx1仅具有一个输出UTXO1。如果在UTXO0中指定的数字资产数额大于在UTXO1中指定的数额,则可以由赢得工作证明竞赛以创建包含UTXO1的区块的节点104分配该差值。替代地或附加地,这不一定排除可以在其自身事务152的其中一个UTXO 203中明确指定事务费用。
[0077] 爱丽丝和鲍勃的数字资产由区块链150中任何位置的任何事务152中的锁定至他们的UTXO组成。因此,通常情况下,给定方103的资产分散在整个区块链150的各种事务152的UTXO中。区块链150中的任何位置均未存储定义给定方103的总余额的一个数字。客户端应用程序105的钱包功能的作用是将锁定至相应方且在其它随后事务中尚未花费的各种UTXO值整理在一起。为实现这一点,其可以查询存储在任何一个位比特币节点104处的区块链150的副本。
[0078] 应当注意的是,脚本代码通常用示意图表示(即使用非精确语言)。例如,可以使用操作码(opcode)来表示特定功能。“OP_...”是指脚本语言的特定操作码。举例来说,OP_RETURN是脚本语言操作码,当在锁定脚本的开始处在操作码前加上OP_FALSE时,操作码创建事务的不可花费输出,该输出可以在事务内存储数据,从而将数据不可改变地记录在区块链150中。例如,数据可包括需存储在区块链中的文件。
[0079] 通常,事务的输入包含对应于公钥PA的数字签名。在实施例中,这基于使用椭圆曲线secp256k1的ECDSA。数字签名对特定的数据段进行签名。在实施例中,对于给定事务,签名将对部分事务输入以及部分或全部事务输出进行签名。对输出的特定部分进行签名取决于SIGHASH标志。SIGHASH标志通常是包含在签名末尾的4字节代码,用于选择签名的输出(并因此在签名时固定)。
[0080] 锁定脚本有时称为“scriptPubKey”,指其通常包括相应事务被锁定到的当事方的公钥。解锁脚本有时称为“scriptSig”,指其通常提供相应的签名。但是更通俗地说,在区块链150的所有应用中,UTXO赎回的条件并不一定包括对签名进行验证。更通俗地说,脚本语言可用于定义任何一个或多个条件。因此,可以优选更为通用的术语“锁定脚本”和“解锁脚本”。
[0081] 第2层覆盖网络
[0082] 区块链网络106本身采用覆盖在网络(例如,互联网101)上的覆盖网络的形式。然而,也可以在区块链的顶层覆盖另一层覆盖网络。图3中通过示例的方式对此进行了阐述。Metanet便是此方面的示例。此类网络也可以称为“第2层(layer‑2)”网络,因为相对于作为底层网络基础设施的基础网络101(例如,互联网)和作为覆盖在基础网络上的第一层覆盖网络的区块链网络106而言,它是第二层覆盖网络。
[0083] 该第二层覆盖网络300包括由节点301和边302组成的网络。应当注意的是,节点301现在指Metanet(或覆盖在区块链上的其他此类网络)层的节点,而不是先前结合图1和图2所述的区块链网络106层的节点104。Metanet网络(或类似网络)的每个节点301都是区块链150上的不同相应事务152,其中每一个都将数据存储在相应事务的有效载荷中。因此,Metanet网络300(或类似网络)的节点301在本文中也可以称为数据存储节点或数据存储事务。存储在其中的数据可以包括数据内容和/或元数据,通常两者都包括在内。在基于输出的模型中,数据可以存储在相应事务的不可花费输出203中、甚至在相应事务的可花费输出中。输出可以通过锁定脚本中的一个或多个操作码变得不可花费,该操作码在运行时终止脚本。例如,在使用脚本语言的系统中,这可以是OP_RETURN操作码,也可以是OP_FALSE后跟OP_RETURN,具体取决于所使用的协议。然而,这并不局限于此,本领域技术人员将了解用于在其他区块链系统的事务中存储任意有效载荷数据的其他技术,例如在采用基于账户的模型的系统中。下面为基于输出的模型的示例,但这并不局限于此。
[0084] 应当注意的是,第2层覆盖网络300可以只由数据构成,即完全虚拟的网络。即Metanet或诸如此类网络的节点301和边302作为覆盖在区块链150的事务152上的覆盖网络,不一定对应于底层区块链网络106或底层网络基础设施101的任何特定物理参与者或实体。
[0085] 数据内容是Metanet(或类似网络)存储的实际数据,例如文本、音频、静态或动态图像,或其他文档。这也可以称为用户内容或用户数据。元数据实现了将网络分层置于区块链150之上的协议。在至少一些事务152中,它定义了数据内容之间的链接。这些也可以称为节点301之间的边302。例如,链接或指针可以包括父节点的事务ID,即TxIDparent。应当注意的是,尽管存在一定的可能性,但本文中的“链接”不一定指超文本链接。更通俗地说,链接可以指任何形式的指针,该指针指向当前节点301在Metanet层(或区块链150顶层的其他此类覆盖层)相关的另一节点301。
[0086] 为方便起见,下面以Metanet为例进行描述,但应当理解的是,这并不局限于此。更通俗地说,本文中提及Metanet的任何位置都可以替换为覆盖在区块链上的任何覆盖网络。类似地,对Metanet节点的任何引用都可以替换为对任何覆盖网络节点或覆盖网络的数据存储节点的引用,对Metanet链接或边的任何引用都可以替换为对相关覆盖网络层的任何覆盖网络边或链接的引用。
[0087] Metanet协议定义了一种构建链上数据的方案和标准,该数据可以存储在公共区块链上并用于许多用例中的不同应用。该协议规定图形结构(包括节点和边)可以根据多组区块链事务构建,并且这些结构可以用于存储、传达、表示和分发任何性质的数据(“内容”)。通过将事务视为节点并将签名视为在事务之间创建的边,Metanet协议允许创建图3所示的链上图形结构。
[0088] 可以看到,Metanet 300的节点301和边302形成树结构。即父节点301链接到一个或多个子节点301,任何给定的子节点301本身可以是链接到其自身的一个或多个子节点的父节点,以此类推。应当注意的是,就本发明而言,相关树结构只能是更宽的树或图形的子集。
[0089] 图3还示出了如何更新节点301及其相关联的边302。由于事务被不可变地记录在区块链152上,因此更新Metanet节点301时需要通过新事务152创建新的实例301’和对应的边302’。
[0090] 图3所示的结构可以包括嵌套域,例如网站及其页面的结构,其中“顶层域”封装其下面的子域,以此类推。一个功能性密钥域(例如写入密钥、资金密钥、加密密钥的域)可跨越许多此类结构域。
[0091] 图3中的圆圈表示节点,这些节点只是根据Metanet协议的规则集创建的事务。图4中示出了根据该规则集创建和格式化的事务152N的示例。
[0092] 图4中右侧的事务152C表示实现Metanet的给定节点301C(子节点)的区块链150的事务152。图4中左上角的事务152P表示在Metanet层实现子节点152C的父节点的区块链150的事务。子节点事务152C具有输入202,该输入包括解锁脚本并且指向区块链150的资金事务152F的输出203。换言之,Metanet节点152C的输入消耗资金事务152F的输出。应当注意的是,资金事务152F和Metanet父事务152P不一定是同一事务(尽管不排除这种可能性)。
[0093] 子事务152C包括不可花费输出203(例如,通过OP_RETURN变得不可花费),该输出具有有效载荷(从区块链层的角度而言的有效载荷)。该有效载荷可以包括经过哈希和/或加密处理的Metanet的数据内容(“数据”),或者可以只是原始数据(“明文”)。
[0094] 子事务152C的有效载荷还包括Metanet网络层的元数据。该元数据至少包括父事务152P的事务标识符。这会在Metanet层创建链接(边)302。Metanet协议可能还要求包括与子节点301C相关联的密钥Pnode。
[0095] 资金事务152F的输出203的锁定脚本还要求将签名包含在子节点152C的输入202的解锁脚本中。具体而言,该签名必须是使用与Metanet父密钥相关联的密钥Pparent签署的签名(即,由该密钥签署的消息)。这会在区块链层创建边402(有时称为花费边)。如果子事务152C的输入202的解锁脚本中不包含所需签名,则子事务152C不会由区块链网络106的节点104核实,因此不会通过区块链网络106传播也不会记录在区块链150上。然而,同样应当注意的是,资金事务152F不一定是与Metanet父事务152P相同的区块链事务152,因此区块链层花费边402不一定与Metanet层边302相同。
[0096] 图4仅概述了作为完整事务抽象层的Metanet事务的特定相关组件。除协议标识符标志外,这些组件包括:
[0097] ·公钥Pnode;
[0098] ·父公钥PParent的签名,SigPParent;
[0099] ·节点本身的事务ID,TxIDnode;
[0100] ·父节点的事务ID,TxIDParent。
[0101] 占位符通常指可以包含在Metanet节点事务中的任何内容数据。在一些应用中,也可能希望用加密密钥ek对数据进行加密,在这种情况下,事务中包含的数据转换为,其中e()是适当的加密函数。
[0102] 每个Metanet节点301都可以通过节点对(Pnode,TxIDnode)进行唯一识别,该节点对是索引,可由Metanet图形继承强大的版本控制和许可控制。还应当理解的是,每个Metanet节点都包含足够的信息,以识别其自身(Pnode,TxIDnode)及其父节点(Pparent,TxIDparent)。
[0103] 为了确保Metanet子节点301C事务包含来自父节点301P的正确输入签名SigPParent,在许多情况下需要创建一个或多个资金事务152F,具体可参见图4的左下角。
[0104] 父密钥Pparent和/或子节点密钥Pnode可以视为写入密钥,该写入密钥授权将子节点301C的数据写入区块链150。
[0105] 因此,Metanet提供了一种协议,该协议使得能够以仅使用区块链本身的底层技术对链上数据的许可和写入访问控制进行编码的方式来构造此类数据。因此,Metanet协议是一种使得用户能够可证明地拥有其链上内容的方案。
[0106] Metanet协议定义了允许创建Metanet有向无环图(Metanet DAG)的规则集。Metanet DAG的单个实例称为Metanet树。每个Metanet树都具有根节点(顶层节点),每个Metanet节点(包括根节点)可以具有一个或多个子节点(例如,再次参见图3)。
[0107] 因此,Metanet DAG成为树的全局集合,其中每个树从自己的根节点开始,并且可以具有自己的本地化许可结构。
[0108] Metanet节点301只是遵循Metanet协议的规则集的事务。存在两种类型的节点:根节点,其没有父节点;子节点,其中给定子节点仅具有一个父节点。根据一种实现方式,Metanet节点的最基本概要结构要求事务满足以下准则:
[0109] ·该事务具有至少一个OP_RETURN输出(或者更一般地,不可花费的输出)。
[0110] ·OP_RETURN有效载荷包括:
[0111] οMetanet标志;
[0112] ο节点地址Pnode;
[0113] ο父事务ID,TxIDparent。
[0114] ·除根节点外,每个事务包含由父节点签名的输入。
[0115] 也不排除相同的数据可以包括在可花费输出(例如,使用OP_PUSHDATA)中的情况。
[0116] 如上所述,Metanet节点是包括以下四个元素的事务152:
[0117] ·Pnode‑节点地址;
[0118] ·TxIDnode‑节点版本;
[0119] ·Pparent‑节点的父辈的地址;
[0120] ·TxIDparent‑节点的父辈的版本。
[0121] Metanet边302通过签名创建。为了创建从父节点到子节点的边,子节点必须使用与其父节点相关联的密钥对进行签名,Sig Pparent必须出现在子节点的输入中。
[0122] 应当注意的是,在一些示例中,Metanet事务可以包括基于公钥Pnode(例如,公钥的哈希)的地址,而不是公钥Pnode本身。
[0123] 此外,还应当注意的是,节点的事务ID TxIDnode可以解释为该节点的版本。类似地,节点的父节点的事务ID TxIDParent可以解释为该父节点的版本。下面将讨论节点版本控制。
[0124] Metanet节点不能与树断开连接,这是因为如图4所示,父节点与子节点之间的链路是通过在子节点的“主体”(即,输出)中发布具有父节点的事务ID的事务来静态创建的。然后,使用父私钥对节点(事务)进行签名。因此,仅通过创建Metanet节点的新版本或核实该节点无效(用户仍然需要检索该节点,以便检查其是否有效),即可从树中排除该相同节点。
[0125] 事务ID TxIDnode被解释为节点的版本。如果存在具有相同公钥的两个节点(如图5所示),则具有最大工作证明的事务ID的节点(插入到最新区块中的节点)被解释为该节点的最新版本。
[0126] 可以通过生成花费要删除的节点中包括的特定UTXO的新事务(不一定是Metanet事务)来删除该节点,或者更确切地说,可以核实该节点无效。根据协议将具有所花费的UTXO的节点视为无效,并因此将其从树中移除。
[0127] 创建树结构的版本
[0128] 下面将描述一种方法,通过该方法,可以使用Metanet或覆盖在区块链上的其他此类图形结构来创建动态树结构,即同一树的不同版本。该方法在下文中有时称为Metanet Flux协议(MFP),然而应当理解的是,这仅仅是便利标签,并且适用于Metanet和其他类型的树结构。根据Metanet Flux协议创建的树将称为Metanet Flux树。
[0129] 在一些实施例中,MFP可以用于创建Metanet Flux树结构,其中该树的某些节点被视为有效,而其他节点被视为无效(例如,取决于该树的访问日期或者谁正在访问该树)。重要的是,节点可以视为无效,而不必花费相关联的UTXO,从而减少提交给区块链的事务的数量。下面将讨论进一步的特征和优点。
[0130] 图7示出了用于实现本文描述的实施例的示例性系统700。系统700包括树创建者701,其被配置为创建Metanet Flux树。树创建者701通常可以是任何类型的当事方(例如,个人、一组个人、公司等),也可以是机器或智能合约等自动化实体。
[0131] 树创建者701可以被配置为执行结合图1和图2的归因于爱丽丝103a和/或鲍勃103b的部分或全部操作。例如,树创建者701被配置为生成区块链事务并将这些事务提交给区块链网络106和/或将这些区块链事务发送给另一方。系统700还包括区块链网络106的一个或多个节点。一个或多个用户702也被示为系统700的一部分。图7中示出了两个用户(用户A和用户B),但是应当理解的是,系统700可以包括任意数量的用户702。与树创建者701一样,每个用户702可以被配置为执行由爱丽丝103a和/或鲍勃103b执行的任何操作。然而,在一些示例中,这并不是必需的。通常,每个用户702仅需要被配置为经由区块链节点104等访问区块链150。在一些示例中,每个用户702还可以被配置为与树创建者701通信,例如向树创建者701发送参数。通信可以通过任何有线或无线连接进行。
[0132] 树创建者701和每个用户702可以操作相应计算机设备(图7中未示出)。各方的相应计算机设备包括相应处理装置,该相应处理装置包括一个或多个处理器,例如,一个或多个CPU、GPU、其他加速器处理器、专用处理器和/或FPGA。相应计算机设备还包括存储器,即采用非瞬时性计算机可读介质形式的计算机可读存储器。该存储器可以包括一个或多个存储器单元,其采用一个或多个存储器介质,例如诸如硬盘等磁介质、诸如SSD、闪存或EEPROM等电子媒介和/或诸如光盘驱动器等光学介质。相应计算机设备上的存储器存储软件,该软件包括被设置为在处理装置上运行的至少一个相应客户端应用程序的相应实例。应当理解的是,在本文中归因于树创建者701或用户702的任何动作均可使用在相应计算机设备的处理装置上运行的软件执行。相应计算机设备包括至少一个用户终端,例如台式电脑或笔记本电脑、平板电脑、智能手机或诸如智能手表等可穿戴设备。相应计算机设备还可以包括一个或多个其他网络资源,诸如通过用户终端访问的云计算资源。相应客户端应用程序最初可通过(例如,从服务器下载的)适当计算机可读存储介质,或通过诸如可移动SSD、闪存密钥、可移动EEPROM、可移动磁盘驱动器、软盘或磁带等可移动存储设备、诸如CD或DVD ROM等光盘或可移动光驱等提供至相应计算机设备。
[0133] 上面已经结合图3至图6描述了覆盖在区块链150上的树结构(例如,Metanet树)的示例。根据本发明的实施例创建的树结构至少在以下方面不同于上述树结构,即创建将子节点连接到父节点的边的方式。也就是说,以下实施例描述了在子节点与父节点之间形成边的新颖方式。在一些示例中,可以使用该新颖方法来形成树结构的每个子节点。在其他示例中,使用该新颖方法仅形成树结构的一些子节点。
[0134] 树创建者701可以访问树结构的至少一部分。该树结构可以仅包括根节点,或者可以包括根节点和一个或多个子节点(例如,根节点的直接子节点),或者可以包括根节点的一个或多个子节点以及这些子节点的一个或多个子节点,以此类推。如上所述,每个子节点是区块链事务,因此包括事务标识符,例如事务内容的(双重)哈希。每个子节点还包括(例如,在事务的输入中)对应于与该子节点所连接的父节点相关联的公钥的签名。如果可以使用公钥核实签名有效,则该签名对应于该公钥。
[0135] 在某个时间点,树创建者701创建一个或多个新的子节点。这些新的子节点是同一父节点的子节点(即,连接到同一父节点的子节点)。父节点可以是根节点,也可以是树的不同节点。一个或多个新的子节点以及这些节点所连接的父节点在下文中分别称为目标子节点和目标父节点。例如,每个目标子节点包括在事务的输出中的相应数据有效载荷。
[0136] 树创建者701还在每个目标子节点与目标父节点之间形成相应边。先前的树结构通过在事务的输出中包括父节点的事务标识符来形成边。相反,通过将目标子节点与相应链路标识符(ID)关联来形成目标子节点与目标父节点之间的边。可以通过将链路ID(link ID)包括在对应事务的输出中来将链路ID与目标子节点关联。输出可以是可花费输出,也可以是不可花费输出。可以使用OP_PUSHDATA等将数据(例如,链路ID)包括在不可花费输出中。可以使用OP_RETURN或OP_FALSE OP_RETURN等将数据包括在可花费输出中。可以使用任何其他等效方法。不排除可以通过不同方式(例如,通过包括在对应事务的输入中)将链路ID与目标子节点关联的情况。
[0137] 在一些示例中,至少两个目标子节点与不同的链路ID相关联(例如,包括不同的链路ID)。因此,在这些示例中,至少创建树的两个不同版本(即,视图)。
[0138] 在一些示例中,每个目标子节点可以与不同的链路ID相关联。例如,如果目标父节点具有三个目标子节点,则这三个目标子节点中的每个目标子节点可以与不同的链路ID相关联。因此,创建树的三个版本。在其他示例中,一个或多个目标子节点可以与相同的链路ID相关联。与相同的链路ID相关联的目标节点属于树的相同版本(即,构成其一部分)。
[0139] 例如,当用户702访问树结构时,用户702可以选择访问树的特定版本,例如具有与特定链路ID相关联的目标子节点的版本。应当注意的是,访问树包括检索树的一个或多个节点。检索所述节点可以包括将这些节点存储在存储器等中。因此,用户702可以选择检索包括与特定链路ID相关联的目标子节点而不包括任何其他目标子节点的树的版本。仍然可以检索任何其他非目标子节点(例如,目标父节点)以及树结构中目标父节点之上的任何节点,一直追溯到根节点。类似地,一个或多个目标子节点本身可以是一个或多个子节点的相应父节点。访问树的版本还可以包括检索与特定链路ID相关联的目标子节点的子节点。
[0140] 链路ID可以基于任何类型的链下数据。链路ID可以通过包括数据或以某种其他方式来“基于”该数据。例如,下面将讨论基于链下数据的函数来生成链路ID。
[0141] 例如,链路ID可以基于时间相关数据(例如,日、周、月、年、日期(例如,21/12/21)等中的一个或多个。例如,一个目标子节点的链路ID可以基于一个月份(例如,3月),而另一个目标子节点的链路ID可以基于不同的月份(例如,4月)。因此,当访问树时,用户可以选择仅访问与该树的访问月份对应的目标子节点。例如,如果当前月份是4月,则用户可以选择仅访问链路ID基于月份“4月”的目标子节点。可以忽略(或视为无效)并且不检索与对应于上个月的链路ID相关联的目标子节点,从而减少用户702检索和存储的节点的数量。
[0142] 作为另一示例,链路ID可以基于用户相关数据,即与特定用户或用户组相关的数据。例如,链路ID可以基于以下各项中的一项或多项:姓名、地址、出生日期、护照号码、电话号码、电子邮件地址等。树结构可以涉及特定应用、网站、服务等。然后,链路ID可以基于所述应用、网站、服务等的用户的用户名。这些示例允许为特定用户或特定用户组创建目标子节点。因此,用户可以访问包括特定于该用户的目标子节点的树的版本。这里,特定于用户的目标子节点意味着该目标子节点的链路ID基于与该用户相关的数据。这同样适用于用户组。
[0143] 在一些示例中,每个目标子节点的相应链路ID可以基于一种或多种相同类型的数据。例如,每个链路ID可以基于用户名,不同的用户名会产生不同的链路ID。类似地,每个链路ID可以基于日期,不同的日期会产生不同的链路ID。在其他示例中,一个或多个链路ID可以基于一种类型的数据(例如,名称),而一个或多个链路ID基于不同类型的数据(例如,星期几)。
[0144] 树创建者701可以生成一个或多个链路ID。然后,树创建者701可以将所生成的链路ID中的一个或多个链路ID发送给一个或多个用户702。树创建者701可以将所有链路ID发送给所有用户702。例如,可以创建七个链路ID,特定一周中每天一个链路ID。树创建者可以将链路ID发送给每个用户702,使得每个用户可以在一周中的特定日期访问树的特定版本。在其他示例中,树创建者可以仅向特定用户发送特定链路ID,例如,基于用户A的数据(例如,用户名)的链路ID可以仅发送给用户A 702a,而基于用户B的数据的链路ID可以仅发送给用户B 702b。
[0145] 附加地或替代地,可以从一个或多个用户接收一个或多个链路ID。例如,用户A 702a可以创建他/她自己的链路ID(例如,基于他/她的用户特定数据),并将其发送给树创建者701。然后,树创建者可以使用从该用户702a接收的链路ID在目标子节点与目标父节点之间形成边。目标子节点可以包括旨在供该用户702a使用的数据内容。
[0146] 如上所述,链路ID可以基于数据,因为该链路ID包括所述数据。或者,链路ID可以基于数据,因为该链路ID是该数据的函数。即,该数据是被配置为生成链路ID的函数的参数。该函数在下文中称为“链路ID函数”。可以通过向链路ID函数输入一个或多个参数来生成链路ID。链路ID函数的一个示例是哈希函数。使用哈希函数是有利的,因为所产生的每个链路ID将具有相同的长度,并且看起来是随机生成的。此外,如果基于不同的输入参数,则两个链路ID相同的可能性极小,并且仅基于所产生的链路ID导出输入参数在计算上是不可行的,从而保持输入参数(例如,用户名)的隐私性。可以改为使用其他函数,例如求和函数、连接函数、异或(XOR)函数等。
[0147] 在一些示例中,通过向链路ID函数输入一个或多个参数来生成每个链路ID。可以通过向相同的链路ID函数输入一个或多个参数来生成每个链路ID。或者,可以通过向一个链路ID函数输入参数来生成一个或多个链路ID,而可以通过向不同的链路ID函数输入参数来生成一个或多个链路ID。
[0148] 可以通过仅向链路ID函数提供单个参数或者通过向链路ID函数提供多个参数来生成链路ID。向该函数提供的参数可以包括时间相关参数、用户特定参数和加权参数中的一个、一些或全部。上面已经讨论了时间相关参数,例如日、周、月、日期等。类似地,上面也已经讨论了用户特定参数,例如用户名、出生日期、电子邮件地址、联系号码等。下面将讨论加权参数。应当注意的是,这些仅仅是可以使用的不同参数的示例,并且不排除其他类型的参数的用户,例如,其他类型的参数包括公司相关数据(例如,公司名称、股票代码等)、地理相关数据(例如,城市、国家等)等。
[0149] 在这些示例中,链路ID还可以是目标父节点的事务ID的函数。例如,链路ID可以基于目标父节点的事务ID和用户702的用户名。
[0150] 每个链路ID可以基于一组相同的参数。或者,一些链路ID可以基于一组不同的参数(与其他链路ID相比)。
[0151] 可以基于一个或多个加密参数或一组参数的加密版本来生成一个或多个链路ID。例如,可以提供用户名的加密版本,而不是向链路ID函数提供用户名。这允许链路ID基于敏感数据,而不会泄露数据本身。
[0152] 在一些示例中,树创建者701可以访问一个或多个链路ID函数。在这种情况下,树创建者可以生成链路ID。然后,可以将链路ID发送给一个或多个用户701。在这些示例中,树创建者701可以选择向链路ID函数提供哪些参数以生成链路ID。或者,用户702可以向树创建者701发送一组参数。然后,树创建者701可以基于这些参数来生成链路ID。图7中示出了这种情况,其中用户A 702a提供一组参数,用户B 702a提供一组不同的参数。链路ID函数可以最初从用户702提供给树创建者701,或者至少最初由用户702决定。例如,用户A可以决定使用哈希函数,而用户B决定使用替代函数。
[0153] 在一些示例中,用户702可以通过向链路ID函数提供相应一组或多组参数来生成一个或多个链路ID。然后,用户702可以将一个或多个链路ID发送给树创建者701。
[0154] 在一些示例中,工作证明可以嵌入链路ID中,嵌入方式类似于通过找到满足目标难度的区块哈希来将工作证明嵌入区块链150的区块151中。与此类似,可以通过找到哈希处理为满足目标难度的链路ID的原像来将工作证明嵌入链路ID中。也就是说,向链路ID函数(例如,哈希函数或等效函数)提供的该组参数必须产生满足目标难度的链路ID。在链路ID函数是哈希函数的情况下,可以通过要求链路ID(即,哈希摘要)具有最小数量的前导零来指定目标难度。可以通过其他方式(例如,以最小数量的零结束)来指定难度。
[0155] 为此,输入到链路ID函数的一个或多个参数可以保持静态,同时每次使用不同的随机数值以产生不同的输出。例如,用户名、父节点事务ID和日期可以保持不变,而随机数从零开始以整数递增。可以重复递增随机数并计算结果的过程,直到找到有效的链路ID。
[0156] 每个目标子节点所需的难度可以是相同的。换句话说,将目标子节点添加到树中所需的工作证明对于所有目标子节点都是一致的。或者,一些目标子节点可能需要满足不同级别的难度。通过这种方式,可以发现某个目标子节点所需的工作证明多于其他目标子节点。因此,可以推断,与具有满足较小难度(例如,五个前导零)的链路ID的目标子节点相比,具有满足较大难度(例如,二十个前导零)的链路ID的目标子节点包含更有价值的内容。应当注意的是,内容的价值不一定以货币来衡量。例如,该价值可以是对内容的信任度量。
例如,投入大量工作证明来生成链路ID的树创建者701可以仅对满足以下条件的数据执行此操作,即树创建者信任并且因此值得在添加到树中时花费工作证明的数据。
[0157] 在一些实施例中,所述目标子节点中的一个或多个目标子节点与特定用户702相关联,或者至少旨在供特定用户702使用。换句话说,这些目标子节点包括特定用户要访问的数据有效载荷。每个目标子节点可以旨在供不同的用户702使用,或者多个目标子节点可以旨在供相同的用户702使用。本发明的实施例允许各个用户确定与该用户相关联的一个或多个目标子节点,并因此仅检索相关节点。
[0158] 在一些实施例中,目标子节点中的一个或多个目标子节点可以包括预期在某些条件下有效或相关的数据,例如,在特定时间段内有效或对特定用户或用户组有效。例如,目标子节点可以包括新闻内容。可以每天将目标子节点添加到树中,其中该目标子节点包含当天的新闻。本发明的实施例允许各个用户确定有效的一个或多个目标子节点,并因此仅检索有效节点。
[0159] 在一些实施例中,目标子节点中的一个或多个目标子节点可以包括相应的网页、博客文章等。在网页的情况下,可以为特定用户定制内容。因此,所描述的技术可以用于基于用户特定数据来生成链路ID,从而允许该用户仅访问相关网页。在博客文章的情况下,每篇博客文章的链路ID可以嵌入工作证明。因此,具有大量工作证明的博客文章可以被认为是合法的,或者至少对创建者是有价值的。当访问树的用户可以创建相同的链路ID(例如,通过向其提供所需的随机数)时,该用户可以确信创建者已经花费了时间、金钱和精力来创建链路ID。目标子节点中的数据内容(例如,博客文章)可以被认为是有价值的,例如可信。
[0160] 目标子节点中包含的其他类型的数据内容包括媒体内容(例如,文本、图像、视频、音频等)或文件(例如,文档、软件、操作系统等)等。
[0161] 在创建多个目标子节点之后,树创建者随后可以创建所述目标子节点中的一个或多个目标子节点的一个或多个子节点。因此,目标子节点成为一个或多个子节点的父节点。可以使用上述技术在这些子节点与父节点之间形成边。或者,可以使用现有协议(例如,Metanet)所使用的技术来形成一些或全部边。
[0162] 在一些实施例中,可以由一个或多个附加元素(即,除链路ID之外)在目标子节点与目标父节点之间形成边。例如,边可以要求目标子节点与对应于与目标父节点相关联的公钥的签名相关联(例如,包括在事务的输入或输出中)。
[0163] 在一些实施例中,每个目标子节点可以包括协议标志,该协议标志指示根据所公开的实施例形成了将目标子节点连接到目标父节点的边。
[0164] 下面将描述根据所公开的实施例,一方(例如,用户702)可以如何访问树创建者701创建的树的特定版本。该方法将根据用户A 702a执行的方式来描述,但是它通常适用于任何一方。用户A 702a称为爱丽丝。这可以是也可以不是结合图1描述的相同的爱丽丝
103a。
[0165] 爱丽丝702a获取目标父节点。目标节点可以是树的根节点,也可以是树的不同节点。爱丽丝702a可以通过经由一个或多个中间节点等跟踪从根节点向下到目标父节点的连接来获取目标父节点。爱丽丝702a可以通过获取与父节点相关联的相应公钥(称为节点地址),然后标识包含该公钥的节点来获取目标父节点。目标父节点可以通过替代方式获取,例如使用目标父节点的事务标识符。
[0166] 例如,爱丽丝702a还通过生成一个或多个链路ID和/或从树创建者701接收一个或多个链路ID来获取一个或多个链路ID。爱丽丝702a可以通过向链路ID函数提供一组参数来生成链路ID。爱丽丝702a最初可能已经向树创建者701发送一个或多个链路ID,用于在目标子节点与目标父节点之间形成边;或者,如上所述,树创建者701可以生成链路ID。如上所述,爱丽丝702a可能已经向树创建者701发送相应一组或多组参数,用于生成相应链路ID。
[0167] 应当理解的是,爱丽丝702a获取目标父节点和链路ID的顺序可以颠倒。在任何情况下,在获取目标父节点和链路ID之后,爱丽丝702a随后标识与所获取的链路ID中的相应一个链路ID相关联的目标父节点的多个子节点中的一个子节点。这可以包括例如在所述事务的输出中标识包括链路ID中的相应一个链路ID的区块链事务。
[0168] 然后,爱丽丝702a创建包括所标识的目标子节点(即,经由所获取的链路ID中的相应一个链路ID形成的边连接到目标父节点的那些目标子节点)的树结构的版本。爱丽丝的树的版本不包括不与所获取的链路ID中的一个链路ID相关联的任何目标子节点,例如不再有效或与不同用户相关的目标子节点。爱丽丝702a可以存储(例如,下载到存储器)形成其树的版本的节点。
[0169] 在获取其树结构的版本之后,爱丽丝可以利用存储在目标子节点中的数据,该目标子节点构成她的版本的一部分。例如,爱丽丝130a可以使用和/或存储包含在所述目标子节点中的数据。利用该数据将取决于存储在目标子节点中的数据的类型。例如,如果该数据是网页,则利用该数据可以包括使用网络浏览器加载该网页。如果该数据是文件(例如,文本文件),则利用该数据可以包括使用文字处理器等应用程序打开该文件。
[0170] 现在提供所公开的实施例的进一步示例。这些示例根据称为Metanet Flux协议的特定协议来描述,但是应当理解的是,它们也适用于上述更一般的示例。
[0171] Metanet是一种静态树结构,其中每个节点可以创建一个或多个子节点,这些子节点永久链接到父节点。如上所述,该链路是通过在子事务中插入父事务的ID来创建的。本发明的实施例替换该静态边,从而使用新的唯一ID替换父节点的ID,该新的唯一ID仅根据给定条件有效(例如,在固定时间段内,仅对所选用户有效)。该方法允许具有动态Metanet结构,以下称为Metanet Flux。
[0172] 图8中示出了在两个不同时间范围内的该动态结构的示例。从静态根节点(Tx1)开始从区块链150检索树。在t=1时,根节点有两个子节点,即节点2(Tx2)和节点3(Tx3)。在t=2时,同一根节点具有不同的结构:虽然节点3(Tx3)仍然存在,但是节点2(Tx2)已经用具有子节点2b.1(Tx5)的节点2b(Tx4)替换。
[0173] Metanet Flux允许设计时变和定制树,从而可以创建具有多视图功能的树。例如,使用Metanet Flux结构构建的网站可以随时间改变,并且可以为用户提供个性化内容。
[0174] 除边创建之外,Metanet Flux可以遵循标准Metanet树的相同规则中的一些规则。在标准实现方式中,为了创建从父节点到子节点的边,子节点必须使用与其父节点相关联的密钥对进行签名,Sig Pparent必须出现在子节点的输入中或该事务的其他部分(例如,OP_RETURN输出)中。子节点包含数据有效载荷(例如,OP_RETURN有效载荷或OP_PUSHDATA有效载荷),该数据有效载荷包括:
[0175] οMetanet标志;
[0176] ο节点地址Pnode;
[0177] ο父事务ID TxIDparent。
[0178] 在Flux实现方式中,签名过程可以是相同的,但是数据有效载荷可以修改如下:
[0179] οMetanet Flux标志;
[0180] ο节点地址Pnode;
[0181] ο使用链下变量(例如,时间、名称)确定性地生成的唯一ID。
[0182] 虽然节点地址相同,但其他两个字段不同。使用特定标志来区分Flux实现方式和标准实现方式,并且用唯一ID替换父事务ID。该更改的最后一步用动态边替换静态边,动态边定义了“通量”。结合一个或多个不同参数来确定性地生成唯一ID(下面的部分将详细地描述ID生成)。这样,可以使用仅对一组用户已知的参数或使用时变信息来创建链路。只有在搜索树时可以提供相同的信息时,才会检索使用该链下信息链接到其父节点的子节点。
[0183] 该技术具有几个优点,例如,当具有过期数据(例如,日期)的链路变得无效时,该技术会自动使旧节点无效。此外,该技术允许创建多视图树,其中每个用户生成不同的唯一ID,并因此生成不同的边(具有相同父节点的用户检索不同的子节点)。此外,该技术还可以用于在树的边中嵌入权重或工作证明。
[0184] 该方法对于具有私有链路也很有用:虽然节点的子节点在比特币网络中是公共的,但是覆盖结构(例如,分支)不可能重建,因为链路是私有的(只要用于创建ID的链下变量和/或函数是私有的)。
[0185] 使用Metanet Flux树创建者或用户提供的外部函数来生成链路ID。该函数将参数列表作为输入,并生成唯一ID。生成该唯一ID的最简单方法是连接参数,然后对它们进行哈希处理。例如,时变链路ID可以使用父事务ID(例如,标准Metanet实现方式)和当前日期作为输入参数:
[0186] 链路ID=hash(parent TxID+day)
[0187] 当日期参数更改时,链路ID也会更改,并且父节点不再检索该子节点。这意味着,每个父节点在每个全新的一天(或月或小时)检索一组不同的子节点。
[0188] 类似地,可以在链路创建中包括用户名或其他标识符:
[0189] 链路ID=hash(parent TxID+username)
[0190] 这样,不同的用户可以访问不同的分支和节点。在这里,访问分支或节点意味着能够重新创建链路ID,从而重新创建父节点与子节点之间的边,并最终重新创建分支的结构。根据用户名的不同,链路可能对某个用户有效,但是对其他用户无效。
[0191] 链路ID生成函数可能比简单的哈希更复杂,复杂的链路生成将增加外部用户检索特定分支或将特定用户与特定分支关联的难度。树创建者和想要合法检索树的用户必须知道或至少可以访问链路ID生成函数。例如,为了提高隐私性,用户可以提供链路ID函数,并且允许创建树的实体在需要创建新的子树时访问该链路ID函数(例如,使用API)。即使参数已知,不知道该函数的其他用户也不能重建链路。
[0192] 图9A和图9B中示出了原生Metanet边缘(图9A)和Metanet Flux边(图9B)的创建与移除之间的比较。在该示例中,Metanet Flux父节点使用时变链路ID函数来创建新的子节点。对于原生Metanet,TxID_C有效,而TxID_D已使TxID_B无效。对于Metanet Flux,TxID_B和TxID_C的有效性取决于函数参数(即,日期)。
[0193] 原生和Metanet Flux实现方式两者创建了从父节点到子节点的静态链路(实心箭头,从左到右)。这使得用户能够找到给定节点的所有子节点(它们是从父节点PA开始的事务)。
[0194] 这两种方法之间的主要区别在于,一方面,原生实现方式也具有从子节点到父节点的静态链路(实心箭头,从右到左),从而创建静态、不可分割的边。另一方面,Flux实现方式创建了动态链路(虚线箭头),其仅在给定一些链下变量的情况下有效。如上所述,该动态链路的功能是定义节点是否被设计为有效,并嵌入混淆信息。
[0195] 当多个视图需要访问相同的内容时,为需要访问该内容的每个用户复制该内容。这会导致资源浪费和树的不必要生长。防止这种情况的一种方法是添加附加参数(例如,group)并使用该附加参数来生成链路ID:
[0196] 链路ID=hash(parent TxID+group)。
[0197] 或者,更一般地:
[0198] 链路ID=link_id(parent TxID,group,username,other parameters),
[0199] 其中link_id是任何适当的函数。此外,也可以使用更复杂的链路ID生成函数。这些函数可以用于创建对多个用户有效的链路,也就是说,输入参数的不同组合会生成与输出相同的链路ID。这可以使节点或分支对多个用户有效。例如,在一些情况下,作为输入的不同用户名可以生成相同的链路ID,从而使一个节点对多个用户有效。这可以在一组用户内部共享内容,从而避免不必要地重复相同信息。
[0200] 这种设计产生的另一个有利特征是混淆链路的能力:尽管始终可以检索给定节点的所有子节点,但是无法重建结构并推断任何其他信息。如果使用原生实现方式来聚类与用户相关联的所有节点(即使用户名是加密的,哈希也是相同的),则在Flux实现方式中,用户名与其他参数混合,因此无法检测任何类型的结构或推断任何相关性。
[0201] 例如,在图10A中,用户名包括在父节点的节点中。使用该原生Metanet实现方式,攻击者可以监测树活动并聚类属于同一用户的所有节点。相反,在图10B所示的Flux实现方式中,链路会混淆其携带的数据,从而提高用户的隐私性。
[0202] 混淆不仅适用于节点(事务)中嵌入的数据,还可以用于隐藏树的部分,从而进一步提高隐私性。对于标准Metanet树,如果可以访问节点ID,则可以找到该节点的一个或多个父节点,因为父节点的TxID存储在子节点中。类似地,在找到父节点之后,也可以找到父节点的父节点以及树的任何其他分支。最终,可以重建整个树。
[0203] 然而,使用Metanet Flux树,如果可以访问节点ID,则无法找到父节点,因为子节点中仅存在链路ID,而不存在父节点的TxID。这意味着,只能检索子节点的子节点及其子节点,依此类推。这意味着,只能导航树的特定分支(从子节点到叶),但是不能检测更高级别和其他分支。这可提高树的隐私性(例如,存储在树的部分中的数据)。
[0204] 在一些示例中,想要检索Metanet Flux树的用户702可能需要三条信息:
[0205] ·父节点ID,即公钥Pnode(如果用户正在访问整个树,则为根ID Proot,或者用于访问子树的任何其他节点ID Pnode);
[0206] ·链路ID生成函数;以及
[0207] ·链路ID参数(例如,日期、用户名、其他数据)。
[0208] 父节点ID用于在区块链150中开始搜索,而链路ID生成函数和参数用于查找所连接的子节点。从父节点Pnode开始的完整检索过程如下:
[0209] 1.初始化用于检索树的新链下Metanet树结构MT。这可以由想要使用该结构的任何应用程序(例如,浏览器、库,例如JS库)来完成。
[0210] 2.将节点Pnode设置为树MT的根。
[0211] 3.收集源自区块链150上发布的Pnode的所有事务Px。
[0212] 4.对于每个事务Px:
[0213] a.验证其是否遵循Metanet Flux协议(检查Metanet Flux标志);
[0214] 如果不遵循,则放弃该事务并返回要点4。
[0215] b.在给定链路ID生成函数和链下参数的情况下,验证链路ID是否有效;
[0216] 如果无效,则放弃该事务并返回要点4。
[0217] c.将事务Px添加到Metanet结构MT中,作为发起事务Pnode的子节点。
[0218] 5.对于添加到树MT中的每个新节点Px,收集源自该新节点的所有事务,
[0219] 并从要点4重新开始。
[0220] 一些步骤可以不同的顺序执行。并非该方法的所有步骤在所有情况下都是必需的。例如,虽然使用协议标志可以缩小可能形成树的潜在事务的范围,但是协议标志不是必需的。例如,可以假设每个事务Px遵循该协议。
[0221] 图11中示意性地示出了该方法。在步骤S101中,用户702初始化新的链下覆盖树结构(例如,Metanet)。在步骤S102中,例如,用户702从树创建者701获取目标父节点。在步骤S103中,用户702收集源自目标父节点的所有事务。然后,在步骤S104中,用户702检查每个事务是否满足Metanet Flux协议的要求。在步骤S105中,用户702检查每个事务是否与有效的链路ID相关联(例如,包括有效的链路ID)。例如,用户702可能已经获取或生成一组链路ID。如果不满足一次或多次检查,则在步骤S107中丢弃未通过该一次或多次检查的事务。如果满足所有检查,则在步骤S108中将事务添加到树结构中。
[0222] 如图11所示,动态边允许仅选择当前有效的节点(在该示例中,链下参数“day=2”),从而创建轻量级树结构。
[0223] 示例性用例
[0224] 图12示出了可以如何使用所描述的实施例来将网站划分为以不同时间间隔更新的部分。例如,该网站的结构可以按每月的有效性发布,每日新闻可以使用日期参数(例如,“日/月/年”)每天发布。该网站可以仅显示当天新闻,并在存档部分中提供旧新闻,该存档部分是通过更改日期参数创建的,并且只能从感兴趣的读者处检索。类似地,可以定制网站,从而为登录用户提供个性化体验。用户将检索包含定制内容的网站的个性化部分,如图12所示。在树的有效性时间范围内的更新可以遵循标准Metanet协议的无效规则来完成。
[0225] 网站树包含大量信息,因为每天或每小时都会添加新的数据,并且登录用户期望定制内容。然而,信息(即,单个用户检索的节点)只占整个网站树的一小部分,并且始终是轻量级的、更新的。
[0226] 作为另一示例,Metanet Flux可以用于通过向链路ID函数添加权重参数来创建加权树。可以按如下方式创建简单的链路ID:
[0227] 链路ID=hash(parent TxID+weight)
[0228] 这允许用户702仅检索具有给定权重或具有最小权重的节点:如果权重可以在0和5之间,并且仅应检索权重大于或等于4的节点,则创建两个链路ID,一个使用权重=4,另一个使用权重=5。如果子节点与两个链路ID中的一个链路ID匹配,则检索该子节点,否则丢弃该子节点。可以通过使用附加参数(例如,日期、版本号)来改变权重,以便在发布节点的新版本(例如,新的一天开始)时更新节点权重。
[0229] 加权树可以用于表示网站(例如,博客)的树结构。可以将较高权重分配给具有例如较多“点赞”、较多评语、较多评论等的页面或博客文章。作为另一示例,树结构可以表示配水管道。可以将较高权重分配给管道中具有较高吞吐量的管道。因此,当使用树结构将水输送到目的地时,可以选择由具有较高权重的管道组成的路线。作为另一示例,树结构可以用于导航目的。例如,用户可以请求从起点到目的地的路线。每个节点可以表示连接点(例如,关注点、十字路口、环形交叉路口等)。连接两个节点的每个边表示由这些节点表示的连接点之间的道路。较高加权边(即,由较高加权链路ID形成)可以表示高速公路,而较低加权边可以表示较小道路、车道等。当计算到目的地的路线时,即计算两个点(两个节点)之间的路线时,可以选择具有较高权重的道路(边),以更快地到达目的地或提高路线计算速度。
[0230] Metanet Flux的另一个应用是创建具有嵌入边中的工作证明(PoW)的树,也就是说,为了附加新节点,必须生成满足预定义难度阈值(等效于用于生成区块的PoW)的链路ID。PoW鼓励诚实守信,并防止垃圾邮件。当有人发布嵌入大量PoW的树或分支时,她/他是在含蓄地表示她/他认为正在发布的信息是相关的(她/他不仅仅是在发送垃圾邮件)。
[0231] 链路ID生成函数可以用于生成具有所嵌入PoW的链路ID。可能需要愿意将新节点附加到PoW Metanet树的服务或用户来创建满足所需难度的链路ID(例如,以给定数量的零开始的链路)。如果用户无法生成该链路,则拒绝该节点。或者,可以添加该链路,但访问该树的服务随后不会检索该链路。与区块创建类似,链路ID生成函数可以通过嵌入随机数来启用PoW,并使用该随机数来创建PoW链路:
[0232] PoW链路ID=link_id(parameters,nonce)
[0233] 或者,类似地:
[0234] PoW链路ID=link_id(old_link_id(parameters),nonce)
[0235] PoW链路ID使用与使用PoW的其他系统相同的方法,其中如果所产生的哈希低于给定阈值,则随机数有效。区块链节点104可以提供随机数搜索服务以换取报酬。值得注意的是,如果仅使用独立于正在创建的子节点的参数(例如,仅父TxID和用户名),则一旦找到PoW,其随后可以用于将其他子节点附加到同一节点。防止这种情况的一种方法是添加特定于每个单个子节点的参数,例如用作输入(所花费的UTXO)的事务的ID。
[0236] 在一些实施例中,内容发布者可以使用该方法来生成具有所嵌入PoW的链路。随机数必须对用户可用,以便他们在检索树时可以重建边。
[0237] 在其他应用中,用户(或区块链节点104)可以生成有效的随机数,作为表达创建应添加到给定分支中的节点的意愿或努力的方式。例如,在博客中,线程可能需要具有预定义数量PoW的链路,以便允许发布。不同的线程可以具有不同的PoW要求。只有当用户能够生成有效的随机数以及内容和其他变量时,他/她才能在特定线程中发布消息(新节点)。
[0238] 值得注意的是,仅在创建新的子节点时使用PoW,而在读取现有PoW树时不需要进一步的PoW。唯一的要求是知道用于生成链路的随机数。
[0239] 如果随机数和日期两者嵌入链路ID中,则内容生产者或用户(取决于应用)必须每天创建新的有效节点(例如,每天重新发布相同的内容),并因此每天生成新的PoW。这迫使节点所有者仅在内容仍然相关时才花费工作量,从而导致自动移除无用信息或旧信息。
[0240] 在这里,PoW用作在特定树/分支中发布新内容的要求。值得注意的是,PoW也可以由树用户用作一种过滤形式:可以决定仅可视化或下载嵌入高PoW的树。类似地,这些用户可以通过过滤更重要/有趣的分支,或者更确切地说嵌入更多PoW的分支来进一步减小树的大小。
[0241] 总而言之,Metanet Flux是一种创建时变、可定制树的技术。这允许用户仅检索树的最新用户特定版本。该技术的优点是提供快速检索和轻量级树,并创建不同用户或组(根据一些链下参数)可访问的同一树的不同版本(视图)。此外,该技术还支持创建加权Metanet树和PoW Metanet树。最后,Metanet Flux创建混淆边,从而隐藏用户活动和其他信息。例如,频繁更新的Metanet树的增长速度可能非常快,并且检索和处理速度变得缓慢,因为用户必须检查和删除无效节点(例如,用户导航网站将下载大量过时信息)。相反,Metanet Flux树将通过设计修剪无效节点和分支,从而提升管理效率和用户体验。例如,给定根和无效子节点,使用原生Metanet实现方式,用户应检索该子节点,然后验证其是否有效(例如,检查内存池以验证UTXO是否已花费或一直寻找该子节点的子节点)。相反,Flux实现方式根本找不到任何有效边。此外,用户可以找到连接到根节点的确切数量的子节点(即使它们是无效的),但是同一用户无法使用Metanet Flux找出该信息。
[0242] Metanet Flux允许生成时变树,并允许使用不同的链下参数来生成同一树的不同可定制版本。此外,与标准Metanet树相比,所生成的树结构更轻、检索速度更快。树的边是混淆边。此外,Metanet Flux还支持创建加权树。此外,可以将工作证明嵌入树和分支中。
[0243] 结论
[0244] 一旦给出本文的公开内容,所公开技术的其它变体或用例对于本领域技术人员可能变得显而易见。本公开的范围不受所描述的实施例限制,而仅受随附权利要求限制。
[0245] 例如,上面的一些实施例已经根据比特币网络106、比特币区块链150和比特币节点104进行了描述。然而,应当理解的是,比特币区块链是区块链150的一个特定示例,并且上述描述通常可以应用于任何区块链。也就是说,本发明决不限于比特币区块链。更一般地,以上对比特币网络106、比特币区块链150和比特币节点104的任何引用可以分别参考区块链网络106、区块链150和区块链节点104来替换。区块链、区块链网络和/或区块链节点可以共享如上所述的比特币区块链150、比特币网络106和比特币节点104的部分或全部所述特性。
[0246] 在本发明的优选实施例中,区块链网络106是比特币网络,并且比特币节点104至少执行对区块链150的区块151进行创建、发布、传播和存储中的所有所述功能。不排除可能存在仅执行这些功能中的一个或部分功能但不是全部功能的其它网络实体(或网络元件)。也就是说,网络实体可以执行传播和/或存储区块的功能,而不创建和发布区块(请记住,这些实体不被认为是优选的比特币网络106的节点)。
[0247] 在本发明的其他实施例中,区块链网络106可以不是比特币网络。在这些实施例中,不排除节点可以执行对区块链150的区块151进行创建、发布、传播和存储中的至少一个或部分功能但不是所有功能。例如,在这些其它区块链网络上,“节点”可用于指被配置为创建和发布区块151但不存储和/或传播这些区块151到其它节点的网络实体。
[0248] 甚至更通俗地说,上面对术语“比特币节点”104的任何引用可以用术语“网络实体”或“网络元件”代替,其中这样的实体/元件被配置为执行对区块进行创建、发布、传播和存储中的一些或全部角色。这种网络实体/元件的功能可以在硬件中实现,方法与上面参照区块链节点104所述的方式相同。
[0249] 应当理解的是,上述实施例仅通过示例的方式进行描述。更通俗地说,可根据下述任何一个或多个语句提供一种方法、装置或程序。
[0250] 语句1.一种计算机实现的方法,用于创建覆盖在区块链上的树结构的不同版本,所述树结构包括节点的集合和节点之间的边,其中每个节点是记录在所述区块链上的不同事务,其中每个边从相应子节点连接到相应父节点,其中所述父节点中的一个父节点是所述树结构的根节点,其中每个节点与相应密钥相关联,其中每个子节点包括i)相应事务标识符、和ii)签名,所述签名对应于与所述相应父节点相关联的所述相应密钥;并且其中所述方法由树创建者(tree creator)执行并且包括:
[0251] 创建目标父节点的一个或多个目标子节点,每个目标子节点包括相应数据有效载荷(data payload);以及
[0252] 通过将所述目标子节点中的每个目标子节点与相应链路标识符关联,在每个目标子节点与所述目标父节点之间形成相应边,其中所述相应链路标识符基于至少一个链下(off‑chain)参数。
[0253] 语句2.根据语句1所述的方法,其中所述目标子节点中的至少两个目标子节点与不同的相应链路标识符相关联。
[0254] 语句3.根据语句1或2所述的方法,其中所述目标子节点中的每个目标子节点与不同的相应链路标识符相关联。
[0255] 语句4.根据前述任一项语句所述的方法,所述方法包括:生成所述相应链路标识符中的一个、一些或每个相应链路标识符。
[0256] 语句5.根据前述任一项语句所述的方法,所述方法包括:从所述树创建者之外的一个或多个实体接收所述相应链路标识符中的一个、一些或每个相应链路标识符。
[0257] 语句6.根据前述任一项语句所述的方法,其中通过向相应链路标识符函数提供相应链下参数集合,来生成所述相应链路标识符中的一个、一些或每个相应链路标识符,所述相应链路标识符函数被配置为基于参数集合生成链路标识符。
[0258] 语句7.根据语句6所述的方法,其中通过向相同的链路标识符函数提供相应链下参数集合,来生成所述相应链路标识符中的一个、一些或每个相应链路标识符。
[0259] 语句8.根据语句7所述的方法,其中所述相应链路标识符中的至少两个相应链路标识符是通过向不同的链路标识符函数提供相应链下参数集合而生成的。
[0260] 语句9.根据语句6或其任何从属语句所述的方法,其中向所述相应链路标识符函数提供的所述相应链下参数集合包括以下各项中的一个、一些或每一个:一个或多个时间相关参数,一个或多个用户特定参数,特定于一组用户的一个或多个参数,一个或多个加权参数,一个或多个数据集特定(dataset‑specific)参数,一个或多个应用程序特定参数。
[0261] 时间相关参数可以包括时间、时间段、日、月、周、年等中的任何一个或多个。用户特定参数包括姓名、地址、DoB、用户名、电子邮件、电话号码等。特定于组群的参数可以包括组群名、组群标识符、组群位置、组群中的用户数量等。数据集特定参数是与数据的主体(即,主题)相关的参数,例如主体可以是汽车,并且参数可以包括车牌号、汽车制造者、汽车型号和/或车龄等。类似地,应用特定参数是与特定应用相关的参数。例如,应用可以是网站(例如,社交媒体网站),并且参数可以包括网站名称、网站地址和/或网站页面等。
[0262] 语句10.根据语句9所述的方法,其中除所述相应链下参数集合之外,还向所述相应链路标识符函数提供所述目标父节点的事务标识符以生成所述相应链路标识符。
[0263] 语句11.根据语句6或其任何从属语句所述的方法,其中对向所述链路标识符函数提供的所述相应参数集合中的一个或多个参数进行加密。
[0264] 语句12.根据语句6或其任何从属语句所述的方法,其中所述相应链路标识符中的一个、一些或每个相应链路标识符是基于至少一个相同参数的不同值而生成的。
[0265] 语句13.根据语句6或其任何从属语句所述的方法,其中所述链路标识符函数包括哈希函数。
[0266] 语句14.根据前述任一项语句所述的方法,其中所述目标子节点中的一个、一些或每个目标子节点与相应用户相关联。
[0267] 语句15.根据语句14所述的方法,其中所述目标子节点中的每个目标子节点与不同的用户相关联。
[0268] 语句16.根据语句14所述的方法,其中所述目标子节点中的至少两个目标子节点与相同的用户相关联。
[0269] 语句17.根据从属于语句5的语句14至16中任一项所述的方法,其中从一个或多个不同实体接收一个或多个相应链路标识符包括:从一个或多个相应用户接收一个或多个相应链路标识符。
[0270] 语句18.根据从属于语句6的语句14至17中任一项所述的方法,所述方法包括:从所述一个或多个相应用户接收所述一个或多个相应链路标识符。
[0271] 语句19.根据从属于语句6的语句14至18中任一项所述的方法,所述方法包括:从所述一个或多个相应用户接收一个或多个相应参数集合。
[0272] 语句20.根据语句6或其任何从属语句所述的方法,所述方法包括:通过生成满足预定难度的相应链路标识符,将工作证明嵌入到至少一个目标子节点与所述父节点之间的所述相应边中,其中所述相应链路标识符是通过向所述相应链路标识符函数提供所述相应参数集合和随机数值而生成的。
[0273] 例如,如果链路标识符包括预定数量的前导零,则所述链路标识符可以满足预定难度。
[0274] 语句21.根据前述任一项语句所述的方法,其中每个目标子节点的所述相应数据有效载荷包括或以其他方式表示以下各项中的一项:网页,博客文章,文件,媒体内容,用户标识符,自主身份(self‑sovereign identity),供应链的组成部分,访问控制数据。
[0275] 语句22.根据前述任一项语句所述的方法,所述方法包括:对于所述目标子节点中的至少一个目标子节点,执行以下步骤:
[0276] 创建一个或多个附加目标子节点;以及
[0277] 在每个附加目标子节点与所述父节点之间形成相应边。
[0278] 语句23.根据前述任一项语句所述的方法,所述方法包括:
[0279] 创建不同目标父节点的一个或多个目标子节点,每个目标子节点包括相应数据有效载荷;以及
[0280] 通过将所述目标子节点中的每个目标子节点与相应链路标识符关联,在每个目标子节点与所述不同目标父节点之间形成相应边,其中所述相应链路标识符基于至少一个链下参数。
[0281] 语句24.一种计算机实现的方法,用于访问覆盖在区块链上的树结构,所述树结构包括节点集合和节点之间的边,其中每个节点是记录在所述区块链上的不同事务,其中每个边从相应子节点连接到相应父节点,其中所述父节点中的一个父节点是所述树结构的根节点,其中每个节点与相应密钥相关联,其中每个子节点包括i)相应事务标识符、和ii)对应于与所述相应父节点相关联的所述相应密钥的签名,其中目标父节点连接到多个目标子节点,每个目标子节点包括相应数据有效载荷,其中所述目标子节点中的每个目标子节点与相应链路标识符相关联,其中所述相应链路标识符基于至少一个链下参数;并且其中所述方法由树访问者(tree accessor)执行并且包括:
[0282] 获取所述目标父节点;
[0283] 获取一个或多个链路标识符;
[0284] 标识与所获取的一个或多个链路标识符中的相应一个链路标识符相关联的所述目标子节点中的一个或多个目标子节点;以及
[0285] 创建所述树结构的版本,所述版本包括所标识的目标子节点中的一个或多个目标子节点,但不包括未标识为与所获取的一个或多个链路标识符中的相应一个链路标识符相关联的那些目标子节点。
[0286] 语句25.根据语句24所述的方法,所述方法包括:
[0287] 对于形成所述树结构的所创建的版本的所述目标子节点中的一个或多个目标子节点,执行以下各项中的至少一项:对所述目标子节点所包括的所述相应数据有效载荷进行访问、存储和/或使用。
[0288] 语句26.根据语句24或25所述的方法,其中所述的获取所述目标父节点包括:获取与所述目标父节点相关联的所述相应密钥;以及使用所述相应密钥来标识与所述密钥相关联的区块链事务。
[0289] 语句27.根据语句24至26中任一项所述的方法,其中所述的标识所述一个或多个目标子节点包括:标识一个或多个区块链事务,所述一个或多个区块链事务包括所获取的链路标识符中的相应一个链路标识符。
[0290] 语句28.根据语句24至27中任一项所述的方法,其中所获取的链路标识符中的至少一个链路标识符是基于发送给所述树创建者的相应链下参数集合而生成的。
[0291] 语句29.根据语句24至28中任一项所述的方法,其中所述的获取所述一个或多个链路标识符包括:生成所述一个或多个链路标识符中的至少一个链路标识符。
[0292] 语句30.根据语句26所述的方法,其中所述的生成所述一个或多个链路标识符中的至少一个链路标识符包括:向链路标识符函数提供链下参数集合。
[0293] 语句31.根据语句28所述的方法,其中所述的生成所述一个或多个链路标识符中的至少一个链路标识符包括:向所述链路标识符,提供所述链下参数集合和随机数值。
[0294] 所述随机数值可以从所述树创建者或其他地方获取,例如,所述随机值可以发布在互联网、区块链等之上。
[0295] 语句32.根据语句24至31中任一项所述的方法,其中所述的获取所述一个或多个链路标识符包括:从负责创建所述树结构的树创建者接收所述一个或多个链路标识符中的至少一个链路标识符。
[0296] 语句33.根据前述任一项语句所述的方法,其中所述树结构是Metanet图形。
[0297] 语句34.一种计算机系统,所述计算机系统包括:
[0298] 处理装置,所述处理装置包括一个或多个处理单元;以及
[0299] 存储器,所述存储器包括一个或多个存储器单元;
[0300] 其中所述存储器存储被设置在所述处理装置上运行的代码,所述代码被配置为当在所述处理装置上运行时执行根据前述任一项语句所述的操作。
[0301] 语句35.一种计算机程序,所述计算机程序包含在计算机可读存储器上并且包括代码,所述代码被配置为当在一个或多个处理单元上运行时执行根据语句1至33中任一项所述的操作。
[0302] 根据本文公开的另一方面,可以提供一种方法,所述方法包括所述树创建者和所述树访问者的所述动作。
[0303] 根据本文公开的另一方面,可以提供一种系统,所述系统包括所述树创建者和所述树访问者的所述计算机设备。