一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

用于复杂核实的包含不同语言的部分代码的区块链交易的制作方法

2022-05-06 10:59:26 来源:中国专利 TAG:


1.本公开涉及一种在区块链上运行存储在交易中的程序的方法。


背景技术:

2.区块链是指一种分布式数据结构形式,其中在点对点(p2p)网络中的多个节点中的每个节点处维护区块链副本。区块链包括一系列数据区块,其中每个区块包括一笔或多笔交易。每笔交易都可以回指序列中的先前交易,其可以扩展一个或更多区块。交易可以通过提交到网络包括在新区块中。新区块的创建过程称为“挖掘”,该过程涉及多个挖掘节点中的每个挖掘节点争相执行“工作量证明”,即基于等待包括在区块中的未决交易池解决加密难题。
3.区块链中的交易通常用于传递数字资产,即用作价值储存手段的数据。但是也可利用区块链实现区块链上的分层附加功能。例如,区块链协议可允许在交易输出中存储附加用户数据。现代区块链在单一交易中可储存的最大数据容量在不断增加,从而能够并入更复杂的数据。例如,这可用于在区块链中存储电子文档,甚至音频或视频数据。
4.网络中的每个节点可以具有以下三个角色中的任何一个、两个或全部:转发、挖掘和存储。转发节点在整个网络节点中传播交易。挖掘节点将交易挖掘到区块中。存储节点各自对区块链中的已挖掘区块存储自己的副本。为了将交易记录在区块链中,一方将该交易发送到网络中的节点中的一个节点进行传播。接收该交易的挖掘节点可以争相将该交易挖掘到新区块中。每个节点被配置为遵守相同的节点协议,该协议将包括用于确认交易有效的一个或更多个条件。无效交易将不会传播或挖掘到区块中。假定交易已经核实有效,从而在区块链上被接受,则该交易(包括任何用户数据)将因此作为不可改变的公共记录,继续存储在p2p网络中的各个节点处。
5.成功解决工作量证明难题以创建最新区块的矿工通常被奖励一笔称为“区块创始交易”的新交易,该交易会生成新的数字资产金额。工作量证明激励矿工不要欺骗系统,在他们的区块中包括双重花费交易,因为挖掘区块需要大量计算资源,而包括试图双重花费的区块很可能不会被其他节点接受。
6.在“基于输出的”模型(有时称为基于utxo的模型)中,给定交易的数据结构包括一个或更多个输入和一个或更多个输出。任何可花费输出包括指定数字资产金额的元素,有时称为utxo(“未花费的交易输出”)。该输出还可以包括指定用于赎回该输出的条件的锁定脚本。每个输入包括指向先前交易中的此类输出的指针,并且还可以包括解锁脚本以用于解锁指向输出的锁定脚本。因此,考虑一对交易,将其称为第一交易和第二交易(或“目标”交易)。第一交易包括指定数字资产金额的至少一个输出,并且包括定义解锁该输出的一个或更多个条件的锁定脚本。第二交易(目标交易)包括至少一个输入和解锁脚本,该至少一个输入包括指向第一交易的输出的指针;该解锁脚本用于解锁第一交易的输出。
7.在此类模型中,当第二交易(目标交易)被发送到p2p网络以在区块链中传播和记录时,在每个节点处应用的有效性准则之一将是:解锁脚本满足在第一交易的锁定脚本中
定义的一个或更多个条件中的所有条件。另一条件将是:第一交易的输出尚未被另一早期有效交易赎回。根据这些条件中的任何一个条件发现目标交易无效的任何节点都不会传播该交易,也不会包括该交易以便挖掘到要记录在区块链中的区块中。
8.另一种交易模型是基于账户的模型。在这种情况下,每笔交易均不通过参考过去交易序列中先前交易的utxo来定义转移的金额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由矿工单独存储到区块链中,并不断更新。该状态被运行的智能合约修改,该智能合约包含于交易之中并当该交易被区块链网络节点核实时被运行。


技术实现要素:

