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

多标准区块链协议的制作方法

2022-05-26 20:42:04 来源:中国专利 TAG:


1.本公开涉及用于实现区块链协议的方法和交易,其要求满足m/n标准(m-of-n criteria)以解锁交易。


背景技术:

2.区块链是指一种分布式数据结构形式,其中在点对点(p2p)网络中的多个节点中的每个节点处维护区块链副本。区块链包括一系列数据区块,其中每个区块包括一笔或多笔交易。每笔交易都可以回指序列中的先前交易,其可以扩展一个或更多区块。通过称为“挖掘”的过程,交易可以通过提交到网络包括在新区块中,该过程涉及多个挖掘节点中的每个挖掘节点争相执行“工作量证明”,即基于等待包括在区块中的未决交易池解决加密难题。
3.区块链中的交易通常用于传递数字资产,即用作价值储存手段的数据。但是也可利用区块链实现区块链上的分层附加功能。例如,区块链协议可允许在交易输出中存储附加用户数据。现代区块链在单一交易中可储存的最大数据容量在不断增加,从而能够并入更复杂的数据。例如,这可用于在区块链中存储电子文档,甚至音频或视频数据。
4.网络中的每个节点可以具有以下三个角色中的任何一个、两个或全部:转发、挖掘和存储。转发节点在整个网络节点中传播交易。挖掘节点将交易挖掘到区块中。存储节点各自对区块链中的已挖掘区块存储自己的副本。为了将交易记录在区块链中,一方将该交易发送到网络中的节点中的一个节点进行传播。接收该交易的挖掘节点可以争相将该交易挖掘到新区块中。每个节点被配置为遵守相同的节点协议,该协议将包括用于确认交易有效的一个或更多个条件。无效交易将不会传播或挖掘到区块中。假定交易已经核实有效,从而在区块链上被接受,该附加用户数据将因此作为不可改变的公共记录,继续存储在p2p网络中的各个节点处。
5.一些区块链协议使用脚本语言,该脚本语言使当事方能创建高级标准,潜在接收者可根据该高级标准花费交易的输出。一些脚本语言包括检查交易的输入中是否存在足够数量的有效数字签名的函数(有时称为操作码)。如果所需的m/n签名(m-of-n signatures)可用,则可花费输出。


技术实现要素:

6.虽然有用,但m/n签名检查仅限于检查是否满足所请求数字签名的阈值。但是,在某些场景中,可能要求不一定是签名的其他标准的阈值。举例来说,潜在接收者可被要求生成

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

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

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

sig’),但在由

sig’输入验证的交易中仍保留附加要求,诸如哈希难题。再如,op_return是脚本语言操作码,用于创建交易的不可花费输出,其可以将元数据储存在交易中,从而将元数据不可变地记录在区块链150中。例如,元数据可包括需存储在区块链中的文件。
[0071]
签名pa是数字签名。在实施例中,这基于使用椭圆曲线secp256k1的ecdsa。数字签名对特定的数据段进行签名。在实施例中,对于给定交易,签名将对部分交易输入以及全部或部分交易输出进行签名。对输出的特定部分进行签名取决于sighash标志。sighash标志是包含在签名末尾的4字节代码,用于选择签名的输出(并因此在签名时固定)。
[0072]
锁定脚本有时称为“scriptpubkey”,指其包括相应交易被锁定到的当事方的公钥。解锁脚本有时称为“scriptsig”,指其提供相应的签名。但是更通俗地说,在区块链150的所有应用中,utxo赎回的条件并不一定包括对签名进行认证。更通俗地说,脚本语言可用于定义任何一个或更多个条件。因此,可以优选更为通用的术语“锁定脚本”和“解锁脚本”。
[0073]
可选的侧信道
[0074]
图3示出了用于实现区块链150的另一系统100。除了附加的通信功能外,该系统100与图1所示的内容基本相同。爱丽丝和鲍勃的每台计算机设备102a,120b上的客户端应用程序分别包括附加通信功能。也就是说,这可使爱丽丝103a建立与鲍勃103b分离的侧信
道301(在任何一方或第三方的鼓动下)。侧信道301能够独立于p2p网络实现数据交换。此等通信有时候被称为“链下”通信。比如,当交换爱丽丝与鲍勃之间的交易152时不想将该交易(仍未)发布到p2p网络106或挖掘到区块150,可以采用此等通信,直到其中一方选择将该交易广播到网络106。替代地或附加地,该侧信道301可以用于交换任何其他的交易相关数据,例如密钥、协商的金额或条款、数据内容、等等。
[0075]
通过与p2p覆盖网络106相同的分组交换网络101可建立侧信道301。此外/或者,通过诸如移动蜂窝网络等不同网络、或者诸如本地无线网络等局域网、或者甚至爱丽丝和鲍勃的设备1021,102b之间的直接有线或无线连接可以建立侧信道301。一般而言,本文所指的侧信道301可包括经由一种或多种联网技术或者通信介质的任何一个或更多个链路,用于“链下”(即独立于p2p覆盖网络106)交换数据。在多个链路被使用的情况下,整个链下链路的捆绑或集合才可以被称为侧信道301。因此,需要注意的是,虽然爱丽丝和鲍勃通过侧信道301对特定的信息或数据片段或者诸如此类进行交换,但这并不一定意味着所有这些数据片段必须通过相同的链路或甚至同一类型网络进行发送。
[0076]
节点软件
[0077]
图4示出了在基于utxo或基于输出的模型的示例中,在p2p网络106的每个节点104上运行的节点软件400的示例。节点软件400包括协议引擎401、脚本引擎402、堆栈403、应用级决策引擎404以及一个或更多个区块链相关功能模块的集合405。在任何给定节点104处,这些模块可以包括以下三个模块中的任何一个、两个或全部:挖掘模块405m、转发模块405f和存储模块405s(取决于该节点的一个或更多个角色)。协议引擎401被配置为识别交易152的不同字段,并根据节点协议处理此类字段。当接收到具有指向另一先前交易152m-1(tx
m-1
)的输出(例如,utxo)的输入的交易152m(txm)时,协议引擎401标识txm中的解锁脚本并将其传递给脚本引擎402。协议引擎401还基于txm的输入中的指针来标识和检索tx
m-1
。如果tx
m-1
尚未在区块链150上,则可以从相应节点自身的未决交易池154中检索tx
m-1
;或者,如果tx
m-1
已在区块链150上,则可以从存储在相应节点或另一节点104处的区块链150中的区块151的副本中检索。无论采用哪种方式,脚本引擎401都会标识tx
m-1
的指向输出中的锁定脚本,并将其传递给脚本引擎402。
[0078]
因此,脚本引擎402具有tx
m-1
的锁定脚本和来自txm的相应输入的解锁脚本。例如,图4中示出的tx1和tx2,但同样可以应用于任何交易对,诸如tx0和tx1等。如前所述,脚本引擎402同时运行两个脚本,这将包括根据正在使用的基于堆栈的脚本语言(例如,脚本)将数据放置到堆栈403上并从该堆栈中检索数据。
[0079]
通过同时运行脚本,脚本引擎402确定解锁脚本是否满足锁定脚本中定义的一个或更多个标准,即解锁脚本是否对包括锁定脚本的输出进行解锁?脚本引擎402将该确定的结果返回给协议引擎401。如果脚本引擎402确定解锁脚本确实满足在相应的锁定脚本中指定的一个或更多个标准,则返回结果“true”。否则,返回结果“false”。
[0080]
在基于输出的模型中,来自脚本引擎402的结果“true”是交易有效性的条件之一。通常,还必须满足由协议引擎401评估的一个或更多个进一步协议级条件;例如,txm的输出中所指向的数字资产的总金额不超过(多个)输入指定的总金额,并且tx
m-1
的指向输出尚未被另一有效交易花费。协议引擎401评估来自脚本引擎402的结果以及一个或更多个协议级条件,并且只有当它们都为true时,协议引擎401才核实交易txm有效。协议引擎401将交易
是否有效的指示输出到应用级决策引擎404。只有在txm确实核实有效的条件下,决策引擎404才可以选择控制挖掘模块405m和转发模块405f中的一个或两个来执行它们涉及txm.的相应区块链相关函数。这可以包括:挖掘模块405m,该挖掘模块将txm添加到节点的相应池154以挖掘到区块151中;和/或转发模块405f,该转发模块将txm转发到p2p网络106中的另一节点104。然而,应当注意的是,在实施例中,虽然决策引擎404不会选择转发或挖掘无效交易,相反,这并不一定意味着,仅因为交易有效,该决策引擎就必须触发该交易的挖掘或转发。可选地,在实施例中,决策引擎404可以在触发这些函数中的一个或两个函数之前应用一个或更多个附加条件。例如,如果节点是挖掘节点104m,则决策引擎可以仅在交易有效且预留足够挖掘费用的条件下选择挖掘该交易。
[0081]
此外,还应当注意的是,在本文中,术语“true”和“false”不一定限于返回仅以单个二进制数(位)形式表示的结果,尽管这确实是一种可能的实现方式。更通俗地说,“true”可以指指示成功或肯定结果的任何状态,而“false”可以指指示不成功或不肯定结果的任何状态。例如,在基于账户的模型(图4中未示出)中,可以通过节点104对签名的隐式协议级核实和智能合约的附加肯定输出的组合来指示结果为“true”(如果两个单独的结果均为true,则认为总体结果为true)。
[0082]
脚本
[0083]
区块链协议可以对交易使用脚本语言。脚本本质上是元素列表,这些元素可以是数据或指令。这些指令在文献中称为脚本字、操作码、命令或函数。操作码(opcode,操作代码的简称)对脚本中的数据执行预定义操作。脚本内的数据可以是例如数字、公钥、签名、哈希值等。操作码是对脚本内的数据执行操作的函数。在脚本语言中,脚本从一端运行到另一端(通常是从左到右),并使用称为“堆栈”的数据结构。数据始终被推送到堆栈上(即放置到堆栈上)。操作码可以从堆栈中弹出数据(即从堆栈中获取数据),对数据执行操作,然后可选地将新数据“推送”到堆栈上。在许多区块链中通常使用的基于堆栈的脚本语言称为脚本。下面将根据脚本语言的操作码进行描述。
[0084]
本领域技术人员将熟悉基于堆栈的脚本语言。以下示例示出了示例性脚本实现方式。具体地说,以下示出了示例性核实和解锁过程。
[0085]
示例性脚本可以包括《鲍勃的签名》《鲍勃的公钥》op_dup op_hash《鲍勃的公共地址》op_equalverify op_checksig。该脚本从左到右操作。
[0086]
步骤1:将《鲍勃的签名》推送到堆栈上
[0087] 《鲍勃的签名》
[0088]
步骤2:将《鲍勃的公钥》推送到堆栈上(这现在是堆栈上的顶部元素)
[0089]
《鲍勃的公钥》《鲍勃的签名》
[0090]
步骤3:op_dup操作码对堆栈上的顶部元素执行操作,以复制《鲍勃的公钥》。
[0091]
《鲍勃的公钥》《鲍勃的公钥》《鲍勃的签名》
[0092]
步骤4:op_hash操作码弹出并通过哈希算法(后跟一项或更多项可选操作)运行《鲍勃的公钥》,以获取《鲍勃的公共地址》并将其放置到堆栈上。
[0093]
《鲍勃的公共地址》《鲍勃的公钥》《鲍勃的签名》
[0094]
步骤5:将《鲍勃的公共地址》推送到堆栈上(这现在是堆栈上的顶部元素)
[0095]
《鲍勃的公共地址》《鲍勃的公共地址》《鲍勃的公钥》《鲍勃的签名》
[0096]
步骤6:op_equalverify操作码从堆栈中弹出最后两个元素(《鲍勃的公共地址》和《鲍勃的公共地址》),并检查这两个地址是否相同。如果它们不相同,则认为执行失败。如果条件为true,则执行下一个命令。
[0097]
ꢀꢀ
《鲍勃的公钥》《鲍勃的签名》
[0098]
步骤7:op_checksig操作码弹出《鲍勃的公钥》》和《鲍勃的签名》》,并检查它们的有效性。此过程完成之后,鲍勃可以解锁交易并访问指定金额的数字资产。
[0099]
true
ꢀꢀꢀ
[0100]
为简洁起见,本文使用的操作码将是script语言的操作码,例如“op_checksig”。但是,本公开不限于script语言的操作码。更通俗地说,虽然实施例将根据特定区块链脚本语言(script)的操作码进行描述,但是相同的教导可以使用任何脚本语言的操作码来实现,该操作码由脚本引擎(例如,脚本解释器)调用时执行特定函数。此外,虽然以下实施例可根据椭圆曲线数字签名算法(ecdsa)进行举例证明,但应当理解的是,诸如rsa等其他加密签名方案在本领域是已知的,并且同样可在本文采用。
[0101]
二进制阈值协议
[0102]
基于阈值的解锁系统的示例是一些区块链协议的多重签名功能的示例。在一些区块链协议中,可构建交易锁定脚本,该交易锁定脚本可通过提供对应于m个先前指定公钥的任何m/necdsa签名进行解锁。用于此等多重签名交易的锁定脚本条件编写如下:
[0103]
m《p1》《p2》

