首页 / 专利库 / 银行与财务事项 / 分布式账本技术 / 区块链 / 区块链账本 / 区块链中解锁交易的输入约束

链中解交易的输入约束

阅读:475发布:2020-05-12

专利汇可以提供链中解交易的输入约束专利检索,专利查询,专利分析的服务。并且无信任的确定性状态机可以使用 区 块 链 基础 设施来实现,并且状态机可以在多个 区块链交易 上并发运行。交易可以在 比特币 区块链账本 中完成。确定解 锁 交易约束,所述解锁交易约束将解锁交易约束为包括交易输入,该交易输入引用了前一交易的输出。创建可赎回交易以包括交易输出和交易锁定脚本,所述交易输出包括一定数额,所述交易锁定脚本包括所述解锁交易约束,其中,解锁所述数额取决于所述解锁交易的至少一个解锁脚本的执行,所述解锁交易满足所述解锁交易约束。在区块链网络的 节点 处可验证所述可赎回交易。,下面是链中解交易的输入约束专利的具体信息内容。

1.一种计算机实现的方法,包括:
确定解交易约束,所述解锁交易约束将解锁交易约束为包括引用前一交易输出的解锁交易输入;
创建可赎回交易,包括:
交易输出,所述交易输出包括可赎回的数额;和
交易锁定脚本,所述交易锁定脚本包括所述解锁交易约束,其中,解锁所述可赎回的数额取决于解锁交易的至少一个解锁脚本的执行,所述解锁交易满足所述解锁交易约束;和在链网络的节点处验证所述可赎回交易。
2.根据权利要求1所述的计算机实现的方法,其中所述解锁交易约束还约束所述解锁交易输入以包括特定的散列值。
3.根据权利要求2所述的计算机实现的方法,其中所述特定散列值对引用所述前一交易输出的标识符进行编码。
4.根据任一前述权利要求所述的计算机实现的方法,其中所述解锁交易约束还约束所述解锁交易的锁定脚本,以包括从所述交易锁定脚本复制的脚本元素集合。
5.根据任一前述权利要求所述的计算机实现的方法,其中所述可赎回交易对具有多个状态的合约进行编码。
6.根据任一前述权利要求所述的计算机实现的方法,还包括确定所述解锁交易的输出的可赎回值。
7.根据任一前述权利要求所述的计算机的实现的方法,其中:
所述解锁交易约束包括来自所述前一交易输出的特定锁定脚本元素;和由于所述解锁交易输入包括了所述特定锁定脚本元素,所述至少一个解锁脚本的执行满足了所述解锁交易约束。
8.根据权利要求7所述的计算机实现的方法,其中,所述特定锁定脚本元素对特定实体的加密密钥进行编码。
9.根据任一前述权利要求所述的计算机实现的方法,其中:
所述解锁交易约束是第一解锁交易约束;和
所述方法还包括:
确定第二解锁交易约束,以进一步约束所述解锁交易;和
创建第二可赎回交易,包括:
第二数额;和
包括所述第二解锁交易约束的第二锁定脚本,其中,解锁所述第二数额还取决于满足所述第二解锁交易约束的所述至少一个解锁脚本的执行。
10.根据权利要求9所述的计算机实现的方法,其中:
所述锁定脚本是第一锁定脚本;
所述至少一个解锁脚本包括第一解锁脚本和第二解锁脚本;
所述第一解锁交易约束约束所述第一解锁脚本以包括所述第一锁定脚本的至少一部分;和
所述第二解锁交易约束约束所述第二解锁脚本以包括所述第二锁定脚本的至少一部分。
11.根据权利要求10所述的计算机实现的方法,其中:
所述第一锁定脚本的至少一部分包括与第一实体相关联的加密密钥;和所述第二锁定脚本的至少一部分包括与不同于所述第一实体的第二实体相关联的加密密钥。
12.根据任一前述权利要求所述的计算机实现的方法,其中,所述解锁交易约束还约束所述解锁交易,以约束所述解锁交易的输出。
13.根据权利要求12所述的计算机实现的方法,其中:
所述解锁交易约束对不同于所述合约的另一个合约进行编码;和
解锁所述可赎回的数额取决于在所述解锁交易的输出中实现的所述其他合约。
14.一种系统,包括:
处理器;和
包括可执行指令的存储器,所述可执行指令在被所述处理器执行可使得所述系统执行根据前述权利要求中任一项所述的计算机实现的方法。
15.一种存储有可执行指令的非暂时性计算机可读存储介质,所述可执行指令在被计算机系统的处理器执行,可使得所述计算机系统至少执行根据权利要求1至13中任一项所述的计算机实现的方法。

说明书全文

链中解交易的输入约束

技术领域

[0001] 本发明主要涉及一种处理区块链交易的计算机实现的方法,具体涉及在区块链交易处理的结构内实现状态机,包括无信任的、确定性和并发状态机。本发明还利用加密和数学技术来加强与通过区块链网络进行的电子转移相关的安全性。本发明特别适用于,但不限于,在智能合约交易中处理和交易以及使用这种智能合约交易实现状态机的方法和装置中使用。

背景技术

[0002] 在本文中,术语“区块链(Blockchain)”可以指几种类型的电子的、基于计算机的分布式账本(Distributed Ledgers)的任何一种。这些包括基于共识的区块链和交易链技术、许可及未许可的账本、共享账本及其变型。虽然也已经提出并开发了其他区块链实施方案,但是区块链技术最广为人知的应用是比特币账本(Bitcoin Ledger)。虽然出于方便和说明的目的,“比特币”的示例可称为本文描述的技术的有用应用,但是比特币仅是本发明中所述技术可以应用到的许多应用中的一个。但是,应该注意的是,本发明不限于与比特币区块链一起使用;可选的区块链实现和协议(包括非商业应用),也落入本发明的范围内。例如,本发明中描述的技术将为使用区块链实现提供优势,该区块链实现在交易中可以编码何种约束方面具有与比特币类似的限制,无论是否发生加密货币的交换。
[0003] 区块链是点对点(Peer-to-Peer)的电子账本,其被实现为基于计算机的、去中心化的分布式系统,该系统由区块组成,区块又可以由交易和其他信息组成。在一些示例中,“区块链交易”是指对包括数据和条件集合的字段值的结构化集合进行编码的输入消息,其中满足条件集合是将字段集写入区块链数据结构的先决条件。区块链系统或区块链网络可以包括多个区块链节点和操作集合。区块链节点可用于执行操作集合中的一些或全部操作。各种区块链节点可以被实现为由节点操作者操作的计算机硬件、计算机软件或两者的组合,其中节点操作者可以是独立的,并且与其他节点操作者无关。区块链节点可能每个维护区块链账本的副本或其中的一部分。操作集合可能包括创建交易、传播交易、读取区块链账本、评估区块链账本、为区块链账本的提议添加生成(挖掘)新区块、与其他区块链节点通信以及为用户提供钱包功能以管理区块链资产。
[0004] 区块链账本可以是去中心化的,因为没有决定何时修改账本的单一区块链节点或实体。相反,每个区块链节点可以使用区块链协议规则的知识进行编程,并且可以验证区块链账本以及其他区块链节点的动作与那些规则一致。术语“区块链(Blockchain)”可以指这样的事实,即区块链账本包括一系列链接区块(Chained Block),每个链接区块在计算机存储器中表示为数据结构,可由计算机进程读取并且可作为数据传输来传输。区块可包括一个或多个交易,也可表示为计算机存储器中的数据结构,可由计算机进程读取并可作为数据传输来传输。这些区块可以被链接,因为正式添加到区块链的每个新区块包含对紧接着的前一区块的不可变引用,该前一区块可以包含对其紧接着的前一区块的不可变引用,以此类推。
[0005] 区块链协议的规则之一可以是,一旦区块被添加到区块链,就不能改变;即,它是不可变的,并且区块链账本的唯一可能的修改可以是添加新区块。由于区块链节点通常可以用它来编程,所以它们不会修改区块链账本副本中的区块,而是仅添加区块,即使这样,也仅在提议的区块上运行验证过程后添加区块,以确保其符合区块链协议。由于这些区块一旦被添加到账本中就不可变,区块中的交易也可以是不可变的。
[0006] 当区块链节点创建交易时,它可以创建包含交易的细节的数据对象,并且可以通过点对点的方式将该数据对象传播到它可以连接到的其他区块链节点。一些区块链节点充当“矿工(Miner)”,并收集一个或多个交易,形成对应于区块的数据结构,执行一些计算以验证放入区块中的交易,解决谜题,将谜题的解决方案放入数据结构中,并尝试将区块传播到其他区块链节点。谜题可能是非平凡计算(Nontrivial Computation)的形式,这种计算特定于交易的数据和区块链账本的当前状态,例如账本中的区块数和最后添加的区块数。
[0007] 通过使谜题依赖于交易,流氓区块链节点(Rogue Blockchain Node)可能无法传播提前组成的区块。通过解决一个非平凡的谜题,流氓区块链节点可能无法简单地将区块注入到区块链网络,但是可能需要区块链节点执行一些重要的计算任务来证明它付出了努(实际上,显示谜题的解决方案是“工作量证明”)。优选地,在区块链协议中,工作量证明是非平凡的,但是验证谜题已经解决并且工作已经完成很容易。这意味着,其他区块链节点不一定必须信任提议将新数据区块添加到账本中的区块链节点。如果被另一区块链节点验证,则该区块链节点可以将新区块添加到其区块链账本副本的末尾,并将该新区块传播到其他区块链节点。当其他区块链节点执行相同的验证时,他们也可以得出该区块有效且应添加到区块链账本的结论,因此他们可以将该区块添加到其区块链账本副本中。如果区块链节点确定提议的新区块无效,则它可以不将其添加到区块链账本的副本中,也可以不传播它。因为区块链的有效性是基于共识的,如果大多数节点同意交易是有效的,那么该交易可以被视为有效。
[0008] 区块链系统可以这样操作,使得节点所有者和操作者不必信任其他节点所有者和操作者。相反,协议可以使执行某些不被协议允许的操作在计算上不可行,例如修改较早的区块、在没有相应的工作量证明的情况下提出新区块或者包括无效交易。当以其他节点不注意的方式执行不被区块链协议允许的操作在计算上不可行时,可以不需要特定的信任。
[0009] 为了将交易包括在写入区块链的区块中,(1)挖掘区块链节点将验证该交易,(2)挖掘区块链节点将尝试传播包含该交易的区块,以及(3)其他节点将验证该区块的有效性和该区块中的交易的有效性。由于将在考虑这些规则的情况下对挖掘区块链节点进行编程或配置,因此挖掘区块链节点不太可能将无法验证的交易包括在区块中,因为这样的区块不会被其他节点接受,并且挖掘节点将不会获得任何好处。对于一些区块链系统来说,这样的挖掘的好处之一是,如果区块被接受,则允许该区块包括“分配”交易,其中指定数量的值被分配给该节点的操作者,而无需相应减少来自其他实体的值。以这种方式,成功的矿工可以通过该区块创造的价值得到补偿。此外,如下所述,交易可以包括交易费用,交易费用也将支付给控制挖掘区块链节点的矿工,并且交易费用还要求该交易可验证为有效,以便该矿工获得任何补偿。
[0010] 区块链网络中的交易包含各种数据元素,例如交易值、交易时间和/或其他数据元素。在去中心化的分布式账本系统中,账本是公共的,因此任何人都可以查看账本和交易。在区块链账本中,可能存在创始交易,该创始交易启动了区块链,并将某些价值单位归因于该创始交易。在本文的示例中,出于说明的目的,价值单位是加密货币,但是其他变型也是可能的。
[0011] 创始交易和分配交易之外的交易涉及“解锁”区块链账本中一个或多个现有交易的价值,并且当这种交易被添加到区块链账本中时,它又可以被转移。每个未转移的交易都以公开的方式指定了解锁该交易价值所需的要求。一个简单的要求可能是“你必须首先证明你是爱丽丝(Alice),然后你才能解锁这个”。爱丽丝可能随后创建一个新交易来“解锁”该交易的值,其中爱丽丝的新交易证明其来自爱丽丝并且具有指向前一交易的指针(Pointer)。分配交易存在交易值,但分配交易不会“解锁”前一的交易。当然,要使爱丽丝的交易被区块链网络接受,它不能指已经转移的交易,而必须实际证明爱丽丝创建了该交易。
[0012] 根据区块链协议,并因此根据区块链节点的协议,如果交易指向已经转移的前一交易输出,则该交易无效;即账本包含指向前一交易输出的有效现有交易输入。为了防止任何闯入者(Interloper)创建新的交易输入来“解锁”由前一的未花费的交易输出(UTXO)所表示的值,每个交易输出都包括表示对任何提出此类交易的索赔人(Claimant)的要求的数据,并且由于UTXO可以是不可变的,所以该数据不能被更改。当然,转移的交易也可以是不可变的。
[0013] 在上面的示例中,爱丽丝可能已经创建了解锁交易,使得只有她能够解锁的前一交易中的值可以被转移到鲍勃(Bob),即,现在将会有只有鲍勃能够解锁并因此解锁的新的未转移交易。爱丽丝创建的解锁交易可能包括对应于以下要求的数据:“如果他们能够提供足够的信息来证明他们知道鲍勃的私钥,则任何人都可以自由指向该交易,从而解锁其所有值”。假设鲍勃很小心,那么鲍勃将是唯一能够创建可解锁该交易的有效交易的人。实际上,鲍勃拥有该值,并且是唯一能够解锁该值的人。注意,这不要求鲍勃信任区块链节点的任何操作员,也不要求他信任有能力创建交易的任何其他方。鲍勃需要信任的是,流氓方不能完全接管区块链节点的大部分。
[0014] 在特定情况下,一个交易完全解锁一个前一未转移的交易,并且该一个交易可以由稍后的交易完全转移,或者根本不转移。在一般情况下,交易具有一个或多个输入和一个或多个输出,其中每个输入引用前一交易的输出(并且该输出具有可赎回值),并且每个输出具有可赎回值(在被未来交易的输入转移/引用之前,该值保持未转移)。交易的输出是交易的可赎回单位,因为它被完全转移或根本不转移。在本文描述的一些示例中,交易被称为“被转移(Transferred)”,并且应当理解的是,在交易具有多个交易输出的情况下,该描述可以涵盖少于所有交易输出可以被转移的情况。相对于解锁交易输出,关于“解锁交易(Unlocking A Transaction)”的描述可以涵盖仅具有一个输出的交易的输出被转移的情况。
[0015] 当交易可以具有多个输出时,该交易的不同交易输出可以在不同时间转移。创建交易时,其输出可以被视为未转移。每个输出都由后续交易的输入来转移,或者保持未转移。如果交易的输入试图在前一交易的输出已经被转移之后解锁前一交易的输出,则区块链节点将其视为无效交易而拒绝。
[0016] 在一方爱丽丝控制值为X的UTXO并且只想解锁该交易输出的一部分(Y)的情况下,爱丽丝可以指定具有多个输出的新交易,一个具有是Y值的交易输出(只能由鲍勃转移),另一个是具有X-Y值的交易输出(只能由爱丽丝转移)。实际上,原始的交易输出被完全转移,但是有新的交易输出为爱丽丝的交易“做出改变”。
[0017] 交易的输入数量和该交易的输出数量不必相同。但是,为了交易有效,当前交易的输出中指定的值的总和不应超过当前交易的输入可以转移的前一交易输出的值的总和,并且在某些情况下(除了一些例外)将会更小。对于创始交易和分配交易,输出值的总和可以大于输入值的总和,或者根本不需要任何输入,但是对于常规交易,如果其输出值的总和超过输入值的总和,则交易将无效。对于某些交易,其输出值的总和可能小于其输入值的总和,在这种情况下,成功的矿工为差额添加交易费用交易,从而平衡并为矿工处理交易创建理由。在比特币协议中,这是币库交易(Coinbase Transaction),该币库交易添加到区块中,并具有等于比特币区块中包括的所有其他交易的交易费用之和(即所有包括的交易的所有输入和输出的差额的和)的可赎回输出,以及用于创建新区块的分配。
[0018] 交易的每个输出都包括必须满足的约束,以便解锁该输出的值。在一些区块链协议中,约束嵌入在“锁定脚本”中,该脚本指定了定义这些约束的数据和脚本命令。锁定脚本充当交易输出中表示的值的留置(Encumbrance),因为另一个参与者无法“解锁”交易输出中表示的值,除非他们可以“解锁”该交易输出的锁定脚本。
[0019] 解锁交易的每个输入都解锁前一交易的输出。解锁交易输入的“解锁脚本”确定该解锁交易是否解锁了前一交易的输出。因此,有效交易指定至少一个输入,并且有效解锁交易的每个输入包括指向前一交易输出(正在传输的交易)的指针和“解锁”锁定脚本的解锁脚本。根据相应的区块链协议操作的区块链节点可以一起执行锁定脚本和解锁脚本来验证交易输入。在特定系统中,脚本是基于堆栈的,并且验证区块链节点可以从空堆栈开始,执行解锁脚本,这可以将数据对象留在堆栈上,然后执行锁定脚本,这可以使用堆栈上的数据对象。
[0020] 当验证区块链节点组合锁定脚本和解锁脚本并执行该组合时,执行后的结果可以是“真(TRUE)”或“假(FALSE)”。在某些情况下,脚本的执行会在脚本完全执行之前以假结果结束。例如,假设对于给定的脚本执行,在有效的脚本执行中有两个值始终相等,而与脚本中发生的其他情况无关。如果在执行该脚本的中途,在这两个值之间进行了比较,并且它们不相等,则脚本的执行会在该比较之后立即停止,并返回假结果。脚本的其余部分无需执行。
[0021] 如果验证区块链节点组合锁定脚本和解锁脚本,执行该组合,并且结果为真(即,解锁脚本包含解锁交易输出所需的一切),则验证区块链节点将验证交易为有效(假设满足其他要求,例如正确的时间戳、正确的格式,不指向已传输的交易输出等)。如果验证区块链节点验证交易有效,则可以传播该交易。其他区块链节点可以进行相同的计算,以得出交易有效的结论。通过这种方式,具有仅指向UTXO的输入并且具有解锁UTXO的解锁脚本的有效交易可以传播并最终成为最终成为账本一部分的区块的一部分。
[0022] 另一方面,如果流氓节点试图传播无效的交易,则其他节点可能会发现该交易无效并且不传播该交易。
[0023] 一旦交易有效并且被区块链接受,其内容就不能改变。这意味着锁定脚本在创建交易时是固定的。但是,当时不必固定解锁脚本,因为解锁脚本包含在稍后的解锁交易中,并且在稍后的解锁交易被创建之前不需要被创建。
[0024] 在典型情况下,验证的解锁脚本不能仅由任何人创建,而只能由被授权解锁前一交易输出的一方创建。如上例所示,锁定脚本可能是“如果任何人都能够提供足够的信息来证明他们知道鲍勃的私钥,则任何人都可以自由指向该交易输出,从而解锁所有其所述的值”,并且解锁脚本的形式可能是“鲍勃已经用其私钥签署了交易,结果是:ABCCC”。那么验证区块链节点可以处理这两个语句,并得出真或假的结论。当易于验证ABCCC是有效签名,鲍勃(或其他知道鲍勃的私钥的人)容易生成这样的签名,而其他人在不知道鲍勃私钥的情况下很难生成有效签名时,这个过程运作良好。因此,值可以在无信任的系统中转移。鲍勃将要解锁的交易的发起者不需要信任系统或信任鲍勃,因为在不首先知道鲍勃的私钥的情况下,在加密上很难形成区块链节点一致接受的有效且可验证的结果。
[0025] 区块链节点可以容易地验证鲍勃签署了交易,并验证该签名是锁定脚本的唯一要求。当然,可能有流氓节点不验证其他节点验证的位置,也可能验证其他节点不验证的位置,但是只要流氓节点不能压倒区块链网络上表现良好的节点,流氓节点就不能推送无效交易或阻止传播或挖掘有效交易。
[0026] 如果节点正在执行交易输入的解锁脚本和前一交易输入的相应锁定脚本,并将每个脚本评估为真,并且满足其他验证条件(如果适用的话),则就该节点而言,交易有效。然后,该节点将经过验证的交易传播到其他网络节点,从而矿工节点可以选择将交易包括在区块中。因此,为了将交易写入区块链,该交易必须(1)由接收交易的节点进行验证,(2)被中继(但仅在交易经过验证的情况下)到网络中的其他节点,(3)被添加到矿工建造的新区块中,(4)作为提议的区块的一部分被传播,以及(5)通过节点的共识,将提议的区块接受为过去交易的公共账本的补充。
[0027] 当向区块链添加足够数量的区块以使交易实际上不可逆转时,可以认为交易已被确认。由于交易是不可变的,因此区块链协议可以阻止交易的单方面逆转。当然,如果爱丽丝将值X转移给鲍勃,而爱丽丝想要回该值X,如果鲍勃同意,则她可以得到它,在这种情况下,X的爱丽丝到鲍勃(Alice-to-Bob-for-X)的交易没有撤销或取消,而是鲍勃发起了新的交易,即X的鲍勃到爱丽丝(Bob-to-Alice-for-X)的交易。
[0028] 一旦交易被包括在区块中,该交易被视为不可变的,并且一旦区块被提交给区块链,该区块被视为不可变的。可能会在短时间内出现区块链中的分叉并且有一定的回滚区块链的能力,但是一般来说,经过的时间越长,任何回滚的可能性就越小。在本文中,除非另有说明,否则假定交易和区块在完全提交给区块链之后是不可变的。
[0029] 确保不变性的一种方法是使用加密技术。例如,存在加密操作(诸如散列和数字签名)将某些数据序列作为其输入,并提供以某种方式对应于该输入数据序列的输出数据序列。操作可以是这样的,对于从给定加密输入(例如,交易或区块)生成的给定加密输出(例如,散列或数字签名),使用可用的计算资源来查找导致相同加密输出的不同加密输入在计算上是不可行或不可能的。因此,验证者可以假设,如果加密输入与加密输出一致,则是加密输入用于生成加密输出,而不是一些其他修改的加密输入。
[0030] 在不需要每个节点都相互信任的区块链网络中,可以对交易进行验证,对区块进行验证,并且不可验证的交易和区块可以忽略和不使用,可以认为交易和区块是有效地不可变的,这可能是以下假设的结果:如果散列或数字签名正确对应于交易或区块,则该交易或区块尚未从其原始内容进行修改。
[0031] 一些区块链节点可能存储整个账本,而其他节点可能仅存储未花费的交易输出(UTXOs;例如,用于比特币账本)。UTXO对应于可赎回的值,并且优选地,每个UTXO具有锁定脚本,对于该锁定脚本,除了该值的“所有者”之外,任何人都无法轻易地生成可验证的解锁脚本。当然,这不是要求,但是可以预期的是,任何人都可以容易地生成可验证解锁脚本的任何UTXO都可以在交易中快速地被转移,该交易将其值转移到另一个UTXO,该UTXO只能由第一个注意到它的人来赎回。因此,区块链可用于转移对加密货币值的控制权,更一般地说,将数字资产从区块链系统的一个参与者转移到区块链系统的另一个参与者,包括转移的交易输出和UTXO在内的交易记录可记录在公共的、不可变的账本中,从而便于验证数字资产的流动并防止这些数字资产的双重解锁。
[0032] 在实施例中,“数字资产”是指与使用权相关联的二进制数据。数字资产的示例包括比特币、以太币和莱特币。如本文所使用的,“数字资产”可以指一个或多个数字资产。例如,交易可能有多个输入,并且这些输入中的每一个都可以代表不同的数字资产。在该示例中,其控制权被转移的数字资产可以是多个数字资产的集合,该集合本身是数字资产。类似地,交易可以细分和/或组合多个输入以产生一个或多个输出,使得例如输入的数量和输出的数量可以不同。
[0033] 在实施例中,加密货币是基于令牌的加密货币,其中每个令牌代表资产的份额(例如公司的份额),并且单个交易涉及多种类型的令牌(例如,涉及一个或多个不同公司的份额)。在一些实施例中(例如使用比特币),数字资产是未令牌化的,使得例如在区块链没有已识别的数字资产的标识符,而是通过生成记录在区块链的有效交易的能力来展示对数字资产的控制。但是,要注意的是,一些区块链实现可能使用令牌化的数字资产,因此,例如,可以使用记录在区块链的信息来明确识别数字资产。尽管在一些实施例中,数字资产可以用作加密货币,但是可以预期,在实施例中,数字资产可以附加地或替代地在其他环境中使用。注意,本发明虽然适用于对数字资产的控制,但是本质上是技术性的,并且可以在利用区块链数据结构而不一定涉及数字资产转移的其他环境中使用。
[0034] 交易包含锁定脚本和解锁脚本,它们可以形成计算对象。一旦提交到区块链,交易可能变得不可变,这一特性的用途可能不仅仅是是以加密货币形式对数字资产进行不可变的控制转移。除了转移值之外,不可变交易还可用于实施其他操作,例如事件的公证记录、智能合约的实施(其中各方的权利和义务可被编码在交易中)以及根据区块链协议,根据智能合约条款转移值。
[0035] 在比特币平台上,脚本是使用基于堆栈的脚本语言编写的,但是也可以使用其他方法来代替。在一些示例中,“基于堆栈的脚本语言”是指支持各种基于堆栈或面向堆栈的执行模型和操作的编程语言。当执行基于堆栈的脚本语言的指令时,处理器(例如区块链节点的一部分)将数据存储在称为堆栈的先进、后出(first-in,last-out)的数据结构上。处理器可以将值压入到堆栈顶部,或者从堆栈顶部弹出值。对堆栈执行的各种操作可以导致从堆栈顶部压入或弹出一个或多个值,对其执行操作,改变堆栈上元素的顺序(这可以等同于两次弹出操作和两次压入,第一次压入是弹出的第一个项目)。例如,OP_EQUAL操作可能会从堆栈中弹出前两项,对它们进行比较,并将结果(例如,如果相等则为1,如果不相等则为0)压入到堆栈顶部。对堆栈执行的其他操作(例如OP_PICK)可以允许从堆栈顶部以外的位置选择项目。在一些本实施例所采用的一些脚本语言中,可以有至少两个堆栈:主堆栈和备用堆栈。脚本语言的一些操作可以将项目从一个堆栈的顶部移动到另一个堆栈的顶部。例如,执行OP_TOALTSTACK操作会导致处理器将值从主堆栈的顶部移动到备用堆栈的顶部。
应该注意的是,在某些情况下,基于堆栈的脚本语言可能不仅限于严格的后进先出(Last-in-First-out,简称LIFO)方式的操作。例如,基于堆栈的脚本语言可以支持将堆栈中的第n个项目复制或移动到顶部的操作(例如,在比特币中分别为OP_PICK和OP_ROLL)。可以将使用基于堆栈的脚本语言编写的脚本压入逻辑堆栈,该逻辑堆栈可以使用任何适当的数据结构(例如向量、列表或堆栈)实现。
[0036] 利用交易中包含的脚本,可以实现智能合约,其中合约的条款被编码到脚本中。示例可以是“如果鲍勃已经支付卡罗尔(Carol)X,并且戴夫(Dave)已经授予了交易许可,则爱丽丝将支付鲍勃X的一半”,并且这可以被编码为锁定脚本的一部分,只有当(在其他条件中)存在鲍勃支付卡罗尔的先前交易和戴夫编码其许可的先前交易时,锁定脚本才评估为真。如本文所使用的,“先前交易(prior transaction)”可以指已经添加到区块链的任何交易,不一定是具有解锁交易解锁的输出的前一交易。实际上,智能合约可以表示机器可执行程序,该程序包括定义输入以产生结果的规则,然后可以根据这些结果执行动作。
[0037] 除了值转移以外,交易还可能转移其他值的对象或拥有的权益。例如,交易可能转移一些名义上的加密货币值,但也包括对应于以下断言的数据:“能够解锁该交易的人也是利环123号的房屋和土地的合法所有者”。拥有的权益可能在公共记录中被模糊化,具有相同的效果。例如,交易可能包括对应于以下断言的数据:“能够解锁该交易的人也是在中央信托行持有的第12345号信托下托管的某些财产的合法所有者”。在本文中,这被称为令牌,其代表并通过区块链实现现实世界实体的转移。潜在的敏感或秘密项目可以由没有可辨别的意义或值的令牌来表示。因此,令牌可以用作允许从区块链引用真实世界项目的标识符。
[0038] 在一些实施例中,与特定实体的交互在智能合约中的特定步骤被编码,并且智能合约可以另外自动地自动生效(self-executing)和自我实施(self-enforced)。在一些示例中,自动生效是指智能合约的生效,执行智能合约以实现UTXO的转移。注意,在这样的示例中,能够解锁UTXO的“任何实体”是指能够创建解锁脚本而无需证明对某些秘密的了解的实体。换句话说,可以验证解锁交易,而无需验证数据源是否可以访问加密秘密(例如,私有非对称密钥、对称密钥等)。此外,在这样的示例中,由于区块链网络的验证节点根据智能合约的约束来验证解锁交易,所以发生了自我实施。在一些示例中,“解锁”UTXO是指创建解锁交易输出,该输出引用UTXO并作为有效的执行。解锁这种交易输出的副作用是,区块链网络可以处理锁定脚本和解锁脚本来验证新交易,即解锁交易。如果有效,则前一交易输出被视为已转移。通过在交易输出中包含一定的值并使其使得任何人都可以解锁该输出,各方有理由创建此类解锁交易,因此很可能执行智能合约的步骤,如果不是由智能合约的参与者执行,则由操作区块链节点的其他人执行。
[0039] 作为交易的一部分而记录的形成锁定脚本和解锁脚本的脚本可以是不可变的,因此锁定脚本通常无法被修改或引用未来交易的部分,因为在交易被固定时这些可能是未知的。交易输入的解锁脚本可以指由区块链的交易输入或除前一交易之外的先前交易所指向的先前交易输出的部分。这可能限制交易的使用方式。
[0040] 期望提供在这些方面中的一个或多个方面中使用区块链技术的附加功能以及改进的方法和系统。因此,根据本发明,提供了如所附权利要求中定义的系统和/或方法。