9.通常情况下,相比基于账户的模型中的智能合约,基于输出的模型中使用的锁定脚本和解锁脚本采用更具限制性的脚本语言。比如,通常情况下,基于输出的模型采用基于堆栈的语言,诸如命名为script的语言(大写s)。基于堆栈的语言不是“图灵完备的”,这意味着无法实现某些类型的算法,诸如循环。
10.由于这个或其他原因,需要将用于核实的附加标准包含在基于输出的模型的交易的锁定脚本中,而不受区块链网络的节点识别的脚本语言的限制条件所约束。比如,可能需要启用类似于基于账户的模型的智能合约的功能,但在基于输出的模型中(例如,基于utxo的模型)。再如,可能需要将精通第二语言的程序编写的条件并入基于输出的模型的锁定脚本中,该基于输出的模型主要基于第一语言进行操作。
11.根据本文公开的一方面,提供了一种由区块链网络的节点执行的计算机实现的方法,其中区块链的副本在区块链网络的至少一些节点进行维护,区块链包括一系列区块,每个区块包括一个或多个交易,每个交易包括一个或多个输出,并且每个输出包括以第一语言编制的锁定脚本。该方法包括:a)从所述交易的第一交易的至少第一输出访问锁定脚本,第一输出的锁定脚本以第一语言指定用于解锁所述第一输出的一个或多个条件;b)接收尚未记录在区块链上的第二交易,其中第二交易包括输入,输入包括以第一语言编制的解锁脚本;c)从区块链上的第一交易或另一交易中提取以第二语言编制的部分代码,而非第一语言;d)以第二语言运行所述提取的部分代码,其中由此代码生成至少一个第一值;e)将第一值写入第一语言的锁定脚本可读的存储位置;f)以第一语言运行来自第一交易的第一输出的锁定脚本以及来自第二交易的解锁脚本,从而评估一个或多个条件,该方法包括在满足所述一个或多个条件的情况下核实第二交易。解锁脚本被配置为从所述存储位置读取第一值,并且该一个或多个条件包括取决于第一值的条件。
12.对于包括目标交易的多笔交易中的每笔交易,网络中的至少一些节点被配置为在交易有效的条件下传播每笔交易,并且至少一些节点被配置为在交易有效的条件下将每笔交易记录在该节点处的区块链的副本中。目标交易的有效性取决于第二语言的代码的结果。如果不满足条件,交易将不会通过区块链网络传播、汇集进行挖矿以及记录在区块链上。因此,可并入以第二语言编写的功能,以设定模型中的有效性条件,否则该模型基于使用第一脚本语言的核实。
附图说明
13.为了帮助理解本公开的实施例并示出如何实施此类实施例,现将仅通过举例的方
式参考附图进行说明,其中:
14.图1是一种用于实现区块链的系统的示意性框图,
15.图2示意性地示出了可记录在区块链中的交易的一些示例,
16.图3是示出根据本文公开的实施例执行非script代码的示意性框图,
17.图4是用于处理交易的一些示例性节点软件的示意性框图,
18.图5是示出根据本文公开的实施例的节点软件的进一步细节的示意性框图,
19.图6示意性地示出了根据本文公开的实施例的示例性脚本的执行序列。
具体实施方式
20.示例性系统概述
21.图1示出了一种用于实现区块链150的示例性系统100。系统100包括分组交换网络101,通常是诸如互联网的广域互联网。分组交换网络101包括多个节点104,该多个节点被设置成在分组交换网络101内形成点对点(p2p)覆盖网络106。每个节点104包括对等体的计算机设备,不同的节点104属于不同的对等体。每个节点104包括含一个或更多个处理器的处理装置,例如一个或更多个中央处理单元(cpu)、加速器处理器、特定应用程序处理器和/或现场可编程门阵列(fpga)。每个节点还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。存储器可包括一个或更多个存储器单元,其采用一个或更多个存储器介质,例如诸如硬盘等的磁介质、诸如固态硬盘(ssd)、闪存或电可擦可编程只读存储器(eeprom)等的电子媒介和/或诸如光盘驱动器等的光学介质。
22.区块链150包括一系列数据区块151,其中在p2p网络160中的多个节点中的每个节点处维护相应的区块链150副本。区块链中的每个区块151均包括一笔或多笔交易152,其中该上下文中的交易是指一种数据结构。数据结构的性质将取决于用作交易模型或计划的一部分的交易协议类型。给定的区块链通常全程使用一个特定的交易协议。在一种常见的交易协议中,每笔交易152的数据结构至少包括一个输入和至少一个输出。每个输出指定一个金额,该金额表示属于输出被加密锁定的用户103的数字资产值(需要该用户的签名进行解锁,从而进行赎回或花费)。每个输入指向先前交易152的输出,从而链接这些交易。
23.节点104中的至少一些节点扮演转发节点104f的角色,这些节点转发并因此传播交易152。节点104中的至少一些节点扮演挖掘区块151的矿工104m的角色。节点104中的至少一些节点扮演存储节点104s(有时也称为“完整副本”节点)的角色,每个存储节点均在相应的存储器中存储相同区块链150的相应副本。每个矿工节点104m还维护等待挖掘到区块151中的交易152的池154。给定节点104可以是转发节点104、矿工104m、存储节点104s或其中两个节点或所有节点的任意组合。
24.在给定的当前交易152j中,输入(或每个输入)包括指针,该指针引用交易序列中先前交易152i的输出,指定该输出将在当前交易152j中被赎回或“花费”。通常,当前交易可以是池154或任何区块151中的任何交易。尽管为了确保当前交易有效,将需要存在先前交易152i并核实其有效,但是在创建当前交易152j甚至向网络106发送当前交易152j时,不必存在先前交易152i。因此,在本文中,“先前”是指由指针链接的逻辑序列中的前任,而不一定是时间序列中的创建时间或发送时间,因此,不一定排除无序创建或发送交易152i、152j的情况(参见下面关于孤立交易的讨论)。先前交易152i同样可以称为先行交易或前任交
易。
25.当前交易152j的输入还包括先前交易152i的输出被锁定到的用户103a的签名。反过来,当前交易152j的输出可以加密锁定到新用户103b。因此,当前交易152j可将先前交易152i的输入中定义的金额转移到当前交易152j的输出中定义的新用户103b。在某些情况下,交易152可具有多个输出,以在多个用户间分割输入金额(其中一个可以是原始用户103a,以便进行变更)。在某些情况下,一交易还可以具有多个输入,以将一个或更多个先前交易的多个输出中的金额汇总在一起,并重新分配到当前交易的一个或更多个输出。
26.上述可称为“基于输出的”交易协议,有时也称为未花费的交易输出(utxo)的协议(其中输出称为utxo)。用户的总余额不是用区块链中存储的任何一个数字定义的;相反,用户需要特殊“钱包”应用程序105,以整理该用户的所有utxo值,这些utxo值分散在区块链151的许多不同交易152中。
27.作为基于账户的交易模型的一部分,另一种类型的交易协议可称为“基于账户的”协议。在基于账户的情况下,每笔交易均不通过参考过去交易序列中先前交易的utxo来定义转移的金额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由矿工单独存储到区块链中,并不断更新。在此类系统中,交易使用账户的运行交易记录(也称为“头寸”)进行排序。该值由发送者签名作为其加密签名的一部分,并作为交易引用计算的一部分进行哈希处理。此外,可选的数据字段也可以在交易中签名。例如,如果数据字段中包含先前交易的id,则该数据字段可指向先前交易。
28.无论采用何种类型的交易协议,当用户103希望执行新交易152j时,其希望将新交易从其计算机终端102发送至p2p网络106的节点104中的一个(现在通常是服务器或数据中心,但原则上可以是其他用户终端)。此节点104根据在节点104中的每个节点处应用的节点协议检查交易是否有效。节点协议的详细信息将与相关区块链150中使用的交易协议类型相对应,一起形成整个交易模型。节点协议通常要求节点104检查新交易152j中的加密签名是否与预期签名相匹配,这取决于交易152的有序序列中的先前交易152i。在基于输出的情况下,这可包括检查新交易152j的输入中包含的用户加密签名是否与新交易花费的先前交易152i的输出中定义的条件相匹配,其中该条件通常包括至少检查新交易152j的输入中的加密签名是否解锁新交易的输入所指向的先前交易152i的输出。在一些交易协议中,条件可至少部分地由输入和/或输出中包含的自定义脚本定义。或者,这可仅由节点协议单独确定,或可通过其组合确定。无论采用哪种方式,如果新交易152j有效,当前节点会将其转发到p2p网络106中的一个或更多个其他节点104。这些节点104中的至少一些节点还作为转发节点104f,根据相同的节点协议应用相同的测试,从而将新交易152j转发到一个或更多个进一步的节点104,依此类推。通过这种方式,新交易在节点104的整个网络中进行传播。
29.在基于输出的模型中,给定输出(例如,utxo)是否花费的定义是,根据节点协议,其是否通过另一个随后交易152j的输入有效赎回。交易有效的另一个条件是其试图花费或赎回的先前交易152i的输出尚未被另一笔有效交易花费/赎回。同样,如果无效,交易152j将不会在区块链中传播或记录。这可防止重复花费,即花费者对同一笔交易的输出花费超过一次。另一方面,基于账户的模型通过保持账户余额防止重复花费。因为同样存在定义的交易顺序,账户余额在任何时候均具有单一定义的状态。
30.除核实之外,节点104m中的至少一些节点在称为挖矿的过程中争先创建交易区
块,该过程以“工作量证明”为基础。在挖矿节点104m处,将新交易添加到区块中尚未出现的有效交易的池中。然后,矿工争相通过尝试解决加密难题来组装交易池154中交易152的新的有效区块151。通常情况下,这包括搜索“随机数”值,从而当随机数与交易池154并置且进行哈希处理时,哈希值的输出满足预定条件。例如,预定条件可以是哈希值的输出具有某个预定义的前导零数。哈希函数的特性是,相对于其输入,其具有不可预测的输出。因此,该搜索只能通过强力执行,从而在试图解决难题的每个节点104m处消耗大量的处理资源。
31.解决难题的第一矿工节点104m在网络106上宣布难题解决,提供解决方案作为证明,然后网络中的其他节点104则可以轻松检查该解决方案(一旦给出哈希值的解决方案,就可以直接检查该解决方案是否使哈希值的输出满足条件)。基于已在每个此类节点处检查获胜者的已宣布解决方案,获胜者已为其解决该难题的交易池154之后由充当存储节点104s的节点104中的至少一些节点记录在区块链150中作为新区块151。区块指针155还分配给指向区块链中先前创建的区块151n-1的新区块151n。工作量证明有助于降低重复花费的风险,因为创建新区块151需要大量工作,并且由于包含重复花费的任何区块都可能被其他节点104拒绝,因此挖矿节点104m受到激励,不允许在其区块中包含双重花费。一旦创建,则不可修改区块151,因为其根据相同的协议在p2p网络106中的存储节点104s中的每个存储节点进行识别和维护。区块指针155还向区块151施加顺序。由于交易152记录在p2p网络106中每个存储节点104s处的有序区块中,因此提供了交易的不可变公共分类账。
32.应当注意的是,在任何给定时间争相解决难题的不同矿工104m可能会根据任何给定时间的未挖掘交易池154的不同快照执行该操作,具体取决于他们何时开始搜索解决方案。解决相应难题的人员首先定义新区块151n中包含的交易152,并更新当前未挖掘交易池154。然后,矿工104m继续争相从新定义的未完成池154中创建区块,依此类推。此外,还存在解决可能出现的任何“分叉”的协议,其中两名矿工104m彼此在很短的时间内解决难题,从而传播区块链的冲突视图。简言之,分叉方向最长的成为最终区块链150。
33.在大部分区块链中,获胜矿工104m会自动获得特殊类型的新交易作为奖励,该新交易创建新的数字资产值(与将数字资产金额从一个用户转移至另一个用户的正常交易截然相反)。因此,获胜节点被视为已“挖掘”一定数量的数字资产。这种特殊类型的交易有时称为“生成”交易,其自动形成新区块151n的一部分。该奖励可激励矿工104m争相参与工作量证明。通常情况下,常规(非生成)交易152还将在其输出中的一个输出中指定附加交易费用,以进一步奖励创建其中包含交易的区块151n的获胜矿工104m。
34.由于挖掘中涉及的计算资源,通常至少矿工节点104m中的每个矿工节点采用服务器的形式,该服务器包括一个或更多个物理服务器单元,甚至整个数据中心。每个转发节点104m和/或存储节点104s还可采取服务器或数据中心的形式。但是,原则上来说,任何给定节点104均可采用一个用户终端或联网在一起的一组用户终端的形式。
35.每个节点104的存储器均存储被配置为在节点104的处理装置上运行的软件,以根据节点协议执行其相应的角色并处理交易152。应当理解的是,在本文中归因于节点104的任何动作均可通过在相应计算机设备的处理装置上运行的软件执行。节点软件可以在应用层的一个或更多个应用中实现,或者在诸如操作系统层或协议层的较低层中实现,或者在这些层的任何组合中实现。此外,在本文中使用的“区块链”一词是指一般技术类型的通用术语,不限于任何特定专有区块链、协议或服务。
36.扮演消费用户角色的多方103中的每一方的计算机设备102也连接到网络101。他们充当交易中的付款人和收款人,但不一定代表其他方参与挖掘或传播交易。他们不一定运行挖矿协议。出于说明目的,示出了双方103及其相应的设备102:第一方103a及其相应的计算机设备102a,以及第二方103b及其相应的计算机设备102b。应当理解的是,更多此类当事方103及其相应的计算机设备102可能存在并参与系统,但为了方便起见,未进行说明。每一方103均可以是个人或组织。仅出于说明目的,在本文中,第一方103a称为爱丽丝(alice),第二方103b称为鲍勃(bob),但应当理解的是,这并不仅限于爱丽丝或鲍勃,且本文对爱丽丝或鲍勃的任何引用均可分别用“第一方”和“第二方”替换。
37.每一方103的计算机设备102包括相应的处理装置,其包括一个或更多个处理器,例如一个或更多个cpu、图形处理单元(gpu)、其他加速器处理器、特定应用程序处理器和/或fpga。每一方103的计算机设备102还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。该存储器可包括一个或更多个存储器单元,其采用一个或更多个存储器介质,例如诸如硬盘等磁介质、诸如ssd、闪存或eeprom等电子媒介和/或诸如光盘驱动器等的光学介质。每一方103的计算机设备102上的存储器存储软件,其包括被设置为在处理装置上运行的至少一个客户端应用程序105的相应实例。应当理解的是,在本文中归因于给定方103的任何行动均可通过在相应计算机设备102的处理装置上运行的软件执行。每一方103的计算机设备102包括至少一个用户终端,例如台式或笔记本电脑、平板电脑、智能手机或诸如智能手表等的可穿戴设备。给定方103的计算机设备102还可包括一个或更多个其他网络资源,诸如通过用户终端访问的云计算资源。
38.客户端应用程序105最初可通过例如从服务器下载的适当计算机可读存储介质,或通过诸如可移动ssd、闪存密钥、可移动eeprom、可移动磁盘驱动器、软盘或磁带等的可移动存储设备、诸如cd或dvd rom等的光盘或可移动光驱等提供至任何给定方103的计算机设备102。
39.客户端应用程序105至少包括“钱包”功能。这有两个主要功能。其中一个功能是使相应的用户方103创建、签名和发送拟在节点104的整个网络中传播的交易152,并因此包含在区块链150中。另一个功能是向相应方汇报其目前拥有的数字资产金额。在基于输出的系统中,该第二功能包括整理分散在区块链150中属于相关方的各种交易152的输出中定义的金额。
40.注意:虽然各种客户端功能可以描述为集成到给定客户端应用105中,但这不一定是限制性的,相反,在本文中所描述的任何客户端功能可以在由两个或更多个不同应用组成的套件中实现,例如经由api进行接口连接或一个应用作为另一个应用的插件。更通俗地说,客户端功能可以在应用层或诸如操作系统的较低层或这些层的任意组合实现。下面将根据客户端应用105进行描述,但应当理解的是,这不是限制性的。
41.每个计算机设备102上的客户端应用程序或软件105的实例可操作地耦合到p2p网络106的转发节点104f中的至少一个转发节点。这可以启用客户端105的钱包功能,以将交易152发送至网络106。客户端105还可联系一个、一些或所有存储节点104,以在区块链150中查询相应方103作为接收者的任何交易(或实际上在区块链150中检查其他方的交易,因为在实施例中,区块链150是在某种程度上通过其公开可见性提供交易信任的公共设施)。每个计算机设备102上的钱包功能被配置为根据交易协议制定和发送交易152。每个节点
104运行软件,其被配置为根据节点协议核实交易152有效的软件,并且在转发节点104f的情况下转发交易152,以在整个网络106中传播此类交易。交易协议和节点协议相互对应,给定交易协议和给定节点协议一起实现给定的交易模型。区块链150中的所有交易152均采用相同的交易协议(尽管交易协议可允许其内存在不同的交易子类型)。网络106中的所有节点104采用相同的节点协议(尽管其可根据针对该子类型定义的规则区分处理不同的交易子类型,并且不同的节点还可扮演不同的角色,从而实现协议的不同对应方面)。
42.如上所述,区块链150包括一系列区块151,其中每个区块151包括通过如前所述的工作量证明过程创建的一个或更多个交易152的集合。每个区块151还包括区块指针155,其指向区块链中先前创建的区块151,以定义区块151的顺序。区块链150还包括有效交易池154,其等待通过工作量证明过程包含在新的区块中。每笔交易152(除了一生成交易)包括指向先前交易的指针,以定义交易序列的顺序(注:交易152的序列可进行分支)。区块151的区块链一直追溯到创始区块(gb)153,该创始区块是区块链中的第一区块。区块链150中早期的一笔或多笔原始交易152指向创始区块153,而非先前交易。
43.当给定方103(比方说爱丽丝)希望发送拟包含在区块链150中的新交易152j时,她将根据相关交易协议(使用其客户端应用程序105中的钱包功能)制定新交易。然后,她将交易152从客户端应用程序105发送至其连接的一个或更多个转发节点104f中的一个。例如,这可以是与爱丽丝的计算机102最近或最佳连接的转发节点104f。当任何给定节点104接收新交易152j时,其将根据节点协议及其相应的角色进行处理。这包括首先检查新接收的交易152j是否满足变为“有效”的特定条件,具体示例稍后将详细讨论。在一些交易协议中,有效条件可通过交易152中包含的脚本在每个交易的基础上进行配置。或者,条件可仅仅是节点协议的内置功能,或通过组合脚本和节点协议进行定义。
44.如果新接收的交易152j通过有效性测试(即:“有效”的条件下),接收交易152j的任何存储节点104s将向在该节点104s处维护的区块链150的副本中的池154中添加新有效交易152。进一步地,接收交易152j的任何转发节点104f随后将有效交易152传播至p2p网络106中的一个或更多个其他节点104。由于每个转发节点104f应用相同的协议,因此假定交易152j有效,这意味着交易很快将在整个p2p网络106中传播。
45.一旦进入在一个或更多个存储节点104处维护的区块链150的副本中的池154中,矿工节点104m将开始竞相解决包括新交易152的池154的最新版本方面的工作量证明难题(其他矿工104m可继续尝试基于池154的旧视角解决难题,但首先解决难题的矿工将定义下一个新区块151的结束位置和新池154的开始位置,最终将有人解决包括爱丽丝的交易152j的池154的一部分的难题)。一旦包括新交易152j的池154完成工作量证明,其将不可变地成为区块链150中区块151中的一个区块的一部分。每笔交易152包括指向早前交易的指针,因此交易的顺序也被不可变地记录下来。
46.不同的节点104可以首先接收给定交易的不同实例,并且因此在一个实例被挖掘到区块150中之前具有关于哪个实例“有效”的冲突视图,此时所有节点104同意所挖掘的实例是唯一的有效实例。如果节点104接受一个实例为有效实例,然后发现第二实例已记录在区块链150中,则该节点104必须接受这一点,并将丢弃(即视为无效)其最初接受的未挖掘实例。
47.基于utxo的模型
48.图2示出了示例性交易协议。这是基于utxo的协议的示例。交易152(简称“tx”)是区块链150的基本数据结构(每个区块151包括一笔或更多笔交易152)。下面将通过参考基于输出或基于“utxo”的协议进行描述。但这并不限于所有可能的实施例。
49.在基于utxo的模型中,每笔交易(“tx”)152包括数据结构,其包括一个或更多个输入202和一个或更多个输出203。每个输出203可包括未花费的交易输出(utxo),其可用作另一新交易的输入202的来源(如果utxo尚未赎回)。utxo指定数字资产金额(价值储存手段)。它还可包含其来源交易的交易id以及其他信息。交易数据结构还可包括头部201,其可包括输入字段202和输出字段203的大小指示符。头部201还可包括交易的id。在实施例中,交易id是交易数据(不含交易id本身)的哈希值,且存储在提交至矿工104m的原始交易152的头部201中。
50.比方说爱丽丝103a希望创建转移相关数字资产金额至鲍勃103b的交易152j。在图2中,爱丽丝的新交易152j标记为“tx
1”。该新交易获取在序列中先前交易152i的输出203中锁定至爱丽丝的数字资产金额,并至少将此类金额中的一部分转移至鲍勃。在图2中,先前交易152i标记为“tx
0”。tx0和tx1只是任意的标记,其不一定意味着tx0指区块链151中的第一交易且tx1指池154中的下一笔交易。tx1可指向仍具有锁定至爱丽丝的未花费输出203的任何先前(即先行)交易。
51.当爱丽丝创建其新交易tx1时,或至少在她将该新交易发送至网络106时,先前交易tx0可能已经有效并包括在区块链150中。该交易此时可能已包括在区块151中的一个区块中,或者可能仍在池154中等待,在这种情况下,该交易将很快包括在新区块151中。或者,tx0和tx1可以创建并一起发送至网络102;或者,如果节点协议允许缓冲“孤立”交易,tx0甚至可以在tx1之后发送。本文交易序列上下文中使用的“先前”和“后续”一词是指由交易中指定的交易指针定义的序列中的交易顺序(哪个交易指向哪个其他交易等等)。它们同样可以替换为“前任”和“继任”、“先行”和“后代”或“父项”和“子项”等。这不一定指其创建、发送至网络106或到达任何给定节点104的顺序。然而,指向先前交易(先行交易或“父交易”)的后续交易(后代交易或“子交易”)不会有效除非父交易有效。在父交易之前到达节点104的子交易被视为孤立交易。根据节点协议和/或矿工行为,其可被丢弃或缓冲一段时间,以等待父交易。
52.先前交易tx0的一个或更多个输出203中的一个包括特定的utxo,标记为utxo0。每个utxo包括指定utxo表示的数字资产金额的值以及锁定脚本,该锁定脚本定义后续交易的输入202中的解锁脚本必须满足的条件,以使后续交易有效,从而成功赎回utxo。通常情况下,锁定脚本将金额锁定至特定方(该金额的交易的受益人)。即,锁定脚本定义解锁条件,该解锁条件通常包括以下条件:后续交易的输入中的解锁脚本包括先前交易被锁定到的一方的加密签名。
53.锁定脚本(亦称scriptpubkey)是节点协议识别的域特定语言中写入的一段代码。此类语言的特定示例称为“脚本(script)”(s大写)。锁定脚本指定花费交易输出203所需的信息,例如爱丽丝签名的要求。解锁脚本出现在交易的输出中。解锁脚本(亦称scriptsig)是提供满足锁定脚本准则所需信息的域特定语言中写入的一段代码。例如,其可包含鲍勃的签名。解锁脚本出现在交易的输入202中。
54.因此在示出的示例中,tx0的输出203中的utxo0包括锁定脚本[checksig pa],该锁
定脚本需要爱丽丝的签名sig pa,以赎回utxo0(严格来说,是为了使试图赎回utxo0的后续交易有效)。[checksig pa]包含爱丽丝的公私密钥对中的公钥pa。tx1的输入202包括向回指向tx1的指针(例如,通过其交易id(txid0),其在实施例中是整个交易tx0的哈希值)。tx1的输入202包括在tx0中标识utxo0的索引,以在tx0的任何其他可能输出中对其进行标识。tx1的输入202进一步包括解锁脚本《sig pa》,该解锁脚本包括爱丽丝的加密签名,该签名由爱丽丝通过将其密钥对中的私钥应用于预定的部分数据(有时在密码学中称为“消息”)创建。爱丽丝需要签名以提供有效签名的数据(或“消息”)可通过锁定脚本、节点协议或其组合进行定义。
[0055]
当新交易tx1到达节点104时,该节点应用节点协议。这包括一起运行锁定脚本和解锁脚本,以检查解锁脚本是否满足锁定脚本中定义的条件(其中该条件可包括一个或更多个准则)。在实施例中,这涉及并置两个脚本:
[0056]
《sig pa》《pa》||[checksig pa]
[0057]
其中“||”表示并置,“《