《p
n-1
》《pn》nop_checkmultisig
[0104]
此处,锁定脚本以所需的有效签名数量(m)开始,然后列出m个签名必须对应的n个公钥集合、n值和操作码op_checkmultisig,该操作码检查是否所有m个签名均有效。
[0105]
解锁脚本将采用以下形式:
[0106]
0《sigpa》

《sigpm》
[0107]
这包括m个签名以及占位符值0。占位符本身不进行处理,仅由于在特定区块链协议的现有实施方式中存在漏洞,才需要占位符。
[0108]
本公开的实施例提供了构建交易锁定脚本(同义地称为输出脚本或scriptpubkey)的技术,该交易锁定脚本可通过在后续交易的解锁脚本(同义地称为scriptsig的输入脚本)中提供满足任何m/n标准的数据项来进行解锁。与op_checkmultisig一样,该标准可能要求对应于公钥的签名。但是,以下技术不限于要求签名。通常而言,可以定义任何标准。比如,可要求提供哈希的哈希原像、方程的解、测验问题的答案等。
[0109]
首先参考图5描述实施例。图5是图1的简化版本,示出了用于实现二进制阈值协议(btp)的示例性系统500。第一方(爱丽丝)103a生成交易tx1并且将第一交易tx1传输至区块链网络106。假设满足区块链协议,则第一交易tx1将包含在区块链150中。需注意,相反,不同方可代表爱丽丝将她的交易传输至区块链网络106。第一交易tx1包括输出,该输出指定数字资产金额。数字资产由输出脚本(或锁定脚本)锁定。为了解锁并转移至第二方(鲍勃)103b,鲍勃必须将第二交易tx2传输至区块链网络106,该区块链网络具有可锁定第一交易tx1的输出脚本的输入脚本(或解锁脚本)。
[0110]
当构建输出脚本时,爱丽丝103a包括多个标准组件。每个标准组件包括一个或更多个操作码(或通常而言,包括函数),例如op_checksigverify。标准组件还可包括一个或更多个数据元素,例如哈希值。每个标准组件定义要求满足特定输入数据项的标准。也就是说,当根据后续交易的输入脚本运行时,每个标准组件要求输入脚本包括特定数据项,以便标准组件成功执行,即返回表示“true”的值,例如《1》。例如,部分或全部标准组件可要求提供不同的数字签名作为输入数据项。优选地,每个标准组件可定义不同的标准。或者,一个或更多个标准组件可定义相同的标准。
[0111]
爱丽丝103a还在输出脚本中包括多个计数器脚本组件。每个计数器脚本组件与相应的一个标准组件相关联。比如,在脚本语言中的脚本从左至右执行时,每个计数器脚本组件可遵循标准组件中的相应一个标准。每个计数器组件包括一个或更多个操作码(或函数)和可选的一个或更多个数据项。每个计数器组件被配置为在满足相关联的标准组件时增加计数器。也就是说,如果满足第一标准组件,则第一计数器组件将增加计数器。在本文中应当注意的是,“增加”可用于指增多型或减少型增加。比如,计数器可呈递增的方式增加(例如,一个、两个、三个等)或者计数器可以递减的方式增加(例如,三个、两个、一个等)。在一些示例中,每个计数器组件可使计数器增加相同的量,即增加相同的数量。比如,计数器可在每当满足标准组件时增加一个。或者,计数器组件可进行加权。也就是说,一些计数器组件可使计数器增加相同的量,即增加相同的数量。举例来说,第一计数器组件可增加一个计数器,而第二计数器组件可增加两个计数器。
[0112]
爱丽丝103a构建输出脚本,使得计数器必须至少达到预定数量(或阈值)才能解锁输出。也就是说,输出脚本被配置为确定是否计数器已增加至预定数量。如果这样,则输出可能被解锁并由鲍勃103b赎回。如果未达到阈值,则输出将不得进行解锁。在计数器以递增的方式增加的情况下,输出脚本被配置为确定是否计数器等于或大于阈值。相反地,在计数器以递减的方式增加的情况下,输出脚本被配置为确定是否计数器小于或等于阈值。计数器脚本可包括一个或更多个操作码和可选的一个或更多个数据元素,一起对计数器执行检
查并且在达到阈值时成功地评估为“true”。
[0113]
在一些示例中,标准组件的总数量可大于阈值数量。换言之,通过满足标准组件,可增加计数器至大于解锁输出所需的预定数量的数量。或者,必须满足每个标准组件才能解锁输出。
[0114]
可选地,给定标准组件可由两个或更多个子标准组件组成。与标准组件一样,子标准组件包括操作码和可选的数据元素,需要后续交易的输入数据项才能进行成功评估。举例来说,标准组件可由多个子标准组件组成,每个子标准组件均将哈希函数应用于相应输入数据项,并且将产生的哈希值与预定哈希值进行比较。如果产生的哈希值与预定的哈希值相匹配,则满足子标准组件并且因此满足标准组件。需注意,即使标准组件包括多个子组件,当整体满足标准组件时计数器仅增加一次,而不是每个子标准组件增加一次。
[0115]
如图5所示,爱丽丝103a将qn标准传输至鲍勃103b。需注意,qn标准定义了满足标准组件所需的输入数据项,而不是数据项本身。比如,标准组件可要求数字签名,但不包括数字签名本身。通过向鲍勃103b提供qn标准,鲍勃可知道需要提供的数据项。或者,爱丽丝103a可能不向鲍勃103b提供标准,在这种情况下,鲍勃需要解释标准组件(例如,操作码的序列),以确定需提供作为对应数据项的内容。
[0116]
输出脚本可包括n个标准组件。如果接收者(鲍勃)至少满足锁定脚本中规定的n个标准中的m个标准,则他可赎回爱丽丝103a提供的全部数字资产金额。如果他不满足至少m个标准,则鲍勃103b无法赎回任何数字资产。btp表示m/n标准阈值,其中m是固定的,并且只有当他们至少满足m标准,接收者才能访问数字资产。下面针对两个人(爱丽丝103a和鲍勃103b)对协议进行详细阐述,其中如果鲍勃可以至少满足n个标准中的m个标准,则爱丽丝103a向鲍勃103b付费。爱丽丝103a创建