发明内容

[0041] 在计算机实现的方法的各种实施例中,该方法包括:确定对第一花费交易输出的第一约束集合;确定对第二花费交易输出的第二约束集合;创建初始交易以包括:至少一个初始锁定脚本,该脚本包括第一约束集合和第二约束集合;和至少一个可花费值,其中花费至少一个可花费值取决于:第一约束集合至少部分地通过验证花费交易包括第一花费交易输出来满足;以及第二约束集合至少部分地通过验证花费交易包括第二花费交易输出来满足;和使得初始交易在区块链网络的节点处被验证。
[0042] 第一花费交易输出中的锁定脚本可以是第二花费交易输出中的锁定脚本的副本。
[0043] 第一花费交易输出中的锁定脚本可以不同于第二花费交易输出中的锁定脚本。
[0044] 第一花费交易输出中的锁定脚本可以包括至少一个初始锁定脚本的至少一部分。
[0045] 至少一个锁定初始脚本的执行可以从至少一个初始锁定脚本的多个部分中选择至少一部分。
[0046] 花费交易的解锁脚本的执行可以导致至少一个初始锁定脚本接收对应于第一花费交易输出或第二花费交易输出之一的数据。
[0047] 数据可以具有索引值。在索引值是第一索引值的条件下,至少一个初始锁定脚本的执行可以确定是否满足第一约束集合。在索引值是第二索引值的条件下,至少一个初始锁定脚本的执行可以确定是否满足第二约束集合。
[0048] 数据可以包括新的锁定脚本。作为接收数据的结果,第一花费交易输出可以被约束为包括新的锁定脚本。
[0049] 至少一个初始锁定脚本可以包括数据源的约束。
[0050] 上述方法还可以包括确定第一花费交易输出的可花费值。
[0051] 初始交易可以对具有多个状态的合约进行编码。
[0052] 花费交易可以包括与多个状态相对应的多个输入值。
[0053] 第一约束集合可以约束第一花费交易输出为具有第一状态。第二约束集合约束第二花费交易输出为具有第二状态。
[0054] 还期望提供一种计算机实现的方法,该方法包括:确定约束花费交易的花费交易约束,以包括引用前一交易输出的花费交易输入;创建可花费交易,包括:包括可花费金额的可花费交易输出;和包括花费交易约束的可花费交易锁定脚本,其中花费可花费金额取决于满足花费交易约束的花费交易的至少一个解锁脚本的执行;以及使得可花费交易在区块链网络的节点处被验证。
[0055] 花费交易约束还可以约束花费交易输入以包括特定散列值。
[0056] 特定散列值可以对引用前一交易输出的标识符进行编码。
[0057] 花费交易约束还可以约束花费交易的锁定脚本,以包括从可花费交易锁定脚本复制的脚本元素集合。
[0058] 可花费交易可以对具有多个状态的合约进行编码。
[0059] 上述方法还可以包括确定花费交易的输出的可花费值。
[0060] 花费交易约束可以包括来自前一交易输出的特定锁定脚本元素。作为包括特定锁定脚本元素的花费交易输入的结果,至少一个解锁脚本的执行可以满足花费交易约束。
[0061] 特定锁定脚本元素可以对特定实体的加密密钥进行编码。
[0062] 花费交易约束可以是第一花费交易约束;并且上述方法还可以包括:确定第二花费交易约束以进一步约束花费交易;以及创建第二可花费交易,该交易包括:第二可花费金额;以及包括第二花费交易约束的第二可花费交易锁定脚本,其中花费第二可花费金额还可以取决于满足第二花费交易约束的至少一个解锁脚本的执行。
[0063] 可花费交易锁定脚本可以是第一可花费交易锁定脚本,并且至少一个解锁脚本可以包括第一解锁脚本和第二解锁脚本。第一花费交易约束可以约束第一解锁脚本为包括第一可花费交易锁定脚本的至少一部分。第二花费交易约束可以约束第二解锁脚本为包括第二可花费交易锁定脚本的至少一部分。
[0064] 第一可花费交易锁定脚本的至少一部分可以包括与第一实体相关联的加密密钥。第二可花费交易锁定脚本的至少一部分可以包括与不同于第一实体的第二实体相关联的加密密钥。
[0065] 花费交易约束还可以约束花费交易以约束花费交易的输出。
[0066] 花费交易约束可以对不同于上述合约的另一个合约进行编码。花费可花费金额可能取决于在花费交易的输出中执行的另一个合约。
[0067] 还期望提供一种计算机实现的方法,该方法包括创建区块链交易,该交易编码:处于第一状态并具有许可的状态转换集合的状态机;以及待执行的脚本元素集合,以使花费交易:根据许可的状态转换集合来编码状态机;并且符合对花费交易的输入的限制或者符合对花费交易的输出的限制;以及使得区块链交易被区块链网络中的节点验证。
[0068] 许可的状态转换集合可以包括可以在不同的区块链交易中独立并同时实现的状态转换。
[0069] 脚本元素集合可以使花费交易符合对花费交易的输出的限制。对输出的限制可能要求:花费交易的第一输出,以指示对应于符合许可的状态转换集合的第一输出的状态;以及花费交易的第二输出,以指示对应于符合许可的状态转换集合的第二输出的状态。
[0070] 对应于第一输出的状态和对应于第二输出的状态可以相同。
[0071] 对应于第一输出的状态和对应于第二输出的状态可以是不同的状态。
[0072] 脚本元素集合可以使花费交易符合对花费交易的输入的限制。对输入的限制可能需要对花费交易进行输入,以指示在另一个区块链交易中编码的另一个状态机。
[0073] 对输入的限制可能要求输入引用处于第一状态的状态机,并且引用处于不同于第一状态的另一状态的另一状态机。
[0074] 从第一状态到第二状态的第一转换可以在允许的状态转换集合内。从另一状态到第二状态的第二转换可以在允许的状态转换的集合内。
[0075] 脚本元素集合可以使花费交易符合对花费交易的输入的限制。对输入的限制可以陈述用于推进状态机的条件集合。推进状态机的条件集合可以取决于另一个状态机的状态。
[0076] 另一个状态机可以在另一个区块链交易中被编码。另一交易可以编码用于推进另一状态机的条件集合。用于推进另一状态机的其他条件集合可以取决于状态机的状态。
[0077] 脚本元素集合可以使花费交易符合对花费交易的输出的限制。对输出的限制可能要求花费交易将智能合约的元素集合并入输出。
[0078] 智能合约的元素集合可以从另一个区块链交易中获得。
[0079] 脚本元素集合可以使花费交易符合对花费交易的输入的限制和对花费交易输出的限制。
[0080] 还期望提供一种计算机实现的方法,该方法包括:在区块链网络中的节点处创建具有交易输出的区块链交易,该交易输出可以由第一花费交易的第一花费交易输入来花费;将约束第一花费交易的脚本元素的第一集合插入到区块链交易中,以包括对应于状态机的操作的花费交易脚本元素的第一集合;以及将脚本元素的第二集合插入到区块链交易中,该脚本元素的第二集合将约束花费交易脚本元素的第二集合,该花费交易脚本元素的第二集合对应于许可的状态机状态转换,该状态机状态转换包括可以使用不同的区块链交易来实现的状态,该交易可以被区块链网络同时但独立地处理。区块链交易可以包括具有第一锁定脚本的第一输出,并且第一交易输出值可以包括具有第二锁定脚本和第二交易输出值的第二输出,其中脚本元素的第一集合是第一锁定脚本的一部分。
[0081] 花费交易可以包括解锁脚本,该解锁脚本在由交易验证者使用前一交易输出锁定脚本执行时,将满足预确定的验证测试,并且将使得节点在执行前一交易输出锁定脚本时,至少将代表花费交易的字段的值存储在交易验证者可访问的存储器中,将脚本元素的第一集合插入到花费交易中,其中脚本元素的第一集合形成花费交易的第一输出的花费交易锁定脚本的一部分,并且与前一交易锁定脚本所规定的要求一致,并且其中脚本元素的第一集合对应于状态机的操作,并且将脚本元素的第二集合插入到花费交易中,其中脚本元素的第二集合形成花费交易锁定脚本的一部分,与前一交易锁定脚本所规定的要求一致,并且对应于许可的状态机状态转换,该状态机状态转换包括可以使用不同的区块链交易来实现的状态,这些交易可以由区块链网络同时但独立地处理。
[0082] 花费交易可以包括输入和输出,其中输入引用前一交易输出,并且其中花费交易包括解锁脚本,该解锁脚本在由交易验证者利用前一交易输出的前一交易锁定脚本执行时,将满足预确定的验证测试,其中解锁脚本使得节点在执行锁定脚本时,至少将代表花费交易字段的值存储在交易验证者可访问的存储器中,并且基于许可的状态机状态转换将对应于附加状态机的数据插入花费交易中,作为花费交易输入和/或花费交易输出,使得花费交易中使用的花费交易输入和/或花费交易输出的数量足以用于多个状态机转换。
[0083] 许可的状态机状态转换可以包括从一个初始状态到两个后续状态的分叉转换,这是通过为花费交易创建对应于第一后续状态的第一交易输出,在花费交易中插入第一交易输出的第一交易输出值,足以使第一交易输出成为引用第一交易输出的第一后续交易的输入,在花费交易的第一交易输出中插入脚本元素的第三集合,其中,脚本元素的第三集合是第一锁定脚本的一部分,第一锁定脚本约束第一后续交易以呈现第一后续状态,为花费交易创建对应于第二后续状态的第二交易输出,在花费交易中插入第二交易输出的第二交易输出值,足以使第二交易输出成为引用第二交易输出的第二后续交易的输入,在第二交易输出中插入脚本元素的第四集合,其中脚本元素的第四集合是第二锁定脚本约束的一部分,第二锁定脚本约束第二后续交易以呈现第二个后续状态,以及在第一个交易输出或第二个交易输出中插入脚本元素的第五集合,其中,脚本元素的第五集合是第一锁定脚本或第二锁定脚本的一部分,施加给第一后续交易和第二后续交易不同的约束。
[0084] 第一锁定脚本可以约束第一后续交易具有第一状态,第二锁定脚本可以约束第二后续交易为具有第二状态。花费交易可以包括对应于三个或更多状态的分叉的三个或更多交易输出值。花费交易可以包括对应于三个或更多状态的合并的三个或更多交易输入值。第一锁定脚本和第二锁定脚本可以约束第一后续交易和第二后续交易为具有相同的状态。
[0085] 通常,花费交易可以包括N个交易输入值和N个交易输出值,其中N是1、2、3或更多。
[0086] 许可的状态机状态转换可以包括从两个初始状态到一个后续状态的合并转换,通过在花费交易中插入用于第一先前状态的第一交易输入,在花费交易中插入用于第二先前状态的第二交易输入,以及在花费交易中插入合并状态,该合并状态是根据状态转换矩阵从第一先前状态和第二先前状态的许可转换。
[0087] 许可的状态机状态转换可以被硬编码到第一交易输入和/或第二交易输入中,通过在第一交易输入中插入具有第一先前状态的第一前一交易的第一引用,在第二交易输入中插入具有第二先前状态的第二前一交易的第二引用,以及在花费交易中插入用于合并状态的第一交易输出,其中状态转换矩阵可用于第一前一交易和第二前一交易。
[0088] 许可的状态机状态转换可以包括从数量为N个(N是两个或更多)的初始状态到数量为N个的后续状态的并行操作,通过在花费交易中插入用于第一先前状态的第一交易输入,在花费交易中插入用于第二先前状态的第二交易输入,在第一交易输入中插入对具有第一先前状态的第一前一交易的第一引用,在第二交易输入中插入对具有第二先前状态的第二前一交易的第二引用,在花费交易中插入用于第一后续状态的第一交易输出,在第一交易输出中插入脚本元素的第三集合,其中该脚本元素的第三集合是约束第一后续交易以呈现第一后续状态的第一锁定脚本的一部分,在花费交易中插入用于第二后续状态的第二交易输出,以及在第二交易输出中插入脚本元素的第四集合,其中该脚本元素的第四集合是约束第二后续交易以呈现第二后续状态的第二锁定脚本的一部分。
[0089] 状态机的操作可以为使用区块链实现的智能合约编码。
[0090] 交易可以使用任意约束进行分割。方法可以包括在区块链网络中的节点处创建第一交易,其中第一交易包括具有第一可花费值的第一输出和第一锁定脚本,并且第一交易包括具有第二可花费值的第二输出和第二锁定脚本,在第一锁定脚本中,包括对第一选择交易输出的第一约束集合,其中如果第一选择交易输出对于花费第一可花费值有效,则第一解锁脚本将满足第一约束集合,在第二锁定脚本中,包括对第二选择交易输出的第二约束集合,其中如果第二选择交易输出对于花费第二可花费值有效,则第二解锁脚本将满足第二约束集合,并且其中第一约束集合或第二约束集合对花费交易的锁定脚本施加约束,该花费交易具有作为花费交易输出的第一选择交易输出或第二选择交易输出。
[0091] 第一选择交易输出可以是第一花费交易的输出,第二选择交易输出可以是不同于第一花费交易的第二花费交易的输出。第一约束集合可以不同于第二约束集合,并且不同于对第一交易的交易输入的约束。第一约束集合和第二约束集合可以各自包括约束的公共集合。对花费交易的锁定脚本的约束可以要求,为了花费交易有效,花费交易的锁定脚本包括对花费交易的至少一个字段的引用。对锁定脚本的另一个约束要求是,为了花费交易有效,花费交易的锁定脚本包括第一锁定脚本的一部分的副本和/或第二锁定脚本的一部分的副本。
[0092] 第一选择交易输出可以是第一花费交易的输出,第二选择交易输出可以是第二花费交易的输出,第一解锁脚本可以包括第一交易的字段、第一选择交易的字段和第二花费交易的字段,并且其中第一锁定脚本可以包括第一交易的提取字段的第一比较和第一花费交易的提取字段的第二比较。
[0093] 第一约束集合和第二约束集合可以各自包括约束的公共集合,由此,两个受约束的花费交易输出锁定脚本受到约束的公共集合的约束。第一约束集合和/或第二约束集合可以包括第一锁定脚本的一部分的散列和/或第二锁定脚本的一部分的散列,和/或对第一锁定脚本的一部分的大小和/或第二锁定脚本的一部分的大小的约束。
[0094] 第一约束集合和/或第二约束集合可以包括对输入数据的可选引用。第一交易的多个输出中的每一个可以由施加到多个输出的输出上的不同约束来约束。
[0095] 交易可以与任意约束合并或具有相互依赖性,例如使用计算机实现的方法,包括在区块链网络中的节点创建第一可花费交易,其中第一可花费交易包括具有第一可花费值的第一可花费输出和第一锁定脚本,在第一锁定脚本中包括对花费交易的第一约束集合,其中,如果花费交易对于花费第一可花费输出有效,则花费交易的第一解锁脚本将满足第一约束集合,在第一约束集合中包括第一花费交易约束,该第一花费交易约束要求花费交易的第一花费交易输出包括第一花费交易输出锁定脚本,以包含智能合约脚本指令的第一集合,并且在第一约束集合中包括第二花费交易约束,该第二花费交易约束要求花费交易包含智能合约脚本指令的第二集合,并且要求花费交易包括引用第二可花费交易输出的花费交易输入。
[0096] 智能合约脚本指令的第一集合可以包括从第一锁定脚本复制的脚本指令和/或对应于不同于在第一锁定脚本中实现的智能合约的新的智能合约的脚本指令。
[0097] 第一约束集合可能是第一花费交易输出锁定脚本包括对第二花费交易输出的引用,以及智能合约脚本指令的第二集合包括对第一花费交易输出的引用。
[0098] 上述方法可以包括在第一约束集合中提供第一并行约束,该第一并行约束要求花费交易包括引用第一可花费交易的第一花费交易输入,第二并行约束,该第二并行约束要求花费交易包括引用第二可花费交易输出的第二花费交易输入,第三并行约束,该第三并行约束要求第一花费交易输出锁定脚本在智能合约脚本指令的第一集合中包含至少脚本指令的第一集合,该脚本指令的第一集合至少部分由第一锁定脚本来确定,以及第四并行约束,该第四并行约束要求第二花费交易输出锁定脚本包含智能合约脚本指令的第二集合,该智能合约脚本指令的第二集合至少部分由第二可花费交易输出的锁定脚本来确定。
[0099] 上述方法可以包括在第一约束集合中提供第一并行约束,该第一并行约束要求花费交易包括引用第一可花费交易的第一花费交易输入,第二并行约束,该第二并行约束要求花费交易包括引用第二可花费交易输出的第二花费交易输入,第三并行约束,该第三并行约束要求第一花费交易输出锁定脚本在智能合约脚本指令的第一集合中包含至少脚本指令的第一集合,该脚本指令的第一集合至少部分由第一锁定脚本来确定,以及第四并行约束,该第四并行约束要求第二花费交易输出锁定脚本包含智能合约脚本指令的第二集合,该智能合约脚本指令的第二集合至少部分由第二可花费交易输出的锁定脚本来确定。
[0100] 第一约束集合可以包括第一并行约束,该第一并行约束要求花费交易包括引用第一可花费交易的第一花费交易输入,第二并行约束,该第二并行约束要求花费交易包括引用第二可花费交易输出的第二花费交易输入,第三并行约束,该第三并行约束要求第一花费交易输出锁定脚本在智能合约脚本指令的第一集合中包含从第一锁定脚本复制的至少脚本指令的第一集合,以及第四并行约束,该第四并行约束要求第二花费交易输出锁定脚本包含从第二可花费交易输出的锁定脚本复制的智能合约脚本指令的第二集合。
[0101] 还期望提供一种计算机实现的方法,该方法包括:确定对第一解锁交易输出的第一约束集合;确定对第二解锁交易输出的第二约束集合;创建初始交易以包括:至少一个初始锁定脚本,该脚本包括第一约束集合和第二约束集合;和至少一个可赎回值,其中解锁至少一个可赎回值取决于:第一约束集合至少部分地通过验证解锁交易包括第一解锁交易输出来满足;以及第二约束集合至少部分地通过验证解锁交易包括第二解锁交易输出来满足;和使得初始交易在区块链网络的节点处被验证。
[0102] 第一解锁交易输出中的锁定脚本可以是第二解锁交易输出中的锁定脚本的副本。
[0103] 第一解锁交易输出中的锁定脚本可以不同于第二解锁交易输出中的锁定脚本。
[0104] 第一解锁交易输出中的锁定脚本可以包括至少一个初始锁定脚本的至少一部分。
[0105] 至少一个锁定初始脚本的执行可以从至少一个初始锁定脚本的多个部分中选择至少一部分。
[0106] 解锁交易的解锁脚本的执行可以导致至少一个初始锁定脚本接收对应于第一解锁交易输出或第二解锁交易输出之一的数据。
[0107] 数据可以具有索引值。在索引值是第一索引值的条件下,至少一个初始锁定脚本的执行可以确定是否满足第一约束集合。在索引值是第二索引值的条件下,至少一个初始锁定脚本的执行可以确定是否满足第二约束集合。
[0108] 数据可以包括新的锁定脚本。作为接收数据的结果,第一解锁交易输出可以被约束为包括新的锁定脚本。
[0109] 至少一个初始锁定脚本可以包括数据源的约束。
[0110] 上述方法还可以包括确定第一解锁交易输出的可赎回值。
[0111] 初始交易可以对具有多个状态的合约进行编码。
[0112] 解锁交易可以包括与多个状态相对应的多个输入值。
[0113] 第一约束集合可以约束第一解锁交易输出为具有第一状态。第二约束集合约束第二解锁交易输出为具有第二状态。
[0114] 还期望提供一种计算机实现的方法,该方法包括:确定约束解锁交易的解锁交易约束,以包括引用前一交易输出的解锁交易输入;创建可赎回交易,包括:包括可赎回金额的可赎回交易输出;和包括解锁交易约束的可赎回交易锁定脚本,其中解锁可赎回金额取决于满足解锁交易约束的解锁交易的至少一个解锁脚本的执行;以及使得可赎回交易在区块链网络的节点处被验证。
[0115] 解锁交易约束还可以约束解锁交易输入以包括特定散列值。
[0116] 特定散列值可以对引用前一交易输出的标识符进行编码。
[0117] 解锁交易约束还可以约束解锁交易的锁定脚本,以包括从可赎回交易锁定脚本复制的脚本元素集合。
[0118] 可赎回交易可以对具有多个状态的合约进行编码。
[0119] 上述方法还可以包括确定解锁交易的输出的可赎回值。
[0120] 解锁交易约束可以包括来自前一交易输出的特定锁定脚本元素。作为包括特定锁定脚本元素的解锁交易输入的结果,至少一个解锁脚本的执行可以满足解锁交易约束。
[0121] 特定锁定脚本元素可以对特定实体的加密密钥进行编码。
[0122] 解锁交易约束可以是第一解锁交易约束;并且上述方法还可以包括:确定第二解锁交易约束以进一步约束解锁交易;以及创建第二可赎回交易,该交易包括:第二可赎回金额;以及包括第二解锁交易约束的第二可赎回交易锁定脚本,其中解锁第二可赎回金额还可以取决于满足第二解锁交易约束的至少一个解锁脚本的执行。
[0123] 可赎回交易锁定脚本可以是第一可赎回交易锁定脚本,并且至少一个解锁脚本可以包括第一解锁脚本和第二解锁脚本。第一解锁交易约束可以约束第一解锁脚本为包括第一可赎回交易锁定脚本的至少一部分。第二解锁交易约束可以约束第二解锁脚本为包括第二可赎回交易锁定脚本的至少一部分。
[0124] 第一可赎回交易锁定脚本的至少一部分可以包括与第一实体相关联的加密密钥。第二可赎回交易锁定脚本的至少一部分可以包括与不同于第一实体的第二实体相关联的加密密钥。
[0125] 解锁交易约束还可以约束解锁交易以约束解锁交易的输出。
[0126] 解锁交易约束可以对不同于上述合约的另一个合约进行编码。解锁可赎回金额可能取决于在解锁交易的输出中执行的另一个合约。
[0127] 还期望提供一种计算机实现的方法,该方法包括创建区块链交易,该交易编码:处于第一状态并具有许可的状态转换集合的状态机;以及待执行的脚本元素集合,以使解锁交易:根据许可的状态转换集合来编码状态机;并且符合对解锁交易的输入的限制或者符合对解锁交易的输出的限制;以及使得区块链交易被区块链网络中的节点验证。
[0128] 许可的状态转换集合可以包括可以在不同的区块链交易中独立并同时实现的状态转换。
[0129] 脚本元素集合可以使解锁交易符合对解锁交易的输出的限制。对输出的限制可能要求:解锁交易的第一输出,以指示对应于符合许可的状态转换集合的第一输出的状态;以及解锁交易的第二输出,以指示对应于符合许可的状态转换集合的第二输出的状态。
[0130] 对应于第一输出的状态和对应于第二输出的状态可以相同。
[0131] 对应于第一输出的状态和对应于第二输出的状态可以是不同的状态。
[0132] 脚本元素集合可以使解锁交易符合对解锁交易的输入的限制。对输入的限制可能需要对解锁交易进行输入,以指示在另一个区块链交易中编码的另一个状态机。
[0133] 对输入的限制可能要求输入引用处于第一状态的状态机,并且引用处于不同于第一状态的另一状态的另一状态机。
[0134] 从第一状态到第二状态的第一转换可以在允许的状态转换集合内。从另一状态到第二状态的第二转换可以在允许的状态转换的集合内。
[0135] 脚本元素集合可以使解锁交易符合对解锁交易的输入的限制。对输入的限制可以陈述用于推进状态机的条件集合。推进状态机的条件集合可以取决于另一个状态机的状态。
[0136] 另一个状态机可以在另一个区块链交易中被编码。另一交易可以编码用于推进另一状态机的条件集合。用于推进另一状态机的其他条件集合可以取决于状态机的状态。
[0137] 脚本元素集合可以使解锁交易符合对解锁交易的输出的限制。对输出的限制可能要求解锁交易将智能合约的元素集合并入输出。
[0138] 智能合约的元素集合可以从另一个区块链交易中获得。
[0139] 脚本元素集合可以使解锁交易符合对解锁交易的输入的限制和对解锁交易输出的限制。
[0140] 还期望提供一种计算机实现的方法,该方法包括:在区块链网络中的节点处创建具有交易输出的区块链交易,该交易输出可以由第一解锁交易的第一解锁交易输入来解锁;将约束第一解锁交易的脚本元素的第一集合插入到区块链交易中,以包括对应于状态机的操作的解锁交易脚本元素的第一集合;以及将脚本元素的第二集合插入到区块链交易中,该脚本元素的第二集合将约束解锁交易脚本元素的第二集合,该解锁交易脚本元素的第二集合对应于许可的状态机状态转换,该状态机状态转换包括可以使用不同的区块链交易来实现的状态,该交易可以被区块链网络同时但独立地处理。区块链交易可以包括具有第一锁定脚本的第一输出,并且第一交易输出值可以包括具有第二锁定脚本和第二交易输出值的第二输出,其中脚本元素的第一集合是第一锁定脚本的一部分。
[0141] 解锁交易可以包括解锁脚本,该解锁脚本在由交易验证者使用前一交易输出锁定脚本执行时,将满足预确定的验证测试,并且将使得节点在执行前一交易输出锁定脚本时,至少将代表解锁交易的字段的值存储在交易验证者可访问的存储器中,将脚本元素的第一集合插入到解锁交易中,其中脚本元素的第一集合形成解锁交易的第一输出的解锁交易锁定脚本的一部分,并且与前一交易锁定脚本所规定的要求一致,并且其中脚本元素的第一集合对应于状态机的操作,并且将脚本元素的第二集合插入到解锁交易中,其中脚本元素的第二集合形成解锁交易锁定脚本的一部分,与前一交易锁定脚本所规定的要求一致,并且对应于许可的状态机状态转换,该状态机状态转换包括可以使用不同的区块链交易来实现的状态,这些交易可以由区块链网络同时但独立地处理。
[0142] 解锁交易可以包括输入和输出,其中输入引用前一交易输出,并且其中解锁交易包括解锁脚本,该解锁脚本在由交易验证者利用前一交易输出的前一交易锁定脚本执行时,将满足预确定的验证测试,其中解锁脚本使得节点在执行锁定脚本时,至少将代表解锁交易字段的值存储在交易验证者可访问的存储器中,并且基于许可的状态机状态转换将对应于附加状态机的数据插入解锁交易中,作为解锁交易输入和/或解锁交易输出,使得解锁交易中使用的解锁交易输入和/或解锁交易输出的数量足以用于多个状态机转换。
[0143] 许可的状态机状态转换可以包括从一个初始状态到两个后续状态的分叉转换,这是通过为解锁交易创建对应于第一后续状态的第一交易输出,在解锁交易中插入第一交易输出的第一交易输出值,足以使第一交易输出成为引用第一交易输出的第一后续交易的输入,在解锁交易的第一交易输出中插入脚本元素的第三集合,其中,脚本元素的第三集合是第一锁定脚本的一部分,第一锁定脚本约束第一后续交易以呈现第一后续状态,为解锁交易创建对应于第二后续状态的第二交易输出,在解锁交易中插入第二交易输出的第二交易输出值,足以使第二交易输出成为引用第二交易输出的第二后续交易的输入,在第二交易输出中插入脚本元素的第四集合,其中脚本元素的第四集合是第二锁定脚本约束的一部分,第二锁定脚本约束第二后续交易以呈现第二个后续状态,以及在第一个交易输出或第二个交易输出中插入脚本元素的第五集合,其中,脚本元素的第五集合是第一锁定脚本或第二锁定脚本的一部分,施加给第一后续交易和第二后续交易不同的约束。
[0144] 第一锁定脚本可以约束第一后续交易具有第一状态,第二锁定脚本可以约束第二后续交易为具有第二状态。解锁交易可以包括对应于三个或更多状态的分叉的三个或更多交易输出值。解锁交易可以包括对应于三个或更多状态的合并的三个或更多交易输入值。第一锁定脚本和第二锁定脚本可以约束第一后续交易和第二后续交易为具有相同的状态。
[0145] 通常,解锁交易可以包括N个交易输入值和N个交易输出值,其中N是1、2、3或更多。
[0146] 许可的状态机状态转换可以包括从两个初始状态到一个后续状态的合并转换,通过在解锁交易中插入用于第一先前状态的第一交易输入,在解锁交易中插入用于第二先前状态的第二交易输入,以及在解锁交易中插入合并状态,该合并状态是根据状态转换矩阵从第一先前状态和第二先前状态的许可转换。
[0147] 许可的状态机状态转换可以被硬编码到第一交易输入和/或第二交易输入中,通过在第一交易输入中插入具有第一先前状态的第一前一交易的第一引用,在第二交易输入中插入具有第二先前状态的第二前一交易的第二引用,以及在解锁交易中插入用于合并状态的第一交易输出,其中状态转换矩阵可用于第一前一交易和第二前一交易。
[0148] 许可的状态机状态转换可以包括从数量为N个(N是两个或更多)的初始状态到数量为N个的后续状态的并行操作,通过在解锁交易中插入用于第一先前状态的第一交易输入,在解锁交易中插入用于第二先前状态的第二交易输入,在第一交易输入中插入对具有第一先前状态的第一前一交易的第一引用,在第二交易输入中插入对具有第二先前状态的第二前一交易的第二引用,在解锁交易中插入用于第一后续状态的第一交易输出,在第一交易输出中插入脚本元素的第三集合,其中该脚本元素的第三集合是约束第一后续交易以呈现第一后续状态的第一锁定脚本的一部分,在解锁交易中插入用于第二后续状态的第二交易输出,以及在第二交易输出中插入脚本元素的第四集合,其中该脚本元素的第四集合是约束第二后续交易以呈现第二后续状态的第二锁定脚本的一部分。
[0149] 状态机的操作可以为使用区块链实现的智能合约编码。
[0150] 交易可以使用任意约束进行分割。方法可以包括在区块链网络中的节点处创建第一交易,其中第一交易包括具有第一可赎回值的第一输出和第一锁定脚本,并且第一交易包括具有第二可赎回值的第二输出和第二锁定脚本,在第一锁定脚本中,包括对第一选择交易输出的第一约束集合,其中如果第一选择交易输出对于解锁第一可赎回值有效,则第一解锁脚本将满足第一约束集合,在第二锁定脚本中,包括对第二选择交易输出的第二约束集合,其中如果第二选择交易输出对于解锁第二可赎回值有效,则第二解锁脚本将满足第二约束集合,并且其中第一约束集合或第二约束集合对解锁交易的锁定脚本施加约束,该解锁交易具有作为解锁交易输出的第一选择交易输出或第二选择交易输出。
[0151] 第一选择交易输出可以是第一解锁交易的输出,第二选择交易输出可以是不同于第一解锁交易的第二解锁交易的输出。第一约束集合可以不同于第二约束集合,并且不同于对第一交易的交易输入的约束。第一约束集合和第二约束集合可以各自包括约束的公共集合。对解锁交易的锁定脚本的约束可以要求,为了解锁交易有效,解锁交易的锁定脚本包括对解锁交易的至少一个字段的引用。对锁定脚本的另一个约束要求是,为了解锁交易有效,解锁交易的锁定脚本包括第一锁定脚本的一部分的副本和/或第二锁定脚本的一部分的副本。
[0152] 第一选择交易输出可以是第一解锁交易的输出,第二选择交易输出可以是第二解锁交易的输出,第一解锁脚本可以包括第一交易的字段、第一选择交易的字段和第二解锁交易的字段,并且其中第一锁定脚本可以包括第一交易的提取字段的第一比较和第一解锁交易的提取字段的第二比较。
[0153] 第一约束集合和第二约束集合可以各自包括约束的公共集合,由此,两个受约束的解锁交易输出锁定脚本受到约束的公共集合的约束。第一约束集合和/或第二约束集合可以包括第一锁定脚本的一部分的散列和/或第二锁定脚本的一部分的散列,和/或对第一锁定脚本的一部分的大小和/或第二锁定脚本的一部分的大小的约束。
[0154] 第一约束集合和/或第二约束集合可以包括对输入数据的可选引用。第一交易的多个输出中的每一个可以由施加到多个输出的输出上的不同约束来约束。
[0155] 交易可以与任意约束合并或具有相互依赖性,例如使用计算机实现的方法,包括在区块链网络中的节点创建第一可赎回交易,其中第一可赎回交易包括具有第一可赎回值的第一可赎回输出和第一锁定脚本,在第一锁定脚本中包括对解锁交易的第一约束集合,其中,如果解锁交易对于解锁第一可赎回输出有效,则解锁交易的第一解锁脚本将满足第一约束集合,在第一约束集合中包括第一解锁交易约束,该第一解锁交易约束要求解锁交易的第一解锁交易输出包括第一解锁交易输出锁定脚本,以包含智能合约脚本指令的第一集合,并且在第一约束集合中包括第二解锁交易约束,该第二解锁交易约束要求解锁交易包含智能合约脚本指令的第二集合,并且要求解锁交易包括引用第二可赎回交易输出的解锁交易输入。
[0156] 智能合约脚本指令的第一集合可以包括从第一锁定脚本复制的脚本指令和/或对应于不同于在第一锁定脚本中实现的智能合约的新的智能合约的脚本指令。
[0157] 第一约束集合可能是第一解锁交易输出锁定脚本包括对第二解锁交易输出的引用,以及智能合约脚本指令的第二集合包括对第一解锁交易输出的引用。
[0158] 上述方法可以包括在第一约束集合中提供第一并行约束,该第一并行约束要求解锁交易包括引用第一可赎回交易的第一解锁交易输入,第二并行约束,该第二并行约束要求解锁交易包括引用第二可赎回交易输出的第二解锁交易输入,第三并行约束,该第三并行约束要求第一解锁交易输出锁定脚本在智能合约脚本指令的第一集合中包含至少脚本指令的第一集合,该脚本指令的第一集合至少部分由第一锁定脚本来确定,以及第四并行约束,该第四并行约束要求第二解锁交易输出锁定脚本包含智能合约脚本指令的第二集合,该智能合约脚本指令的第二集合至少部分由第二可赎回交易输出的锁定脚本来确定。
[0159] 上述方法可以包括在第一约束集合中提供第一并行约束,该第一并行约束要求解锁交易包括引用第一可赎回交易的第一解锁交易输入,第二并行约束,该第二并行约束要求解锁交易包括引用第二可赎回交易输出的第二解锁交易输入,第三并行约束,该第三并行约束要求第一解锁交易输出锁定脚本在智能合约脚本指令的第一集合中包含至少脚本指令的第一集合,该脚本指令的第一集合至少部分由第一锁定脚本来确定,以及第四并行约束,该第四并行约束要求第二解锁交易输出锁定脚本包含智能合约脚本指令的第二集合,该智能合约脚本指令的第二集合至少部分由第二可赎回交易输出的锁定脚本来确定。
[0160] 第一约束集合可以包括第一并行约束,该第一并行约束要求解锁交易包括引用第一可赎回交易的第一解锁交易输入,第二并行约束,该第二并行约束要求解锁交易包括引用第二可赎回交易输出的第二解锁交易输入,第三并行约束,该第三并行约束要求第一解锁交易输出锁定脚本在智能合约脚本指令的第一集合中包含从第一锁定脚本复制的至少脚本指令的第一集合,以及第四并行约束,该第四并行约束要求第二解锁交易输出锁定脚本包含从第二可赎回交易输出的锁定脚本复制的智能合约脚本指令的第二集合。
[0161] 还期望提供一种系统,包括:处理器;以及包括可执行指令的存储器,作为由处理器执行的结果,可执行指令使得系统执行所要求保护的任何方法。
[0162] 还期望提供一种其上存储有可执行指令的非暂时性计算机可读存储介质,作为由计算机系统的处理器执行的结果,可执行指令使得计算机系统至少执行所要求保护的任何方法。附图说明
[0163] 参考本文所述的实施例,本发明的这些和其他方面将变得清晰并得以阐明。现在将仅通过示例并参考附图来描述本发明的实施例,其中:
[0164] 图1示出了可以实现各种实施例的区块链环境。
[0165] 图2示出了可以在图1的区块链环境中使用的区块链节点的示例。
[0166] 图3示出了可以存储在图2的区块链节点所使用的区块链账本中的交易的示例。
[0167] 图4示出了特定于比特币区块链环境的区块链交易的示例。
[0168] 图5示出了用于实现生成签名的OP_GENSIG脚本的示例脚本。
[0169] 图6示出了用于实现注入对应于解锁交易的输入的前一交易OP_PREVTXINJECTION脚本的示例脚本。
[0170] 图7示出了用于实现注入对应于被签名的输入的前一交易的OP_SELFTXINJECTION脚本的示例脚本。
[0171] 图8示出了用于实现将序列化解锁交易注入到锁定脚本中的OP_SPENDINGTXINJECTION脚本的示例脚本。
[0172] 图9示出了一对交易的示例,其中,一个是具有要转移的值的交易,另一个是表示该值的解锁的交易。
[0173] 图10示出了多个交易的示例,其中,交易具有来自其他交易的多个输入和可以由未来交易转移的多个输出。
[0174] 图11示出了根据实施例从交易字段的序列化集合生成签名的示例。
[0175] 图12示出了解锁交易的示例,该解锁交易包括解锁脚本,该解锁脚本包括该解锁交易的一部分的副本。
[0176] 图13示出了解锁交易和前一交易。
[0177] 图14是对解锁交易的锁定脚本施加约束的锁定脚本的示例的流程图
[0178] 图15示出了对应于图14的步骤的更具体的步骤的一些示例。
[0179] 图16示出了验证解锁脚本的示例。
[0180] 图17示出了对输入施加约束集合的锁定脚本的示例。
[0181] 图18是对解锁交易的输入施加约束的锁定脚本的示例的流程图。
[0182] 图19示出了输入约束的示例。
[0183] 图20示出了在图18所示过程的环境中的约束的示例。
[0184] 图21示出了联锁脚本约束。
[0185] 图22示出了使用区块链交易实现的状态机的示例。
[0186] 图23示出了状态机逻辑如何在区块链交易中进行编码的示例。
[0187] 图24示出了根据实施例的无信任的确定性状态机的示例。
[0188] 图25是示出根据各种实施例的用于无信任的确定性状态机的处理的示例的流程图。
[0189] 图26示出了使用具有某些特征的状态转换矩阵的状态机。
[0190] 图27示出了可用于实现状态机的交易的示例。
[0191] 图28示出了使用区块链交易分叉智能合约的一部分的示例。
[0192] 图29是分叉处理的示例伪代码序列。
[0193] 图30示出了使用区块链交易从智能合约创建新的智能合约的示例。
[0194] 图31是用于在解锁交易中强制智能合约的示例伪代码序列。
[0195] 图32示出了使用区块链交易的智能合约的合并操作的示例。
[0196] 图33作为具有弱依赖性的合并处理的示例的伪代码序列。
[0197] 图34是作为具有强依赖性的合并处理的示例的伪代码序列。
[0198] 图35示出了使用区块链交易的智能合约的并行处理操作的示例。
[0199] 图36是作为并行交易屏障处理的示例的伪代码序列。
[0200] 图37示出了如何在并发路径中使用区块链交易按照合约屏障来执行智能合约的部分的示例。