》”表示将数据放在堆栈上,“[

]”表示由解锁脚本组成的函数(在该示例中指基于堆栈的语言)。同样,脚本可以使用公共堆栈一个接一个地运行,而不是并置脚本。无论采用哪种方式,当一起运行时,脚本使用爱丽丝的公钥pa(包括在tx0的输出的锁定脚本中),以认证tx1的输入中的锁定脚本是否包含爱丽丝签名预期部分的数据时的签名。预期的部分数据本身(“消息”)也需要包括在tx0中,以便执行此认证。在实施例中,签名的数据包括整个tx0(因此不需要包括一个单独的元素来明文指定签名的部分数据,因为其本身便已存在)。
[0058]
本领域技术人员将熟悉通过公私密码进行认证的细节。基本上而言,如果爱丽丝已通过使用其私钥加密签署消息,则给定爱丽丝的公钥和明文中的消息(未加密消息),诸如节点104等其他实体可认证加密版本的消息必须已经由爱丽丝签名。签署通常包括对消息进行散列,签署哈希值和将此标记到消息的明文版本作为签名,从而使公钥的任何持有者能够认证签名。因此,应当注意的是,在实施例中,在本文中对签名特定数据片段或交易部分等的任何引用可以意味着对该数据片段或交易部分的哈希值进行签名。
[0059]
如果tx1中的解锁脚本满足tx0的锁定脚本中指定的一个或更多个条件(因此,在所示示例中,如果在tx1中提供了爱丽丝的签名并进行认证),则节点104认为tx1有效。如果是挖矿节点104m,这意味着其将添加至等待工作量证明的交易154池。如果是转发节点104f,则其将交易tx1转发到网络106中的一个或更多个其他节点104,从而将在整个网络中传播。一旦tx1有效并包括在区块链150中,这将把tx0中的utxo0定义为已花费。请注意,tx1仅在花费未花费的交易输出203时才有效。如果试图花费另一交易152已经花费的输出,则即使满足所有其他条件,tx1也将无效。因此,节点104还需要检查先前交易tx0中引用的utxo是否已经花费(已经形成另一有效交易的有效输入)。这是为何区块链150对交易152施加定义的顺序很重要的原因之一。在实践中,给定节点104可维护单独的数据库,标记已花费交易152的utxo 203,但最终定义utxo是否已花费取决于是否在区块链150中形成了另一有效交易的有效输入。
[0060]
如果给定交易152的所有输出203中指定的总金额大于其所有输入202所指向的总金额,则这是大多数交易模型中的另一失效依据。因此,此类交易将不会传播或挖掘到区块151中。
[0061]
请注意,在基于utxo的交易模型中,给定utxo需要作为一个整体使用。不能“留下”utxo中定义为已花费的一部分金额,而同时又花费另一部分。但utxo的金额可以在下一个交易的多个输出之间分割。例如,tx0的utxo0中定义的金额可以在tx1中的多个utxo之间分割。因此,如果爱丽丝不想将utxo0中定义的所有金额都给鲍勃,她可以使用剩余部分在tx1的第二输出中自己找零钱,或者支付给另一方。
[0062]
在实践中,爱丽丝通常还将需要包括获胜矿工的费用,因为现在仅靠区块创始交易的奖励币通常不足以激励挖掘。如果爱丽丝未包括矿工的费用,tx0可能会被矿工节点104m拒绝,因此,尽管技术上有效,但仍然不会传播并包括在区块链150中(如果矿工104m不愿意,矿工协议不会强制他们接受交易152)。在一些协议中,挖掘费不需要其自身的单独输出203(即不需要单独的utxo)。相反,给定交易152中输入202所指向的总金额与输出203所指定的总金额之间的任何差额都将自动提供给获胜矿工104。例如,假设指向utxo0的指针是tx1的唯一输入,而tx1只有一个输出utxo1。如果utxo0中指定的数字资产的金额大于utxo1中指定的金额,则该差额将自动提供给获胜矿工104m。替代地或附加地,这不一定排除可以在其自身交易152的其中一个utxo 203中明确指定矿工费用。
[0063]
爱丽丝和鲍勃的数字资产由区块链150中任何位置的任何交易152中的锁定至他们的未花费utxo组成。因此,通常情况下,给定方103的资产分散在整个区块链150的各种交易152的utxo中。区块链150中的任何位置均未存储定义给定方103的总余额的一个数字。客户端应用程序105的钱包功能的作用是将锁定至相应方且在其他随后交易中尚未花费的各种utxo值整理在一起。通过查询在任何存储节点104s(例如,与相应方的计算机设备102最近或最佳连接的存储节点104s)处存储的区块链150副本,可以实现这一点。
[0064]
请注意,脚本代码通常用示意图表示(即非精确语言)。例如,可写入[checksig pa]表示[checksig pa]=op_dup op_hash160《h(pa)》op_equalverify op_checksig。“op_...”是指脚本语言的特定操作码。op_checksig(又称“checksig”)是脚本操作码,其取两个输入(签名和公钥),并使用椭圆曲线数字签名算法(ecdsa)验证签名的有效性。在运行时,移除脚本中任何出现的签名(

sig’),但在由