二进制付费’交易(标题为bpay),其中存在包含输出脚本的输出,该输出脚本锁定包含在输出中的数字资产,直至鲍勃103b能够提供花费交易的输入脚本,该花费交易包含至少满足n个标准中m个标准的内容(在一些示例中,输入脚本还必须包括鲍勃的数字签名)。鲍勃输入脚本的内容将是输入数据项的多个子单元的组合。每个数据项作为特定标准的解决方案提供。
[0117]
该协议经由bpay交易中的输出脚本实现其目标,其中鉴于(来自鲍勃的)输入满足其在bpay输出脚本中的对应标准,会增加计数器(例如,初始化为0并增加一个)。由于预期接收者(鲍勃)预计会将相关输入置于输入交易中,标准被描述为“对应的”,从而将输入与bpay交易的bpay输出脚本中的适当标准进行比较。计数器的值可存储在堆栈上,例如script语言的alt堆栈。当输入相对于其标准很成功时,从alt堆栈中移除(弹出)计数器的当前状态,放置(推动)到主堆栈上,然后从主堆栈中弹出并推回至alt堆栈。如果计数器的最终值至少是m,则接收者鲍勃103b可解锁bpay输出。
[0118]
下面在txid
bpay
和txid
spend
中分别示出了满足btp所需特性的输出和输入脚本示例。
[0119]
锁定(输出)脚本的[criterion_1]分段表示接收者鲍勃103b需要满足的标准(即条件)。比如,这可能需要下面所示的哈希原像。
[0120]
[criterion_1]=op_hash160 h(preimage)op_equal
[0121]
标准还可表示

分组的子标准集合’,其在合并时必须评估为true。
[0122]
[criterion_i]=f([criterion_ia]criterion_ib],

,criterion_i
t
])
[0123]
即使[criterion_i]是多个子标准的组合,如果所有这些子标准的组合评估为true,则计数器仍仅增加一个单位。
[0124][0125]
需注意,括号中的文本是注释,实际上不会包含在交易中。
[0126]
为了解锁bpay的输出,接收者鲍勃103b将在花费交易的输入脚本中提供n段输入,其中这些输入中的至少m个满足至少m个前述标准。示例性花费交易txid
bpay
如上文所示。
[0127][0128]
n个输入的这些集合按必要的顺序放置,使得当输入和输出脚本在堆栈中合并和执行时,每个输入片段均根据预期标准进行匹配和评估,例如:
[0129]
[criterion_2]《input_2》
[0130]
类似于标准下标,《input_i》也可表示分组的输入集合。
[0131]
《input_i》=《input_ia》《input_ib》

