首页 / 专利库 / 银行与财务事项 / 数字货币 / 加密货币 / 比特币 / 用于区块链实现的基于脚本的字节解释的方法和系统

用于链实现的基于脚本的字节解释的方法和系统

阅读:806发布:2020-05-08

专利汇可以提供用于链实现的基于脚本的字节解释的方法和系统专利检索,专利查询,专利分析的服务。并且本 发明 涉及 分布式账本 技术,比如基于共识的 区 块 链 ,例如 比特币 区块链。描述了通过耗用交易的 锁 定脚本实施的用于去信任化的确定性状态机的计算机实现的方法。耗用交易转移对至少一种数字资产或其一部分的控制。耗用交易与前一交易相关,该前一交易包括具有字节码序列的锁定脚本。耗用交易还包括具有相同字节码序列的锁定脚本。可以通过验证耗用交易和前一交易的锁定脚本的字节码序列彼此是否匹配来确认耗用交易。作为执行锁定脚本的结果,可以转移对至少一种数字资产或其一部分的控制。例如,锁定脚本可以施加一组条件来验证耗用交易。,下面是用于链实现的基于脚本的字节解释的方法和系统专利的具体信息内容。

1.一种计算机实现的方法,包括:
接收耗用链交易,以转移对至少一种数字资产或其一部分的控制,其中,所述耗用交易包括由字节码序列表示的定脚本,并且其中,所述耗用交易引用包括由字节码序列表示的锁定脚本的前一交易,使得第一锁定脚本和第二锁定脚本共享相同的字节码序列;
以及
通过验证所述耗用交易的锁定脚本的字节码序列与所述前一交易的锁定脚本的字节码序列是否匹配来确认所述耗用交易。
2.根据权利要求1所述的计算机实现的方法,其中,所述耗用交易还包括解释器代码,所述前一交易还包括解释器代码,使得所述耗用交易和所述前一交易共享相同的解释器代码来解释所述锁定脚本的字节码序列,并且确认所述耗用交易还包括验证所述耗用交易的解释器代码与所述前一交易的解释器代码是否匹配。
3.根据任一前述权利要求所述的计算机实现的方法,其中,所述前一交易存储在区块链上,以及/或者所述解释器代码被包含为所述耗用交易和所述前一交易两者的锁定脚本的一部分,以及/或者所述解释器代码支持将至少一个高级字节码操作转换为由节点执行的低级字节码操作。
4.根据任一前述权利要求所述的计算机实现的方法,其中,所述前一交易的锁定脚本和所述耗用交易的锁定脚本还包括与由所述前一交易的锁定脚本和所述耗用交易的锁定脚本共享的字节码序列的不同执行状态有关的数据,其中,这些数据用于在确认所述耗用交易时控制执行对字节码序列的解释。
5.根据权利要求4所述的计算机实现的方法,其中,所述前一交易的锁定脚本还包括用于所述锁定脚本的字节码序列的当前执行状态的状态数据、以及与锁定脚本的字节码序列的所述当前执行状态相对应的执行指针,其中,所述耗用交易的锁定脚本还包括用于锁定脚本的字节码序列的下一执行状态的状态数据、以及与所述锁定脚本的字节码序列的所述下一执行状态相对应的执行指针,并且确认所述耗用交易还包括:
i)使用表示所述锁定脚本的字节码序列的所述当前执行状态的数据来恢复所述字节码序列的所述当前执行状态,
ii)从与所述字节码序列的所述当前执行状态相对应的执行指针开始执行所述锁定脚本的字节码序列,直到与所述字节码序列的所述下一执行状态相对应的执行指针结束;以及
iii)将因执行所述锁定脚本的字节码序列而产生的状态数据与用于包含在所述耗用交易中的锁定脚本的字节码序列的所述下一执行状态的状态数据进行比较,以验证这些状态数据是否匹配。
6.根据权利要求5所述的计算机实现的方法,其中,确认所述耗用交易还包括:从虚拟存储器中提取用于所述锁定脚本的字节码序列的所述当前执行状态的状态数据,从虚拟存储器中提取与用于所述锁定脚本的字节码序列的所述当前执行状态相对应的执行指针,并且从虚拟存储器中提取与所述锁定脚本的字节码序列的所述下一执行状态相对应的执行指针。
7.根据权利要求4所述的计算机实现的方法,其中,所述虚拟存储器以不同的第一格式和第二格式存储与字节码序列的不同执行状态有关的数据,其中,所述第一格式用于将这些数据存储为锁定脚本的一部分,并且其中,所述第二格式适用于在执行所述锁定脚本的字节码序列时操纵所述虚拟存储器中的数据。
8.根据权利要求7所述的计算机实现的方法,其中,所述虚拟存储器包括至少一个堆栈数据结构,所述第一格式包括序列化字节格式,并且所述第二格式包括堆栈格式。
9.根据权利要求8所述的计算机实现的方法,还包括:通过将表示所述字节码序列的所述当前执行状态的数据从所述字节格式反序列化为所述堆栈格式,从所述虚拟存储器中提取用于所述锁定脚本的字节码序列的所述当前执行状态的状态数据,以及/或者通过将因执行所述锁定脚本的字节码序列而产生的状态数据从所述堆栈格式序列化为所述字节格式,对因执行所述锁定脚本的字节码序列而产生的状态数据与用于包含在所述耗用交易中的锁定脚本的字节码序列的下一执行状态的状态数据进行比较。
10.根据任一前述权利要求所述的计算机实现的方法,其中,作为执行所述锁定脚本的结果,转移对所述至少一种数字资产或其一部分的控制,并且锁定脚本施加一组条件来确认所述耗用交易。
11.根据权利要求10所述的计算机实现的方法,其中,所述耗用交易还包括解锁脚本,其中,执行所述解锁脚本提供了用来得到用于确认所述耗用交易的一组条件的数据。
12.根据任一前述权利要求所述的计算机实现的方法,其中,所述耗用交易的至少一部分被复制以生成新的耗用交易,直到满足终止条件为止。
13.根据任一前述权利要求所述的计算机实现的方法,其中,所述耗用交易和所述前一交易体现部分的智能合约
14.一种系统,包括:
处理器;以及
包括可执行指令的存储器,所述可执行指令由所述处理器的执行,使得所述系统执行根据权利要求1至13中的任一项所述的计算机实现的方法。
15.一种非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质上存储有可执行指令,所述可执行指令由于被计算机系统的处理器执行而使得所述计算机系统至少执行根据权利要求1至13中的任一项所述的计算机实现的方法。

说明书全文

用于链实现的基于脚本的字节解释的方法和系统

[0001] 相关申请的交叉引用
[0002] 本申请要求于2017年8月15日提交的英国专利申请第1713046.9号的优先权,其全部内容通过引用并入本文中。

技术领域

[0003] 本发明总体上涉及区块链技术,并且更具体地涉及使用耗用交易脚本的区块链交易。本发明特别适合于但不限于在自动执行智能合约中使用。

背景技术

[0004] 在本文档中,使用术语“区块链”来包括所有形式的电子的、基于计算机的分布式账本。这些包括基于共识的区块链和交易链技术、许可和未许可的账本、共享账本及其变型。区块链技术最广为人知的应用是比特币账本,但是已经提出并开发了其他区块链实施方案。尽管在本公开中为了方便和说明的目的可能提到的是“比特币”,但是应当理解的是,本发明不限于与比特币区块链一起使用,并且替代性的区块链实施方案和协议也落入本发明的范围内。例如,本发明可以用于如下其他区块链实施方案中:这些实施方案在关于可以在交易内编码哪些约束条件方面具有与比特币类似的限制。
[0005] 区块链是点对点的电子账本,其实现为基于计算机的去中心化的分布式系统,该系统由区块组成,而区块又由交易和其他信息组成。例如,对于比特币,每个交易都是对数字资产的控制(control)在区块链系统中的参与者之间的转移进行编码的数据结构,并且包括至少一个输入和至少一个输出。在一些实施方案中,可以通过将数字资产的至少一部分从第一实体重新关联到第二实体来转移对数字资产的控制。每个区块都包含前一区块的散列,使得区块链接在一起,以创建自区块链创建以来写入区块链的所有交易的永久的、不可更改的记录。交易包含称为脚本的小程序,这些小程序嵌入到其输入和输出中,其指定了如何以及由谁来访问交易的输出。在比特币平台上,这些脚本采用基于堆栈的脚本处理语言。
[0006] 换言之,基于堆栈的脚本处理语言可以利用称为堆栈的数据结构。在堆栈的情况下,可以将值推入堆栈的顶部或从堆栈的顶部弹出。
[0007] 为了将交易写入区块链,必须对其进行“确认(validate)”。网络节点(矿工)执行工作以确保每个交易均是有效的,而无效交易则被网络拒绝。节点可以具有与其他节点不同的有效性标准。由于区块链中的有效性是基于共识的,因此,如果大多数节点同意交易是有效的,则该交易被视为有效。安装在节点上的软件客户端通过执行未耗用交易(UTXO)定和解锁脚本来对引用UTXO的交易部分地执行此确认工作。如果锁定和解锁脚本的执行评估为TRUE,并且满足其他确认条件(如果适用),则由节点进行的交易有效。经确认的交易会传播到其他网络节点,随后矿工节点可以选择将该交易包含在区块链中。因此,为了将交易写入区块链,必须:i)由接收交易的第一节点进行确认——如果交易被确认,该节点将其中继给网络中的其他节点;ii)添加到由矿工建造的新区块中;以及iii)挖掘,即,添加到过去交易的公共账本中。当向区块链添加足够数量的区块以使交易实际上不可逆时,该交易被视为已被确认。
[0008] 当前研究的一个领域是使用区块链来实现“智能合约”。这些智能合约是被设计为自动执行机器可读合约或协定的条款的计算机程序。与将按自然语言编写的传统合约不同,智能合约是的机器可执行程序,其包含可以处理输入以产生结果的规则,然后可以根据这些结果来执行动作。
[0009] 在实施方式中,在不对创建者或某个其他特定实体强制实施和/或执行智能合约的意义上,智能合约是“智能”的。换言之,尽管可以在智能合约中的特定步骤对与特定实体的交互进行编码,但是智能合约可以由机器以其他方式自动执行并自行强制实施。智能合约是机器可读且可执行的。在一些示例中,自动执行是指任何实体能够耗用UTXO并且具有耗用UTXO的动机(例如,奖励)。应当指出的是,在这样的示例中,能够耗用UTXO的“任何实体”是指能够创建解锁脚本而无需证明了解某些秘密的实体。换言之,可以在不验证数据来源有权访问加密秘密(例如,私有非对称密钥、对称密钥等)的情况下确认耗用交易(spending transaction)。同样,在这样的示例中,自行强制实施是指根据约束条件来使区块链网络的确认节点强制实施耗用交易。在一些示例中,“耗用”UTXO是指引用UTXO并有效执行的耗用交易。
[0010] 区块链交易输出包括锁定脚本和有关数字资产、比如比特币的所有权的信息。锁定脚本通过指定为了耗用输出所需要满足的条件来“锁定”数字资产,锁定脚本也可以被称为阻碍。例如,锁定脚本可能要求在解锁脚本中提供某些数据以解锁关联的数字资产。锁定脚本在比特币中也被称为“scriptPubKey”。要求当事方提供数据以解锁数字资产的技术包括将数据的散列嵌入锁定脚本中。

发明内容