sig’输入验证的交易中仍保留附加要求,诸如哈希难题。再如,op_return是脚本语言操作码,用于创建交易的不可花费输出,其可以将元数据储存在交易中,从而将元数据不可变地记录在区块链150中。例如,元数据可包括需存储在区块链中的文件。
[0065]
签名pa是数字签名。在实施例中,这基于使用椭圆曲线secp256k1的ecdsa。数字签名对特定的数据段进行签名。在实施例中,对于给定交易,签名将对部分交易输入以及全部或部分交易输出进行签名。对输出的特定部分进行签名取决于sighash标志。sighash标志是包含在签名末尾的4字节代码,用于选择签名的输出(并因此在签名时固定)。
[0066]
锁定脚本有时称为“scriptpubkey”,指其包括相应交易被锁定到的当事方的公钥。解锁脚本有时称为“scriptsig”,指其提供相应的签名。但是更通俗地说,在区块链150的所有应用中,utxo赎回的条件并不一定包括对签名进行认证。更通俗地说,脚本语言可用于定义任何一个或更多个条件。因此,可以优选更为通用的术语“锁定脚本”和“解锁脚本”。
[0067]
节点软件
[0068]
图4示出了在基于utxo或基于输出的模型的示例中,在p2p网络106的每个节点104上运行的节点软件450的示例。节点软件450包括协议引擎451、脚本引擎452、堆栈453、应用
级决策引擎454以及一个或更多个区块链相关功能模块的集合455。在任何给定节点104处,这些模块可以包括以下三个模块中的任何一个、两个或全部:挖掘模块455m、转发模块455f和存储模块455s(取决于该节点的一个或多个角色)。协议引擎401被配置为识别交易152的不同字段,并根据节点协议处理此类字段。当接收到具有指向另一先前交易152i(txi)的输出(例如,utxo)的输入的交易152j(txj)时,协议引擎451标识txj中的解锁脚本并将其传递给脚本引擎452。协议引擎451还基于txj的输入中的指针来标识和检索txi。如果txi尚未在区块链150上,则可以从相应节点自身的未决交易池154中检索txi;或者,如果txi已在区块链150上,则可以从存储在相应节点或另一节点104处的区块链150中的区块151的副本中检索。无论采用哪种方式,脚本引擎451都会标识txi的指向输出中的锁定脚本,并将其传递给脚本引擎452。
[0069]
因此,脚本引擎452具有txi的锁定脚本和来自txj的相应输入的解锁脚本。例如,图2中示出的标为tx0和tx1的交易,但同样可以应用于任何交易对。如前所述,脚本引擎452同时运行两个脚本,这将包括根据正在使用的基于堆栈的脚本语言(例如,脚本)将数据放置到堆栈453上并从该堆栈中检索数据。
[0070]
通过同时运行脚本,脚本引擎452确定解锁脚本是否满足锁定脚本中定义的一个或更多个标准,即解锁脚本是否对包括锁定脚本的输出进行解锁?脚本引擎452将该确定的结果返回给协议引擎451。如果脚本引擎452确定解锁脚本确实满足在相应的锁定脚本中指定的一个或更多个标准,则返回结果“true”。否则,返回结果“false”。
[0071]
在基于输出的模型中,来自脚本引擎452的结果“true”是交易有效性的条件之一。通常,还必须满足由协议引擎451评估的一个或更多个进一步协议级条件;例如,txj的输出中所指向的数字资产的总金额不超过其输入指定的总金额,并且txi的指向输出尚未被另一有效交易花费。协议引擎451评估来自脚本引擎452的结果以及一个或更多个协议级条件,并且只有当它们都为true时,协议引擎451才核实交易txj有效。协议引擎451将交易是否有效的指示输出到应用级决策引擎454。只有在txj确实核实有效的条件下,决策引擎454才可以选择控制挖掘模块455m和转发模块455f中的一个或两个来执行它们涉及txj的相应区块链相关函数。这可以包括:挖掘模块455m,该挖掘模块将txj添加到节点的相应池154以挖掘到区块151中;和/或转发模块455f,该转发模块将txj转发到p2p网络106中的另一节点104。然而,应当注意的是,在实施例中,虽然决策引擎454不会选择转发或挖掘无效交易,相反,这并不一定意味着,仅因为交易有效,该决策引擎就必须触发该交易的挖掘或转发。可选地,在实施例中,应用级决策引擎454可以在触发这些函数中的一个或两个函数之前应用一个或更多个附加条件。例如,如果节点是挖掘节点104m,则决策引擎可以仅在交易有效且预留足够挖掘费用的条件下选择挖掘该交易。
[0072]
此外,还应当注意的是,在本文中,术语“true”和“false”不一定限于返回仅以单个二进制数(位)形式表示的结果,尽管这确实是一种可能的实现方式。更通俗地说,“true”可以指指示成功或肯定结果的任何状态,而“false”可以指指示不成功或不肯定结果的任何状态。例如,在基于账户的模型(图4中未示出)中,可以通过节点104对签名的隐式协议级核实和智能合约的附加肯定输出的组合来指示结果为“true”(如果两个单独的结果均为true,则认为总体结果为true)。
[0073]
第二语言的在线执行
[0074]
如今,越来越多的数据存储在区块链上,以利用区块链提供的安全性和不可变性。此外,这可包括编程语言采用引用txid的对象的可能性,以及可执行文件存储在链上并且供公众使用的可能性。随着挖矿服务的出现,需要为矿工提供一种分散计算的方式,例如消除消费者在其个人设备中拥有巨大处理能力的需求。在本节中,公开了一种方法,使得通过将非script代码包含在script代码中在链下评估此等目的或类似目的,但是由此输入和输出不可变地存储在链上。这与某些软件上可用的虚拟机类似,诸如基于账户的模型。
[0075]
注:本文的实施例针对锁定脚本和解锁脚本中使用的script脚本语言进行举例证明,并且第二语言是非script语言。但是,更通俗地说,在其他区块链实施方式中,本文任何位置公开的技术均可扩展至任何第一和第二语言,其中第一语言是锁定脚本和解锁脚本中使用的任何语言,该语言由区块链网络106的节点104根据区块链网络106上采用的标准节点协议进行识别。第二语言可以是除此之外的任何语言。下面和本文其他位置用示例来描述实施例,其中第一语言是script,第二语言是非script语言。但是,应当理解的是,这并不构成限制,更通俗地说,本文任何位置对script和非script语言的任何提及均可分别用术语“第一语言”和“第二语言”代替。还应当注意,本文所指的术语“语言”指计算机语言(即编程语言)。这可以是计算机设备能够识别的任何形式的代码(软件),以实现用于操作计算机设备的一组规则、指令或步骤。其可以指脚本语言,拟编译的高级语言、拟解释的高级语言、拟汇编的汇编语言或拟直接执行的低级机器代码语言。进一步地,需注意本文所指的术语“执行”通常可指以任何种类的语言运行任何此等程序的任何此等方式,并且在狭义上不一定指例如执行机器代码指令。
[0076]
通常情况下,软件中的本地扩展描述将一种编程语言的一些代码嵌入另一编程语言的脚本中的过程(例如,在ruby脚本中包含c代码)。更通俗地说,这是一种将一个软件连接至另一软件的方式。嵌入脚本可本地编译并链接,因为生成的可执行文件可根据本地扩展的返回值设置条件。在本节中,脚本(小写)指一组基于代码的指令,script(大写)指由区块链网络106的节点104识别的编程语言,用于锁定脚本和解锁脚本,以根据网络106的节点104识别的节点协议核实交易152。
[0077]
根据本文公开的实施例,脚本可被定义为使用嵌入在script代码中的外部代码。该代码链接至外部的非script库,执行并将值返回至script代码中。该script代码可使用例如标准op代码进行验证或分析。该方法可使用区块链150或用户的输入对值进行分析,以及用于选择各种交易选项。图3示出了该过程的示例性图示。
[0078]
图3示出了执行非script代码301的示例性图示。钱包或节点软件使用程序启动器,诸如集成虚拟机,以用外部非script库303评估非script代码302。在实施例中,然后可将接收推送至堆栈453,并且使用script op代码进行评估。
[0079]
使用非script代码可允许将更复杂的控制数据和验证步骤嵌入压缩的可执行文件中。如果可执行嵌入脚本的虚拟机集成在钱包或节点软件中,则区块链的安全和身份验证也可提供至软件。这可用于直接针对现有的软件盗版问题,例如,因为重新分配软件需要在基于区块链的场景中暴露私钥。
[0080]
在脚本中,控制数据和/或密钥验证可作为一组条件语句(例如,if、else、while)包含在非script代码302中。然后,脚本引擎452的分支中包含的提取器可读取存储在op_return、op_pushdata和/或op_drop中的压缩的可执行文件,然后解压缩并在集成的虚拟机
上运行代码。该过程允许交易脚本访问交易外的数据,在遵守基本协议的同时增加了脚本的通用性。
[0081]
图5示出了根据本文公开的实施例的节点软件450的扩展。脚本引擎452还包括提取器501,并且节点软件450还包括用于运行非script代码302的程序启动器502。节点软件450还可包括一个或更多个非script库303。提取器被配置为从交易152提取非script代码302,并且将其传送至程序启动器502以供运行。在实施例中,这可包括使用一个或更多个非script库303运行非script代码302。
[0082]
所描述的过程由节点软件450在区块链网络的至少一个节点104上运行。通常而言,这可以是核实交易152的任何类型的节点104:挖矿节点104m、存储节点104s和/或转发节点104f。但是,在特别优选的实施例中,过程至少由一个或更多个挖矿节点104m实现。在这种方式中,通过至少向矿工支付固有的挖矿费和付款人(例如爱丽丝103a)明确留下的任何额外挖矿费,运行非script软件302。如稍后将更详细地讨论,本公开提供了一种机制,由此必须运行非script代码302,以核实相关交易,并且因此矿工必须运行非script代码302以获取费用。
[0083]
脚本引擎452被设置成接收已记录在区块链150的区块151中的第一交易152i(txi)。通过访问区块链150上其自身节点的交易152的本地记录,或者访问另一节点104(例如,存储节点104s)上的记录,可实现这一点。第一交易txi包括可花费的输出203,该可花费的输出包括锁定脚本,即script代码301。
[0084]
脚本引擎452还被设置成接收第二交易152j(txj),该第二交易尚未被记录在区块链150的区块151中。相反,第二交易将基于本公开的机制核实,以进行传播和/或挖矿。第二交易txj可从终端用户的用户设备102进行接收,例如从爱丽丝的设备102b接收。或者,第二交易txj可从充当转发节点104f的另一节点104接收。作为另一种可能性,第二交易txj可在执行核实的节点104处编制,在这种情况下,其从本地节点104的另一内部过程接收。无论从何处接收,第二交易txj均包括指向第一交易txi的输出203的输入202。第二交易txj的输入202还包括解锁脚本,用于解锁第一交易txi的输出,并且从而核实第二交易txj,以进行传播和/或挖矿(并且因此最终记录在区块链150上的区块151中)。解锁脚本以与锁定脚本相同的脚本语言编制,即本示例中的script。
[0085]
提取器501被配置为从第一交易txi自动提取非script代码302,并将提取的非script代码302传送至非script程序启动器502以供执行(运行)。或者,并不排除非script代码可以包含在区块链150上的另一现有交易152中,并且从中提取。下面将针对作为锁定脚本301嵌入在相同交易中的非script代码302进行描述,该锁定脚本用于核实第二交易txj,但应当理解的是,这并一定局限于所有可能的实施例。
[0086]
当非script代码302作为锁定脚本301嵌入在相同交易中时,即第一交易txi,存在多个这方面的选项。因为包含非script代码302是非标准元素,所以原则上,只要提取器501被配置为知道在何处寻找或者如何在交易数据结构中找到,则其可以包含在第一交易txi中的任何位置(在作为相应锁定脚本301的同一可花费的输出中,或在诸如不可花费的输出等另一输出中,或在诸如附加至交易的其他位置)。通过在交易152的预定位置或预定字段包含非script代码302(在示例中为txi),可以实现这一点。在这种情况下,提取器501被预先配置为从预定字段或位置提取非script代码302。或者,交易数据结构中非script代码
302的位置可以用代码标记来指示。比如,在一些实施例中,可以使用非标准(非script)代码标记,诸如nsc_{

},其中花括号中的部分包括非script代码302。但是,作为另一选项,通过使用锁定脚本301的脚本语言的操作码,即在本示例中使用script op代码,非script代码302可嵌入第一交易txi的一个输出203中(例如,嵌入锁定脚本301本身中)。
[0087]
用于此操作的script op代码可以是op_return。在这种情况下,非script代码302包含在与锁定脚本301不同的单独输出203中。当节点104的脚本引擎452运行时,op_return可以终止包含其自身在内的任何输出203的脚本。因此,op_return会使包含其自身的输出呈现为不可花费。这使得相关输出可以用来携带任何任意的有效载荷数据。
[0088]
再如,在同一输出203中,诸如op_drop或op_pushdata等script op代码可用于将非script代码嵌入在锁定脚本301本身中。比如,op_drop告知脚本引擎452在解锁脚本执行期间忽略op_drop前面的内容。这可用于在脚本引擎452运行锁定脚本301时,将非script代码302包含在锁定脚本301中,而不会导致错误。op_pushdata告知脚本引擎452推送下一个n字节至堆栈453,例如假设op_pushdata4将下一个4字节推送至堆栈。这可用于将非script代码推送到堆栈453上,然后提取器501将从堆栈453读取非script代码。
[0089]
无论采用何种提取方式,提取器501都将提取的非script代码302传送至程序启动器502以供运行。在实施例中,提取器501还可移除非script代码302(和任何非script代码标记),仅在输出203中留下拟由脚本引擎452运行的标准交易格式,该标准交易格式包括标准script 301。但是,在其他实施例中,诸如使用op_return、op_drop或op_pushdata的实施例中,这是不必要的,因为已经写入锁定脚本301,以便在脚本引擎452遇到非script代码302时忽略或使其无效。
[0090]
程序启动器502被配置为运行从提取器501接收的非script代码302。非script代码302可包括任何高级或低级语言。其可包括例如任何脚本语言、需要编译的语言,需要链接的语言、需要汇编的语言和/或解释性语言。代码启动器452运行非script代码302可包括以下任何一项或多项:编译、链接、汇编和/或解释,具体视语言而定。比如,非script代码302可以是c、c 、python、java script、basic等,或者甚至语言的组合。在实施例中,非script代码启动器502可以采用虚拟机的形式。其可引用一个或更多个库303以运行非script代码302,例如通过链接至库303。
[0091]
当由代码启动器502运行时,非script代码302执行一个或更多个操作,导致一个或更多个第一值输出至由标准脚本引擎452识别的第一语言可读的存储位置。实际上,该存储位置可以是任何非易失性存储器、ram或甚至一个或更多个寄存器。在第一语言是基于堆栈的语言的情况下,诸如script,存储位置为堆栈453。但是,并不排除在其他区块链实施方式中使用非基于堆栈的第一语言的可能性。通过示例的方式,下面将针对基于堆栈的实施方式进行描述,其中非script代码302输出的值的目的地存储位置是堆栈453,使得可访问脚本引擎452识别的基于堆栈的脚本语言(例如script),但应当理解的是,这不一定构成限制。
[0092]
第一交易txi的锁定脚本301被配置为使得输出“true”并且从而启用核实取决于由非script代码302写入堆栈453中的至少一个值。因此,第二交易txj的核实被迫以在相应节点104运行非script代码302为条件。
[0093]
除此之外,锁定脚本301对非script代码302写入堆栈453的值施加的特定条件几
乎可以是用户或开发人员希望的任何内容。在给出的示例中,其中付款人是爱丽丝,即第一交易txi的输出203锁定至爱丽丝,则非script代码302可以是爱丽丝希望向矿工付款来为她执行的一些代码,例如代替爱丽丝自己的设备103a,在网络106上执行一些计算分析或机器学习任务。非script代码301的预期输出值可以例如是期望的结果,或非script代码302已正确执行的证据。
[0094]
比如,在实施例中,鲍勃103b可以是矿工(因此他的计算机设备102b包括挖矿节点104m,而不仅仅是终端用户设备)。第二交易txj的输入202指向锁定至爱丽丝的第一交易txi的输出203,第二交易txj具有锁定至矿工鲍勃或另一方的输出203。因此,在此场景中,爱丽丝至少向鲍勃支付挖矿费,并且还可能支付明确的费用,以运行她期望的软件。非script代码302的输出可推送至script代码中运行的堆栈453,从而允许应用op_codes。然后,返回的值(“第一”值)可用于解锁其他脚本或解锁和完成加载程序所在的同一脚本。鲍勃必须运行非script软件302,否则不会核实第二交易txj并且他不会收到费用。包含锁定脚本301的输出203可指定少量(可忽略的)的数字资产金额,然而第一交易txi的输入202是非可忽略的金额,因此实际上只向矿工支付费用。或者,也可通过输出203(或另一输出)向另一方支付费用。
[0095]
作为施加在非script代码302的输出值(“第一”值)上的条件的示例,脚本引擎452可被配置为接收第二值,比较第二值与第一值(非script代码302输出的值),并且在第一值和第二值匹配的条件下输出结果为true。第二值可以从第二交易txj的输入202接收,或从另一来源接收,诸如用户输入(例如通过矿工鲍勃),或在运行非script代码302的节点104进行本地预存储。应当理解的是,该上下文中的“第一”和“第二”同样只是任意的标签,不一定暗示任何关于值生成顺序的信息。
[0096]
比如,第一交易txi的输出203中的锁定脚本301可以是:
[0097]
{non script code 1}<expected output>op_equalverify
[0098]
在这种情况下,为了获得有效的第二交易txj,第二交易txj的输入202中的解锁脚本将是:
[0099]
{non script code 1 input}
[0100]
此处,《》表示推送至堆栈,{}表示外部执行的非script代码,其输出推送至堆栈。预期输出是第一值(非script代码302向堆栈453输出的值),非script代码1输入是第二值,即与非script代码302的输出进行比较的值。
[0101]
在此示例中,要求第一值等同于第二值,以核实第二交易。但是,更通俗地说,匹配可能需要相同值,或可允许一些其他匹配标准,例如,在值为数字的情况下第一值和第二值在误差范围内,或者值的同义词是单词等。
[0102]
在进一步的示例中,锁定脚本301可以取决于拟由非script代码输出的多个值。
[0103]
例如,第一交易txi的输出203中的锁定脚本301可以是:
[0104]
{non script code 1}《expected output》op_equalverify{non script code 2}
[0105]
第二交易txj的输入202中的对应解锁脚本将是:
[0106]
{non script code 2 input}{non script code 1 input}
[0107]
图6中示出了上述示例性脚本的执行。
[0108]
在此示例中,要求非script代码302输出的两个第一值(预期值)中的每一个均等
于两个对应第二值(在这种情况下,两个值均在第二交易txj的输入中指定)的相应值。在其他示例中,锁定脚本301可指定如果例如两个值中的任何一个与其相应的第二值匹配(即逻辑or,使得不一定需要两个匹配),则满足条件。另一个示例是xor。这些想法还可以扩展至两个以上的第一值及其对应的第二值。
[0109]
脚本的评估使用链上/链下混合机制完成,其中输入和输出均记录在链上,条件的验证在链上进行,但是复杂条件在链下评估。这提供了一种一旦矿工选择专门从事这方面,则执行付费分散计算的方法。
[0110]
在上述示例中,由于赎回交易不需要签名,任何人均可通过试图花费交易提交输入,并且任何验证条件均可在《non script code 1》中实现。或者,但是,用于核实的一个或更多个进一步条件(不取决于非script代码302)可由第一交易txi的锁定脚本301另外施加。这些条件可包括一个或更多个常规条件,诸如认证第二交易txj的解锁脚本中包含的鲍勃的签名,或者第二交易txj的解锁脚本提供第一交易txi的锁定脚本301中设置的哈希难题的解决方案。
[0111]
应当理解,上述实施例仅通过示例的方式进行描述。
[0112]
更通俗地说,根据本文公开的一方面,提供了一种由区块链网络的节点执行的计算机实现的方法,其中区块链的副本在区块链网络的至少一些节点进行维护,区块链包括一系列区块,每个区块包括一个或更多个交易,每个交易包括一个或更多个输出,并且每个输出包括以第一语言编制的锁定脚本。该方法包括:从所述交易的第一交易的至少第一输出访问锁定脚本,第一输出的锁定脚本以第一语言指定用于解锁所述第一输出的一个或更多个条件;并且接收尚未记录在区块链上的第二交易,其中第二交易包括输入,输入包括以第一语言编制的解锁脚本。所述方法进一步包括:从区块链上的第一交易或另一交易中提取以第二语言编制的部分代码,而非第一语言;以第二语言运行所述提取的部分代码,其中由此代码生成至少一个第一值;以第一语言将第一值写入锁定脚本可读的存储位置;以第一语言运行来自第一交易的第一输出的锁定脚本以及来自第二交易的解锁脚本,从而评估一个或更多个条件,该方法包括在满足所述一个或更多个条件的情况下核实第二交易。解锁脚本被配置为从所述存储位置读取第一值,并且该一个或更多个条件包括取决于第一值的条件。
[0113]
在实施例中,第一语言可以是基于堆栈的语言,用于将值放置到堆栈上并从堆栈中读取值,并且第二语言可以是非基于堆栈的语言。在这种情况下,所述存储位置可以是堆栈。
[0114]
在实施例中,第二语言可以是图灵完备的,第一语言可以不是图灵完备的。
[0115]
在实施例中,第一语言可以是script,第二语言可以是非script语言。
[0116]
在实施例中,所述部分代码可以提取自第一交易。
[0117]
在一些此等实施例中,所述部分代码可存储在第一交易的第一输出中,并且所述提取可包括从所述第一输出中提取部分代码。比如,所述部分代码可嵌入在第一输出的锁定脚本中,所述提取包括从所述第一输出的锁定脚本中提取部分代码。
[0118]
或者,所述部分代码可存储在第一交易的第二不可花费的输出中,并且所述提取可包括从第二输出中提取部分代码。
[0119]
在实施例中,解锁脚本可被配置为将第一值与第二值进行比较,并且取决于第一
值的条件可包括:第一值与第二值相匹配的条件。
[0120]
在实施例中,第二值可包含在第二交易的输出中。在这种情况下,该方法可包括从第二交易提取第二值,并且所述比较可包括将第一值与从第二交易提取的第二值进行比较。
[0121]
在实施例中,第二值可包含在第二交易的输入中,第二值的提取包括从第二交易的输入中提取第二值。比如,第二值可嵌入在解锁脚本中,第二值的提取包括从第二交易的输入中提取第二值。
[0122]
在替代实施例中,第二值可由用户输入确定,或可预先存储在执行所述方法的节点处。
[0123]
在实施例中,由于运行提取的部分代码,该代码可输出多个第一值。所述比较可包括将第一值中的每一个与多个第二值中的相应值进行比较,并且取决于第一值的条件可包括:至少一个第一值与相应的第二值相匹配的条件。
[0124]
比如,取决于第一值的所述条件可包括:第一值中的每一个均与相应的第二值相匹配的条件。或者,取决于第一值的所述条件包括:第一值中的任何一个均与相应的第二值相匹配的条件。
[0125]
在实施例中,该条件可还包括仅基于解锁脚本而非第二语言的所述部分代码评估的一个或更多个其他条件。比如,该一个或多个其他条件可包括锁定脚本在运行时将解锁脚本中的加密签名认证为锁定脚本被锁定的一方的签名的条件。
[0126]
在实施例中,所述部分代码可以压缩形式存储在第一交易中,并且所述部分代码的运行包括解压缩该压缩形式的代码。
[0127]
在实施例中,执行该方法的节点可以是挖矿节点。在这种情况下,该方法可包括在所述核实的条件下将第二交易包含在交易池中,并竞相将交易池挖掘到区块链的新区块中。
[0128]
在实施例中,执行该方法的节点可以是转发节点。在这种情况下,该方法可包括在所述核实的条件下将第二交易转发至区块链网络的至少一个其他节点。
[0129]
在实施例中,执行该方法的节点可以是存储节点。在这种情况下,该方法可包括存储区块链的部分或全部,区块链包含新区块,该新区块包括第二交易,第二交易一旦被核实,便被挖掘到新区块中。
[0130]
根据本文公开的另一方面,提供了一种包含在计算机可读存储器上的计算机程序,配置为当在区块链网络的节点上运行时执行根据本文公开的任何实施例所述的方法。
[0131]
根据另一方面,提供了一种区块链网络的节点,包括:处理装置、存储器和网络接口,该处理装置包括一个或更多个处理器,该存储器包括一个或更多个存储装置,该网络接口用于接收交易;其中该存储器储存被设置用于在处理装置上运行的软件,该软件被配置为在运行时执行根据本文公开的任何方面的方法,第二交易经由网络接口接收。
[0132]
根据另一方面,提供了用于记录在区块链中的一组交易,该组在计算机可读数据介质或媒体上包括:第一交易,该第一交易至少包括第一输出,该第一输出包括以第一语言编制的锁定脚本,其中该锁定脚本以第一语言指定用于解锁所述第一输出的一个或更多个条件;第二交易,该第二交易包括输入,该输入包括以第一语言编制的解锁脚本;其中第一交易包括以第二语言而非第一语言编制的嵌入部分代码,所述部分代码被配置为在区块链
网络的节点上运行时生成至少一个第一值,并且将第一值写入第一语言的锁定脚本可读的存储位置;并且其中解锁脚本被配置为从所述存储位置读取第一值,并且锁定脚本中指定的一个或更多个条件包括取决于第一值的条件。
[0133]
根据本文公开的另一方面,可提供一种包括第一方、第二方、可能涉及的任何第三方和/或任何一个或更多个节点网络的动作的方法。
[0134]
根据本文公开的另一方面,可提供一种系统,该系统包括第一方的计算机设备、第二方的计算机设备、任何第三方的计算机设备和/或任何一个或更多个节点网络。
[0135]
一旦给出本文的公开内容,所公开技术的其他变体或用例对于本领域技术人员可能变得显而易见。本公开的范围不受所描述的实施例限制,而仅受随附权利要求限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献