《input_i
t
》》
[0132]
鉴于用户能够定义任何标准,这完成了二进制阈值协议的目标,其中必须满足通用标准的阈值,以花费交易的输出。
[0133]
频谱阈值协议
[0134]
btp设置用于赎回数字资产金额的二进制阈值。频谱阈值协议(stp)设置一系列阈值,其中接收者可接收的数字资产金额取决于成功满足的标准数量。
[0135]
图1和图5的示例性系统可用于实现以下描述的技术。第一方(爱丽丝)103a构建具有多个输出的第一交易(称为“spay交易”)。爱丽丝103a以与btp类似的方式构建每个输出。也就是说,每个输出具有输出脚本,并且每个输出脚本包括多个标准组件和多个计数器组件,每个均与标准组件中的相应一个相关联。每个标准组件均定义了标准,该标准可由后续交易的输入脚本中的输入数据项满足。每个计数器组件被配置为如果满足相关联的标准组件,则增加计数器。每个计数器组件可使计数器增加相同的量(例如一个)。或者,一些计数器组件可使计数器增加不同的量。多个标准组件和多个计数器组件定义在每个输出脚本的第一脚本条件中。此处,第一脚本条件仅仅是输出脚本的一部分的标签,包括标准组件和计数器组件。需注意,每个输出包括相同标准组件。
[0136]
与btp一样,对于stp,爱丽丝103a构建每个输出脚本,使得计数器必须至少达到预定数量(或阈值),以解锁相应的输出。也就是说,每个输出脚本被配置为确定是否计数器已增加至预定数量。如果是这样,则鲍勃103b可解锁和赎回相关联输出。如果未达到阈值,则输出将不得进行解锁。与btp不同,stp的至少一个输出脚本要求计数器达到不同的预定数量。也就是说,一些输出脚本要求满足不同的阈值,以进行解锁。
[0137]
在一些示例中,每个输出脚本均要求满足不同的阈值。在其他示例中,一个或更多个输出脚本可共享相同的阈值。在一些示例中,每个输出可锁定不同的数字资产金额。在其他示例中,一个或更多个输出脚本可锁定相同的数字资产金额。数字资产金额可随阈值的增加而增加,即如果满足更多标准,则可赎回更大的数字资产金额。增加量可以与满足的标准数量成比例或不成比例。
[0138]
与btp一样,对于stp,标准组件的总数量可大于阈值数量。或者,必须满足每个标准组件才能解锁输出。同样,与btp一样,对于stp,一个或更多个标准组件可由多个子标准组件组成。
[0139]
图6示出了第一交易tx1的示例性表示。第一交易tx1具有多个输出i。在所示示例中,每个输出锁定数字资产yi的金额。也是就说,输出1锁定金额y1,输出2锁定金额y2,输出π锁定金额y
π
。如所示出的,交易tx1包括输入,该输入包括至少等于yi之和的数字资产金额。
[0140]
需注意,图6示出了解锁每个输出时必须在输入脚本中提供的内容,而不是输出本身包含的内容。查看图6的输出1,为了解锁输出1,可提供第二交易tx2的输入脚本,该脚本包括足够的输入数据项(用《input》表示),以满足输出1的阈值。第二交易tx2在下文称为“收款交易”,因为允许鲍勃103b收取由输出1锁定的数字资产y1。每个第一脚本条件(下面称为“收款条件”)还可要求收款交易的输入脚本分别包括爱丽丝和/或鲍勃的数字签名,即
σ
爱丽丝
和σ
鲍勃
。作为另一可选特性,收款条件可要求收款交易tx2包括鲍勃选择的秘密值k。秘密值是保密的,从某种意义上说,在收款交易传输至并且包含在区块链150中之前,仅鲍勃103b知道秘密值。对于需要秘密值的收款交易,鲍勃103b必须向爱丽丝103a传输秘密值的哈希值。然后,收款条件可对秘密值进行哈希处理,并将结果值与收款条件中从鲍勃103b处获得的哈希值进行比较。需注意,还存在其他解锁tx1的输出的方式。这些将在下面参照“退款交易”和“取消交易”进行详细描述。
[0141]
尽管为了方便起见,收款交易、退款交易和取消交易可在此处用大写字母书写,但这并不一定暗示任何特定的专利名或专有名称,术语同样也可在本文任何位置用小写字母书写。
[0142]
在一些示例中,爱丽丝103a本人可构建收款交易tx2的一部分。比如,爱丽丝103a可经由侧信道(例如,图3中所示的侧信道301)向鲍勃103b提供包括她的数字签名(σ
爱丽丝
)的部分交易。爱丽丝103a可为第一交易tx1中的每个输出构建此等部分交易。爱丽丝103a可在部分收款交易中包含锁定时间,她可经由侧信道构建并发送至鲍勃103b。锁定时间可在一定时间(例如可由unix时间或区块高度指定)之前防止收款交易成功包含在区块链150的区块中。锁定时间可使用交易的“nlocktime”字段实现。nlocktime是交易参数,其规定在将交易接受至区块之前的最短时间。如下所述,每个收款交易可指定不同的锁定时间。
[0143]
当构建第一交易tx1时,爱丽丝103a可在每个输出脚本中包含第二脚本条件。下面将第二脚本条件称为“退款条件”。与收款条件一样,退款条件是输出脚本的一部分的标签,并且包括一个或更多个操作码(或通常而言,包括函数)。退款条件还可包括一个或更多个数据元素。退款条件被配置为要求后续交易的输入脚本包括爱丽丝的数字签名和鲍勃的数字签名。也就是说,退款条件确定是否已在“退款交易”的输入脚本中提供爱丽丝和鲍勃的数字签名,并且如果已提供,则退款条件评估为true(或《1》),例如在堆栈上。
[0144]
每个输出被构建成使得后续交易的输入脚本只能满足一个脚本条件。也就是说,任何给定输入脚本均无法同时满足收款条件和退款条件。这是因为收款条件和退款条件要求解锁不同的输入数据项。例如,收款条件要求输入数据项满足标准组件,而退款条件无此要求。
[0145]
在一些示例中,爱丽丝103a本人可构建退款交易的一部分。比如,爱丽丝103a可经由侧信道(例如,图3中所示的侧信道301)向鲍勃103b提供包括她的数字签名(σ
爱丽丝
)的部分交易。爱丽丝103a可为第一交易中的每个输出构建此等部分交易。爱丽丝103a可将锁定时间包含在部分退款交易中,她可构建并经由侧信道发送至鲍勃103b。然后,鲍勃103b可将他的签名σ
鲍勃
包含在部分退款交易中,并且将已署名的退款交易返回至爱丽丝103a。应当理解的是,在替代示例中,鲍勃103b可首先签署部分退款交易,并且将其发送至爱丽丝供爱丽丝进行签署。
[0146]
与收款交易一样,爱丽丝103a可为每个退款交易设置锁定时间。锁定时间可在爱丽丝和/或鲍勃用其相应签名签署交易之前进行设置。对于具有相关联收款交易和退款交易的每个输出,退款交易的锁定时间将晚于收款交易的锁定时间,这意味着收款交易可在相关联退款交易之前包含在区块链150的区块中。
[0147]
退款条件和退款交易两者旨在允许爱丽丝103a赎回鲍勃103b未主张的每个输出中的数字资产金额。举例来说,如果鲍勃未能提供满足任何输出标准阈值的输入(例如,在
预定时间段内),则爱丽丝103a需要能够要求归还(或退还)与输出相关的数字资产。
[0148]
当构建第一交易tx1时,爱丽丝103a可在部分或全部输出脚本中包含第三脚本条件。下面将第三脚本条件称为“取消条件”。与收款条件和退款条件一样,取消条件是输出脚本的一部分的标签,并且包括一个或更多个操作码(或通常而言,包括函数)。取消条件还可包括一个或更多个数据元素。取消条件被配置为要求后续交易的输入脚本包括爱丽丝的数字签名。也就是说,取消条件确定是否已在“取消交易”的输入脚本中提供爱丽丝的数字签名,并且如果已提供,则取消条件评估为true(或《1》),例如在堆栈上。取消条件还可要求秘密值k。
[0149]
取消条件和取消交易两者旨在允许爱丽丝103a赎回鲍勃103b未主张的每个输出中的数字资产金额。举例来说,如果一个输出需要满足两个标准,另一输出需要满足三个标准,并且鲍勃103b只能满足两个标准,则爱丽丝103a需要能够要求归还(或退还)具有输出脚本的输出,该输出脚本指定三个标准阈值。通过要求取消交易包括秘密值(在区块链上揭露之前仅鲍勃103b知道),鲍勃103b可确保爱丽丝103a在鲍勃试图使用收款交易主张其中一个输出之前无法取消任何交易。
[0150]
在stp的背景下,利用频谱阈值,其中接收者鲍勃103b基于他能够满足的标准数量获得收款。根据二进制阈值,满足

哪些标准’并不重要,重要的是满足的标准数量。
[0151]
为了实现频谱阈值功能,stp利用至少包含π≤n个输出的交易(称为spay交易)。每个输出i基于要求鲍勃满足的标准金额mi支付一定金额yi。mi值的集合被定义为
[0152][0153]
这样做的目的在于,如果接收者能够满足mi标准,则接收者能够从spay交易的专用输出(即输出i)收取yi款项。虽然协议适用于此等实例,但付款金额不一定必须与满足的标准数量成比例。作为非成比例的示例,如果鲍勃103b至少满足一个标准,则鲍勃可赎回10个单位的数字资产;如果至少满足两个标准,则可赎回15个单位的数字资产;并且如果至少满足三个标准,则可赎回25个单位的数字资产。
[0154]
进一步地,输出集合的阈值标准付款可以是

任意的’,并且因此不一定必须是等差数列和/或遵循定义的模式。考虑spay交易包括

至少ma标准’、

至少mb标准’、

至少mc标准’、

至少m
d’的输出,其中ma<mb并且mc<md;spay交易中不存在用于阈值m
x
,my,mz的输出,其中
[0155]
ma<m
x
<mb[0156]
mb<my<mc[0157]
mc<mz<md[0158]

无等差数列’意味着y
b-ya不一定必须等于y
d-yc。鉴于输出的