具体实施方式

[0201] 首先将参考图1,图1示出了根据本发明实施例的与区块链相关联的示例性区块链网络100。在该实施例中,区块链网络100包括可能被实现为点对点分布式电子设备的区块链节点,每个节点运行软件和/或硬件的实例,该软件和/或硬件执行遵循区块链协议的操作,该区块链协议全部或部分地在节点的运营商之间达成一致。在一些示例中,这些分布式电子设备被简单地称为“节点”(例如图1中的节点102)。区块链协议的一个示例是比特币协议。
[0202] 节点102可以包括任何合适的计算设备(例如,数据中心中的服务器、客户端计算设备(诸如台式电脑、笔记本电脑平板电脑、智能手机等)),由计算资源服务提供商的分布式系统中的多个计算设备或者由任何合适的电子客户端设备组成。节点102可以具有输入,以接收代表所提议的交易(诸如交易104)的数据消息或对象。节点102可以查询其所维护的信息,例如对交易状态的理解。
[0203] 如图1所示,一些节点102可以通信地连接到一个或多个其他节点102。至于哪些节点102可以与哪些其他节点通信,这些细节不需要被集中地确定。假设消息是区块链协议指示应该被转发的消息,那么区块链网络100中的活动节点能够与一个或多个其他节点102通信就足够了,使得从一个节点102传递到另一个节点102的消息可以在区块链网络100(或其某个重要部分)中传播。一个这样的消息可以是由节点102A之一所提议的交易的发布,然后该消息将沿着诸如路径106的路径传播。另一个这样的消息可能是提议将其包含在区块链中的新区块的发布。
[0204] 图2示出了可以在区块链环境中用作图1的区块链网络中的节点的区块链节点202的示例。如图所示,区块链节点202被示出为包括处理器204、程序存储器206、存储区块链规则和协议细节208、对等体列表210、存储应用程序变量212、通信接口214和存储区块链账本216。区块链账本216包含对应于区块链中的区块的数据,例如包含与交易相对应的数据的区块221、222、223,例如具有交易230(1)-(4)的区块222。除了区块223外,上述区块可以是加密地不可变的,因为后续区块依赖于当它变得不可变时在区块上计算出的值,并且对不可变区块的任何修改可以容易地被其他区块链节点识别为无效区块。区块223被示为开放区块,表示可能可变的并且可能尚未提交给区块链的交易的存储。
[0205] 区块链节点202通过通信接口214进行通信,通信接口214可以实现为有线或无线通信中的一个或多个。区块链账本216可以是区块链网络的区块链账本的完整副本或其一部分。一些区块链节点可能仅维护未转移的交易,而其他节点可能维护整个账本。通过这种方式,账本是分布式账本,因为每个节点都可以有自己的副本。优选地,节点仅根据协议的规则修改其副本,对于完全遵循这些规则的所有节点,它们的副本有时应该与其他节点相同,为区块和交易节省一些传播时间。区块链节点应该包括验证其接收的区块和这些区块中的交易的能力。区块链协议的规则可能是,如果区块链节点确定交易的区块无效,则该区块链节点不向其他节点传播区块或交易。根据该规则,有效且经验证为有效的区块和交易可以传播区块链网络,而无效的区块和交易可能不会传播。
[0206] 区块链网络中的一些节点可以是矿工节点,其执行收集交易和创建交易区块的操作,以便可以将新区块提交给区块链。矿工节点可能被期望执行一些既复杂(以避免流氓节点轻易创建不适当的区块)又依赖于所包括的交易的数据(使得流氓节点不能提前执行复杂的操作)的操作,这些任务的表现容易被其他节点验证。由于上述其他节点验证矿工节点的工作,在验证后,其他节点将区块接收到其区块链副本中并进行传播。这将新区块提交到区块链的分布式账本。在一些示例中,区块是交易的群组,通常标记有时间戳和前一区块的“指纹”(例如散列)。这样,每个区块都链接到前一区块,从而创建链接区块链中区块的“链”。在实施例中,有效区块可以通过区块链网络中的节点的共识被添加到区块链中。同样在一些示例中,区块链包括已验证区块的列表。
[0207] 在实施例中,如本发明中所描述的,至少一些节点用作验证交易的验证节点。在一些示例中,区块链以数字资产的形式证明值,并且区块链的交易共同提供了从创始交易(启动区块链)或者分配交易到后续交易的链,该分配交易生成新“挖掘”的数字资产作为矿工节点操作者参与的原因。链的一部分的末端将是未转移的交易或其一部分,并且区块链上的每个交易指定一个或多个输出,其中一些输出可能被转移,而一些未被转移,其中输出包括该输出的值的说明书以及某人通过插入有效交易(即,至少满足指定要求的交易)来“解锁”该输出所需的要求,该有效交易将扩展链的该部分。如本文所使用的,未花费的交易输出可以被称为(Unspent Transaction Output,简称UTXO)。解锁UTXO在本领域中也可以称为花费UTXO。
[0208] 某人解锁UTXO所需的要求可以在UTXO的锁定脚本中指定。有效的解锁交易可以是(i)指定一个或多个前一UTXO作为交易的输入,其中该指定可以带有指向UTXO的指针,(ii)满足每个UTXO的锁定脚本的要求,以及(iii)具有输入,使得这些输入指向的所有UTXO的值的总和小于或等于交易的所有输出的值的总和。表示满足锁定脚本要求的数据可以称为解锁脚本。验证节点可以处理解锁脚本,随后是锁定脚本,并且该过程的输出要么是无效结果,要么是解锁交易的验证。
[0209] 该过程可以是无状态过程,因此,如果一个节点运行该解锁脚本和该锁定脚本,则结果是验证,该验证将是其他节点的结果。因此,满足区块链上已经存在但尚未转移的前一交易输出的锁定脚本的解锁交易可以传播并最终提交给区块链。创建要提交的解锁交易的节点反过来会在其自己的锁定脚本中指定任何人解锁该新交易的输出值所需的要求。该过程可以被认为是无状态的,因为脚本不需要引用脚本之外的引用,也不依赖于这些脚本之外的变量或其他状态,除了一些小的例外。因此,解锁脚本和锁定脚本可以单独评估。
[0210] 在其他变型中,区块链系统可以包括允许外部数据被包括在脚本评估过程中的功能。在这种情况下,可以通过以下方式控制和/或保护外部数据:当使用外部数据评估解锁脚本和锁定脚本时,评估可以在执行评估的节点之间保持一致。
[0211] 图3示出了可以存储在由图2的区块链节点使用的区块链账本中的交易300的示例。具有类似功能的其他变型也是可能的。交易的数据元素或字段可以如图3所示,并且可以包括除了本发明中描述的那些之外的其他字段。如图所示,存在区块链版本字段302,该区块链版本字段302具有指示交易300的区块链协议版本的值。#vin字段304指示交易300中存在多少交易输入(如下所述)。其他字段可能存在且未被示出,但是对于每个交易输入(本文示出为示例Vin[y]310),可以存在字段集合,该字段集合包括前一交易的交易标识(TxID)311、指向该前一交易(提供交易输出以匹配交易输入310的交易)的输出之一的指针312,其中TxID 311和指针312共同形成引用前一交易的输出的指针313。如本文所使用的,术语“前一交易(previous transaction)”在相对于当前或本交易的上下文中使用时,可以指具有由当前或本交易引用(和“转移”)的交易输出的特定先前交易(或多个交易)。在示例中,当前或本交易可以被称为“解锁交易”。
[0212] 在一些区块链实现中,不存在用于分配唯一TxID值的中心化机制,而是存在用于为交易生成唯一TxID的去中心化机制,例如通过生成交易本身内容的散列。由于有效交易不能拥有与另一有效交易完全相同的内容,所以每个有效交易可以为其TxID具有唯一的散列(除了极低的散列冲突概率)。无论如何实现,本文假设每个交易具有唯一的交易标识。由于散列的性质,一旦从交易的内容中生成TxID,该内容都不能更改,并且TxID对于该交易仍然有效。
[0213] 如图3所示,交易输入Vin[y]310的字段集合还包括指示后一个脚本长度的解锁脚本长度字段314(Unlocking_Script_Length field)、包含vin[y]310的解锁脚本的解锁脚本字段(Unlocking_Script field)315,该vin[y]310的解锁脚本“解锁”由指针313指向的交易输出的相应锁定脚本,和可用于约束交易300的序列#字段(sequence#field)316。
[0214] 尽管图3仅明确地示出了一个交易输入和一个交易输出,但是多个交易输入和多个交易输出也是可能的。在交易输入之后,可以存在#vout字段320,其可以指示在交易300中存在多少交易输出(下文中也有解释)。对于每个交易输出(在本文中示出为示例Vout[x]330),可以存在字段集合,该字段集合包括指示由该交易输出Vout[x]330提供的交易值的输出值字段332、指示后一个脚本长度的锁定脚本长度字段(Locking_Script_Length field)334、以及包含该交易输出Vout[x]330的锁定脚本的锁定脚本字段(Locking_Script field)336。如所解释的,该交易输出的交易值可以由任何能够创建具有交易输入的解锁交易的人“转移”,该交易输入具有解锁脚本,当使用该解锁脚本和该锁定脚本执行验证时,区块链节点可以将该解锁脚本验证为真。其他字段可以跟随交易输出字段,例如锁定时间字段338,其可以限制交易300在指定的未来时间之前或者在指定的未来区块之前不活动。在解锁交易的每个交易输入指向前一交易输出的相应交易输出并且前一交易输出包括交易值的情况下,交易输入不需要包含指示该交易值的字段。
[0215] 图4示出了特定于比特币区块链环境的区块链交易400的示例。在该示例中,区块链交易400包括所示的数据元素或字段,并且可以包括除了在本发明中示出或描述的那些之外的附加字段。交易400包括具有指示交易400的版本的值的nVersion字段402。#vin字段404可以指示交易400中存在多少交易输入。对于每个交易输入,例如交易输入Vin[y]410,可以存在字段集合,该字段集合包括引用前一交易的散列411、指向前一交易的特定输出的指针n412、指示后一个解锁脚本长度的scriptSigLen字段414、包含该交易输入Vin[y]410的解锁脚本的scriptSig字段415、以及可以用于约束交易400的nSequence字段416。
[0216] 在交易输入之后,可以存在#vout字段420,其指示在交易400中存在多少交易输出,并且对于每个交易输出(本文示出了一个作为示例Vout[x]430),可以存在字段集合,包括指示由该交易输出Vout[x]430提供的交易值的nValue字段432、指示后一个锁定脚本的长度的scriptPubKeyLen字段434以及包含用于该交易输出Vout[x]430的锁定脚本的scriptPubKey字段436。交易440还可以用nLockTime字段438示出,该nLockTime字段438可以约束交易400在指定的未来时间之前或者在指定的未来区块之前不活动。
[0217] 操作代码
[0218] 在示例脚本语言中(例如在许多比特币区块链节点中使用的脚本语言),可以存在操作代码(operation codes,简称OP codes)集合,它们可以作为脚本(例如锁定脚本或解锁脚本)中的脚本指令出现。在本发明中,引用各种脚本操作代码和关键字来执行各种操作。然而,可以设想,其他区块链技术可以实现不同的指令集合,因此本发明中描述的操作代码应该被视为操作代码所执行的操作的说明。
[0219] 本发明的某些实施例在脚本系统或用于实现所描述的指令集合的其他系统允许单个脚本中超过200条指令(例如,200条以上的操作代码)的假设下操作。同样,本发明某些实施例还假定由本发明所引用的操作代码提供的功能在执行操作代码脚本/指令集合的系统中存在并启用。本发明中引用的操作代码的示例包括:·OP_ADD,从堆栈中弹出前两项,将它们相加并将结果压入到堆栈中
·OP_BIGMOD,从堆栈中弹出前两项,将第二项除以第一项,并将余数压入到堆栈中·OP_BIGMODADD,从堆栈中弹出前三项,对第一项和第二项执行模加,对第三项执行模运算,并将结果压入到堆栈中
·OP_BIGMODINVERSE,从堆栈中弹出前两项,对第一项模第二项执行模负指数运算,并将结果压入到堆栈中
·OP_BIGMODMUL,从堆栈中弹出前三项,对第一项和第二项执行模乘,对第三项执行模运算,并将结果压入到堆栈中
·OP_CAT,从堆栈中弹出前两项,连接这两项并将结果压入到堆栈中
·OP_CHECKSIG,从堆栈中弹出两个项目,使用第一个作为公钥,第二个作为签名,检查弹出的签名是否是有效签名,如果有效,则将1(真)压入到堆栈中,否则将0(假)压入到堆栈中
·OP_CHECKSIGVERIFY,其功能与OP_CHECKSIG相同,但OP_VERIFY随后执行
·OP_DIV,从堆栈中弹出两个项目,将第二个项目与第一个项目分开,并将结果压入到堆栈中
·OP_DUP,将堆栈上的顶部项目的副本压入到堆栈中,从而复制顶部项目
·OP_ELSE,如果未执行前面的OP_IF或OP_NOTIF或OP_ELSE,则将执行这些语句;否则,如果执行了前面的OP_IF或OP_NOTIF或OP_ELSE,则不执行这些语句
·OP_ENDIF,结束if/else区块
·OP_EQUAL,读取堆栈上的前两个项目,如果这两个项目完全相等,则将1压入到堆栈中,否则压入0
·OP_EQUALVERIFY,与OP_EQUAL相同,但随后运行OP_VERIFY
·OP_FROMALTSTACK,将输入放在主堆栈的顶部,并将其从备用堆栈中移除
·OP_HASH256,其中输入被散列两次:首先使用SHA-256,然后使用RIPEMD-160
·OP_IF,如果顶部堆栈值不为假,则执行语句并移除顶部堆栈值
·OP_MUL,将堆栈中的前两项相乘
·OP_NOTIF,如果顶部堆栈值为假,则执行语句并移除顶部堆栈值
·OP_OVER,复制堆栈上的第二个项目,并将其压入到堆栈顶部
·OP_ROLL,其中堆栈中深度为n项的项被移动到顶部
·OP_SUBSTR,返回字符串的一部分
·OP_SWAP,其中交换堆栈中的前两项
·OP_TOALTSTACK,将输入放在备用堆栈的顶部,并将其从主堆栈中移除
·OP_VERIFY,如果顶部堆栈值不为真,则将交易标记为无效
[0220] 上述操作代码中的一些可能是由区块链节点支持的基本操作代码,而为便于描述,本文将其他代码称为操作代码,但是其通常被实现为由多个基本操作代码组成的小脚本。例如,OP_BIGMOD被引用为操作代码,但是可以使用一系列操作代码来实现,以执行将堆栈中的前两个项目相除后返回余数的功能。OP_BIGMODADD、OP_BIGMODINVERSE和OP_BIGMODMUL可以用相似的操作代码序列通过直接的方式表示。
[0221] OP_GENSIG:在本发明中,对OP_GENSIG的引用应视为对应于本文描述的OP_GENSIG脚本的操作的简写。生成交易签名的OP_GENSIG脚本,该签名可能被压入到堆栈上或被使用。OP_GENSIG脚本始于以下假设:按顺序压入主(后进先出)堆栈的输入是(指示交易的哪些字段将在散列中使用),消息值(交易的已使用交易字段的序列化集合的双重SHA256),私钥(用于对消息值进行散列)和数字(a用于掩码/保护私钥的随机或伪随机数;“掩码数(mask number)”)。
[0236] 解锁脚本920为了呈无状态的,也不能直接在解锁交易922的字段上进行操作。无状态质量可能是有用的,因为它确保在给定相同的锁定脚本910和相同的解锁脚本920的情况下,任何适当编程的区块链节点都将得到相同的结果906。其中的一个例外是,脚本可能具有将其中一个脚本中的签名与整个交易生成的签名进行核对的能力。在实施例中,脚本可以为此目的使用OP_CHECKSIG。
[0237] 在基于堆栈的操作中,交易验证者通过依次处理脚本中的每个操作代码来执行解锁脚本。一些操作代码导致处理,一些导致数据被压入堆栈或从堆栈弹出,或者一些组合。一旦解锁脚本的执行完成,堆栈上可能会有剩余数据。如果解锁脚本的执行没有脚本错误或终止执行的操作代码,则交易验证者执行锁定脚本,该锁定脚本可以使用堆栈上存在的数据。在可以使用同一操作代码集合编写锁定脚本和解锁脚本的情况下,这实际上类似于执行单个脚本,该单个脚本包括解锁脚本和锁定脚本的串联。但是,在解锁脚本的操作代码执行结束时和执行锁定脚本的操作代码之前检查脚本错误,可以防止由格式错误的解锁脚本引起的问题。
[0238] 一旦脚本的执行完成,保留在堆栈顶部的结果就是验证的结果。如果“真”位于堆栈顶部,则这可以被视为解锁脚本实际上对锁定脚本进行解锁的验证。在这方面,解锁脚本满足锁定脚本的所有要求。
[0239] 图10示出了多个交易和多个输入/输出的示例。如图所示,前一交易1002具有两个交易输出,带有其锁定脚本1006的Vout[0]1004和带有其锁定脚本1016的Vout[1]1014,以及它们相应的交易输出值,以及其它未示出的字段,(例如前一交易1002的交易输入)。解锁交易1020被示出为具有两个交易输入,Vin[0]1024(具有其解锁脚本1026和指向其对应的前一交易输出的指针1028)和Vin[1]1034(具有其解锁脚本1036和指向其对应的前一交易输出的指针1038)。在此示例中,Vin[0]对应的前一交易输出是前一交易1002(前一交易1)的Vout[0],而Vin[1]对应的前一交易输出是另一交易(前一交易2)的一些输出(未示出)。
[0240] 为了验证解锁交易1020,具有交易验证者1044的区块链节点1042根据其所有输入是否有效来输出真或假结果1046。在这种情况下,可以存在用于解锁交易1020的多个输入,因此通过处理交易输入的解锁脚本和由输入的指针指向的相应交易输出的锁定脚本来验证每个输入。
[0241] 使用具有多个输出和多个输入的能力,一个交易的值可以通过多个其他交易来转移,并且在新交易中可赎回的值可以来自多个前一交易。如上所述,锁定脚本可以通过签名和其他加密技术对解锁脚本中必须包含的内容施加约束。
[0242] 一个这样的约束可能是解锁脚本必须包含一些任意数据。一些约束可能是“弱约束(weak constraints)”或更一般的约束,例如解锁脚本必须包含一些长度为4字节的数据,或者一些特定数量的字节,而不将这些字节约束为任何特定值。更强或更具体的约束可能是,当数据被散列时,数据必须产生特定的散列值。后一个约束通常要求数据具有特定长度和数据的特定值,因为某人几乎不可能确定会导致相同散列的不同值。该约束可以在脚本中实现,通过解锁脚本将该数据压入到堆栈上,或者将该数据的散列压入到堆栈上,让锁定脚本将所需的散列压入到堆栈上,然后执行OP_EQUAL,然后执行OP_VERIFY操作代码。如果这两个压入的项目匹配,则这些操作代码将返回真,如果不匹配,则返回假。在更一般的情况下,可以施加要求存在某些数据或具有某些特征的数据的约束。
[0243] 弱约束的示例是解锁脚本必须包括某些数据,这些数据可能包含解锁交易字段的序列化集合,而不一定要求这些字段是任何特定的值。以这种方式,锁定脚本可以约束解锁脚本的脚本,该解锁脚本对该锁定脚本的输出进行解锁,以包括该解锁脚本来自的解锁交易的字段。这有效地允许锁定脚本对解锁脚本留在堆栈上的解锁交易的字段执行操作。弱约束的另一示例是解锁脚本必须包含某些数据,这些数据可能是从指定的位置获得的,但是对数据的值没有约束。这允许施加一些弱约束,即使在锁定脚本不可变之后才确定数据的值。
[0244] 约束的操作和约束的数据可能包括“智能合约”的元素。智能合约定义了合约的条款和条件,涉及谁能做什么,什么时候能做,以及谁在什么时候获得报酬。在解锁脚本或解锁交易的其他部分中,条款和条件可以表示为约束(弱约束或强约束),智能合约的这些条款和条件可以由区块链协议执行。因此,正如上述示例中,只有鲍勃能够解锁被锁定的交易输出的值(因为只有鲍勃能够创建的解锁脚本才能解锁该交易输出),可能存在仅在一方授予许可并且在特定时间之后并且仅在另一个交易输出被花费之后的约束等等,然后可以花费交易输出。
[0245] 图8示出了OP_SPENDINGTXINJECTION,即脚本的操作代码的缩写,该脚本对用于导致解锁交易字段的序列化集合的注入的约束进行编码。锁定脚本可能包括操作代码OP_GENSIG(这将导致生成比特币签名),后跟操作代码OP_CHECKSIG(这将导致检查签名是否为解锁交易的有效签名)。为了使OP_GENSIG产生有效签名,它必须具有某些元素作为输入:SIGHASH Type元素、解锁交易字段的序列化集合的散列(对应于SIGHASH Type元素的特定集合)、私钥和掩码数(例如,用于屏蔽/保护私钥的随机数或伪随机数)。通过在锁定脚本中包含散列操作代码、私钥和随机数,这有效地约束了解锁脚本,以提供SIGHASH Type和解锁交易字段的序列化集合。
[0246] 图11示出了用于从交易字段的序列化集合生成签名的过程。这可以通过创建交易的区块链节点或其他交易生成器来完成。如图11所示,序列化交易1110(即,以特定格式的一系列数据对象表示的交易)包括交易的字段值的集合。序列化交易1110的签名者选择SIGHASH Type1112并提供签名者的私钥。区块链客户端/节点可以从SIGHASH Type1112确定序列化交易1110的待使用的字段或修改的字段。在生成散列之前,某些字段可能会被修改(而不是将其设置为零)。在图11的示例中,SIGHASH Type被设置为等于SIGHASH_NONE|SIGHASH_ANYONECANPAY,因此选择的字段是由经修改的序列化交易1114示出的字段。
[0247] 区块链客户端/节点生成经修改的序列化交易1114的散列(例如,执行双重SHA-256散列),从而产生消息m 1116。处理序列化交易1110的区块链客户端/节点选择数字k 
1118,该数字通常是随机数或伪随机数,以便掩码/保护私钥。在本发明中,数字k有时被称为“掩码数”。区块链客户端/节点根据来自SIGHASH Type1112的签名输入1120的集合、消息m 1116、签名者的私钥1122和数字k 1118创建签名1124(在此示例中为DER编码的电子签名)。签名1124和SIGHASH Type1112然后可以在解锁脚本中使用。
[0248] 图12示出了解锁交易1200的示例,该解锁交易包括解锁脚本1203,该解锁脚本1203包括解锁交易(例如解锁交易的字段的序列化集合)的副本。如图12所示,交易输入之一是Vin[z]。输入Vin[z]具有散列,该散列是前一交易的TxID和该前一交易的输出号n。这些一起形成指向特定前一交易的特定输出的指针1202,该特定前一交易将由Vin[z]解锁。
交易输入Vin[z]具有解锁脚本1203,该解锁脚本1203又具有多个组成部分或子脚本1206、
1208、1210、1212。解锁脚本1203包括前一交易Z的序列化版本1206。还示出了前一交易Z′的序列化版本1208,该前一交易Z′是以相同的方式序列化的具有由前一交易Z转移的输出的交易。虽然未被示出,但是可以包括附加的前一交易。解锁脚本1203还包括SIGHASH_TYPE字节1210,以指示解锁交易1200的哪些字段已经被包括。
[0249] 前一交易的锁定脚本使用OP_GENSIG和OP_CHECKSIG来约束解锁脚本以包括解锁交易,并且使用前一交易的TxID和OP_EQUALVERIFY来约束解锁脚本以包括前一交易Z的序列化版本1206。可以从解锁交易的字段中提取前一交易Z的TxID,并且可以注入前一交易Z。因为前一Tx Z本身包括前一交易Z′的TxID,所以可以提取该TxID,以此类推。
[0250] 解锁交易的交易字段的序列化集合不包括解锁交易本身的解锁脚本;否则会有因果关系问题。在一些实施例中(例如比特币区块链环境),交易的签名散列可以排除一些预确定的字段。SIGHASH Type可以指在进行序列化和散列处理之前从交易中提取字段集合。
[0251] 前一交易的锁定脚本可以对解锁交易施加这样的要求,即为了解锁交易有效,解锁交易的解锁脚本需要包括解锁交易的一些或所有字段的副本以及对解锁交易解锁的一个或多个前一交易的引用。当然,解锁交易的字段在创建解锁交易时可以是可变的。但是,前一交易的锁定脚本可以对解锁交易的字段施加约束,因为如果作为解锁交易的解锁脚本的一部分的解锁交易的那些字段不满足这些约束,解锁交易可以不验证何时执行解锁脚本。不属于解锁脚本的字段(例如不包含SIGHASH Type值或设置为零的字段)可能不受锁定脚本的约束。此外,并非序列化解锁交易中包含的所有字段都需要约束。例如,锁定脚本可能只约束解锁脚本中包含的序列化解锁交易的多个字段之一。
[0252] 前一交易的不同输出可以应用不同的约束集合,可能是对不同解锁交易的不同输入和输出的约束。使用这种技术,区块链节点可以使用这种锁定脚本创建交易,并且该锁定脚本还可以执行其他检查,使得随着所创建的交易输出被转移,解锁该交易输出等的交易可能必然携带各种数据元素和状态。
[0253] 图12的交易可以被扩展以实现具有相当复杂功能的状态机。如上所述,锁定脚本可以在验证时访问只有在创建和修复锁定脚本后才可用的数据。该数据可以包括被验证的解锁交易的字段的详细信息以及包含锁定脚本的前一交易的详细信息(以及当时正在创建解锁交易的区块链节点已知的可能的其他前一交易)。这允许状态机的状态在脚本中表示,并且允许状态和状态转换在区块链环境的无信任范围内实现和发生。换句话说,状态机可以使用由不一定可信的区块链节点验证的交易来实现,通过将交易像由区块链网络处理的其他交易一样进行处理。在一些示例中,“无信任”是指只要满足约束,任何实体都可以创建有效的解锁交易的属性,并且该实体不需要被信任。然而,在某些情况下,实体可能需要与确定的源进行交互以获得所需的输入。在一些实施例中,可以从未确定的来源(例如从序列化的前一交易)获得一个或多个输入。
[0254] 在区块链网络中,交易有一些输入值(由交易输入解锁的前一交易的交易输出值决定)和一些输出值。为了有效,输出的总和不能超过输入的总和(分配交易和创始交易除外,它们可以在此说明书中保留),并且为了被矿工节点占用,输出可能小于输入,以便为矿工节点操作者提供参与的理由。在使用区块链网络实现无信任的确定性状态机时,状态机的初始状态将处于包含足够值的交易中,以向矿工提供包括对应于状态机的状态转换的交易的理由。
[0255] 在一般情况下,前一交易的锁定脚本可以用于实现状态机,使得解锁交易表示该状态机的状态转换,其中锁定脚本约束解锁交易的内容,特别是约束解锁交易的各种交易输出的内容和性质。因此,前一交易输出的锁定脚本实际上可以指定解锁交易的每个交易输出需要是什么样子。锁定脚本可以要求不同解锁交易输出的不同特征(例如通过要求解锁交易的Vout[0]包括某些数据和脚本元素),并且解锁交易的Vout[1]包括某些其他数据和其他脚本元素。
[0256] 提供SIGHASH Type和特定SIGHASH Type使用的解锁交易字段集合的任何实体都可以解锁交易输出。以这种方式,一些参与方将有理由通过解锁交易并从锁定脚本中转发详细信息来传播交易的内容。如上所述,在一些示例中,“解锁”交易输出是指创建解锁交易,该解锁交易引用交易输出并且可以评估为有效,从而可以导致交易输出被转移。
[0257] 使用上述技术和装置,可以在区块链账本上创建交易,该账本包括实现智能合约的脚本、能够实现状态机的脚本,并且可以引用当前交易、具有由当前交易转移的输出的前一交易以及可能的其他先前交易的字段的脚本。有了这些工具,交易流可以执行自我复制脚本,以用于智能合约或其他用途。
[0258] 图13示出了解锁交易1320和前一交易1310。在该示例中,解锁交易具有引用前一交易的输入Vin[0]1322和前一交易的交易输出Vout[x]1314。为了使解锁交易被视为有效,必须满足Vout[x]的锁定脚本的约束。如上所述,一些约束可能很简单,例如指向锁定脚本的解锁交易输入的解锁脚本必须能够提供由出现在锁定脚本上的公钥签名的有效签名的简单要求。然而,如本文所述,锁定脚本可以提供更复杂的约束。
[0259] 例如,前一交易1310的Vout[x]1314的锁定脚本可以对解锁交易的输出施加特定的约束。在此示例中,Vout[x]1314的锁定脚本对解锁交易1320的输出Vout[0]1324施加约束集合(约束集合1),对解锁交易1320的输出Vout[0]1326施加约束集合(约束集合2)。在特定的情况下,约束集合1和约束集合2是相同的,并且都仅要求输出Vout[0]1324和Vout[1]1326的锁定脚本与前一交易1310的Vout[x]1314的锁定脚本相同。
[0260] 在更一般的情况下,约束可能不仅仅是复制锁定脚本的要求。此外,约束集合可以在解锁交易输出到输出之间有所不同。约束可以是解锁交易可以具有的输出数量、每个输出的值,以及解锁交易输出的锁定脚本中需要的某些内容。
[0261] 注入解锁交易的输出约束
[0262] 图14是对解锁交易的锁定脚本施加约束的前一交易的锁定脚本的一部分1400的示例的流程图。该示例可以由基于堆栈的验证者执行,该验证者处理解锁交易的输出的解锁脚本,该解锁脚本可以将数据保留在堆栈上,然后处理前一交易的输出的锁定脚本来执行该过程。因为解锁脚本的处理能够将数据保留在堆栈上,并且因为解锁脚本能够将例如解锁交易的序列化内容(包括解锁交易的锁定脚本的细节)保留在堆栈上,所以这些细节可以在验证时可用。
[0263] 在上述过程的步骤1402中,验证者验证解锁脚本包含某些数据,并且验证者可以执行不需要在逐个输出的基础上完成的其他验证。这种数据的示例可以包括解锁交易字段的序列化集合、序列化的前一交易、对前一交易的引用等。在步骤1404,验证者检查是否满足这些约束,如果不满足,则在步骤1406停止,使解锁交易无效。否则,处理在步骤1408继续,验证者在步骤1408确定是否有任何解锁交易输出待检查。对于第一次通过,验证者可以设置索引i=0,并且当没有更多输出要检查时,转到步骤1410的另一处理流程。
[0264] 对于输出的每个索引,验证者执行步骤1412、1414和1416,然后递增i(步骤1418)并返回步骤1408,直到没有更多的索引要考虑。在另一种变型中,验证者可以循环通过要检查的索引集合,其中该索引集合不一定包括i的所有值和/或不一定包括它们并且以递增的顺序来验证它们,而不是将索引递增1并验证每个输出。在这样的变型中,步骤1418相应地不同,在被检查的特定索引集合中的输出的索引i中循环。
[0265] 在步骤1412中,验证者提取解锁交易的Vout[i]的锁定脚本。这可以使用堆栈内容上的OP_SUBSTR操作来实现。接下来,在步骤1414中,验证者基于前一交易输出的锁定脚本,确定解锁交易的Vout[i]的锁定脚本上的约束。在步骤1416,验证者随后验证这些约束。以这种方式,由解锁交易的输入所转移的前一交易的输出的锁定脚本可以对该解锁交易的输出施加约束。
[0266] 前一交易的输出的锁定脚本约束解锁交易的输出,以便允许前一交易锁定脚本规定关于可以如何转移解锁交易的输出的规则。这些约束可以被硬编码在前一交易输出的锁定脚本中,或者该约束可以基于指向前一交易输出的解锁交易的输入的解锁脚本中存在的数据来确定。
[0267] 图15示出了对应于图14的步骤1402和1414的更具体的步骤的一些示例。验证者执行步骤1402的一个示例是执行步骤1502,其中验证者确定解锁交易输入中的解锁脚本(或其他地方)中的数据的某些部分来自确定来源。确定来源可以是解锁交易的序列化或序列化的先前交易。替代地或附加地,验证者可以执行步骤1504并执行解锁交易数据详细信息的一些其他验证。
[0268] 至于前一交易的输出的锁定脚本可以对解锁交易的输出的锁定脚本施加的特定约束,存在步骤1506,其中解锁交易的输出Vout[i]的锁定脚本必须与来自某个确定来源的数据相等(“==”指相等性测试)。另一个示例是步骤1508,其中解锁交易的输出Vout[i]的锁定脚本必须等于硬编码到前一交易的输出的锁定脚本中的数据。步骤1510涵盖基于来自确定来源的数据对解锁交易的输出Vout[i]施加另一约束的情况,并且步骤1512涵盖基于来自前一交易的输出的锁定脚本的硬编码数据对Vout[i]施加另一约束的情况。
[0269] 在某些情况下,可以使用数据的散列,而不是使用来自上述来源或经硬编码的全部数据,在这种情况下,在散列之间进行比较。
[0270] 要使用的数据可以来自前一交易,例如来自被硬编码到前一交易的输出的锁定脚本,或者可以是来自前一交易的之前交易的数据(或者对之前交易的引用,远离解锁交易的两个链接)(即,其一个或多个输出被之前交易转移的交易)。以这种方式,所使用的数据可以来自从前一交易到其分发交易(例如比特币协议中的币库交易)的链中的任何交易。
[0271] 图16示出了这种的示例。对于图14(其中验证是解锁脚本具有某些数据)的过程1400中的步骤1402,可以执行步骤1602、1604、1608、1610和1612,以验证解锁交易的解锁脚本具有对交易链中的交易的引用。
[0272] 在步骤1602中,验证者从解锁交易的输入中提取交易标识(TxID),如果在解锁脚本中可用,则验证者可以这样做。验证者然后可以在步骤1604验证解锁脚本还包含该TxID的前一交易的序列化副本。如果不是,则验证者可以使交易无效,但是如果是,则在步骤1608,验证者从前一交易TxID′提取TxID,然后在步骤1610验证前一交易包含TxID′引用的交易的序列化副本或对其的引用。该链可以继续n次,其中在步骤1612,验证者验证TxID(n-1)′(n-1个素数)引用的交易包含TxIDn′(n个素数)引用的交易的序列化副本。
[0273] 在图16中,步骤1614和1616涉及提取TxIDn′引用的交易副本的锁定脚本,并验证约束条件,即解锁交易的输出Vout[i]的锁定脚本等于由TxIDn′引用的交易的已提取锁定脚本。
[0274] 约束可以应用于输出的锁定脚本的子集,而不是整个锁定脚本。可以从数据的子集而不是整个数据中确定约束。例如,一个子集可能要求显示“支付到公钥散列(Pay-to-Public-Key-Hash)”,另一个子集可能要求显示“支付给鲍勃(Pay to Bob)”。
[0275] 假设解锁交易的输出的锁定脚本可以由两个部分()来表示,其中可以使用字符串拼接操作来提取,以便将约束分别应用于。示例是被约束为,而被约束为OP_CHECKSIG。以这种方式,整个锁定脚本被约束为OP_CHECKSIG。也可以使用从解锁脚本中的数据导出的约束。
[0276] 使用这些技术,前一交易输出的锁定脚本可以对试图解锁该输出的解锁交易施加约束。特别地,约束可以是对解锁交易具有的输出集合的约束,并且对于不同的输出,约束可以不同,并且也不同于前一交易的锁定脚本。
[0277] 约束可以对应于引用各种输出的索引。在一种情况下,对每个索引重复约束,但是在其他情况下,可以提供一些结构。例如,约束的索引可以在条件语句中用来选择约束集合,例如“如果索引==0:则约束A,否则约束B”。
[0278] 如果索引集是硬编码的,则脚本中使用索引的部分的结果可以是固定的。代替或除了对解锁交易的输出的约束之外,对解锁交易的输入也可能存在约束。
[0279] 注入解锁交易的输入约束
[0280] 具有锁定脚本约束解锁交易的输入的一个用途是允许锁定脚本对具有特定属性的交易的依赖性(例如,受约束的输入必须引用该交易)进行编码。这不同于约束解锁交易的输出,因为输出是可变的,而输入可以是对区块链上预先存在的不可变UTXO的引用。换句话说,可以修改输出以匹配约束,而必须找到匹配这些约束的输入。
[0281] 对解锁交易输入的约束可能属于两种一般类型:(1)直接置于输入的引用(即交易TxID字段,以及可选的输出指针字段)的约束,以及(2)对输入中引用所指向的前一交易的字段的约束。
[0282] 图17示出了前一交易1710和解锁交易1720,其中前一交易1710具有输入Vin[y]1712和输出Vout[x]1714,解锁交易1720具有输入Vin[0]1722和Vin[1]1723和输出Vout[0]
1724。Vout[x]1714的锁定脚本对输入Vin[0]1722施加了约束集合(约束集合1),对输入Vin[0]1723施加了约束集合(约束集合2)。约束集合可能包括对解锁脚本、引用或输入的其他部分的约束。约束集合可以相同或不同,或者存在两个以上的输入,其中有些相同,有些不同。
[0283] 部分地,这些约束可以引用解锁交易的某些部分,例如通过使用OP_SPENDINGTXINJECTION脚本将解锁交易字段的序列化集合作为数据注入解锁脚本。
[0284] 图18是对解锁交易的输入施加约束的前一交易的锁定脚本的一部分1800的示例的流程图。该示例可以由验证者执行,该验证者处理解锁交易的输出的解锁脚本,该解锁脚本可以在堆栈上留下数据(包括解锁交易的详细信息),然后处理前一交易的输出的锁定脚本来执行该过程。
[0285] 在该过程的步骤1802中,验证者验证解锁脚本包含某些数据,并且验证者可以执行不需要在逐个输出的基础上完成的其他验证。在步骤1804,验证者检查是否满足这些约束,如果不满足,则在步骤1806停止,使解锁交易无效。否则,处理在步骤1808继续,其中验证者确定是否有任何解锁交易输入要检查。对于第一次通过,验证者可以设置索引i=0,并且当没有更多的输入要检查时,在步骤1810转到另一个处理流程。
[0286] 对于输入的每个索引,验证者执行步骤1812、1814和1816,然后递增i(步骤1818)并返回到步骤1808,直到没有更多的索引要考虑(或者验证者循环通过索引集合来检查,不一定是所有的索引和/或不一定是以递增的顺序;在这些情况下,步骤1818相应地不同,循环通过被检查的输入的索引i)。在步骤1812,验证者从解锁交易输入Vin[i]中提取其对前一交易的引用,并输出其解锁。这可以使用堆栈内容上的OP_SUBSTR操作来实现。接下来,在步骤1814中,验证者基于前一交易输出的锁定脚本来确定对该引用的约束,或者使用该引用来引起前一交易的注入,之后约束可以被应用于前一交易的字段。在步骤1816,验证者随后验证这些约束。以这种方式,由解锁交易的输入所转移的前一交易的输出的锁定脚本可以对该解锁交易的输入施加约束。
[0287] 输入约束的其他示例在图19中通过元素1902、1904、1906、1910、1912和1914示出。由于TxID可能是与交易的一对一映射,这意味着约束可能是必须在输入中引用特定的交易。可以首先创建锁定脚本所依赖的交易,从而允许锁定脚本在对解锁交易的输入的约束中使用其自己的TxID。
[0288] 可以对与输入中的引用相对应的前一交易的字段上放置约束。在对前一交易的字段放置约束之前,可以通过在输入中使用TxID导致注入相应的前一交易。约束可以引用与正在解锁前一交易输出的输入不同的输入,该前一交易具有施加约束的锁定脚本。
[0289] 图20示出了在图18的过程1800中的步骤1802和1814的环境中的约束的示例。在图20中,可以执行步骤2002、2004、2014和2016。在步骤2002中,验证者从解锁交易的输入中提取交易标识(TxID),如果在解锁脚本中可用,则验证者可以这样做。验证者然后可以在步骤
2004验证解锁脚本还包含该TxID的前一交易的序列化副本。在步骤1614中,验证者从前一交易中提取一个或多个字段的集合,并且在步骤1616中验证对提取的该字段的集合的某种约束。
[0290] 图21示出了联锁脚本约束。如图所示,解锁交易(解锁交易1)2106的输入可以引用前一交易(前一交易1)2102和前一交易2104(前一交易2)。特别地,解锁交易1的输入Vin[0]指向前一交易1的Vout[0],如箭头2110所示。因此,如果解锁交易1有效,则可以解锁前一交易1的Vout[0]。同样,解锁交易1的输入Vin[1]指向前一交易2的输出[0],如箭头2112所示。此类引用可能是具有多个输入的解锁交易的常规引用,该多个输入引用了多个前一交易。
[0291] 为了引用前一交易,这些交易应该已经存在,并且在创建解锁交易之前是不可变的。尽管如此,前一交易可以在解锁交易上应用相互依赖的锁定脚本约束。通过对解锁交易的输入集合进行约束,可以实现相互依赖的锁定脚本,这可以在无信任的确定性状态机的环境中提供并发性。
[0292] 前一交易1的输出Vout[0]的锁定脚本2120对解锁交易1的输入Vin[1]具有约束,该约束要求输入的指针2122(例如,其对前一交易和前一交易的输出的引用)是对前一交易2和前一交易2的Vout[0]的引用。前一交易2的输出Vout[0]的锁定脚本2124对解锁交易1的输入Vin[0]具有约束,该约束要求输入的指针2126(例如,其对前一交易和前一交易的输出的引用)是对前一交易1和前一交易1的Vout[0]的引用。
[0293] 由于交易的TxID在交易完成之前是未知的,交易锁定脚本不能直接指定解锁交易解锁脚本必须引用的TxID,但是这基本上可以通过锁定脚本提取输入的指针(包括具有锁定脚本的前一交易的TxID)来实现,使用该TxID注入前一交易的字段,并验证前一交易的某个字段是否等于它应为的值。换句话说,如果前一交易具有设置为某个值的字段,并且前一交易的锁定脚本从解锁交易输入获得TxID,注入由该TxID引用的任何交易,检查设置为特定值的字段和未设置为该特定值的字段,则解锁交易输入必须指向不同的前一交易。因此,通过检查该特定值,前一交易输出的锁定脚本可以确定解锁交易输入是否引用该前一交易输出。
[0294] 以这种方式,前一交易1表示其第一输出只能通过解还锁特定交易(前一交易2)的第一输出的交易来转移,并且前一交易2表示其第一输出只能通过还解锁前一交易1的第一输出的交易来转移。
[0295] 相互依赖的锁定脚本允许多个智能合约相互放置条件。例如,智能合约1可能是“爱丽丝同意向卡罗尔贡献1BTC,但前提是鲍勃向卡罗尔贡献2BTC”,而智能合约2可能是“鲍勃同意向卡罗尔贡献2BTC,前提是爱丽丝同意向卡罗尔贡献1BTC”。为了有效,解锁交易必须解锁两个智能合约。
[0296] 如上所述,锁定脚本可以将依赖性编码成具有某些属性的交易,并且这些属性可以包括该交易的字段。这意味着锁定脚本可能依赖于具有特定锁定脚本的交易。
[0297] 例如,在图21的图示中,(前一交易1的Vout[0]的)锁定脚本#1将解锁交易1的Vin[1]约束为引用(前一交易2的Vout[0]的)锁定脚本2124,以及锁定脚本#3 2124将解锁交易1的Vout[0]约束为引用前一交易1的Vout[0]的锁定脚本#1。在本文中,这可以被称为对另一个锁定脚本的依赖性进行编码的锁定脚本。
[0298] 实现相互依赖的锁定脚本可以创建因果竞争条件,其中第一锁定脚本对第二锁定脚本的依赖进行编码,而第二锁定脚本对第一锁定脚本的依赖性进行编码,因为前一交易1和前一交易2中的一个可能先于另一个存在。如果锁定脚本A对依赖性进行硬编码到锁定脚本B上,则锁定脚本B必须是已知的并且是固定的,这使得锁定脚本B不可能对未知的锁定脚本A上的依赖性进行硬编码。这可以通过至少在一个锁定脚本中具有可确定的依赖性来解决。
[0299] 作为示例,锁定脚本A依赖于锁定脚本X,并且将在解锁脚本A中提供锁定脚本X,锁定脚本B依赖于将在解锁脚本B中提供的锁定脚本Y。当解锁交易被创建时,锁定脚本A和锁定脚本B都是已知的,从而使得解锁交易的解锁脚本A能够包含锁定脚本B作为其数据,并且使得解锁交易的解锁脚本B能够包含锁定脚本A作为其数据。
[0300] 在一些变型中,对于待验证的解锁交易输入,其解锁脚本必须引用前一交易1和前一交易2。在其他变型中,解锁脚本引用与前一交易1具有相同锁定脚本的任意两个(或更多)前一交易就足够了。
[0301] 在一些变型中,要求可能是排他性的,而不是强制要求解锁脚本引用特定的前一交易或多个前一交易的集合,因为该要求可以是解锁脚本不引用特定的前一交易或多个前一交易的集合。这些变型的组合也是可能的,有效地实现了对先前引用的交易的布尔逻辑(Boolean logic)。例如,要求可能是对于待验证的解锁交易输入,其解锁脚本必须引用前一交易1和前一交易2,不引用前一交易1,并且必须引用前一交易B或前一交易C。其他逻辑表达式也是可能的。
[0302] 状态机
[0303] 使用上述技术,状态机可以使用区块链交易来实现,其中交易具有状态并且使用状态机结构(例如通过转换矩阵和许可的下一状态)进行编码。解锁交易可以解锁这种区块链交易的输出,实际上导致状态机的状态转换。
[0304] 图22示出了使用区块链交易实现的状态机的示例2200。具体地,图22描绘了使用区块链交易从第一状态转换到第二状态的状态机。在一些示例中,状态机的状态转换被解释为在给定(1)当前状态、(2)一个或多个输入2226和(3)状态规则集合2206的情况下确定下一状态。图22的示例2200示出了具有嵌入在参数中的状态规则集合2206和第一状态2228A的前一交易2202。在一些实施例中,创建解锁交易2204以接受来自确定来源的输入
2226。结合第一状态2228A,输入2226可用于引用状态规则集合2206来确定嵌入解锁交易
2204的参数中的第二状态2228B。
[0305] 在实施例中,状态规则集合2206包括状态交易矩阵,该状态交易矩阵可以由锁定脚本对解锁交易2204施加的约束来表示。在这样的实施例中,约束可以由当前状态和从中确定下一状态的输入来参数化。该约束可以包括检查以确保解锁交易2204包括输出,该输出包括特定字段中的下一状态值。
[0306] 在实施例中,当前状态被表示为嵌入在交易中的参数,例如该交易的输出的锁定脚本的一部分,并且解锁交易2204可以具有也嵌入在解锁交易2204中的下一状态值。下一状态值可以是相对于解锁交易2204的字段值的集合的当前状态,如上所述,当解锁交易2204被创建时,该当前状态可以是可访问的。
[0307] 在一些实施例中,在创建解锁交易2204时确定的参数中,提供至少一个输入作为外部数据。为了安全起见,这些参数来自确定来源。这可以提供确定的状态转换。最后,通过使用自复制锁定脚本的脚本,可以创建无信任的、确定性状态机的实施例。通过进一步允许在交易的不同交易输入和输出上施加不同的锁定脚本,可以实现并发的无信任的、确定性状态机。
[0308] 图23说明了这一点。在该示例中,无信任的确定性状态机系统2300可以在状态规则集合2306中包括处于第一状态2328A(“S1”)的前一交易2302。状态规则集合2306为下一状态提供两个可能的状态2330A(“S2”或“S3”)。状态规则集合2306可以被编码在前一交易2302的输出的锁定脚本中。当前状态2328A可以被嵌入锁定时间字段,或者可以被嵌入锁定脚本。下一状态(在此示例中为S2 2328B)被编码在解锁交易的输出的锁定脚本中,该解锁交易解锁前一交易的输出以实现状态转换。
[0309] 如在示例2300中可以看到的,解锁交易2304将其解锁脚本中的输入2326和嵌入前一交易2302的字段值集合中的第一状态2328A(“S1”)作为输入,从状态规则集合2306中确定适当的第二状态2328B(“S2”)。从示例2300中还可以看出,状态转换矩阵现在提供了新状态2330B(“S4”或“S5”),该新状态对于从第二状态2328B的下一状态转换是可能的。注意,状态规则集合2306可以被编码为由当前状态和一个或多个输入参数化的切换语句或其他条件语句(例如,“如果-然后-否则”(if-then-else))。当前状态S2 2328B可以被嵌入锁定时间字段,也可以被嵌入锁定脚本。下一状态(在此示例中是S2 2328B)被编码在解锁交易的输出的锁定脚本中,该解锁交易解锁前一交易的输出以实现状态转换。
[0310] 在实施例中,在自复制锁定脚本中,每个可能的状态在状态改变的规则集合(例如状态转换矩阵)中被表示,并且特定交易输出表示处于特定状态的状态机。在这样的实施例中,交易输出的锁定脚本被复制到试图将数字资产的控制权转移到下一交易的每个解锁交易,该下一交易必须链接到当前交易输出。该过程可以重复,直到满足终止条件。因为输入不是固定的,并且可能是未确定的数据,所以可以根据特定的外部输入来改变状态机的状态。因此,未确定的数据提供了可能影响下一状态的输入。
[0311] 在说明性示例中,爱丽丝借给鲍勃一些钱,鲍勃同意还给爱丽丝。如本发明中所描述的,无信任的、确定性状态机可以被实现为智能合约,以表示鲍勃向爱丽丝进行的支付。例如,智能合约可以被构建成使得鲍勃在接下来的三个月中每月向爱丽丝支付,并且如果错过支付,则鲍勃的债务进入债务收集阶段。因此,只要鲍勃每月支付,当前状态就保持在还款状态。然而,如果外部实体提供指示鲍勃已经错过支付的输入,则状态转换到错过支付状态。在未支付状态下,爱丽丝可以释放交易并将其移交给收债者,于是不信任确定性状态机切换到债务收集状态。在收债状态下,收债者将向鲍勃收债。可以使用本文所述脚本的变型来创建这种智能合约。
[0312] 在另一个示例中,爱丽丝是一个非常慈善的人,每个月赠送一个单位的数字资产。她的规则可能是任何人都可以申请数字资产,但是每个月只能申请一个单位。爱丽丝以本发明中描述的方式创建智能合约,并使用数字资产的3个单位的初始池为其播种。爱丽丝可以构建脚本,该脚本允许任何实体每月获取1个单位的数字资产。数字资产的剩余部分被复制到后续的智能合约中。
[0313] 图24示出了本发明的示例性无信任的确定性状态机的解锁脚本和锁定脚本。
[0314] 图25是示出根据各种实施例的用于无信任的确定性状态机的过程2500的示例的流程图。实现这一点的示例脚本是图24的脚本。过程2500的一些或全部(或所描述的任何其他过程,或这些过程的变型和/或组合)可以在配置有可执行指令和/或其他数据的一个或多个计算机系统的控制下执行,并且可以实现为在一个或多个处理器上共同执行的可执行指令。可执行指令和/或其他数据可以存储在非暂时性计算机可读存储介质(例如,永久存储在磁、光或闪存介质上的计算机程序)上。这些指令可以作为区块链交易验证过程的一部分来执行。
[0315] 例如,过程2500的一些或全部可以由示例性区块链网络(例如图1的示例性区块链网络100)中的验证节点来执行。这种验证节点可以包括任何合适的计算设备(例如,通过数据中心中的服务器、通过客户端计算设备、通过计算资源服务提供商的分布式系统中的多个计算设备、或者通过任何合适的电子客户端设备)。过程2500包括一系列操作,其中验证自复制智能合约的锁定脚本,可以从序列化的前一交易获得当前状态,可以从解锁脚本获得输入,并且可以至少部分基于状态规则集合来确定下一状态。
[0316] 在步骤2502,系统接收解锁交易。系统首先运行解锁交易输入的解锁脚本,这将导致序列化的前一交易和嵌入在锁定脚本中的输入被放置在堆栈中。这些输入可以在2512中被检索。在2504中,执行过程2500的系统确定是否满足终止条件。在实施例中,终止条件是一旦满足,则导致状态机转换结束的条件。如果满足终止条件,则执行过程2500的系统进行到2506,于是无信任的确定性状态机停止状态的自复制和/或传播。
[0317] 在步骤2508,系统验证前一交易输出锁定脚本与解锁交易输出锁定脚本匹配。如果锁定脚本不匹配,则验证失败,解锁交易可能无法被验证。否则,如果锁定脚本匹配,则在2510中,系统从序列化的前一交易中提取可能状态集合的当前状态。在2512,系统获得作为锁定脚本执行的结果而放置在堆栈上的一个或多个输入。然后,在2514,系统应用状态规则集合来基于当前状态和一个或多个输入来确定无信任的确定性状态机的可能状态集合的下一状态。在2516,系统可以验证下一状态(例如,状态变量和其他状态相关数据,如果适用的话)被嵌入解锁交易中。系统还可以应用锁定脚本中指定的任何剩余约束。在成功完成
2502到2516的操作之后,该过程以2518结束,于是执行该过程的系统可以认为解锁交易有效。注意,在步骤2502至2518中执行的一个或多个操作可以以各种顺序和组合来执行,包括并行执行。
[0318] 注意,在描述所公开的实施例的上下文中,除非另有说明,否则使用有关可执行指令(也称为代码、应用程序、代理等)的表达式来执行“指令”通常不单独执行的操作(例如,数据传输、计算等),表示指令正在由机器执行,从而使机器执行指定的操作。
[0319] 作为区块链交易的状态机
[0320] 使用上述技术和设备,可以使用区块链交易来实现状态机。可以通过使状态沿着状态转换矩阵从一个状态变化到另一个状态来操作状态机。一些状态图可能非常复杂,并且具有多个路径。在这种情况下,状态机执行的某些计算可以与其他计算同时进行。如下所述,状态机可以使用区块链交易进行操作,并且部分地同时进行。
[0321] 如下所述,可以使用区块链交易的锁定脚本和解锁脚本来实现无信任的确定性状态机。锁定脚本包含可以施加在解锁脚本上的约束,因此可以要求将某些数据注入解锁交易输入的解锁脚本,例如解锁交易本身的序列化字段、包含正在执行的锁定脚本的前一交易的序列化字段、当前状态值、来自确定来源(可选的)的输入、以及定义状态机的流条件和操作的集合的状态转换矩阵,并指定如何从当前状态和其他输入计算下一状态。解锁交易的一个锁定脚本约束可能是解锁交易必须在其输出之一中复制锁定脚本,从而传播状态机。
[0322] 图26示出了使用具有某些特征的状态转换矩阵2600的状态机。状态S1被突出显示以指示当前状态。状态机可以沿状态转换(如箭头所示)转移到任何状态。在状态转换矩阵中,可能存在沿着S1-S2-S3-S4-S8-S12的可能转换,但是从状态S1的转换也可能需要处于状态S5。类似地,状态S5转换到S6和S9。从状态S9到状态S10的转换可以是有条件的或有屏障的,因为直到同时发生从状态S6到状态S7的转换,状态转换才可能出现。向状态S8的转换可以作为状态S4和状态S7的合并而发生。
[0323] 这些状态中的每一个可以通过由区块链交易输出表示的状态机进入,并且每个转换由交易输出的单个路径来处理,当解锁交易输入解锁前一交易输出时,发生状态转换(如图22或图23所示)。但是,利用区块链交易的输入和输出,可以实现状态的并行处理。当智能合约需要在多个并发步骤中执行时,这可能很有用。在合约过程中,任务有时可以在合约过程中同时执行。例如,建造房屋的合约可能具有瓷砖工程的不同完成阶段和景观美化的不同完成阶段,这可能是可并行执行的。通过允许智能合约中的并发性,可以以异步方式彼此独立地执行联系人的不同片段
[0324] 图26示出了这种处理的许多需求。一个需求是来自一个状态的多条路径的创建。这可能是智能合约的分叉。假设智能合约从S1开始。智能合约的分叉可能会创建两个状态机,一个在状态S2,一个在状态S5。另一个需求可能是智能合约的克隆,以使两个相同的状态机并行运行,每个状态机处于相同的状态。例如,智能合约可能需要S2-S3-S4步骤的多个实例。这也可能是智能合约的克隆,这是分叉的特殊情况,其中两个或多个新的交易输出具有相同的状态。
[0325] 另一个有用的特性是新合约的生成。例如,由图26的状态转换矩阵2600表示的智能合约可以是这样的,即在状态S3,智能合约的某一方将创建单独的合约,该合约可以与智能合约相关联,但是可以不是智能合约的一部分和/或可以在智能合约创建之后创建。这在本文可以称为生成(spawning)。新合约可以不同于最初提供图26的状态转换图的原始智能合约。
[0326] 合并是两个状态机或两个智能合约合并,就像状态S4和S7的情况。如下所述,不同的路径可以被同时执行,例如S2-S3-S4和S5-S6-S7。使用这些元素,可以在区块链环境中轻松实现并发的无信任确定性状态机。
[0327] 图27示出了具有一个输入Vin[0]和两个输出Vout[0]和Vout[1]的交易的示例。通过解锁该交易的输出,两个独立的交易将被记录在区块链账本中,并且这些交易的创建者将通过该交易提供给他们的某个值(未示出)得到补偿。如图所示,前一交易输出的锁定脚本(Vin[0]所指向的)要求解锁该输出的解锁交易包含状态S2和S5。为了解锁包含状态S2的解锁交易的输出(图27中的Vout[0]),未来解锁交易基于当前状态S2将被约束为包括下一状态。S5状态也是如此。
[0328] 以这种方式,交易输出可以具有状态,并对解锁交易可能处于的状态施加约束。由此,区块链交易可以根据如图26所示的状态图来实现处理,并且交易输出的解锁对应于状态图的状态转换。为了避免有人创建一个具有多个输入的交易并解锁所示交易的两个输出,锁定脚本可以对此进行检查并禁止它。如何生成有效交易的规则(例如需要多少输出)可以在智能合约中编码被编码为硬编码值或在智能合约创建后可以提供的参数。
[0329] 使用区块链交易分叉和克隆智能合约
[0330] 当状态需要同时转换到两个或更多个(不一定是唯一的)下一状态时,可以使用分叉。有时,可以在没有所有可能并发的情况下处理智能合约,但是在有并发的情况下,分叉可以启动它。如上所述,区块链账本上的智能合约交易的输出的锁定脚本可以对解锁交易的输入和/或解锁交易在区块链账本上的输出的锁定脚本“施加”要求。克隆可能是特定类型的分叉,其中下一组状态可能都是相同的状态。就解锁交易而言,多个输出可以被约束为复制转换矩阵并嵌入其各自的下一状态。
[0331] 分叉/克隆可以通过将无信任的确定性状态机的约束应用于输出集合来实现。如上所述,索引集合允许对不同的输出应用不同的约束。该索引集合可以在转换矩阵中被硬编码,或者作为验证过程输入的一部分提供。
[0332] 由于给定的解锁交易可能具有多个输出,其中一些输出可能与状态机无关,或者与多个不相关的状态机相关,因此在交易的锁定脚本中嵌入下一状态可能比将其嵌入所有输出的公共字段(如锁定时间字段)更实际。上文描述了约束输出锁定脚本的子集。
[0333] 图28示出了脚本如何与分叉操作相关。如图所示,状态机2810使用前一交易2820和解锁交易2830来实现。前一交易2820的锁定脚本将解锁交易2830约束为具有至少两个输出,每个输出要求后续解锁交易具有处于指定状态(并且是单独的交易)的输出。这可以允许独立地并且可能同时地执行那些状态S2,S3。
[0334] 有了状态机,子任务对于启用更快的并发智能合约会变得很有用。为了处理子任务,可以使用多个状态,并且由于一个状态机通常一次只能处于单个状态,所以可以通过具有独立的交易线程来提供并发性。状态机可以通过创建多个交易锁定脚本来进行分叉。基于来自前一交易输出的当前状态,解锁交易可以被约束为具有两个或更多具有锁定脚本的输出(如图28所示)。为了防止分叉变得不可赎回并且提前停止,应该检查每个输出值,以确保有足够的资金来继续该状态机。
[0335] 如虚线箭头所示,解锁交易2830的输入Vin[0]指向前一交易2820和该交易的输出Vout[0]。Vout[0]的锁定脚本包括当前状态(“S1”)、状态机的转换矩阵,并且约束解锁交易2830的Vout[x]为处于下一状态(“S3”)并且解锁交易2830的Vout[y]处于另一个下一状态(“S2”),每个状态也被约束为携带状态转换矩阵以及可能的其他约束。
[0336] 前一交易输出的锁定脚本可以包括<当前状态><转换矩阵><其他脚本>的串联,而解锁交易的输出的锁定脚本可以包括<下一状态><转换矩阵><其他脚本>的串联。可以只复制锁定脚本的一个子集,而不是复制整个锁定脚本,而另一个子集可能被约束为包含状态。
[0337] 状态机的状态可以存储在可能不用于其他目的的交易字段(例如锁定时间字段)中,而不是存储在锁定脚本中。实际上,可以使用不同的未使用的交易字段。这适用于单个状态,也适用于需要存储多个状态的情况,尽管后者可能更复杂。
[0338] 图29示出了可以被执行来实现分叉或克隆过程的示例伪代码。该伪代码可以使用本文描述的操作代码来实现。该伪代码可以由创建交易和/或验证交易的区块链节点的处理器执行。在一些实施例中,脚本的一部分来自解锁脚本,且脚本的一部分来自锁定脚本。
[0339] 在图29的伪代码中,注入了前一交易、解锁交易和可选输入,以便锁定脚本可以访问它们。然后,可能会检查终止条件。如果智能合约没有终止,则处理器提取前一交易锁定脚本和前一交易当前状态,这可以使用本文描述的技术来完成。然后,处理器循环通过解锁交易的输出,并且对于每个解锁交易输出,提取其锁定脚本,并检查前一交易锁定脚本中的转换矩阵,以确定其是否匹配正在处理的解锁交易输出的锁定脚本中的转换矩阵。如果它们不匹配,则处理器将其视为脚本失败,停止并且不验证解锁交易。如果它们匹配,则处理器根据提取的当前状态、状态转换矩阵(可选地为输入)和输出索引值来确定状态机的下一状态。然后,处理器对照正在处理的解锁交易输出中的下一状态检查确定的下一状态。如果它们不匹配,则处理器将其视为脚本失败,停止并且不验证解锁交易。如果还有其他可选约束需要检查,则此时可以检查这些约束。如果满足所有约束,则脚本通过。
[0340] 工人生产智能合约
[0341] 在上一节中,描述了分叉和克隆智能合约的能力。本节详细介绍强制新的智能合约出现在解锁交易中的能力,其可以是另一个完全不同的状态机,也可以是一个可能不是状态机但完全不同类型的智能合约。
[0342] 图30示出了强制作为状态机的新的智能合约的约束的示例。如图所示,前一交易的输出的锁定脚本对解锁交易的输出提供了约束,使得解锁交易的输出锁定脚本必须等于期望的新的智能合约脚本,或者输出锁定脚本的散列必须等于期望的新的智能合约脚本的散列。新的智能合约脚本或散列可以被硬编码在前一交易的输出的锁定脚本中,或者通过解锁交易的输入的解锁脚本作为参数安全地提供。解锁交易输出中的多个新的智能合约可以通过在锁定脚本中具有如上对于每个新的智能合约所述的相应约束来强制执行。
[0343] 如上所述,可以是状态机的新的智能合约被创建。该新的智能合约可以是与前一交易相同的状态机,也可以是另一个完全不同的状态机。可以检查新状态和转换矩阵。这可以独立地完成(例如,检查新状态,然后检查转换矩阵值),也可以一起完成。
[0344] 尽管未在图30中示出,但是新的智能合约可以不是状态机。在这种情况下,可能需要也可能不需要下一状态值,但是可以使用脚本的相等性检查或其散列来验证新的智能合约。
[0345] 使用从前一交易中的当前状态转换和解锁交易的输出的新的智能合约,可以生成新的智能合约。在所示示例中,解锁交易的输出的第一集合被约束为复制状态转换矩阵并嵌入下一(多个)状态,输出的第二集合被约束为包含新的智能合约。解锁交易的输出可以被约束为包含新的锁定脚本,并且通过使用多个索引,可以将不同的约束应用于不同的输出。新的智能合约集合可以在转换矩阵中被硬编码,或者被提供为输入的一部分。
[0346] 从状态机的度来看,状态机可以实例化新的不同的状态机,以便与调用状态机(calling state machine)同时执行。为了将这种方法应用于状态机,该操作的锁定脚本可能与分叉/克隆操作的锁定脚本相似,但是可以检查新的智能合约的存在,而不是检查每个新的状态机实例的锁定脚本中的相等性。相等性检查可以在一系列不同的值上执行,包括交易的交易字段序列化集合、锁定脚本字节码或这些值的散列。
[0347] 图30示出了生成新的智能合约。如图所示,状态机3010使用前一交易3020和解锁交易3030来实现。前一交易3020的输出Vout[0]的锁定脚本将解锁交易3030约束为具有至少两个输出(Vout[x]和Vout[y]),每个输出要求后续解锁交易具有指定状态的输出(并且是单独的交易)。具体地,如图所示,为了使解锁交易3030的输入Vin[0]来解锁前一交易3020的Vout[0],解锁交易3030可以被约束为使Vout[x]具有转换矩阵并且处于状态S4,同时还约束Vout[y]具有新的智能合约。
[0348] 使用这种方法,新的智能合约可以与状态机并行处理。虽然没有明确显示,但新的智能合约可以是第二状态机。如上所述,新的智能合约本身不需要是状态机,在这种情况下,产生的智能合约可能没有状态值字段。
[0349] 如图30中虚线箭头所示,解锁交易3030的输入Vin[0]指向前一交易3020和该交易的输出Vout[0]。这可以通过前一交易3020的TxID和设置为“0”以指向输出Vout[0]的整数值的形式。Vout[0]的锁定脚本包括当前状态(“S3”)、状态机的转换矩阵,并且将解锁交易3030的Vout[x]约束为处于下一状态(“S4”)的状态机,将解锁交易3030的Vout[y]约束为新的智能合约(new smart contract,简称“NSC”),以及可能的其他约束。
[0350] 作为示例,工人生成过程和强制新的智能合约出现在解锁交易中的过程的示例的伪代码可以如图31所示。
[0351] 合并智能合约
[0352] 在两个或多个状态需要合并到相同的下一状态的情况下,可以使用状态的合并或加入。在某些情况下,并发运行的状态机可能会发现自己处于相同的状态,但如果智能合约不要求合并,则不会合并。例如,利用图26的状态图,S4和S7可能分别转换到S8并保持为两个单独的交易。
[0353] 图32示出了状态机3210的合并操作。在这种情况下,解锁交易3230(输入Vin[0]和Vin[1]以及输出Vout[x])解锁前一交易3220和前一交易3222的输出Vout[0]。使用这些技术,智能合约可以通过实例化其自身的新实例或实例化不同的智能合约来分支出去,并且多个智能合约(相同或不同)可以通过其相应的状态机合并以形成单个智能合约。
[0354] 每个合并解锁交易可以具有一个锁定脚本。该锁定脚本继续执行单个智能合约。这可以是正在合并的智能合约之一,也可以是全新的智能合约。在任何情况下,都可以执行许多检查。可以检查每个智能合约作为对解锁交易的有效输入。可以通过使用前一交易的验证来执行。
[0355] 如图32所示,Vin[0]指向前一交易3220及其输出Vout[0],而Vin[1]指向前一交易3222及其输出Vout[0]。两个Vout[0]的锁定脚本将解锁交易3230的Vout[x]约束为具有下一状态S8和状态转换矩阵。这些约束可以通过前一交易的锁定脚本3222检查新的智能合约是解锁交易的输出来实施。
[0356] 为了使用并发状态机来实现这一点,交易可以使用多个输入,每个需要加入的状态机都有一个输入。在状态机转换矩阵中,可以添加约束来检查所有加入的独立状态机的状态。如果其中加入的状态机之一未处于允许收敛的状态,则交易可能被拒绝。为了确保加入操作,可以基于解锁交易中的状态向状态机添加约束,以检查是否存在两个解锁脚本。可以对每个脚本进行检查,以确保每个脚本都处于转换所需的正确状态。如本文其他地方所解释的,也可以使用相互依赖的锁定约束。
[0357] 图33示出了伪代码序列,该伪代码序列作为在具有弱依赖性的解锁交易中合并智能合约的过程的示例。对于合并,发生从当前状态(不一定是唯一状态)集合到共享的下一状态集合的转换。就解锁交易而言,它的输入集合可以解锁锁定脚本集合,该脚本共享相同输出必须复制转换矩阵并嵌入相同下一状态的约束。对于弱依赖性,可能有多个状态机恰好对同一输出具有相同的下一状态。
[0358] 根据图32和图33的合并可以弱依赖性地发生。锁定脚本可以包含其他约束,如相互依赖、分叉、生成新的智能合约等。作为弱依赖性的示例,在碰巧发生合并的情况下,锁定脚本1可以是从状态A到状态X和Y的分叉,而锁定脚本2可以是从状态B到状态X的正常转换。这两个锁定脚本恰好将解锁交易的输出约束为包含状态X
[0359] 在图33的伪代码序列中,根据该伪代码序列处理脚本的处理器可以注入前一交易、解锁交易和可选的一些输入数据,并且在继续之前检查终止条件。然后处理器提取前一交易锁定脚本和解锁交易锁定脚本。接下来,处理器可以检查前一交易锁定脚本中的转换矩阵是否等于解锁交易锁定脚本中的转换矩阵,如果不是,则中止。处理器从中提取前一交易的当前状态值,并从该当前状态值以及从转换矩阵和输入(如果使用)中,确定下一状态,并检查下一状态,以确定它是否与解锁交易锁定脚本中的下一状态相匹配。可选地,可以在此检查其他约束。
[0360] 图34示出了伪代码序列,该伪代码序列作为在具有显式依赖性的解锁交易中合并智能合约的过程的示例。对于显式依赖关系,可能有多个状态机,并且它们对于相同的输出恰好具有相同的下一状态可能是不够的,但是此外,它们可能是特定的不同状态机。根据图32和图34的合并可以通过显式依赖性发生。在强约束下,解锁交易可能需要指向两个或多个特定的合并状态机。
[0361] 在图34的伪代码序列中,根据该伪代码序列处理脚本的处理器可以注入前一交易、解锁交易和可选的一些输入数据,并且在继续之前检查终止条件。然后处理器提取解锁交易锁定脚本。接下来,处理器可以循环通过输入索引集合,并提取其相应的前一交易锁定脚本,并检查相应的前一交易锁定脚本中的转换矩阵是否等于解锁交易锁定脚本中的转换矩阵,如果不是,则中止。处理器从中提取前一交易的当前状态值,并将其附加到当前状态列表中,然后对其他输入进行重复。根据当前状态以及转换矩阵和输入(如果使用),处理器确定下一状态,并检查下一状态,以确定它是否与解锁交易锁定脚本中的下一状态相匹配。可选地,可以在此检查其他约束。
[0362] 并行智能合约/屏障
[0363] 如上所述,两个或多个智能合约可以被合并为一个具有弱约束或强约束的智能合约。拥有两个或多个可以并行执行的智能合约可能也很有用。这可能不仅仅是并发处理,因为约束可能是两条并发路径必须通过一个解锁交易。这也可以用于并发状态机中的“屏障(barrier)”,其中在状态机中其他地方发生另一个转换之前,不允许发生特定的转换。
[0364] 图35示出了并行处理操作。在这种情况下,解锁交易3530具有两个输入(Vin[0],Vin[1]),一个输入用于前一交易3520和前一交易3530中的每一个,以及两个输出(Vout[x],Vout[y]),每个输出用于继续单独的智能合约。解锁交易3530包含解锁脚本,该解释脚本包含智能合约的每一个前一交易。此外,可能需要每个智能合约的锁定脚本来继续执行。使用并行智能合约,每个合约不能独立转换,而是所有合约(如锁定脚本中所定义的)需要同时发生。
[0365] 先前的示例提供了分叉智能合约、合并两个智能合约以及两个(或多个智能合约)的并行操作。这些可以与并行智能合约结合使用。当状态转换与另一个状态转换有逻辑关系时,可以使用屏障。例如,它可能要求另一个状态机处于特定状态,或者要求来自该状态机的输入数据。
[0366] 可以创建解锁交易来促进该功能,该功能包括多个输入和输出。屏障中所需的每个状态机(转换中的或约束中涉及的)都可以包含在其自己的解锁脚本中。对于每个正在经历转换的状态机,可以使用锁定脚本。在图26所示的示例中,允许从状态S9到S10的转换,但是仅当从S6到S7的转换同时发生时才允许。为此,在解锁交易中存在两个解锁脚本,一个用于状态S6的状态机,一个用于状态S9的状态机。解锁交易具有两个锁定脚本,一个用于仍处在S7的状态机,一个用于现在处于S10的状态机。
[0367] 图36是伪代码序列,该伪代码序列作为在需要并行交易输入/输出的并行状态机中使用屏障的示例。在此示例中,根据伪代码序列的脚本检查每个前一交易是否具有与解锁交易中相同的锁定脚本。在此示例中,设置一个锁定脚本以匹配第一前一交易,等等。接下来,根据伪代码序列的脚本从两个前一交易中提取当前状态,读取两个状态机的输入,并检查为两个状态转换设置的任何障碍。
[0368] 回到图35,各种依赖性使用虚线箭头和数字圆圈示出。依赖性#1可能是Vin[0]必须引用前一交易3520,依赖性#2可能是Vin[0]必须引用指定交易(前一交易3520)的第一输出(Vout[0]),依赖性#3可能是Vin[1]必须引用前一交易3522,依赖性#4可能是Vin[1]必须引用指定交易(前一交易3522)的第一输出(Vout[0])。这可能只是两个依赖性,一个是Vin[0]必须引用交易3520的Vout[0]的依赖性,另一个是Vin[1]必须引用交易3522的Vout[0]的依赖性。
[0369] 前一交易3520的Vout[0]的锁定脚本施加依赖性#5,该依赖性#5要求Vout[x]具有状态=S8并且具有用于状态机1的转换矩阵,并且施加依赖性#6,该依赖性#6要求Vout[y]具有状态=S8并且具有用于状态机2的转换矩阵。前一交易3522的Vout[0]的锁定脚本以类似的方式施加依赖性#7和#8。在一些示例中,它可能是某种其他形式的智能合约的约束,而不是状态机的约束。由于两个(或多个)前一交易输出约束了两个(或多个)解锁交易输出,因此可以提供并行智能合约。
[0370] 屏障可能不同于合并。屏障可以是从当前状态(不一定是唯一状态)集合的转换被约束为同时发生的情况。就解锁交易而言,它的输入集合可以解锁相互依赖的锁定脚本集合,所有这些脚本可以将其各自的约束应用于输出集合。相互依赖的锁定脚本可能是一个需求以及共享的下一状态集合,虽然可能,但可能不是必需的。相互依赖的锁定脚本可以嵌入到转换矩阵中,使得某些转换需要这种相互依赖。
[0371] 图37示出了用于屏障/并行智能合约的用例的状态图。假设爱丽丝和鲍勃正在学跳舞,去上舞蹈课。作为保持舞蹈学生进步的方式,他们的进步可以使用状态机记录下来。首先,等级之间可能存在一个状态机,包含关于他们的各种舞蹈类型的整体舞蹈能力的状态。这在状态S1、S3、S5以及最后S6都有体现。这些年级的状态按顺序发展,直到学生达到舞蹈俱乐部支持的最高等级。为了进入下一等级(例如从S1到S3),学生可能需要学习几种舞蹈类型。可以使用较小的嵌入式状态机(例如,S2和S4)来监控每种舞蹈类型。在这个用例中,可以存在以下操作:
[0372] 1)分叉或克隆——这可以在点S1和点S5使用,表示一个新等级的开始,由此可以有一个分叉到多个状态机,每个舞蹈类型对应一个状态机。
[0373] 2)工人生成——这可能在特定舞蹈类型需要更多课程或者与所提供的其他舞蹈类型进行不同的评估的某个时候使用,。
[0374] 3)合并——当学生达到一个新的等级时,这个过程可以在点S3和点S6使用。对于新的等级,每个学生都需要在嵌入式舞蹈状态机的最终状态S4下进行评估。
[0375] 4)并行交易/屏障——这可用于约束一个状态机与另一个状态机之间的状态转换。在这个用例的情况下,我们可以假设S2和S4之间的转换需要同时发生,因为你不能在单节课中跳单种类型的舞蹈。
[0376] 因此,说明书和附图应被认为是说明性的而非限制性的。但是,显而易见的是,在不脱离权利要求中所阐述的本发明的范围的情况下,可以对其进行各种修改和变化。同样,其他变型在本发明的范围内。因此,虽然所公开的技术易受各种修改和替代构造的影响,但特定示出的实施例在附图中示出并且已经在上文中详细描述。然而,应当理解的是,无意将本发明限制于所公开的一种或多种特定形式,相反,其目的是涵盖所附权利要求所定义的落入本发明的范围内的所有修改、替代构造和等同物。
[0377] 除非本文另有说明或者与上下文明显矛盾,否则在描述所公开的实施例的上下文中(特别是在下文权利要求的上下文中),术语“一(a)”和“一个(an)”和“所述(the)”以及类似的指代的使用应理解为涵盖单数和复数。除非另有说明,术语“包括(comprising)”、“具有(having)”、“包括(including)”和“包含(containing)”应理解为开放式术语(即,意味着“包括但不限于”(including,but not limited to))。术语“连接(connected)”在未修改的情况下指的是物理连接,即使有东西介入,应理解为部分或全部包含在、连接到或连接在一起。除非另有说明,否则本发明中数值范围的引用仅旨在用作分别指代落入该范围内的每个单独数值的简写方法,并且每个单独数值都被并入说明书中,如同单独引用一样。除非另有说明或与上下文矛盾,否则术语“集合(set)”(例如,“项目集合(a set of items)”)或“子集(subset)”的使用应理解为包括一个或多个成员的非空集合。此外,除非另有说明或与上下文矛盾,否则对应集合的术语“子集”不一定表示对应集合的适当子集,但是子集和对应集合可以相等。
[0378] 除非另有明确说明或与上下文明显矛盾,否则诸如“A、B和C中的至少一个(at least one of A,B,and C)”或“A、B或C中的至少一个(at least one of A,B,or C)”形式的短语之类的连接语言,在上下文中理解为通常用来表示一个项目、术语等,可以是A或B或C,也可以是A和B和C集合的任何非空子集。例如,在具有三个成员的集合的说明性示例中,连接短语“A、B和C中的至少一个”和“A、B或C中的至少一个”是指以下任意集合:{A}、{B}、{C}、{A,B}、{A,C}、{B,C}、{A,B,C}。因此,这种连接语言通常并不意味着特定实施例要求存在A中的至少一个、B中的至少一个和C中的至少一个。
[0379] 除非另有说明或者与上下文明显矛盾,否则过程的操作可以任何合适的顺序执行。过程(或其变型和/或组合)可以在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可以通过硬件或其组合实现为在一个或多个处理器上共同执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用程序)。代码可以例如以计算机程序的形式存储在计算机可读存储介质上,计算机程序包括可由一个或多个处理器执行的多个指令。计算机可读存储介质可以是非暂时性的。
[0380] 除非另有说明,否则提供的任何和所有示例或示例性语言(例如,“诸如(such as)”)的使用仅旨在更好地说明本发明的实施例,并且不对本发明的范围构成限制。说明书中的任何语言都不应解释为表明任何未要求保护的要素对于实现本发明必不可少。
[0381] 描述了本发明的实施例,包括发明人已知的用于实施本发明的最佳模式。通过阅读前述说明书,这些实施例的变型对于本领域普通技术人员来说将变得显而易见。发明人期望熟练的技术人员适当地采用这类变型,发明人打算以不同于具体描述的方式来实践本发明的实施例。因此,本发明的范围包括适用法律允许的所附权利要求中列举的主要内容的所有修改和等同物。此外,除非另有说明或者与上下文明显矛盾,否则上述要素在其所有可能的变型中的任何组合都包含在本发明的范围内。
[0382] 所引用的所有参考文献(包括出版物、专利申请和专利)通过引用并入本文,其并入程度与每个参考文献单独且明确地指出通过引用并入并完整列出的程度相同。
[0383] 应当说明的是,上述实施例说明而非限制本发明,在不脱离本发明的由所附权利要求限定的范围的情况下,本领域技术人员将能够设计出许多替代性实施例。在权利要求中,括号中的任何附图标记不应解释为对权利要求的限制。词语“包括(comprising)”、“包括(comprises)”等并非在整体上排除其他元件和步骤的存在,尽管这些元件和步骤并没有在任何权利要求或说明书中列出。在本说明书中,“包括(comprises)”意指“包括(includes)或由......组成(consists of)”,“包括(comprising)”意指“包括(including)或由......组成(consisting of)”。元件的单数引用不意味着排除这些元件的复数引用,反之亦然。本发明可以借助包括若干不同元件的硬件,以及借助适当编程的计算机来实施。在列举了若干装置的设备权利要求中,这些装置中的若干个可以由硬件的同一个部件来体现。不争的事实是,在相互不同的从属权利要求中列举了某些方法,并不代表这些方法的结合不能获得有益效果。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