[0011] 因此,期望提供在这些方面中的一个或更多个方面中改进区块链技术的改进的方法和系统。因此,根据本发明,提供了如所附权利要求所限定的方法和相应的系统。
[0012] 可以将本发明描述为验证方法/系统,以及/或者描述为用于经由区块链来控制数字资源或资产的交换或转移的控制方法/系统。术语“资产”和“资源”在本文中可以互换使用。数字资源可以是令牌,或者是加密货币的一部分,等等。如下所述,还可以将本发明描述为用于经由区块链网络或平台来执行操作的新的、改进的且有利的方式的安全方法/系统。
[0013] 如将在下面更详细地描述的,在实施方式中,可以通过由字节码序列实现或表示的(第一)锁定脚本来实现去信任化的确定性状态机。在一个或多个实施方式中,锁定脚本可以是参数化智能合约的一部分或者包括参数化智能合约的一部分,由此第一(“耗用”)区块链交易被用来转移对数字资产/资源的控制。耗用交易可以引用交易,该前一交易包括包含字节码序列的锁定脚本。交易还可以包括锁定脚本,该锁定脚本包含字节码序列,使得前一交易和耗用交易的锁定脚本共享相同的字节码序列。可以在区块链网络中的节点处接收耗用交易。可以通过获取前一交易并验证前一交易和耗用交易的锁定脚本共享相同的字节码序列来进行确认。
[0014] 在其他实施方式中,前一交易的锁定脚本还可以包括用于解释前一交易的锁定脚本的字节码序列的解释器代码,并且耗用交易的锁定脚本也可以包括解释器代码,使得前一交易和耗用交易的锁定脚本共享相同的解释器代码。解释器代码可以支持将至少一个高级字节码操作转换为由确认耗用交易的节点执行的低级字节码操作。在这种情况下,耗用交易的确认可以进一步包括验证前一交易和耗用交易的锁定脚本是否共享相同的解释器代码。
[0015] 如将在下面更详细描述地,在实施方式中,锁定脚本的字节码序列和/或解释器代码可以被复制为有序次数的耗用交易(或耗用交易的序列)的锁定脚本的一部分,直到实现终止条件为止。
[0016] 因此,根据本发明的实施方式,可以提供一种计算机实现的方法,该计算机实现的方法包括:
[0017] 接收第一区块链交易(“耗用交易”)以转移对至少一种数字资产或其一部分的控制,其中,所述第一区块链交易包括由字节码序列表示的(第一)锁定脚本,并且其中,第一区块链交易引用包括由字节码序列表示的(第二)锁定脚本的前一(区块链)交易,使得第一锁定脚本和第二锁定脚本共享相同的字节码序列;第一交易可以被称为“耗用”交易。可以在区块链网络中的节点处接收该交易。该交易可以布置为经由网络将对数字资产(也可以称为“数字资源”)的控制转移到实体、当事方或节点。
[0018] 该方法还包括以下步骤:
[0019] 通过确认第一锁定脚本的字节码序列与前一交易的锁定脚本(即,第二锁定脚本)的字节码序列是否匹配来确认第一(耗用)区块链交易。
[0020] 优选地,第一区块链交易还包括解释器代码,前一区块链交易还包括解释器代码,使得第一区块链交易和前一区块链交易共享相同的解释器代码来解释第一锁定脚本和第二锁定脚本的字节码序列,并且确认第一区块链交易还包括验证第一区块链交易的解释器代码与前一区块链交易的解释器代码是否匹配。
[0021] 优选地,第一区块链交易由区块链网络中的节点接收和/或确认。附加地或替代性地,前一区块链交易可以存储在由区块链网络的节点维护的区块链上。附加地或替代性地,可以通过复制前一区块链交易的至少一部分来生成第一区块链交易。附加地或替代性地,第一锁定脚本可以包括验证第一锁定脚本的字节码序列与第二锁定脚本的字节码序列是否匹配的至少一个操作。解释器代码可以被包含为第一锁定脚本和第二锁定脚本的一部分。附加地或替代性地,解释器代码可以支持将至少一个高级字节码操作转换为由节点执行的低级字节码操作。附加地或替代性地,第一锁定脚本可以包括布置为验证第一锁定脚本的解释器代码与第二锁定脚本的解释器代码是否匹配的至少一个操作。
[0022] 优选地,第一锁定脚本和第二锁定脚本(即,耗用交易的锁定脚本和前一交易的锁定脚本)还包括与由第一锁定脚本和第二锁定脚本共享的字节码序列的不同执行状态有关的数据,其中,这些数据用于在确认第一区块链交易时控制执行对字节码序列的解释。
[0023] 优选地,第二锁定脚本包括用于字节码序列的当前执行状态的状态数据、以及与字节码序列的当前执行状态相对应的执行指针,其中,第一锁定脚本还包括用于字节码序列的下一执行状态的状态数据、以及与(锁定脚本的)字节码序列的下一执行状态相对应的执行指针,并且确认第一区块链交易还包括:i)使用表示字节码序列的当前执行状态的数据来恢复字节码序列的当前执行状态;ii)从与字节码序列的当前执行状态相对应的执行指针开始执行字节码序列,直到与字节码序列的下一执行状态相对应的执行指针结束;以及iii)将因执行字节码序列而产生的状态数据与用于包含在第一区块链交易中的第二锁定脚本的字节码序列的下一执行状态的状态数据进行比较,以验证这些状态数据是否匹配。
[0024] 优选地,确认第一区块链交易还包括从虚拟存储器中提取用于字节码序列的当前执行状态的状态数据,从虚拟存储器中提取与字节码序列的当前执行状态相对应的执行指针,并且从虚拟存储器中提取与字节码序列的下一执行状态相对应的执行指针。
[0025] 优选地,虚拟存储器以不同的第一格式和第二格式存储与字节码序列的不同执行状态有关的数据,其中,第一格式用于将这些数据存储为锁定脚本的一部分,并且其中,第二格式适用于在执行锁定脚本的字节码序列时操纵虚拟存储器中的数据。
[0026] 优选地,虚拟存储器包括至少一个堆栈数据结构,第一格式包括序列化字节格式,以及/或者第二格式包括堆栈格式。
[0027] 该方法还可以包括:通过将表示字节码序列的当前执行状态的数据从字节格式反序列化为堆栈格式,从虚拟存储器中提取用于字节码序列的当前执行状态的状态数据,以及/或者通过将因执行字节码序列而产生的状态数据从堆栈格式序列化为字节格式,对因执行字节码序列而产生的状态数据与用于包含在第一(耗用)区块链交易中的字节码序列的下一执行状态的状态数据进行比较。
[0028] 优选地,作为执行第一锁定脚本的结果,转移对至少一种数字资产或其一部分的控制,并且第二锁定脚本施加一组条件来确认第一区块链交易。
[0029] 优选地,第一区块链交易还包括解锁脚本,其中,执行解锁脚本提供了用来得到用于确认第一区块链交易的一组条件的数据(其可以是确定的数据来源或未确定的数据来源)。
[0030] 优选地,第一区块链交易的至少一部分被复制以生成新的区块链交易,直到满足终止条件(例如,当与第一区块链交易相关联的数字资产的大小不足以被转移时)为止。
[0031] 优选地,第一区块链交易和前一区块链交易体现部分的智能合约。
[0032] 根据本发明,还提供了一种系统,该系统被布置为实施上文描述的一种或多种方法的任何实施方式。该系统可以包括:
[0033] 处理器;以及
[0034] 包括可执行指令的存储器,该可执行指令由由所述处理器的执行,使得所述系统执行上述实施方式中的任何一个实施方式的计算机实现的方法。
[0035] 还提供了一种非暂时性计算机可读存储介质,该暂时性计算机可读存储介质上存储有可执行指令,该可执行指令由于被计算机系统的处理器执行而使得计算机系统至少执行上述实施方式中的任何一个实施方式的计算机实现的方法。
[0036] 通过利用区块链网络和加密技术来设置和强制实施用于重新关联或转移数字资产的标准,本公开中描述和暗示的技术改进了计算领域、特别是区块链技术领域(包括机器可执行智能合约的执行)。另外,本公开中描述和暗示的技术通过使区块链交易能够充当状态机来改进区块链网络的功能。
[0037] 此外,本公开中描述和教导的技术必须植根于计算机技术中,以克服特别是在使用出于安全原因专设计用来限制功能的脚本语言(比如,比特币脚本)的分布式账本技术和区块链技术方面存在的问题。例如,比特币的脚本处理语言本身不支持出现复杂的流控制功能(例如,循环)。这种限制的一个优点是程序具有可预测的执行时间。将脚本限制为线性或类似树的决策任务的另一个显著优点是,这避免了无限循环,无限循环可能用作发起诸如拒绝服务(DoS或DDoS)攻击之类的利用的手段。因此,增强并保留了区块链转移/交换的安全性,但是需要找到机制来实现语言本身不允许或不提供的功能。本发明在这方面提供了改进,通过自复制的区块链交易锁定脚本的实现至少部分地解决了区块链交易的当前限制。因此,本发明提供了对技术问题的技术解决方案,并且在安全性、对经由区块链进行的数字资产交换/转移的改进控制、以及当前区块链有关功能的扩展方面具有优势。附图说明
[0038] 参照本文中所描述的实施方式,本发明的这些和其他方面将变得明显并被阐明。现在将仅通过示例的方式并参照附图来描述本发明的实施方式,在附图中:
[0039] 图1示出了可以在其中实现各种实施方式的区块链环境;
[0040] 图2示出了根据实施方式的采用锁定脚本的智能合约的示例,该锁定脚本包含在交易序列上复制的字节码序列。
[0041] 图3示出了根据实施方式的图2的采用字节码序列的锁定脚本的示例,该字节码序列被解释以实现去信任化的确定性状态机;
[0042] 图4A至图4C共同为示出了根据实施方式的执行图3的耗用交易的解锁脚本和前一交易的锁定脚本的操作的示例的流程图
[0043] 图5是根据实施方式的可以用于执行锁定脚本的字节码序列的示例性虚拟堆栈数据结构的示意图;
[0044] 图6是根据实施方式的可以存储为图3的锁定脚本的一部分的序列化状态数据的示意图;
[0045] 图7是根据实施方式的可以用于将存储为锁定脚本的一部分的序列化状态数据转换成适合于存储在图5的堆栈数据结构上的格式的操作的示意图;
[0046] 图8是根据实施方式的可以用于将以图5的堆栈数据结构的格式存储的状态数据转换成适于存储在锁定脚本内的序列化状态数据的操作的示意图;
[0047] 图9示出了根据实施方式的图2的锁定脚本的另一示例,该锁定脚本采用字节码序列和解释器代码来实现去信任化的确定性状态机;
[0048] 图10A至图10C共同为示出了根据实施方式的执行图9的耗用交易的解锁脚本和前一交易的锁定脚本的操作的示例的流程图;
[0049] 图11是示出了根据实施方式的图9的锁定脚本的解释器代码的执行的示意图,其与确认节点的运行时间系统(例如,区块链客户端)的内置软件解释器的执行协作,以解释锁定脚本的字节码序列;
[0050] 图12A和图12B是作为图10A至图10C的操作的一部分的锁定脚本的解释器代码的示例性操作的示意图,该示例性操作将VOP_ADD字节码解释为锁定脚本的一部分;以及[0051] 图13示出了可以在其中实现各种实施方式的计算环境。

具体实施方式