任意阈值’标准的适应性,请记住,尽管存在可满足的n标准,但有π≤n个输出。
[0159]
在一些示例中,spay交易的每个输出包括多个脚本条件,例如收款条件、退款条件和取消条件。每个输出必须包含收款条件,并且可以可选地包含退款条件和/或取消条件。如图6所示,输出1包括收款条件和退款条件,因为可通过收款交易或退款交易来满足。输出2包括收款条件、退款条件和取消条件,因为可通过收款交易、退款交易或取消交易来满足。
[0160]
下面提供了不同的花费交易和每个交易的描述。
[0161]
收款交易——收款交易(collecti)指如果鲍勃满足该输出i所需的标准阈值,则
向接收者(鲍勃)支付奖金(yi)的交易。收款交易的输入脚本可要求付款人(爱丽丝)的签名、接收者(鲍勃)的签名和秘密值k中的一个、部分或全部。该秘密值最初仅鲍勃知道,并且仅在鲍勃花费收款交易时进行揭露。收款交易可以是锁定时间的,例如向nlocktime字段/参数分配ti值,防止收款交易在该时间点之前成功地传输至区块链150。
[0162]
取消交易——取消交易(canceli)指如果鲍勃之前已向任何其他输出j提交收款交易,则将输出i的奖金(yi)退回给付款人(爱丽丝)的交易,其中j≠i。取消交易的输入脚本要求付款人(爱丽丝)的签名以及可选的秘密值k。该秘密可由爱丽丝从鲍勃之前已提交至区块链150的收款交易进行检索。只要爱丽丝知道k,该取消交易则可在任意时间点由爱丽丝进行提交。
[0163]
退款交易——退款交易(refundi)指如果接收者(鲍勃)未向区块链150提交收款交易(针对该输出),例如在指定时间点t
i,i 1
之前,则将输出i的奖金(yi)退回给付款人(爱丽丝)的交易,其中ti<t
i,i 1
<t
i 1
。退款交易的输入脚本要求付款人(爱丽丝)的签名和接收者(鲍勃)的签名。退款交易可以是锁定时间的,即退款交易只有在nlocktime字段/参数值t
i,i 1
.之后才能成功地传输至区块链150。
[0164]
如上所述,图6中示出了spay交易的设计。图中表示的信息涉及交易的各种输出以及成功花费每个输出所需的内容。在此示例中,每个输出i>1由输出脚本锁定,该输出脚本允许接收者使用三个不同方案花费输出。这些解锁方案中的每一个均对应于一个交易(退款、收款或取消)。需注意,如前所述,输出1只能使用两个方案(退款和收款)进行花费。此外,虽然不是强制性的,但stp建立在接收者能够满足越多标准则会获得越多收款的前提或期望之上。与此同时,对于图6中表示的spay交易,根据支付的金额(与该输出拟满足的标准数量一致)对输出进行排序(从上至下)。在图中,较大的输出(并且因此所需的标准数量)高于具有较小输出的输出。
[0165]
图7示出了用于输出i:i≠1的spay交易的示例性输出。该输出可使用取消、收款或退款交易进行花费。
[0166]
图8示出了示例性取消交易800。为了利用取消交易800花费图7所示的输出,付款人(预计是付款人(爱丽丝))必须提供她的签名和秘密值k。秘密值是构想出来的,最初仅接收者鲍勃103b知道。区块链脚本语言促进了对(ecdsa)签名的请求和对秘密值的请求。哈希难题可用于请求秘密值k。既需要秘密值又需要签名的此等锁定脚本的示例如下:
[0167][0168]
其中h(k)是秘密值k的哈希值,puba是付款人爱丽丝103a拥有的公钥。哈希值指单向加密哈希函数的摘要,诸如sha-256。标准哈希函数采用任意大小的输入,并生成固定范围内的整数。例如,sha-256哈希函数给出256位的数字作为其输出哈希摘要。
[0169]
该脚本称为取消条件([condition:cani])。解锁脚本(在取消交易中)将是:
[0170]
《siga》《puba》《k》
[0171]
其中siga是利用公钥puba的取消交易的(ecdsa)签名。
[0172]
该脚本称为取消输入(《input:cani》)。
[0173]
图9示出了示例性退款交易900。为了利用退款交易900花费图7所示的输出,付款
人(爱丽丝)必须生成她的签名siga,并且接收者鲍勃103b还必须提供他的签名sigb。退款交易900必须由付款人和接收者两者签署;这是为了确保双方协定退款交易按照其应有的方式进行构建,并且特别注意所需包含的nlocktime值(即锁定时间901),以防止退款交易900在约定的时间点之前有效。需要两者签名的脚本示例如下:
[0174][0175]
该脚本称为退款条件([condition:refi])。相反,可以使用2/2(m/n)多重签名脚本。
[0176]
解锁脚本(在退款交易900中)将是:
[0177]
《sigb》《pubb》《siga》《puba》
[0178]
该脚本称为退款输入(《input:refi》)。
[0179]
图10示出了收款交易1000的示例。为了利用收款交易1000花费图7的输出,必须至少提供四个项目。付款人(爱丽丝)必须生成她的签名(siga),而接收者鲍勃103b必须提供他的签名(sigb)和秘密值k。此外,鲍勃103b必须提供输入,
[0180]
《answers》≡《input_n》

《input_2》《input_1》
[0181]
预计将有足够的

正确’输入数据项,以满足该输出所需的mi标准。收款交易1000包括nlocktime值(即锁定时间1001),该值可防止收款交易1000在约定的时间点之前有效。需要四段数据的脚本示例如下:
[0182][0183]
该脚本称为收款条件([condition:coli])。相反,可以使用2/2(m/n)多重签名脚本。[test mi]部分充当脚本分段的表示,即:定义用户必须满足的整个标准集合,针对每个满足的标准增加计数器,并且验证满足的标准数量是否正确(≥mi)。该[test mi]脚本分段将类似于txid
bpay
中示出的输出脚本并且如下所示,其中《mi》表示输出i的阈值。
[0184]
需注意,锁定时间限制不在脚本中表示,但在收款交易1000的nlocktime字段中表示。
[0185]
[test mi]:
[0186][0187]
解锁脚本(收款交易1000的输入脚本)将是:
[0188]
《answers》《sigb》《pubb》《siga》《puba》《k》
[0189]
该脚本称为收款输入(《input:coli》。该脚本包含两个参与者的签名以及秘密值k。脚本中还可以看到《answers》值。这是包含多个数据项的输入脚本部分,该多个数据项预计将成为至少满足spay交易的输出i的输出脚本的[test mi]部分中至少mi标准的解决方案。
[0190]
《answers》≡《input_n》《input_n-1》

《input_2》《input_1》
[0191]
每个《answers》的子元素将按特定顺序设置,从而每个《input_i》均由[test]脚本中发现的预期[criterion_i]进行评估。元素《input_i》预计将成为接收者(鲍勃)的难题标准的解决方案,该难题标准由付款人爱丽丝在[criterion_i]中定义。需注意,类似于btp,标准可具有子标准,输入值可由多个子输入组成。
[0192]
由于至少有三种不同的花费方案(收款、退款、取消)可用于花费spay交易的输出i,所述输出的锁定(输出)脚本必须并入必要的脚本元素,以便于选择花费交易。为了做到这一点,锁定脚本可使用条件元素,例如op_if、op_else等。
[0193][0194]
需注意,括号中的文本是注释,实际上不会包含在交易中。
[0195]
此处,脚本包含三个条件,即[condition:coli]、[condition:refi]和[condition:
cani];每个管理一项特定的花费交易。这些条件是前面描述的锁定脚本。为了成功花费spay输出,提议的接收者鲍勃103b必须包含其预期花费交易类型所需的正确输入。决定花费交易类型的输入脚本将具有至少三个分段(见下面的单元格)。如以下单元格所示,这些输入与前面描述的输入相对应。
[0196]
《input:cani》《input:refi》《input:coli》
[0197]
如果接收者鲍勃103b提交特定类型的花费交易,例如收款交易1000,则预计鲍勃103b将使适当的脚本分段《input:coli》包含在由三部分组成的输入脚本中,并且用

虚拟数据’替换其他两个输入元素。在本发明中表示为《dummy》的虚拟数据被定义为输入数据,该输入数据在根据[condition]评估时故意评估为

不正确’。因此,如果鲍勃103b想提交收款交易1000,则收款交易的输入脚本将类似于
[0198]
《dummy》《dummy》《input:coli》
[0199]
图11示出了根据stp的示例性交易错开时间。“如果接收者至少知道n个解决方案中的mi解决方案,那么提议的接收者知道m
i-1解决方案、m
i-2解决方案......2种解决方案或1种解决方案”语句中捕捉到

交易具有多个输出,其中每个输出基于提议的接收者能够满足的n个标准中的mi标准进行付费’的潜在漏洞。这使得接收者能够花费spay交易的多个输出。这当然是极其不可取的。锁定时间和错开时间可用于防止此等滥用。该错开时间可经由交易的nlocktime字段启用,以确保接收者只能将收款交易提交至spay交易的一个输出。
[0200]
花费交易的错开时间使用图11所示的设计进行解释。时间在水平轴上从左到右显示。花费交易用完整箭头表示,其中箭头的尾部以交易可成功提交至区块链150的时间(在该时间或之后)开始,受交易锁定时间的限制。举例来说,收款交易collect1必须在time=t1之后提交,然而收款交易winning2必须在time=t2之后提交等。花费交易的预期接收者示出在箭头的头部。取消交易不取决于时间(在此上下文中,这意味着取消交易的提交不受nlocktime值所限制)。只要提交者知道秘密值k(和爱丽丝的签名),取消交易则可在任何时间提交至区块链150。输出i=1不具有取消交易。针对任何输出j的取消交易用于使爱丽丝103a能够立即

取消’collectj交易。collectj仅在提交输出i的收款交易后才可提交。因为collect1没有

之前的’collectj,所以输出i=1的取消交易是不适用的。请记住,如果鲍勃从不提交他的collect1交易,则存在用于输出i=1的refund1交易。需注意,向区块链150提交收款交易会将k值揭露给任何相关方。
[0201]
根据图11,可提交的第一交易tx1是输出i=1的collect1的交易。这可以在时间t1之后由鲍勃提交。对于输出i=1,退款交易refund1只能在时间t
1,2
(指在时间t1之后但在时间t2之前的时间)(由爱丽丝)进行提交。因此,在时间t1之后,鲍勃有δ1=t
1,2-t1单位的时间跨度来提交收款交易collect1(以免爱丽丝向自己的输出退款)。该时间跨度用双头箭头表示。
[0202]
可提交的下一收款交易1000是collect2......,只能在时间t2之后进行提交。这意味着如果鲍勃103b想要收取该第二输出i=1的奖金,则他只能在t2之后提交该交易,即t
1,2
时间之后,即爱丽丝103a可提交输出i=1的退款交易refundi的时间(在该时间或之后)。
[0203]
这为鲍勃103b收取spay交易的多个输出提供了保护。为付款交易spay筹集资金的个人(爱丽丝)有责任在接收者有能力提交收款交易collect2之前执行退款交易refund1。因此,在t
i,i 1
之后,爱丽丝有δ
i,i 1
=t
i 1-t
i,i 1
个单位的时间提交退款交易refund1(以免鲍
勃能够提交collect
i 1
)。
[0204]
输出i=1是例外的,因为其不具有取消交易。为了探索取消交易,可查看图11的通用输出i:i》1。取消交易canceli执行退款的功能,但与退款交易refundi相反,取消交易提交至区块链150不受nlocktime值限制,而受对秘密值的了解(或缺乏对秘密值的了解)所限制。只要知道秘密值是k,则爱丽丝103a可提交此取消版本的

退款’交易。在一些示例中,还需在该交易中包含爱丽丝的签名。鉴于该秘密值在鲍勃103b提交收款交易时进行揭露,如果鲍勃103b将提交收款交易collecti,则随后输出j:j>i中的每个取消提交可立即由爱丽丝103a提交。这将使鲍勃103b无法访问所有随后的输出。
[0205]
因此,提议的接收者鲍勃103b有责任访问(在区块外)他可以成功花费并且愿意提交的输出。选定的输出预计将是以最大数字资产金额奖励鲍勃的输出。如果鲍勃103b选择输出i,则鲍勃必须对k值保密,直至他提交交易collecti为止。对于任何先前输出(j<i),爱丽丝本可以(或至少有机会)提交退款交易refundj。
[0206]
虽然是优选的,但锁定时间和错开时间并不是必需的。相反,爱丽丝103a可仅在适当的时间提交取消交易和/或退款交易。类似地,可以信任鲍勃103b仅提交单一收款交易。
[0207]
图12示出了stp的示例性序列,时间从上到下运行。具体序列如下:
[0208]
1.鲍勃选择秘密值k。
[0209]
2.鲍勃向爱丽丝发送秘密值的哈希值。
[0210]
3.爱丽丝创建spay交易。
[0211]
4.爱丽丝创建退款交易和收款交易。
[0212]
5.爱丽丝将标准集合和锁定时间发送给鲍勃。
[0213]
6.爱丽丝签署退款交易和收款交易,并且将其发送给鲍勃。
[0214]
7.如果鲍勃同意,则鲍勃签署退款交易并且将其发送回爱丽丝。
[0215]
8.爱丽丝将spay交易提交至区块链。
[0216]
9.鲍勃根据尽可能多的标准确定解决方案。
[0217]
10.鲍勃确定他可解锁并且支付最高数字资产金额的输出。
[0218]
11.至此,爱丽丝可向区块链提交任何输出j<i的退款。
[0219]
12.鲍勃将输出i的收款交易提交至区块链。
[0220]
13.既然已揭露秘密值,爱丽丝提交输出j>i的取消交易。
[0221]
需注意,上述序列是一个特定示例,其他排序也是可能的。比如,向鲍勃呈现标准时存在一定的灵活性。
[0222]
如上文所述,在二进制和频谱阈值协议的一些实施方式中,成功满足标准可使计数器增加1个,或在其他实施方式中,计数器可增加其他值。“加权标准”实施方式在某些情况下可能是必要的,其中某些标准比其他标准更

重要’。当满足标准的奖励金额不是强制统一的,但取决于具体的标准时,可使用加权标准。
[0223]
满足标准i可使计数器增加wi,其中阈值设置为值mi:mi≤v,其中v≥n是最大可实现(计数器)值,例如满足criterion_i可使计数器增加2个,满足criterion_j可使计数器增加1个,而满足criterion_k可使计数器增加3个等。
[0224]
在此等实施方式中,达到阈值不仅受限于满足的标准数量,而且受限于满足的标准。鲍勃103b可实现满足不同数量标准的阈值。举例来说,如果阈值设置为六,则鲍勃103b
可通过满足三个标准实现阈值,其中每个的权重值为两个单位,或鲍勃103b可通过满足两个标准实现阈值,其中每个的权重值为三个单位。
[0225]
btp和stp两者可设计为通过仅将在[test]脚本中alt堆栈中的计数器增加的值改为现在针对每个标准i的wi,以并入该加权考量。阈值《mi》仍由付款人选择,并根据标准及其权重进行选择。
[0226][0227]
对于迄今为止示出的[test]脚本(加权或其他),可以进行一些改进,以提高其执行效率。下面描述至少一个改进方面。效率改进通过减少输入标准评估(i-ca)的数量来进行。对于之前版本的[test]脚本,n个输入中的每一个均根据对应标准进行评估;这意味着n个i-ca始终是完成的。如果输入标准评估在计算上特别昂贵,则这可能会有问题。
[0228]
先前版本的[test]和解锁脚本的对应输入集合基于接收者鲍勃103b可能知道或可能不知道哪个输入能够满足输入的对应标准的想法;因此,锁定脚本在相应地更新计数器时确定哪些是正确的。但是,鲍勃103b可能会在提交收款交易之前知道他能够满足n个标准中的哪m个标准。[test]脚本可进行修改,使得其要求鲍勃103b指定其想要执行i-ca的标准。
[0229][0230]
需注意,对于修改的[test]脚本,在每个标准之前引入op_if元素。该“if”语句检
查来自鲍勃的输入值(值0或1),以确定是否鲍勃想要根据该标准执行i-ca(如果是,则为1,如果不是,则为0)。op_if操作码可替换为用于检查特定数据元素的等效函数。通常而言,[test]脚本可包括“检查”组件,该组件被配置为检查是否输入包括两个可能的数据元素中的一个。如果提供第一数据元素,则对于第二不同数据元素执行以下脚本,反之亦然。
[0231]
还应当注意op_verify的引入。这可以是标准脚本的之前元素之后的独立操作码,或者可以是标准始终利用验证操作码。
[0232]
在以下内容之后的op_verify:
[0233]
op_if[op_equal]op_verify
[0234]
或verify操作码
[0235]
op_if[op_equalverify]
[0236]
需注意,如果顶部堆栈值不是true,则verify脚本元素将交易标记为无效。同时,删除顶部堆栈值。如果标准失效,则verify组件立即使整个交易无效,并且不进行进一步脚本执行。根据锁定脚本的修订[test],还需修改收款交易中的解锁脚本。上文描述的解锁脚本包括《answers》部分,如下所示:
[0237]
《answers》≡《input_n》《input_n-1》

《input_2》《input_1》
[0238]
该部分输入脚本的有效修改版本将以散布的第一或第二数据元素(例如,值0或1)为特性,这些数据元素指示是否鲍勃想要针对特定标准执行i-ca。此等修改的示例如下所示:
[0239][0240]
此处,鲍勃103b知道他可通过仅提供标准1、4和n的解决方案来达到所需阈值。因此,《1》的值放在《input_1》、《input_4》和《input_n》元素之后。《0》替换《answers》脚本中的所有其他《input_i》值。利用上述修订《answers》,完成i-ca的总数量将是3,而不是n。因此,假设对于所有i,权重《w1》等于1,则m个i-ca仅针对m/n阈值进行。
[0241]
图13和图14示出了有效改进的[test]脚本的示例性使用案例。该使用案例是一些区块链协议的m/n多重签名功能的当前实施方式的替代方案。对于m/n多重签名功能的现有实施方式,经由op_checkmultisig,锁定脚本包含一组n个公钥,而解锁脚本包含m个数字(ecdsa)签名。确定是否签名满足阈值通过以下方式进行。op_checkmultisig操作码将第一签名与每个公钥进行比较,直至找到ecdsa匹配为止。从随后的公钥开始,其将第二签名与每个剩余公钥进行比较,直至找到ecdsa匹配为止。重复该过程,直至所有签名均已检查或无足够的公钥可产生成功的结果。所有签名均需与公钥匹配。因为任何签名比较失效时都不会再次检查公钥,所以签名必须使用与其对应公钥放置在scriptpubkey中的相同顺序放置在scriptsig中。如果所有签名均有效,则返回1,否则返回0。
[0242]
考虑图13所示的3/5多重签名示例。每个公钥pi可视为一个标准,而每个签名sigi可视为一个输入。请记住,虚线箭头表示失效的i-ca,非虚线箭头表示成功的i-ca,可以看出有两个用于评估sig3的i-ca(与sig3类似)。由于脚本中没有表示拟评估sig3所依据的公钥pi,sig3必须根据一组pis按有序序列进行评估,直至:
[0243]
a)实现匹配pi;
[0244]
b)耗尽所有pi值,却找不到匹配项;或
[0245]
c)耗尽足够的pi值未找到匹配项,使得即使最终在剩余的pis集合中找到其匹配项,也不会有足够的剩余pis足以满足所需的阈值(即使所有剩余的pis与剩余的sigis成功匹配)。
[0246]
最终,关键在于对于op_checkmultisig,≥1公钥-签名i-ca中涉及每个sigi。如果拟利用效率提高的[test]函数,则执行的i-ca数量将提高效率。考虑下面提议的此等m/n ecdsa签名[test]脚本。
[0247][0248]
以及下面其对应的解锁脚本,其中鲍勃103b提供三个签名,即sig1、sig4和sign,
[0249][0250]
如图14所示,由于鲍勃使用值0和值1来表示评估签名所依据的公钥,这将每个签名涉及的i-ca数量减少到最多1个(与op_checkmultisig≥1相反)。
[0251]
利用[test]函数(之前呈现的版本和效率改进的版本两者)的附加优势是获得了隐私保护。通过利用m/n多重签名的[test]函数代替op_checkmultisig,鲍勃103b不必揭露任何公钥。这是由于op_checkmultisig锁定脚本包括公钥,而[test]锁定脚本包括公钥的哈希值。
[0252]
结论
[0253]
应当理解,上述实施例仅通过示例的方式进行描述。
[0254]
更通俗地说,根据本文公开的教导的第一实例,提供了一种生成用于区块链交易的计算机实现的方法,该交易用于将数字资产金额从第一方转移至第二方;该方法由所述第一方实施并且包括:生成第一交易,该第一交易包括锁定数字资产金额的输出,该输出包括输出脚本,该输出脚本包括多个标准组件,每个均要求相应输入数据项,以及多个计数器脚本组件,每个标准组件与计数器脚本组件中的一个相关联,并且其中该输出脚本被配置为,当与第二交易的输入脚本一起执行时,i)每当输入脚本的相应输入数据项满足相应标准组件时,增加计数器,并且ii)要求计数器增加到至少预定数量,以由输入脚本进行解锁。
[0255]
根据本文公开的教导的第二可选实例,根据第一实例提供了一种方法,其中多个
标准组件的总数量大于或等于预定数量。
[0256]
根据本文公开的教导的第三可选实例,根据第一实例或第二实例提供了一种方法,其中多个标准组件中的一个、部分或全部定义了不同的相应标准。
[0257]
根据本文公开的教导的第四可选实例,根据第一实例至第三实例中任一项提供了一种方法,其中多个标准组件中的一个、部分或全部包括多个子标准组件,每个均要求相应的子输入数据项。
[0258]
根据本文公开的教导的第五可选实例,根据第一实例至第四实例中任一项提供了一种方法,其中所述多个标准组件中的一个、部分或全部和/或所述多个子标准组件中的一个、部分或全部要求对应于预定区块链公钥的相应区块链签名,分别作为输入或子输入数据项。
[0259]
根据本文公开的教导的第六可选实例,根据第一实例至第五实例中任一项提供了一种方法,其中多个标准组件中的一个、部分或全部与计数器脚本组件相关联,该计数器脚本组件被配置为以不同的数量增加计数器。
[0260]
根据本文公开的教导的第七可选实例,根据第一实例至第六实例中任一项提供了一种方法,其中输入脚本中的每个输入数据项包括第一或第二元素,并且其中多个标准组件中的一个、部分或全部与相应检查组件相关联,其中每个相应检查组件被配置为当与输入脚本一起执行时,i)确定是否每个输入数据项包括第一元素,并且ii)如果输入数据项包括第一元素,则仅执行相关联的标准组件。
[0261]
根据本文公开的教导的第八可选实例,根据第七实例提供了一种方法,其中每个输出脚本被配置为如果输入脚本的输入数据不满足执行的标准组件,则使第一交易无效。
[0262]
根据本文公开的教导的第九可选实例,根据第一实例至第八实例中任一项提供了一种方法,包括将相应标准和/或子标准传输至第二方。
[0263]
根据本文公开的教导的第十可选实例,根据第一实例至第九实例中任一项提供了一种方法,包括将第一交易传输至与区块链相关联的一个或更多个节点以包含在区块链中。
[0264]
根据本文公开的教导的第十一实例,提供了第一方的计算机设备,该计算机设备包括:存储器,该存储器包括一个或更多个存储器单元;以及处理装置,该处理装置包括一个或更多个处理单元,其中该存储器存储被布置成在处理装置上运行的代码,该代码被配置为当在处理装置上运行时,执行根据第一实例至第十实例中任一项所述的方法。
[0265]
根据本文公开的教导的第十二实例,提供了一种计算机程序,该计算机程序包含在计算机可读存储器上,并且被配置为当在第一方的计算机设备上运行时,执行根据所述第一实例至第十实例中任一项所述的方法。
[0266]
根据本文公开的教导的第十三实例,提供了一种用于包含在区块链中的第一交易,该第一交易用于将数字资产的金额从第一方转移至第二方,该交易包含在计算机可读数据介质或媒体上,并且包括可执行代码,该代码包括多个标准组件,每个均要求相应输入数据项,以及多个计数器组件,每个标准组件与计数器组件中的一个相关联,并且其中代码被配置为当与区块链网络节点上第二交易的输入脚本一起执行时:每当输入脚本的相应输入数据项满足相应标准组件时,增加存储在节点的存储器中的计数器;并且基于增加到至少预定数量的计数器将数字资产的金额转移至第二方。
[0267]
根据本文公开的教导的第十四实例,提供了一种生成用于区块链交易的计算机实现的方法,该交易用于将数字资产金额从第一方转移至第二方,第一方和第二方与区块链相关联;该方法由第一方实施并且包括:生成第一交易,该第一交易包括多个输出,每个输出锁定相应数字资产金额并且包括相应第一脚本条件,其中每个第一脚本条件包括多个标准组件,每个均要求相应输入数据项,以及多个计数器组件,每个标准组件与计数器组件中的一个相关联,并且其中每个第一输出脚本条件被配置为当与第二交易的输入脚本一起执行时,i)每当输入脚本的相应输入数据项满足相应标准组件时,增加计数器,并且ii)要求计数器增加到至少相应预定数量,以由该输入脚本进行解锁,并且其中第一脚本条件中的一个、部分或全部要求计数器增加到不同的预定数量。
[0268]
根据本文公开的教导的第十五可选实例,根据第十四实例提供了一种方法,其中输出中的一个、部分或全部锁定不同的相应数字资产金额。
[0269]
根据本文公开的教导的第十六可选实例,根据第十五实例提供了一种方法,其中由相应输出锁定的相应数字资产金额基于相应第一脚本条件要求计数器增加到的相应预定数量。
[0270]
根据本文公开的教导的第十七可选实例,根据第十四实例至第十六实例中任一项提供了一种方法,其中为了被输入脚本解锁,每个第一脚本条件被配置为要求输入脚本包括第一方的数字签名和/或第二方的数字签名。
[0271]
根据本文公开的教导的第十八可选实例,根据第十七实例提供了一种方法,包括:对于每个输出,生成相应第二交易,其中每个第二交易的输入脚本包括第一方的预定签名;并且将每个第二交易传输至第二方。
[0272]
根据本文公开的教导的第十九可选实例,根据第十八实例提供了一种方法,其中每个第二交易包括不同锁定时间,其中每个相应锁定时间被配置为防止相应第二交易包含在区块链中,直至相应预定时间结束之后为止。
[0273]
根据本文公开的教导的第二十可选实例,根据第十四实例至第十九实例中任一项提供了一种方法,其中每个第一脚本条件包括秘密值的哈希值,并且其中为了被输入脚本解锁,每个第一脚本条件被配置为要求输入脚本包括秘密值。
[0274]
根据本文公开的教导的第二十一可选实例,根据第十四实例至第二十实例中任一项提供了一种方法,其中每个输出包括相应第二脚本条件,该第二脚本条件被配置为当与第三交易的输入脚本一起执行时,要求第三交易的输入脚本包括第一方的预定数字签名和第二方的预定数字签名,以由该输入脚本进行解锁。
[0275]
根据本文公开的教导的第二十二可选实例,根据第二十一实例提供了一种方法,包括:对于每个输出,从第二方接收相应第三交易,其中每个第三交易的输入脚本包括第一方的预定签名和第二方的预定数字签名。
[0276]
例如,第一方可签署第三交易,并且将已签署的第三交易传输至第二方。然后,第二方可将第三交易传输至第一方。
[0277]
根据本文公开的教导的第二十三可选实例,根据第二十二实例提供了一种方法,其中每个第三交易包括不同锁定时间,其中每个相应锁定时间被配置为防止相应第二交易包含在区块链中,直至相应预定时间结束之后为止。
[0278]
根据本文公开的教导的第二十四可选实例,根据至少从属于第十九实例的第二十
三实例提供了一种方法,其中每个输出与第二交易中的不同交易和第三交易中的不同交易相关联,并且其中对于每个输出,第三交易的相应锁定时间防止第三交易包含在区块链中,直至第二交易可包含在区块链中之后为止。
[0279]
根据本文公开的教导的第二十五可选实例,根据第十四实例至第二十四实例中任一项提供了一种方法,其中输出的一个、部分或全部包括相应第三脚本条件,其中每个第三脚本条件被配置为当与第四交易的输入脚本一起执行时,要求第四交易的输入脚本包括第一方的预定数字签名,以由该输入脚本解锁。
[0280]
根据本文公开的教导的第二十六可选实例,根据至少从属于第二十实例的第二十五实例提供了一种方法,其中每个第三脚本条件包括秘密值的哈希值,并且其中为了被第四交易的输入脚本解锁,每个第三脚本条件被配置为要求输入脚本包括秘密值。
[0281]
根据本文公开的教导的第二十七可选实例,根据第二十六实例提供了一种方法,包括:获取秘密值;对于输出中的一个、部分或全部,生成相应第四交易,其中每个第四交易的输入脚本包括第一方的预定签名和秘密值;将每个第四交易传输至与区块链相关联的一个或更多个节点以包含在区块链中。
[0282]
根据本文公开的教导的第二十八可选实例,根据第十四实例至第二十七实例中任一项提供了一种方法,其中多个标准组件的总数量大于每个相应预定数量中的每一个。
[0283]
根据本文公开的教导的第二十九可选实例,根据第十四实例至第二十八实例中任一项提供了一种方法,其中多个标准组件中的一个、部分或全部定义了不同的相应标准。
[0284]
根据本文公开的教导的第三十可选实例,根据第十四实例至第二十九实例中任一项提供了一种方法,其中多个标准组件中的一个、部分或全部包括多个子标准组件,每个均要求相应的子输入数据项。
[0285]
根据本文公开的教导的第三十一可选实例,根据第十四实例至第三十实例中任一项提供了一种方法,其中对于第一脚本条件中的一个、部分或全部、多个标准组件中的一个、部分或全部、和/或多个子标准组件中的一个、部分或全部要求对应于预定区块链公钥的相应区块链签名,分别作为输入或子输入数据项。
[0286]
根据本文公开的教导的第三十二可选实例,根据第十四实例至第三十一实例中任一项提供了一种方法,其中对于第一脚本条件中的一个、部分或全部,多个标准组件中的一个、部分或全部与计数器脚本组件相关联,该计数器脚本组件被配置为以不同的数量增加计数器。
[0287]
根据本文公开的教导的第三十三可选实例,根据第十四实例至第三十二实例中任一项提供了一种方法,其中输入脚本中的每个输入数据项包括第一或第二元素,并且其中多个标准组件中的一个、部分或全部与相应检查组件相关联,其中每个相应检查组件被配置为当与输入脚本一起执行时,i)确定是否每个输入数据项包括第一元素,并且ii)仅执行对应于包括第一元素的输入数据项的标准脚本组件。
[0288]
根据本文公开的教导的第三十四可选实例,根据第三十三实例提供了一种方法,其中每个第一脚本条件被配置为如果输入脚本的输入数据不满足执行的标准脚本,则使第一交易无效。
[0289]
根据本文公开的教导的第三十五可选实例,根据第十四实例至第三十四实例中任一项提供了一种方法,包括将相应标准和/或子标准传输至第二方。
[0290]
根据本文公开的教导的第三十六可选实例,根据第十四实例至第三十五实例中任一项提供了一种方法,包括将第一交易传输至与区块链相关联的一个或更多个节点以包含在区块链中。
[0291]
根据本文公开的教导的第三十七实例,提供了第一方的计算机设备,该计算机设备包括:存储器,该存储器包括一个或更多个存储器单元;处理装置,该处理装置包括一个或更多个处理单元,其中该存储器存储被设置在处理装置上运行的代码,该代码被配置为当在处理装置上时,执行根据第十四实例至第三十六实例中任一项所述的方法。
[0292]
根据本文公开的教导的第三十八实例,提供了一种计算机程序,该计算机程序包含在计算机可读存储器上,并且被配置为当在第一方的计算机设备上运行时,执行根据所述第十四实例至第三十六实例中任一项所述的方法。
[0293]
根据本文公开的教导的第三十九实例,提供了一种生成用于区块链的交易的计算机实现的方法,所述交易用于将数字资产金额从第一方转移至第二方,第一方和第二方均与区块链相关联,其中区块链包括第一交易,该第一交易包括锁定数字资产金额的输出并且包括第一脚本条件,其中该第一脚本条件包括多个标准组件,每个均要求相应输入数据项;该方法由第二方执行,并且包括:生成第二交易,该第二交易包括第一输入脚本组件,该第一输入脚本组件包括:i)多个输入数据项,每个对应于第一脚本条件的相应标准组件,ii)秘密值,iii)第一方的预定数字签名,和iv)第二方的预定签名;并且将第二交易传输至与区块链相关联的一个或更多个节点以包含在区块链中。
[0294]
根据本文公开的教导的第四十可选实例,根据第三十九实例提供了一种方法,其中第一交易包括第二和第三脚本条件,并且其中第二交易包括:第二输入脚本组件,该第二输入脚本组件被配置为当根据第二脚本条件执行时评估为false;第三输入脚本组件,该第三输入脚本组件被配置为当根据第三脚本条件执行时评估为false。
[0295]
根据本文公开的教导的第四十一可选实例,根据第三十九实例或第四十实例提供了一种方法,其中第一脚本条件包括多个检查组件,每个均与多个标准组件的相应组件相关联,并且其中每个相应检查组件被配置为当与输入脚本一起执行时,i)确定是否每个输入数据项包括第一元素,并且ii)仅执行对应于包括第一元素的输入数据项的标准脚本组件;并且其中每个输入数据项包括第一数据元素或第二不同数据元素。
[0296]
根据本文公开的教导的第四十二可选实例,根据第三十九实例至第四十一实例中任一项提供了一种方法,其中输入数据项中的一个、部分或全部包括相应数字签名。
[0297]
根据本文公开的教导的第四十三实施例,提供了第二方的计算机设备,该计算机设备包括:存储器,该存储器包括一个或更多个存储器单元;处理装置,该处理装置包括一个或更多个处理单元,其中该存储器存储被设置在处理装置上运行的代码,该代码被配置为当在处理装置上时,执行根据第三十九实例至第四十二实例中任一项所述的方法。
[0298]
根据本文公开的教导的第四十四实施例,提供了一种计算机程序,该计算机程序包含在计算机可读存储器上,并且被配置为当在第二方的计算机设备上运行时,执行根据第三十九实例至第四十二实例中任一项所述的方法。
[0299]
根据本文公开的教导的第四十五实例,提供了一种用于包含在区块链中的第一交易,该第一交易用于将数字资产金额从第一方转移至第二方,该第一交易包含在计算机可读数据介质或媒体上,并且包括可执行代码,该代码包括多个输出脚本,每个输出脚本锁定
数字资产的相应金额并且包括相应第一、第二和第三脚本条件,每个第一脚本条件包括:i)多个标准组件,每个均要求相应输入数据项,以及ii)多个计数器组件,每个标准组件与计数器组件中的一个相关联,并且其中代码被配置为当与区块链网络节点上第二交易的输入脚本一起执行相应输出脚本时:如果执行相应第一脚本条件,则每当输入脚本的相应输入数据项满足相应标准组件时,增加存储在节点的存储器中的计数器,并且基于增加到至少预定数量的计数器将数字资产金额转移至第二方;如果执行相应第二脚本条件,则确定是否输入脚本包括所述第一方的预定数字签名和第二方的预定数字签名,并且将数字资产金额转移至第一方;并且如果执行相应第三脚本条件,则确定是否输入脚本包括第一方的预定数字签名和秘密值,并且将数字资产金额转移至第一方。
[0300]
根据本文公开的教导的第四十六实例,提供了一种计算机可读存储介质,其上存储有第四十五实例的第一交易。
[0301]
根据本文公开的教导的第四十七实例,提供了一种计算机可读存储介质,其上存储有第十三实例的第一交易。
[0302]
根据本文公开的教导的另一个实例,可提供一种方法,该方法包括第一方和第二方的措施。
[0303]
根据本文公开的教导的另一个实例,可提供一种系统,该系统包括第一方和第二方的计算机设备。
[0304]
根据本文公开的教导的另一个实例,可提供一组交易,其包括第一和第二交易。
[0305]
一旦给出本文的公开内容,所公开技术的其他变体或用例对于本领域技术人员可能变得显而易见。本公开的范围不受所描述的实施例限制,而仅受随附权利要求限制。
再多了解一些

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

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

相关文献