[0052] 首先将参照图1,其示出了根据本公开的实施方式的与区块链相关联的示例性区块链网络100。在该实施方式中,示例性区块链网络100包括运行区块链协议的实例的点对点的分布式电子设备。在一些示例中,分布式电子设备被称为节点102。区块链协议的示例是比特币协议或其任何版本/变体。
[0053] 节点102可以包括任何合适的计算设备(例如,包括数据中心中的服务器、客户端计算设备(例如,台式计算机、膝上型计算机、平板电脑、智能手机等)、计算资源服务提供商的分布式系统中的多个计算设备、或任何合适的电子客户端设备比如图11的计算设备2600)。
[0054] 在实施方式中,节点102中的一个或更多个节点通信上耦接至节点102中的一个或更多个其他节点。这种通信耦接可以采用众所周知的有线通信链路或无线通信链路中的一者或更多者。在该实施方式中,每个节点102均维护区块链中所有交易的“账本”的至少一部分。以此方式,账本是分布式账本。由影响账本的节点处理的交易能够由其他节点中的一个或更多个节点验证,使得维护账本的完整性。
[0055] 在实施方式中,节点102中的至少一些节点是矿工节点,该矿工节点执行与复杂计算相关的挖掘过程,比如解决加密问题。解决加密问题的矿工节点为区块链创建新的区块,并将该新的区块广播到节点102中的其他节点。节点102中的其他节点执行验证过程,该验证过程验证矿工节点的工作,并且在验证以后将区块接收到区块链中(例如,通过将区块添加到区块链的分布式账本)。在一些示例中,区块通常是用前一区块的“指纹”(例如,散列)和时间戳标记的一组交易。以此方式,每个区块都链接到前一区块,从而在区块链中创建链接区块的“链”。在实施方式中,通过节点102的共识将有效区块添加到区块链。同样在一些示例中,区块链包括经确认的区块的列表。
[0056] 在实施方式中,节点102中的至少一些节点作为执行确认如本公开中所描述的交易的确认过程的确认节点操作。图1示出了标记为104的一个示例性交易。在一些示例中,交易包括提供对数字资产的所有权(例如,多个比特币)的证明以及接受或转移对数字资产的所有权/控制的条件的数据。在一些示例中,“耗用交易”是指将数字资产的至少一部分重新关联(例如,将所有权或控制转移)到与区块链地址相关联的实体的交易,该数字资产由前一交易的未耗用交易输出(UTXO)表示。在一些示例中,“前一交易”是指包含由耗用交易引用的UTXO的交易。在一些实施方式中,交易可以包括“解锁脚本”和“锁定脚本”,其通过必须满足的条件在确认交易并且在交易对所有权/控制进行转移之前来阻碍交易。在一些实施方式中,锁定脚本可以与交易的输出关联,并且可以被配置为定义耗用该输出所需的一个或更多个条件。此外,耗用交易的解锁脚本可以配置成使得执行解锁脚本提供了用来得到一组条件的数据以确认耗用交易,该一组条件通过执行的前一交易的锁定脚本来评估。在一些实施方式中,区块链地址是与对数字资产的至少一部分的控制转移/重新关联到的实体相关联的一串字母数字字符。在一些实施方式中实现的一些区块链协议中,与实体相关联的公共密钥与区块链地址之间存在一一对应关系。交易的确认可以包括确认交易的解锁脚本和/或锁定脚本中指定的一个或更多个条件。在成功确认交易之后,确认节点可以将交易传播到其他网络节点,随之矿工节点可以选择将交易作为添加至如本文中所描述的区块链的区块的一部分嵌入。
[0057] 一些区块链技术、例如比特币使用椭圆曲线数字签名算法(ECDSA)作为数字签名的数学方案。在实施方式中,ECDSA是用于保护UTXO不被未经批准的实体耗用的加密数字签名。比特币中的椭圆曲线数字签名(ECDS)通常具有附加至末尾的签名散列标记(SIGHASH类型);然而,设想的是,本公开的技术能够与不实现SIGHASH类型的区块链技术一起使用。在这样的区块链技术中,设想ECDS符合特定区块链技术的签名生成原则。
[0058] 在一些实施方式中,SIGHASH类型是指在被序列化(例如,规范化)和散列化之前从交易中提取的字段集。例如,SIGHASH类型可以影响交易的哪些字段被包含在签名中。在一些示例中,SIGHASH类型可以是比特币协议中使用的SIGHASH_ALL、SIGHASH_NONE、SIGHASH_SINGLE或SIGHASH_ANYONECANPAY中的一者或更多者。
[0059] 比特币协议使用称为“脚本”的脚本处理系统来执行各种操作。在本公开中,各种脚本操作代码(或op_codes)和关键字被引用以执行各种操作。然而,设想的是,其他区块链技术可以实现不同的指令集,因此,本公开中描述的操作代码被认为是对由该操作代码(而不是脚本中的特定操作代码)执行的操作的说明。在一些实施方式中,脚本处理系统是图灵不完整指令集(例如,不支持循环、递归、goto语句等)。在其他实施方式中,脚本处理系统可以是图灵完整指令集。
[0060] 本公开的某些实施方式可以在脚本处理系统或用于实现所描述的指令集的其他系统允许在单个脚本中有多于200条指令(例如,操作代码或op_codes)的假设下操作。同样,本公开的某些实施方式还假定:
[0061] ·在执行操作代码脚本/指令集的系统中,存在并启用由某些低级操作代码(或低级字节码操作)提供的功能;以及/或者
[0062] ·由某些高级操作代码(或高级字节码操作)提供的功能可以通过创建被编写为提供期望行为的定制函数来实现。这些定制函数可以被编写为实现语言中存在的但已被禁用的op_codes的功能,也可能是提供脚本处理语言中原本未提供的特定功能的“新的”op_codes。
[0063] 脚本处理系统可以支持的低级操作代码示例包括:
[0064] ·OP_1SUB,其中,从顶部堆栈项中减去值“1”
[0065] ·OP_2DUP,其复制前两个堆栈项
[0066] ·OP_ADD,其将堆栈上的前两项相加
[0067] ·OP_CAT,其将堆栈上的前两项连接
[0068] ·OP_CHECKSIG,其中,从堆栈中弹出公钥和签名,并根据SIGHASH类型针对交易字段的签名进行验证。如果签名有效,则返回1,否则返回0。
[0069] ·OP_CHECKSIGVERIFY,其功能与OP_CHECKSIG相同,但之后执行OP_VERIFY[0070] ·OP_DROP,其移除或弹出堆栈的顶部项
[0071] ·OP_DUP,其复制顶部堆栈项
[0072] ·OP_ELSE,如果未执行前面的OP_IF或OP_NOTIF或OP_ELSE,则执行这些语句;否则,如果执行了前面的OP_IF或OP_NOTIF或OP_ELSE,则不会执行这些语句
[0073] ·OP_ENDIF,其使if/else区块结束
[0074] ·OP_EQUAL,如果输入完全相等,则返回1,否则返回0
[0075] ·OP_EQUALVERIFY,其与OP_EQUAL相同,但之后运行OP_VERIFY
[0076] ·OP_FROMALTSTACK,其将输入放置在主堆栈的顶部,并将输入从备用堆栈移除[0077] ·OP_HASH256,其中,输入被散列化两次:首先利用SHA-256,然后利用RIPEMD-160[0078] ·OP_IF,如果顶部堆栈值不为False,则执行该语句并移除顶部堆栈值
[0079] ·OP_LEFT,其仅保留字符串中指定点左侧的字符
[0080] ·OP_MUL,其将堆栈上的前两项相乘
[0081] ·OP_NOTIF,如果顶部堆栈值为False,则执行该语句并移除顶部堆栈值
[0082] ·OP_RIGHT,其仅保留字符串中指定点右侧的字符
[0083] ·OP_ROLL,其中,将堆栈中的n个项深的项移至顶部
[0084] ·OP_ROT,其将堆栈上的前三项向左旋转
[0085] ·OP_SIZE,其推动堆栈的顶部元素的字符串长度(而不使其弹出)
[0086] ·OP_SUBSTR,其返回字符串的一部分
[0087] ·OP_SWAP,其中,堆栈上的前两项被调换
[0088] ·OP_TOALTSTACK,其将输入放置在备用堆栈的顶部上,并将输入从主堆栈移除[0089] ·OP_TUCK,其中,将堆栈顶部的项幅值并插入到正数第二项之前
[0090] ·OP_VERIFY,如果顶部堆栈值不为真,则将交易标记为无效
[0091] 比特币协议的脚本处理系统当前支持这些低级操作代码。
[0092] 可以由本公开的方法和系统支持的高级操作代码的示例包括:
[0093] ·OP_ECPX,其返回椭圆曲线点的x坐标
[0094] ·OP_BIGMOD,其返回将堆栈上的前两项相除后的余数
[0095] ·OP_BIGMODADD,其执行堆栈的前两项模堆栈的第三项的模数加法
[0096] ·OP_BIGMODINVERSE,其执行模数负指数运算
[0097] ·OP_BIGMODMUL,其执行堆栈的前两项模堆栈的第三项的模数乘法
[0098] ·OP_DERENCODE,其将堆栈上的前两项以DER格式编码
[0099] ·OP_ECPMULT,其对堆栈上的前两项执行椭圆曲线点乘法(也称为椭圆曲线标量乘法)
[0100] 这些高级操作代码可以提供比特币协议的脚本处理系统中原本未提供的特定功能。
[0101] 图2示出了智能合约的示例实施方式2100,该智能合约采用锁定脚本作为交易序列的一部分,其中,锁定脚本被配置为每次将发送至耗用交易的数字资产量减少一个单位,并且还将1单位的数字资产支付给Alice。即,第一交易202包括锁定脚本并且保持初始量X。确认第一交易202,然后挖掘第一交易202,使得第一交易202嵌入在区块中,然后对该区块进行验证,使得该区块存储在区块链208上。将第一交易202(或其一部分)的锁定脚本复制并结合为第二交易204的锁定脚本的一部分。第二交易204是通过执行第一交易202的锁定脚本来确认的耗用交易,其被配置为将由第一交易202持有的1单位的初始量X支付给属于Alice的支付给公钥散列(pay-to-public-key-hash,P2PKH)地址,并保留新的总量(X'=X–
1)。在一些示例中,P2PK或P2PKH可以用作将数字资产转移到与相应公钥相关联的实体的地址。然后挖掘第二交易204,使得第二交易204嵌入到区块中,然后对该区块进行验证,使得该区块存储在区块链208上。将第二交易204(或其一部分)的锁定脚本复制并结合为第三交易206的锁定脚本的一部分。第三交易206是通过执行第二交易204的锁定脚本来确认的耗用交易,其被配置为将由第二交易204持有的1单位的量X'支付给属于Alice的支付给公钥散列(P2PKH)地址,并保留新的总量(X”=X'–1)。然后挖掘第三交易206,使得第三交易206嵌入到区块中,然后对该区块进行验证,使得该区块存储在区块链208上。如果期望的话,可以将第三交易206(或其一部分)的锁定脚本复制并结合为如上所述的一个或更多个随后的耗用交易的锁定脚本的一部分。因此,可以看出,随着处理继续进行,与初始量X无关,最终将产生耗用交易以输出数字资产的不可耗用量(例如,零)。这即使不扣除在各种区块链协议中扣除的最低交易费用,也可以通过观察每个后续耗用交易将比其前一交易拥有更少的数字资产量来直观地理解。因此,输出的量将收敛于零,此时进行交易变得毫无意义。然而,本公开的实施方式包括通过实现终止条件以避免这种不可耗用的耗用交易来解决该问题的解决方案。一旦被确认并存储在区块链上,相应交易序列202、204、206等就提供了对交易引用的数字资产的控制的转移。
[0102] 此外,在实施方式中,智能合约的交易序列202、204、206等包括具有在所有交易中拷贝或复制的字节码序列的锁定脚本。因此,针对智能合约的每个耗用交易的确认过程可以包括:从前一交易中提取锁定脚本的字节码序列,从耗用交易中提取锁定脚本的字节码序列,并且验证这两个提取的字节码序列彼此是否匹配。
[0103] 下表1中提供了此过程的基本概况:
[0104] 表1:
[0105]
[0106]
[0107] 如在上面的脚本中可以看到的,前一交易(例如,第一交易202)的锁定脚本的字节码序列——其为将解锁前一交易的UTXO的锁定脚本——针对耗用交易(例如,第二交易204)的锁定脚本的字节码序列进行验证,当该耗用交易是另一耗用交易(例如,第三交易
206)的前一交易时,该耗用交易在将来将会被赎回。因此,锁定脚本不是为每个交易创建不同的耗用交易,而是强制实施用于两个锁定脚本的字节码序列必须相同。如果前一交易的锁定脚本的字节码序列与耗用交易的锁定脚本的字节码序列相同,则确保两个锁定脚本都是真实的。
[0108] 在实施方式中,终止条件避免了前一交易没有足够资金但是锁定脚本仍然进行确认的情况,即,不可耗用的交易。例如,可以实施终止条件以验证是否有足够的数字资产来执行下一交易,否则终止确认。作为更具体的示例,如果初始池包含365单位的数字资产加上每次交易费用所需的量(例如,足够一年中每天进行一次交易),则终止条件可以证实剩余的单位数量超过完成交易所需的单位数量;例如,只要有足够的资金,就可以继续确认交易。否则,如果资金不足,则满足终止条件,并且终止确认。因此,如果在第366天没有足够的资金,则确认第366个耗用交易的锁定脚本是不必要的,并且终止条件确保其终止交易和相关联的锁定脚本的复制。
[0109] 注意,图2的如上所述的将数字资产支付给属于Alice的支付给公钥散列(P2PKH)地址的智能合约是示例性的。在实施方式中,本文中所描述的锁定脚本的原理和操作可以被扩展以支持使用区块链的各种各样的智能合约。在本文档中,使用术语“智能合约”来包括其条款由交易序列执行的合约,这些交易采用计算机化交易协议,以将交易存储在区块链上。
[0110] 图3示出了根据本公开的实施方式的示例性交易,该示例性交易采用具有公共字节码序列的锁定脚本来实现去信任化的确定性状态机。更具体地,公共字节码序列是可以被视为下述状态机的计算机程序:该状态机体现具有一组定义明确的状态的一组状态规则,从而执行字节码序列(计算机程序)的字节码提供了状态机的状态之间的转换。
[0111] 如图3中示意性地示出的,前一交易302包括具有字节码序列的锁定脚本304,该字节码序列表示用于状态机306的一组状态规则。锁定脚本304还包括:表示由字节码序列所表示的状态机306的状态内的、当前状态的序列化状态数据;和当前状态执行指针(或“当前执行指针”)。在所示示例中,锁定脚本304的序列化状态数据和当前执行指针表示当前状态“S1”,并且由字节码序列所表示的状态机306的一组状态规则提供了用于当前状态S1之后的下一状态的两种可能的状态(“S2”或“S3”)。被包含为锁定脚本304的一部分的当前执行指针是指与当前状态(在这种情况下为状态“S1”)相对应的字节码序列的执行点。被包含为锁定脚本304的一部分的序列化状态数据表示在由包含于锁定脚本304中的当前执行指针所引用的执行点处、由字节码序列所表示的状态机的状态。
[0112] 从图3的示例中可以看出的,耗用交易308包括具有字节码序列的锁定脚本312,该字节码序列表示状态机314的一组状态规则,状态机314是由前一交易302的锁定脚本304的字节码序列表示的状态机306的副本。锁定脚本312还包括表示当前状态S1之后可能的下一状态之一(在这种情况下为状态“S2”)的序列化状态数据和下一状态执行指针(或“下一执行指针”)。包含为锁定脚本312的一部分的下一执行指针是指与当前状态S1之后的下一状态(在这种情况下为状态“S2”)相对应的字节码序列的执行点。包含为锁定脚本312的一部分的序列化状态数据表示在由包含于锁定脚本312中的下一执行指针所引用的执行点处、由字节码序列所表示的状态机的状态。
[0113] 注意,在创建耗用交易时,包含为锁定脚本312的一部分的序列化状态数据可以通过下述方式确定:使用前一交易的锁定脚本304的序列化状态数据来恢复锁定脚本的字节码序列的当前执行状态以生成或访问包含在锁定脚本312中的下一执行指针,然后执行锁定脚本的字节码序列。这样的执行始于与包含在前一交易302中的当前执行指针相对应的点(或操作),并终止于与包含在锁定脚本312中的下一执行指针所对应的点(或操作)。这样的执行还可以使用通过执行耗用交易308的解锁脚本确定的输入数据310来进行。
[0114] 作为确认耗用交易308的一部分,执行耗用交易308的解锁脚本和锁定脚本304/312的公共字节码序列。公共字节码序列的执行将根据执行耗用交易308的解锁脚本所确定的输入数据310、以及由包含在前一交易302的锁定脚本304中的序列化状态数据和当前执行指针及包含在耗用交易308的锁定脚本312中的下一执行指针所体现的当前状态“S1”作为输入,并且从与包含在前一交易302的锁定脚本304中的当前状态执行指针相对应的点(或操作)到与包含在耗用交易308的锁定脚本312中的下一执行指针相对应的点(或操作)执行锁定脚本304/312的公共字节码序列。这样的执行从由公共字节码序列所表示的一组状态规则314确定适当的下一状态(比如,第二状态“S2”)。从公共字节码序列的执行到与包含在耗用交易308的锁定脚本312中的下一执行指针相对应的点(或操作)所确定的该下一状态(比如,状态“S2”)被组织为序列化状态数据,该序列化状态数据遵循包含为耗用交易
308的锁定脚本312的一部分的状态数据的序列化格式。然后,针对作为耗用交易308的锁定脚本312的一部分包含的序列化状态数据,对根据公共字节码序列的执行所确定的序列化状态数据进行验证。再次,并非为每个交易创建不同的耗用交易,而是锁定脚本的执行强制实施在确认耗用交易期间通过执行锁定脚本的字节码序列所得到的执行状态与在创建耗用交易时包含在耗用交易中的锁定脚本的预期得到的执行状态相匹配。如果这两个得到的执行状态相同,则确保锁定脚本有效。
[0115] 注意,图3的示例示出的是,由耗用交易308的锁定脚本312的字节码序列所表示的状态机的状态提供了新的状态“S4”或“S5”,新的状态“S4”或“S5”对于从状态“S2”开始的下一状态转换是可能的。应当指出的是,可以将由锁定脚本的字节码序列所表示的一组状态规则编码为由当前状态和一个或更多个输入参数化的switch语句或其他条件语句(例如,“if-then-else”)。
[0116] 在实施方式中,包含在交易的锁定脚本中的字节码序列表示状态机的一组状态规则,并且交易的锁定脚本的执行指针和序列化状态数据表示状态机的状态。在这样的实施方式中,将交易的锁定脚本的字节码序列被拷贝或复制到尝试将对数字资产的控制转移到下一交易的每个耗用交易,该下一交易必须链接到当前交易。此过程重复进行,直到满足终止条件为止。由于根据执行耗用交易的解锁脚本所确定的输入数据不是固定的并且可以是不确定的数据,因此可以基于特定的外部输入来使状态机的状态发生变化。因此,不确定的数据提供了可能会影响下一状态的输入。
[0117] 此外,在确认耗用交易时将执行的锁定脚本的字节码操作的数量——其取决于如包含在前一交易中的锁定脚本的字节码序列的当前执行状态的执行指针与如包含在耗用交易中的锁定脚本的字节码序列的下一执行状态的执行指针之间的差异——可以通过选择或改变如包含在耗用交易中的锁定脚本的字节码序列的下一执行状态的执行指针进行设计来改变。以此方式,在确认耗用交易时将执行的锁定脚本的字节码操作的数量可以被约束或者用于使对耗用交易(耗用交易为对锁定脚本进行耗用的交易)的约束条件参数化。该参数化的约束条件可以用于限制交易之间执行的字节码操作的数量(例如,以避免智能合约的字节码序列的低效操作),以在逻辑上将智能合约的字节码序列分为在耗用交易序列上执行的不同分段,以基于参数化的约束条件来计算对创建新交易的实体的奖励,或用于其他可能的用途。
[0118] 在说明性示例中,Alice向Bob借了一些钱,并且Bob同意向Alice还钱。如上所述的去信任化的确定性状态机可以用于实现表示Bob向Alice付款的智能合约。例如,可以构建智能合约,使得Bob在接下来的三个月中每月向Alice付款,如果错过付款,Bob的债务将进入收债阶段。因此,只要Bob每月付款,当前状态就保持在偿还状态。然而,如果外部实体提供指示Bob错过了付款的输入,则状态分支进入到错过付款状态。在错过付款状态下,Alice可以释放交易并将其移交给收债员,于是去信任化的确定性状态机将切换到收债状态。在收债状态下,收债员将向Bob收债。可以使用图2和图3中描绘的实施方式的脚本的变体来创建这样的智能合约。
[0119] 在另一示例中,Alice是非常慈善的人,她每个月都会捐赠1单位的数字资产。她的规则是任何人都可以主张数字资产,但每月只能主张1单位。Alice以本公开中描述的方式创建智能合约,并将智能合约与3单位的数字资产的初始池一起制种。Alice可以构建允许任何实体每月收取1单位的数字资产的脚本。数字资产的其余部分将复制到后续的智能合约。
[0120] 在其他实施方式中,本文中所描述的锁定脚本的原理和操作可以扩展为支持使用区块链的各种各样的智能合约。
[0121] 下表2示出了实现本公开的去信任化的确定性状态机的解锁脚本和锁定脚本的示例。
[0122] 表2:
[0123]
[0124]
[0125]
[0126] 图4A至图4C共同为示出了示例性操作的流程图,该示例性操作执行作为智能合约的一部分的耗用交易的解锁脚本和前一交易的锁定脚本。这些操作可以是耗用交易的确认过程的一部分。耗用交易包括具有字节码序列的锁定脚本,该字节码序列实现根据本公开的实施方式的去信任化的确定性状态机。锁定脚本还包括表示状态机的下一执行状态的序列化状态数据和下一状态执行指针(或“下一执行指针”)。包含为锁定脚本的一部分的下一执行指针是指与下一执行状态相对应的字节码序列的执行点。包含为锁定脚本的一部分的序列化状态数据表示在由包含于耗用交易的锁定脚本中的下一执行指针所引用的执行点处、由字节码序列所表示的状态机的执行状态。
[0127] 注意,在创建耗用交易时,包含为耗用交易的锁定脚本的一部分的序列化状态数据可以通过下述方式确定:使用前一交易的锁定脚本的序列化状态数据来恢复状态机的当前执行状态以生成或访问包含在耗用交易的锁定脚本中的下一执行指针,然后执行锁定脚本的字节码序列。这样的执行始于在与包含在前一交易的锁定脚本中的当前执行指针相对应的点(或操作),并终止于与包含在耗用交易的锁定脚本中的下一执行指针相对应的点(或操作)。这样的执行还可以使用耗用交易的解锁脚本的输入。设想到的是,耗用交易的创建可以包括与钱包、代理节点或区块链网络的一些其他节点相关的操作。
[0128] 图4A至图4C的操作中的一些或全部操作(或描述的任何其他处理、或这些处理的变体和/或组合)可以在配置有可执行指令和/或其他数据的一个或更多个计算机系统的控制下执行,并且可以实现为在一个或更多个处理器上共同地执行的可执行指令。可执行指令和/或其他数据可以存储在非暂时性的计算机可读存储介质上(例如,永久存储在磁、光或闪存介质上的计算机程序)。
[0129] 例如,图4A至图4C的操作中的一些或全部操作可以由示例区块链网络(比如图1的示例区块链网络100)中的确认节点执行。这样的确认节点可以包括任何合适的计算设备(例如,数据中心中的服务器、客户端计算设备、计算资源服务提供商的分布式系统中的多个计算设备、或任何合适的电子客户端设备,比如图13的计算设备2600)。
[0130] 图4A至图4C的操作验证前一交易和耗用交易的锁定脚本的字节码序列是否相同,从前一交易获取当前执行状态,通过执行耗用交易的解锁脚本而获取输入,至少部分地基于对锁定脚本的字节码序列的解释来确定下一执行状态,并且验证通过执行锁定脚本所确定的下一执行状态与由包含为耗用交易的锁定脚本的一部分的下一状态数据所表示的下一执行状态是否匹配。图4A至图4C反映了表2中发现的示例脚本的变体。假定前一交易的锁定脚本(例如,scriptPubKey)以及耗用交易的解锁脚本(例如,scriptSig)和锁定脚本(例如,scriptPubKey)都存储在虚拟存储器中,这可以通过一个或更多个运行时间数据结构——比如堆栈、堆栈框架或堆——来实现。
[0131] 在401中,确定是否满足终止条件。在实施方式中,终止条件可以是这样的条件,该条件在满足时导致由锁定脚本的字节码序列所表示的状态机转换结束。如果满足终止条件,则操作进行到435,在此避免锁定脚本的进一步复制,使得作为智能合约的一部分的锁定脚本的复制结束,并且操作继续进行到427和429,如下所述。如果不满足终止条件,则操作继续进行到403。
[0132] 在403中,从虚拟存储器中检索前一交易的锁定脚本的字节码序列,并从虚拟存储器中检索耗用交易的锁定脚本的字节码序列,并且将两个锁定脚本的字节码序列彼此比较,以确定其是否匹配。
[0133] 在405中,确定在403中比较的两个锁定脚本的字节码序列彼此是否匹配。如果不匹配,则操作继续进行到433,由此确定耗用交易无效。如果匹配,则操作继续进行到407。
[0134] 在407中,从虚拟存储器中检索用于锁定脚本的字节码序列的当前执行状态的执行指针(如包含在前一交易的锁定脚本中)。
[0135] 在409中,从虚拟存储器中检索用于锁定脚本的字节码序列的下一执行状态的执行指针(如包含在耗用交易的锁定脚本中)。
[0136] 在411中,从虚拟存储器中检索锁定脚本的当前状态数据(如包含在前一交易的锁定脚本中),并且使用锁定脚本的当前状态数据恢复虚拟存储器中的锁定脚本的字节码序列的执行状态。例如,可以以序列化格式从虚拟存储器中提取锁定脚本的当前状态数据,然后将锁定脚本的当前状态数据反序列化为堆栈格式,以用于恢复虚拟存储器的存在于锁定脚本的字节码序列的前一次执行结束时的堆栈数据结构(其中,执行指针位于如包含在前一交易的锁定脚本中的当前状态执行指针处)。
[0137] 在413中,可以基于存储在虚拟存储器中的一个或多个输入来执行锁定脚本的字节码序列(如包含在前一交易的锁定脚本中)。对锁定脚本的字节码序列的执行在用于锁定脚本的字节码序列的当前执行状态的执行指针(如在407中检索到的)处开始,并在到达用于锁定脚本的字节码序列的下一执行状态的执行指针(在409中检索到的)处终止。在实施方式中,锁定脚本的字节码序列的字节码是计算机指令,但不是机器代码(因此不与任何特定的CPU硬件绑定),其中,这些计算机指令被设计用于有效执行,该有效执行包括由软件解释器进行的解释,该软件解释器是确认耗用交易的节点的运行时间系统(例如,区块链客户端)的一部分。软件解释器的执行可以配置为将字节码序列段的字节码(例如,从用于锁定脚本的字节码序列的当前执行状态的执行指针至用于锁定脚本的字节码序列的下一执行状态的执行指针)转换成适合在节点的特定CPU硬件上执行的机器代码,该节点在运行时根据需要确认耗用交易并在特定CPU硬件上执行机器代码。软件解释器的执行可以将字节码序列段的字节码一次一个字节码依次转换为机器代码(例如,简单解释),或者可以采用及时编译方法,其中,字节码序列段(或其部分)在运行时根据需要被编译为机器代码,然后执行所得到的机器代码。所得到的机器代码可以被缓存并稍后再次使用,而无需重新编译。
[0138] 在415中,确定锁定脚本的字节码序列的执行是否已经到达与用于锁定脚本的字节码序列的下一执行状态的执行指针相对应的点。如果没有到达,则操作返回到413,在此继续执行锁定脚本的字节码序列。如果到达,则操作继续进行到417。
[0139] 在417中,确定存储在虚拟存储器中的所得到的执行状态是否评估为真。在实施方式中,该检验确保耗用交易的解锁脚本的操作和前一交易的锁定脚本的操作均已完成且没有错误,并且确保由耗用交易的解锁脚本和前一交易的锁定脚本编码的任何条件和所有条件已被满足。如果没有,则操作继续进行到433,由此确定耗用交易无效。如果是这样,则操作继续进行到419。
[0140] 在419中,存储在虚拟存储器中的锁定脚本的字节码序列的所得到的执行状态(在到达用于锁定脚本的字节码序列的下一执行状态的执行指针之后)被组织并存储为表示锁定脚本的字节码序列的下一执行状态的序列化状态数据。序列化状态数据以包含在耗用交易中的序列化格式被存储在虚拟存储器中。
[0141] 在421中,从虚拟存储器中检索表示锁定脚本的字节码序列的下一执行状态的序列化状态数据。
[0142] 在423中,将如在419中确定的、表示锁定脚本的字节码序列的下一执行状态的序列化状态数据与如在421中从虚拟存储器中检索到的表示如包含在耗用交易中的锁定脚本的字节码序列的下一执行状态的序列化状态数据进行比较,以确定序列化状态数据是否匹配。
[0143] 在425中,确定序列化状态数据是否匹配。如果不匹配,则操作继续进行到433,由此确定耗用交易无效。如果匹配,则操作继续进行到427和429。
[0144] 在427和429中,操作确定是否满足用于耗用交易的有效性的一个或更多个其他条件。这样的条件可以包括在耗用交易的锁定脚本或解锁脚本中指定的其他约束条件。如果满足,则操作继续进行到431,随后执行确认过程的系统可以将耗用交易视为有效。如果不满足,则操作继续进行到433,由此确定耗用交易无效。应当指出的是,在401至435中执行的一个或更多个操作可以以各种顺序和组合来执行,包括并行执行。
[0145] 还应当指出的是,如果确定耗用交易是有效的(例如,在431中)并且可以存储在区块链上以及在确定耗用交易是有效的(例如,在431中)并且可以存储在区块链上的情况下,可以复制耗用交易的锁定脚本的字节码序列以生成“新的”耗用交易。以此方式,“旧的”耗用交易的一部分被复制为对该交易进行耗用的交易。在这种情况下,“新的”耗用交易的输入可以引用此“旧的”耗用交易,“新的”耗用交易的输出可以包括这样的锁定脚本,该锁定脚本包括此“旧的”耗用交易的锁定脚本的字节码序列的副本。作为确认过程的一部分,“新的”耗用交易的确认过程可以将“旧的”耗用交易等同于前一交易。
[0146] 此外,在确认“新的”耗用交易时将执行的锁定脚本的字节码操作的数量——其取决于如包含在“旧的”耗用交易中的锁定脚本的当前执行状态的执行指针与如包含在“新的”耗用交易中的锁定脚本的下一执行状态的执行指针之间的差异——可以通过选择或改变包含在“新的”耗用交易中的锁定脚本的下一执行状态的执行指针进行设计来改变。以此方式,在确认“新的”耗用交易时将执行的锁定脚本的字节码操作的数量可以被约束或者用于使对“新的”耗用交易(该“新的”耗用交易为对锁定脚本进行耗用的交易)的约束条件参数化。该参数化的约束条件可以用于限制交易之间执行的字节码操作的数量(例如,以避免智能合约的字节码序列的低效操作),以在逻辑上将智能合约的字节码序列分为在耗用交易序列上执行的不同段,以基于参数化的约束条件来计算对创建新交易的实体的奖励,或用于其他可能的用途。
[0147] 还应当指出的是,在如上所述的一个或更多个实施方式中,对于给定的锁定脚本,耗用交易是在其输入中的一个输入方面中引用锁定脚本的交易,并且前一交易是包含在耗用交易的输入中的一个输入中引用的锁定脚本的交易。此外,前一交易可以与耗用交易中的输入一样多。此外,区块链协议可能不允许锁定脚本查询其耗用交易或其先前交易中的一个交易。然而,由于交易只是具有某些属性的数据,而锁定脚本只是对解锁脚本上的约束条件进行编码以包含某些数据,因此可以利用这些属性来提供锁定脚本,从而导致将耗用交易和前一交易注入解锁脚本中。这允许锁定脚本约束耗用交易(例如,耗用交易必须具有一个输出),并且还可以从前一交易中提取数据。应当指出的是,锁定脚本不能约束前一交易,因为前一交易已被写入到区块链中。两者的组合意味着锁定脚本可以从前一交易中提取数据并约束耗用交易,但前提是前一交易和耗用交易的锁定脚本包含相同的字节码序列。
[0148] 此外,锁定脚本的字节码序列以及解锁脚本和锁定脚本本身可以被视为计算机程序。如此,解锁脚本和锁定脚本需要访问执行解锁脚本和锁定脚本的CPU的存储器系统。在实施方式中,可以对存储系统的一部分(在本文中称为虚拟存储器)进行分配和管理,以存储锁定脚本和解锁脚本的字节码序列和相关数据。
[0149] 应当指出的是,如本文中所描述的锁定脚本的字节码解释器可以被配置为支持如系统的设计所指示的各种字节码操作。然而,几乎可以肯定,一组支持的字节码操作将允许与虚拟存储器进行交互。在比特币脚本语言中,存在一系列字节码用于存储器管理。下面示出了一些字节码:
[0150] ·OP_TOALTSTACK:将顶部项从主堆栈移到备用堆栈的顶部
[0151] ·OP_FROMALTSTACK:将顶部项从备用堆栈移至主堆栈的顶部
[0152] ·OP_SWAP:交换堆栈上的前两个项
[0153] ·OP_PICK:在堆栈中获取特定的项,并将其复制到顶部
[0154] ·OP_ROLL:在堆栈中获取特定的项,并将其放置在顶部
[0155] 此外,在本文描述的实施方式中,锁定脚本的字节码序列可以包括高级字节码操作(或“虚拟字节码操作”),该高级字节码操作被解释为由确认节点的运行时间系统(例如,区块链客户端)的软件解释器所支持的相应序列或低级字节码操作的组合。在这种情况下,锁定脚本的字节码序列本质上是程序中的程序,非常类似于软件在操作系统顶部上的运行方式。在这样的实施方式中,用于锁定脚本的状态数据和执行指针可以被保持在驻留于虚拟存储器中的两个虚拟堆栈中,如图5所示,这两个虚拟堆栈通常称为虚拟主堆栈和虚拟Alt堆栈,并且可以存储为比特币主堆栈的一部分。应当指出的是,虚拟主堆栈位于虚拟Alt堆栈的顶部上。为了跟踪这两个堆栈数据结构的开始,主堆栈包含指向虚拟主堆栈的顶部的指针。这两个堆栈数据结构中的每个堆栈数据结构都可以存储一组项,第一是堆栈高度(不计算自身),然后是数据。在这种配置中,锁定脚本的状态数据和执行指针有效地存储在两个虚拟存储器数据结构(虚拟主堆栈和虚拟Alt堆栈)中,这两个虚拟存储器数据结构嵌入在另一个更大的虚拟存储器数据结构(主堆栈)中。
[0156] 例如,表3A和表3B示出了称为VOP_SWAP和VOP_DROP的两个高级字节码操作,这两个高级字节码操作在图5的虚拟主堆栈和虚拟Alt堆栈上以如下方式工作。
[0157] 表3A
[0158]
[0159] 表3B
[0160]
[0161] 应当指出的是,用于这两个字节码操作的脚本假定在执行相应操作之前已执行任何必要的错误检查(例如,虚拟主堆栈的高度>=2)。
[0162] 在本文中所描述的实施方式中,从虚拟存储器中提取或检索如包含在前一交易中的锁定脚本的字节码序列的当前执行状态,以进行处理(例如,参见如上所述的411)。类似地,在执行锁定脚本的字节码序列之后,如存储在虚拟存储器中的锁定脚本的字节码序列的所得到的执行状态被组织为序列化状态数据,并与包含在耗用交易的锁定脚本中的序列化状态数据进行比较(例如,参见如上所述的419、421和423)。在实施方式中,锁定脚本的状态数据具有两种格式:用于嵌入交易中的第一序列化格式;以及用于在虚拟存储器中“容易/直接”解释和操纵的第二格式。此外,从第一序列化格式改变为第二格式(可以是如上所述的411的一部分)可以称为反序列化,而从第二格式改变为第一序列化格式可以称为序列化(可以是如上所述的419的一部分)。图5示出了第二格式。图6示出了第一序列化格式,其中,执行状态数据由有序字节串表示,该有序字节串中包括以下内容:
[0163] -堆栈高度字段,其对字节串中的堆栈项的数量进行编码
[0164] -若干堆栈项,这些堆栈项各自都包括尺寸字段和数据字段,其中,尺寸字段指示堆栈项的数据字段的字节数。
[0165] 图7示出了表示如包含在前一交易中以用于存储在虚拟存储器中的锁定脚本的字节码序列的当前执行状态的字节串、以恢复锁定脚本的字节码序列的当前状态的方式进行的反序列化(例如,参见如上所述的411)。下表4中提供了示例脚本,该示例脚本对表示如包含在前一交易中以用于存储在图5的虚拟主堆栈和虚拟Alt堆栈中的锁定脚本的字节码序列的当前状态的字节串进行反序列化。
[0166] 表4
[0167]
[0168]
[0169]
[0170]
[0171]
[0172] 图8示出了将存储在虚拟存储器中的锁定脚本的字节码序列的所得到的执行状态序列化为表示如包含在耗用交易中的锁定脚本的字节码序列的下一状态数据的序列化字节串(例如,参见如上所述的419)。下表5中提供了示例脚本,该示例脚本将存储在图5的虚拟主堆栈和虚拟Alt堆栈中的锁定脚本的字节码序列的所得到的执行状态序列化为序列化字节串,该序列化字节串表示如包含在耗用交易中的锁定脚本的字节码序列的下一状态数据。
[0173] 表5
[0174]
[0175]
[0176] 在实施方式中,在耗用交易的序列上复制的锁定脚本可以包括用于解释锁定脚本的字节码序列的解释器代码。解释器代码可以支持高级字节码或命令的转换,这些高级字节码或命令扩展或补充了由确认节点的运行时间系统(例如,区块链客户端)的软件解释器所支持的低级字节码操作。例如,解释器代码可以支持将高级字节码(或虚拟字节码)转换为由确认节点的运行时系统的软件解释器所支持的相应序列或低级字节码操作的组合。在这种情况下,解释器代码可以支持将表3A和表3B的虚拟字节码操作VOP_SWAP和VOP_DROP转换为属于比特币脚本语言并由确认节点的运行时间系统(例如,比特币客户端)的软件解释器所支持的op_code或命令。在另一示例中,解释器代码可以支持以高级编程语言编写的脚本字节码操作的转换,以由确认节点的运行时间系统的软件解释器进行解释。在这种情况下,解释器代码可以支持将以高级编程语言编写的脚本字节码操作转换为属于比特币脚本语言并由确认节点的运行时间系统的软件解释器所支持的op_code或命令。
[0177] 此外,在实施方式中,用于智能合约的每个耗用交易的确认过程可以包括:从前一交易中提取锁定脚本的字节码序列,从耗用交易中提取锁定脚本的字节码序列,验证这两个提取的字节码序列彼此是否匹配,从前一交易中提取锁定脚本的解释器代码,从耗用交易中提取锁定脚本的解释器代码,并且验证这两个提取的解释器代码彼此是否匹配。
[0178] 图9示出了根据本公开的实施方式的示例性交易,该示例性交易采用具有公共字节码序列和共享解释器代码的锁定脚本来实现去信任化的确定性状态机。更具体地,公共字节码序列是可以被视为下述状态机的计算机程序:该状态机体现具有一组定义明确的状态的一组状态规则,从而执行字节码序列(计算机程序)的字节码提供了状态机的状态之间的转换。共享解释器代码支持对锁定脚本的字节码序列进行解释。
[0179] 如图9中示意性的示出的,前一交易302'包括具有字节码序列和解释器代码的锁定脚本304',字节码序列表示用于状态机306'的一组状态规则,解释器代码支持对锁定脚本304'的字节码序列进行解释。锁定脚本304'还包括表示由锁定脚本304'的字节码序列所表示的状态机306'的状态内的当前状态的序列化状态数据和当前状态执行指针(或“当前执行指针”)。在所示示例中,锁定脚本304'的序列化状态数据和当前执行指针表示当前状态“S1”,并且由字节码序列所表示的状态机306'的一组状态规则提供了用于当前状态S1之后的下一状态的两种可能的状态(“S2”或“S3”)。被包含为锁定脚本304'的一部分的当前执行指针是指与当前状态(在这种情况下为状态“S1”)相对应的字节码序列的执行点。被包含为锁定脚本304'的一部分的序列化状态数据表示在由包含于锁定脚本304'中的当前执行指针所引用的执行点处、由字节码序列所表示的状态机的状态。
[0180] 如从图9的示例中可以看出的,耗用交易308'包括具有字节码序列和解释器代码的锁定脚本312',字节码序列表示状态机314'的一组状态规则,解释器代码支持对锁定脚本312'的字节码序列进行解释。状态机314'是由前一交易302'的锁定脚本304'的字节码序列所表示的状态机306'的副本,并且解释器代码是前一交易302'的锁定脚本304'的解释器代码的副本。锁定脚本312'还包括表示当前状态S1之后的可能的下一状态之一(在此情况下为状态“S2”)的序列化状态数据和下一状态执行指针(或“下一执行指针”)。被包含为锁定脚本312'的一部分的下一执行指针是指与当前状态S1之后的下一状态(在这种情况下为状态“S2”)相对应的字节码序列的执行点。被包含为锁定脚本312'的一部分的序列化状态数据表示在由包含于锁定脚本312'中的下一执行指针引用的执行点处、由字节码序列所表示的状态机的状态。
[0181] 注意,在创建耗用交易时,包含在锁定脚本312'中的序列化状态数据可以通过下述方式确定:使用前一交易的锁定脚本304'的序列化状态数据来恢复锁定脚本的字节码序列的当前执行状态以生成或访问包含在锁定脚本312'中的下一执行指针,然后执行锁定脚本的字节码序列。这样的执行始于与包含在前一交易302'中的当前执行指针相对应的点(或操作),并终止于与包含在锁定脚本312'中的下一执行指针相对应的点(或操作)。这样的执行还可以使用通过执行耗用交易308'的解锁脚本而确定的输入数据310'。
[0182] 作为确认耗用交易308'的一部分,执行耗用交易308'的解锁脚本和锁定脚本304'/312'的公共字节码序列。公共字节码序列的执行将通过执行耗用交易308'的解锁脚本所确定的输入数据310'、以及由包含在前一交易302'的锁定脚本304'中的序列化状态数据和当前执行指针及包含在耗用交易308'的锁定脚本312'中的下一执行指针所体现的当前状态“S1”作为输入,并调用共享的解释器代码,以从与包含在前一交易302'的锁定脚本
304'中的当前状态执行指针相对应的点(或操作)到与包含在耗用交易308'的锁定脚本
312'中的下一执行指针相对应的点(或操作),对锁定脚本的公共字节码序列进行解释。这样的解释根据由字节码序列所表示的一组状态规则314'确定适当的下一状态(比如,第二状态“S2”)。从字节码序列的解释到与包含在耗用交易308'的锁定脚本312'中的下一执行指针相对应的点(或操作)所确定的该下一状态(例如状态“S2”)被组织为这样的序列化状态数据,该序列化状态数据遵循包含为耗用交易308'的锁定脚本312'的一部分的状态数据的序列化格式。然后,针对作为耗用交易308'的锁定脚本312'的一部分包含的序列化状态数据,对根据公共字节码序列的执行所确定的序列化状态数据进行验证。再次,并非为每个交易创建不同的耗用交易,而是锁定脚本的执行强制实施在确认耗用交易期间通过执行锁定脚本的字节码序列所得到的执行状态与在创建耗用交易时包含在耗用交易中的锁定脚本的预期得到的执行状态相匹配。如果这两个得到的执行状态相同,则确保耗用交易308'的锁定脚本有效。
[0183] 注意,图9的示例示出的是,由耗用交易308'的锁定脚本312'的字节码序列所表示的状态机的状态提供了新的状态“S4”或“S5”,新的状态“S4”或“S5”对于从状态“S2”开始的下一状态转换是可能的。应当指出的是,可以将由锁定脚本的字节码序列所表示的一组状态规则编码为由当前状态和一个或更多个输入参数化的switch语句或其他条件语句(例如,“if-then-else”)。
[0184] 在实施方式中,包含在交易的锁定脚本中的字节码序列表示状态机的一组状态规则,并且包含在交易的锁定脚本中的执行指针和序列化状态数据表示状态机的状态。锁定脚本还包括用于对锁定脚本的字节码序列进行解释的解释器代码。在这样的实施方式中,交易的锁定脚本的字节码序列和解释器代码被拷贝或复制到尝试将对数字资产的控制转移到下一交易的每个耗用交易,该下一交易必须链接到当前交易。此过程重复进行,直到满足终止条件为止。因为通过执行耗用交易的解锁脚本所确定的输入数据不是固定的并且可以是不确定的数据,因此可以基于特定的外部输入来使状态机的状态发生变化。因此,不确定的数据提供了可能会影响下一状态的输入。
[0185] 此外,在确认耗用交易时将解释的锁定脚本的字节码操作的数量——其取决于如包含在前一交易中的锁定脚本的字节码序列的当前执行状态的执行指针与如包含在耗用交易中的锁定脚本的字节码序列的下一执行状态的执行指针之间的差异——可以通过选择或改变如包含在耗用交易中的锁定脚本的字节码序列的下一执行状态的执行指针进行设计来改变。以此方式,在确认耗用交易时将解释的锁定脚本的字节码操作的数量可以被约束或者用于使对耗用交易(耗用交易为对锁定脚本进行耗用的交易)的约束条件参数化。该参数化的约束条件可以用于限制交易之间解释的字节码操作的数量(例如,以避免智能合约的字节码序列的低效操作),以在逻辑上将智能合约的字节码序列分为在耗用交易序列上执行的不同段,以基于参数化的约束条件来计算对创建新交易的实体的奖励,或用于其他可能的用途。
[0186] 下表6示出了实现本公开的去信任化的确定性状态机的解锁脚本和锁定脚本的示例。
[0187] 表6:
[0188]
[0189]
[0190]
[0191] 图10A至图10C共同为示出了示例性操作的流程图,该示例性操作执行作为智能合约的一部分的耗用交易的解锁脚本和前一交易的锁定脚本。这些操作可以是耗用交易的确认过程的一部分。耗用交易包括具有字节码序列和解释器代码的锁定脚本,该字节码序列和解释器代码实现根据本公开的实施方式的去信任化的确定性状态机。锁定脚本还包括表示状态机的下一执行状态的序列化状态数据和下一状态执行指针(或“下一执行指针”)。包含为锁定脚本的一部分的下一执行指针是指与下一执行状态相对应的字节码序列的执行点。包含为锁定脚本的一部分的序列化状态数据表示在由包含于锁定脚本中的下一执行指针所引用的执行点处、由字节码序列所表示的状态机的执行状态。解释器代码用于对锁定脚本的字节码序列进行解释。
[0192] 注意,在创建耗用交易时,包含为耗用交易的锁定脚本的一部分的序列化状态数据可以通过下述方式确定:使用前一交易的锁定脚本的序列化状态数据来恢复状态机的当前执行状态以生成或访问包含在耗用交易的锁定脚本中的下一执行指针,然后执行锁定脚本的字节码序列。这样的执行始于与包含在前一交易中的当前执行指针相对应的点(或操作),并终止于与包含在耗用交易的锁定脚本中的下一执行指针相对应的点(或操作)。这样的执行还可以使用耗用交易的解锁脚本的输入。设想到的是,耗用交易的创建可以包括与钱包、代理节点或区块链网络的一些其他节点相关的操作。
[0193] 图10A至图10C的操作中的一些或全部操作(或描述的任何其他处理、或这些处理的变体和/或组合)可以在配置有可执行指令和/或其他数据的一个或更多个计算机系统的控制下执行,并且可以实现为在一个或更多个处理器上共同地执行的可执行指令。可执行指令和/或其他数据可以存储在非暂时性的计算机可读存储介质上(例如,永久存储在磁、光或闪存介质上的计算机程序)。
[0194] 例如,图10A至图10C的操作中的一些或全部操作可以由示例区块链网络(比如图1的示例区块链网络100)中的确认节点执行。这样的确认节点可以包括任何合适的计算设备(例如,数据中心中的服务器、客户端计算设备、计算资源服务提供商的分布式系统中的多个计算设备、或任何合适的电子客户端设备,比如图13的计算设备2600)。
[0195] 图10A至图10C的操作验证智能合约的前一交易和耗用交易的锁定脚本的字节码序列和解释器代码是否都相同,从前一交易获取当前执行状态,通过执行耗用交易的解锁脚本而获取输入,至少部分地基于对锁定脚本的字节码序列的解释来确定下一执行状态,并且验证通过执行耗用交易的锁定脚本所确定的下一执行状态与由包含为耗用交易的锁定脚本的一部分的下一状态数据所表示的下一执行状态是否匹配。图10A至图10C的操作反映了表6中发现的示例脚本的变体。假定前一交易的锁定脚本(例如,scriptPubKey)以及耗用交易的解锁脚本(例如,scriptSig)和解锁脚本(例如,scriptSig)都存储在虚拟存储器中,这可以通过一个或更多个运行时间数据结构——比如堆栈、堆栈框架或堆——来实现。
[0196] 在1001中,确定是否满足终止条件。在实施方式中,终止条件可以是这样的条件,该条件在满足时导致由锁定脚本的字节码序列所表示的状态机转换结束。如果满足终止条件,则操作进行到1039,在此避免锁定脚本的进一步复制,使得作为智能合约的一部分的锁定脚本的复制结束,并且操作继续进行到1031和1033,如下所述。如果不满足终止条件,则操作继续进行到1003。
[0197] 在1003中,从虚拟存储器中检索前一交易的锁定脚本的字节码序列,并从虚拟存储器中检索耗用交易的锁定脚本的字节码序列,并且将两个锁定脚本的字节码序列彼此比较,以确定其是否匹配。
[0198] 在1005中,确定在1003中比较的两个锁定脚本的字节码序列彼此是否匹配。如果不匹配,则操作继续进行到1037,由此确定耗用交易无效。如果匹配,则操作继续进行到1007。
[0199] 在1007中,从虚拟存储器中检索前一交易的锁定脚本的解释器代码,并从虚拟存储器中检索耗用交易的锁定脚本的解释器代码,并且将两个锁定脚本的解释器代码彼此比较,以确定其是否匹配。
[0200] 在1009中,确定在1007中比较的两个锁定脚本的解释器代码彼此是否匹配。如果不匹配,则操作继续进行到1037,由此确定耗用交易无效。如果匹配,则操作继续进行到1011。
[0201] 在1011中,从虚拟存储器中检索用于锁定脚本的字节码序列的当前执行状态的执行指针(如包含在前一交易的锁定脚本中)。
[0202] 在1013中,从虚拟存储器中检索用于锁定脚本的字节码序列的下一执行状态的执行指针(如包含在耗用交易的锁定脚本中)。
[0203] 在1015中,从虚拟存储器中检索锁定脚本的当前状态数据(如包含在前一交易的锁定脚本中),并且使用锁定脚本的当前状态数据恢复虚拟存储器中的锁定脚本的字节码序列的执行状态。例如,可以以序列化格式从虚拟存储器中提取锁定脚本的当前状态数据,然后将锁定脚本的当前状态数据反序列化为堆栈格式,以用于恢复虚拟存储器的存在于锁定脚本的前一次执行结束时的堆栈数据结构(其中,执行指针位于如包含在前一交易的锁定脚本中的当前状态执行指针处)。
[0204] 在1017中,可以基于存储在虚拟存储器中的一个或多个输入来调用解释器代码(其包含在前一交易的锁定脚本中)以对锁定脚本的字节码序列进行解释。对锁定脚本的字节码序列的解释始于用于如在1011中检索到的锁定脚本的当前执行状态的执行指针,并在到达用于锁定脚本的下一执行状态的执行指针(在1013中检索到的)时终止。在实施方式中,锁定脚本的字节码序列的字节码是计算机指令,这些计算机指令被设计用于通过执行包含在前一交易中的解释器代码来解释。
[0205] 在实施方式中,解释器代码的执行将锁定脚本的字节码序列的字节码转换为由确认节点的运行时间系统(例如,区块链客户端)的软件解释器所支持的操作代码或命令,确认节点将这些操作代码或命令转换为在确认节点的CPU硬件上执行的机器代码,如图11所示。解释器代码的执行可以支持高级字节码或命令的转换,这些高级字节码或命令扩展或补充了由确认节点的运行时间系统的软件解释器所支持的低级字节码操作的命令。例如,解释器代码可以支持虚拟字节码的转换,该虚拟字节码表示由确认节点的运行时间系统的软件解释器所支持的字节码操作的组合。在这种情况下,解释器代码可以支持将表4A和表4B的虚拟字节码操作OP_VSWAP和OP_VDROP转换为属于比特币脚本语言且由确认节点的运行时间系统(例如,比特币客户端)的软件解释器所支持的op_code或命令。在另一示例中,解释器代码可以支持以高级编程语言编写的脚本字节码操作的转换,以由确认节点的运行时间系统的软件解释器进行解释。在这种情况下,解释器代码可以支持将以高级编程语言编写的脚本字节码操作转换为属于比特币脚本语言且由确认节点的运行时间系统的软件解释器所支持的op_code或命令。软件解释器的执行可以将操作码或命令一次一个字节码依次转换为机器代码(例如,简单解释),或者可以采用即时编译方法,其中,字节码序列段(或其部分)在运行时根据需要被编译为机器代码,然后执行所得到的机器代码。所得到的机器代码可以被缓存并稍后被再次使用,而无需重新编译。
[0206] 在1019,确定解释器代码是否已经将锁定脚本的字节码序列解释至与用于锁定脚本的字节码序列的下一执行状态的执行指针相对应的点。如果没有,则操作返回到1017,在此继续执行解释器代码。如果是这样,则操作继续进行到1021。
[0207] 在1021中,确定存储在虚拟存储器中的所得到的执行状态是否评估为真。在实施方式中,该检验确保耗用交易的解锁脚本的操作和前一交易的锁定脚本的字节码序列的操作均已完成且没有错误,并且确保由耗用交易的解锁脚本和前一交易的锁定脚本编码的任何和所有条件已被满足。如果没有,则操作继续进行到1037,由此确定耗用交易无效。如果是这样,则操作继续进行到1023。
[0208] 在1023中,存储在虚拟存储器中的锁定脚本的字节码序列的所得到的执行状态(在到达用于锁定脚本的字节码序列的下一执行状态的执行指针之后)被组织并存储为表示锁定脚本的字节码序列的下一执行状态的序列化状态数据。序列化状态数据采用如包含在耗用交易中的序列化格式。
[0209] 在1025中,从虚拟存储器中检索表示锁定脚本的字节码序列的下一执行状态的序列化状态数据。
[0210] 在1027中,将如在1023中确定的、表示锁定脚本的字节码序列的下一执行状态的序列化状态数据与如在1025中从虚拟存储器中检索到的表示如包含在耗用交易中的锁定脚本的字节码序列的下一执行状态的序列化状态数据进行比较,以确定序列化状态数据是否匹配。
[0211] 在1029中,确定序列化状态数据是否匹配。如果匹配,则操作继续进行到1031。如果不匹配,则操作继续进行到1037,由此确定耗用交易无效。
[0212] 在1031和1033中,操作确定是否满足用于耗用交易的有效性的一个或更多个其他条件。这样的条件可以包括在前一交易的解锁脚本和耗用交易的锁定脚本中指定的其他约束条件。如果满足,则操作继续进行到1035,随后执行确认过程的系统可以将耗用交易视为有效。如果不满足,则操作继续进行到1037,由此确定耗用交易无效。应当指出的是,在1001至1039中执行的一个或更多个操作可以以各种顺序和组合来执行,包括并行地执行。
[0213] 还应当指出的是,如果确定耗用交易是有效的(例如,在1035中)并且可以存储在区块链上,则可以复制耗用交易的锁定脚本的字节码序列以生成“新的”耗用交易。以此方式,“旧的”耗用交易的一部分被复制为对该交易进行耗用的交易。在这种情况下,“新的”耗用交易的输入可以引用此“旧的”耗用交易,“新的”耗用交易的输出可以包括锁定脚本,该锁定脚本嵌入此“旧的”耗用交易的锁定脚本的字节码序列的副本和共享的解释器代码。作为确认过程的一部分,“新的”耗用交易的确认过程可以将“旧的”耗用交易等同于前一交易。
[0214] 此外,在确认“新的”耗用交易时将解释的锁定脚本的字节码操作的数量——其取决于如包含在“旧的”耗用交易中的锁定脚本的字节码序列的当前执行状态的执行指针与如包含在“新的”耗用交易中的锁定脚本的下一执行状态的执行指针之间的差异——可以通过选择或改变如包含在“新的”耗用交易中的锁定脚本的字节码序列的下一执行状态的执行指针进行设计来改变。以此方式,在确认“新的”耗用交易时将解释的锁定脚本的字节码操作的数量可以被约束或用于使对“新的”耗用交易(该“新的”耗用交易为对锁定脚本进行耗用的交易)的约束条件参数化。该参数化的约束条件可以用于限制交易之间执行的字节码操作的数量(例如,以避免智能合约的字节码序列的低效操作),以在逻辑上将智能合约的字节码序列分为在耗用交易序列上执行的不同段,以基于参数化的约束条件来计算对创建新交易的实体的奖励,或用于其他可能的用途。还应当指出的是,在如上所述的一个或更多个实施方式中,对于给定的锁定脚本,耗用交易是在其输入中的一个输入方面中引用锁定脚本的交易,并且前一交易是包含在耗用交易的输入中的一个输入中引用的锁定脚本的交易。此外,前一交易可以与耗用交易中的输入一样多。此外,区块链协议可能不允许锁定脚本查询其耗用交易或其先前交易中的一个交易。然而,由于交易只是具有某些属性的数据,而锁定脚本只是对解锁脚本上的约束条件进行编码以包含某些数据,因此可以利用这些属性来提供锁定脚本,从而导致将耗用交易和前一交易注入解锁脚本中。这允许锁定脚本约束耗用交易(例如,耗用交易必须具有一个输出),并且还可以从前一交易中提取数据。应当指出的是,锁定脚本不能约束前一交易,因为前一交易已被写入到区块链中。两者的组合意味着锁定脚本可以从前一交易中提取数据并约束耗用交易,但前提是前一交易和耗用交易的锁定脚本包含相同的字节码序列。
[0215] 此外,锁定脚本的字节码序列以及解锁脚本和锁定脚本本身可以被视为计算机程序。由于字节码序列嵌入在锁定脚本内,因此字节码序列本质上是程序中的程序,就像软件在操作系统之上运行的方式一样。如此,解锁脚本和锁定脚本需要访问执行解锁脚本和锁定脚本的CPU的存储器系统。在实施方式中,可以对存储系统的一部分(在本文中称为虚拟存储器)进行分配和管理,以存储锁定脚本和解锁脚本的字节码序列和相关数据。
[0216] 图12A示出了在对包含在锁定脚本中的字节码序列进行解释时通过执行解释器代码而执行的示例性操作。在一个或多个实施方式中,解释器代码和字节码序列两者都被包含为如本文中所描述的锁定脚本的一部分。对于图5的虚拟存储器,字节码序列的解释可以包括:首先从锁定脚本的当前状态恢复虚拟主堆栈和虚拟Alt堆栈,然后从当前状态的执行指针开始直到到达下一状态的执行指针为止对单个字节码进行解释。
[0217] 作为对字节码进行解释的一部分,解释器代码的执行可以用来获取需要解释的下一字节码。下表7提供了执行此功能的称为OP_GETOP的操作代码。此操作代码本质上采用解释的字节码,从前一交易中提取当前位置,然后将所需的字节——在本实例中为下一字节码——返回到堆栈顶部。
[0218] 表7
[0219]
[0220] 下表8是描述解释器代码的执行的脚本,该解释器代码用于解释示例性字节码,特别是图12B中示意性示出的VOP_ADD字节码。
[0221] 表8
[0222]
[0223]
[0224] 应当指出的是,在描述所公开的实施方式的上下文中,除非另有说明,否则使用关于如下可执行指令(也称为代码、应用程序、代理等)的表述表示指令由机器执行从而使机器执行指定操作:该可执行指令执行“指令”通常不独立执行的操作(例如,数据的传输、计算等)。
[0225] 图13是可以用于实践本公开的至少一个实施方式的计算设备2600的说明性简化框图。在各种实施方式中,计算设备2600可以用于实现上面示出和描述的系统中的任意系统。例如,计算设备2600可以配置为用作数据服务器、网络服务器、便携式计算设备、个人计算机或任何电子计算设备。如图13所示,计算设备2600可以包括一个或更多个处理器2602,一个或更多个处理器2602可以配置为经由总线子系统2604与多个外围子系统通信并且操作性地耦接至多个外围子系统。处理器2602可以用于处理解锁脚本和锁定脚本,作为确认本文中所描述的耗用交易的一部分。这些外围子系统可以包括存储子系统2606(包括存储器子系统2608和文件/磁盘存储子系统2610)、一个或更多个用户接口输入设备2612、一个或更多个用户接口输出设备2614以及网络接口子系统2616。存储子系统2606可以用于信息、比如与本公开中所描述的交易相关联的细节的暂时或长期存储。
[0226] 总线子系统2604可以提供用于使计算设备2600的各个组件和子系统能够按预期彼此通信的机制。尽管总线子系统2604被示意性地示出为单个总线,但是总线子系统的替代实施方式可以利用多个总线。网络接口子系统2616可以提供通向其他计算设备和网络的接口。网络接口子系统2616可以用作用于从来自计算设备2600的其他系统接收数据以及向计算设备2600的其他系统传输数据的接口。例如,网络接口子系统2616可以使数据技术员能够将该设备连接至无线网络,使得数据技术员能够在处于远程位置、比如用户数据中心时发送和接收数据。总线子系统2604可以用于将诸如细节、搜索项等的数据传送到本公开的监督模型,并且可以用于将监督模型的输出传送到一个或更多个处理器2602以及经由网络接口子系统2616传送到商户和/或债权人。
[0227] 用户接口输入设备2612可以包括:一个或更多个用户输入设备,比如键盘;定点设备,比如集成鼠标轨迹球触摸板或图形输入板;扫描仪条形码扫描仪;结合在显示器中的触摸屏;音频输入设备,比如语音识别系统、麦克;以及其他类型的输入设备。通常,术语“输入设备”的使用意在包括向计算设备2600输入信息的所有可能类型的设备和机制。一个或更多个用户接口输出设备2614可以包括显示子系统、打印机或非视觉显示器,比如音频输出设备等。显示子系统可以是阴极射线管(CRT)、平板设备比如液晶显示器(LCD)、发光二极管(LED)显示器或投影仪或其他显示设备。通常,术语“输出设备”的使用意在包括用于从计算设备2600输出信息的所有可能类型的设备和机制。一个或更多个用户接口输出设备2614可以例如用于当用户与执行所描述的过程和其中的变型的应用程序交互为适当时呈现用户接口以有助于这样的交互。
[0228] 存储子系统2606可以提供用于存储可以提供本公开的至少一个实施方式的功能的基本编程和数据结构的计算机可读存储介质。应用程序(程序、代码模块、指令)在由一个或更多个处理器执行时可以提供本公开的一个或更多个实施方式的功能,并且可以被存储在存储子系统2606中。这些应用程序模块或指令可以由一个或多个处理器2602执行。存储子系统2606可以另外提供用于存储根据本公开使用的数据的存储库。存储子系统2606可以包括存储器子系统2608和文件/磁盘存储子系统2610。
[0229] 存储器子系统2608可以包括多个存储器,包括用于在程序执行期间存储指令和数据的主随机存取存储器(RAM)2618以及可以存储固定指令的只读存储器(ROM)2620。文件/磁盘存储子系统2610可以为程序和数据文件提供非暂时性永久性(非易失性)存储,并且文件/磁盘存储子系统2610可以包括硬盘驱动器软盘驱动器以及关联的可移动媒体、紧凑型磁盘只读存储器(CD-ROM)驱动器、光盘驱动器、可移动介质盒以及其他类似的存储介质。
[0230] 计算设备2600可以包括至少一个本地时钟2624。本地时钟2624可以是表示从特定起始日期开始发生的滴答数的计数器,并且可以一体地位于计算设备2600内。本地时钟2624可以用于以特定时钟脉冲对计算设备2600的处理器和包括在计算设备2600中的所有子系统中的数据传输进行同步,并且可以用于协调计算设备2600与数据中心中的其他系统之间的同步操作。在一个实施方式中,本地时钟2624是原子时钟。在另一实施方式中,本地时钟是可编程间隔计时器。
[0231] 计算设备2600可以是各种类型,包括便携式计算机设备、平板计算机工作站或以下描述的任何其他设备。另外,计算设备2600可以包括可以通过一个或更多个端口(例如,USB、机插孔、闪电连接器等)连接至计算设备2600的另一设备。可以连接至计算设备2600的设备可以包括配置为接纳光纤连接器的多个端口。因此,该设备可以配置为将光信号转换为电信号,该电信号可以通过将设备连接至计算设备2600的端口进行传输以进行处理。由于计算机和网络的不断变化的性质,因此对图13中描绘的计算设备2600进行的描述仅意在出于说明设备的优选实施方式的目的而作为特定示例。与图13中描绘的系统相比,具有更多或更少组件的许多其他配置是可能的。
[0232] 因此,说明书和附图应被认为是说明性的而不是限制性的。然而,明显的是,在不背离如权利要求中所阐述的本发明的范围的情况下,可以对其做出各种修改和改变。同样,其他变型也在本公开的范围内。因此,尽管所公开的技术易于做出各种改型和替代构造,但是其某些示出的实施方式在附图中示出并且已经在上文进行了详细描述。然而,应当理解的是,无意将本发明限制为所公开的一种或多种特定形式,相反,本发明旨在涵盖落入所附权利要求中限定的本发明的范围内的所有改型、替代构造和等同形式。
[0233] 除非另有指示或与上下文明显矛盾,否则描述所公开的实施方式的上下文中(尤其是所附权利要求的上下文中)的术语“一”和“该”以及类似指代的使用应被解释为涵盖单数和复数两者。除非另有说明,否则术语“包括(comprising)”、“具有(having)”、“包含(including)”和“含有(containing)”应被解释为开放式术语(即,意思是“包括但不限于”)。术语“连接”在未修改且指代物理连接时应理解为部分或全部包含在内、附接或接合在一起,即使存在某些介入。除非另有指示,否则本公开内容中的数值范围的列举仅意在用作分别指代落入该范围内的每个单独值的速记方法,并且每个单独值像其被分别列举一样结合在说明书中。除非另有说明或与上下文矛盾,否则术语“组”(例如“一组项”)或“子组”的使用应解释为包括一个或更更多个成员的非空集合。此外,除非另有说明或与上下文矛盾,否则对应组的术语“子组”不一定表示对应组的适当子组,而是该子组和对应组可以等同。
[0234] 除非另有明确说明或与上下文明显矛盾,否则诸如“A、B、和C中的至少一者”或“A、B和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中的至少一个各自存在。
[0235] 除非另外指出或与上下文明显矛盾,否则所描述的过程的操作可以以任何合适的顺序执行。所描述的过程(或其变体和/或组合)可以在配置有可执行指令的一个或更多个计算机系统的控制下执行,并且可以实现为通过硬件或其组合在一个或更多个处理器上共同执行的代码(例如,可执行指令、一个或更多个计算机程序或一个或更多个应用程序)。该代码可以例如以计算机程序的形式存储在计算机可读存储介质上,该计算机程序包括可由一个或更多个处理器执行的多个指令。计算机可读存储介质可以是非暂时性的。
[0236] 除非另有要求,否则所提供的任何示例和所有示例或示例性语言(例如,“比如”)的使用仅意在更好地阐明本发明的实施方式,而不构成对本发明范围的限制。说明书中的任何语言都不应解释为指示实施本发明必不可少的任何未要求保护的要素。
[0237] 描述了本公开的实施方式,包括发明人已知的用于执行本发明的具体实施方式。通过阅读前述说明,实施方式的变型对于本领域普通技术人员而言将变得明显。发明人期望熟练技术人员适当地采用这样的变型,并且发明人预期到本公开的实施方式可以以不同于具体描述的方式来实践。因此,本公开的范围包括适用法律所允许的所附权利要求中记载的主题的所有改型和等同物。而且,除非另外指出或与上下文明显矛盾,否则上述要素在其所有可能的变型中的任何组合都被本公开的范围涵盖。
[0238] 所引用的包括出版物、专利申请和专利的所有参考文献在如同每个参考文献被单独地且具体地指示为通过引用整体并入并阐述的程度上通过引用并入本文。
[0239] 应当指出的是,上述实施方式说明而不是限制本发明,并且本领域技术人员将能够在不脱离由所附权利要求限定的本发明的范围的情况下设计许多替代实施方式。在权利要求中,括号中的任何附图标记不应被解释为限制权利要求。词语“包括(comprising)”、“包括(comprises)”等不排除任何权利要求或说明书整体中列出的元件或步骤之外的元件或步骤的存在。在本说明书中,“包括(comprises)”是指“包括(includes)或者由……组成(consists of)”,而“包括(comprising)”是指“包括(including)或者由……组成(consisting of)”。元件的单数引用不排除这些元件的复数引用,反之亦然。本发明可以通过包括若干不同元件的硬件以及通过适当编程的计算机来实现。在列举了若干装置的设备权利要求中,这些装置中的若干装置可以由同一个硬件项来实现。在相互不同的从属权利要求中引用某些措施这一事实并不表示这些措施的组合不能有利地使用。
高效检索全球专利

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

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

申请试用

分析报告

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

申请试用

QQ群二维码
意见反馈