CN116636180A - 事务签名标志 - Google Patents
事务签名标志 Download PDFInfo
- Publication number
- CN116636180A CN116636180A CN202180087079.4A CN202180087079A CN116636180A CN 116636180 A CN116636180 A CN 116636180A CN 202180087079 A CN202180087079 A CN 202180087079A CN 116636180 A CN116636180 A CN 116636180A
- Authority
- CN
- China
- Prior art keywords
- transaction
- voting
- output
- input
- signature
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000004590 computer program Methods 0.000 claims abstract description 49
- 238000013515 script Methods 0.000 claims description 134
- 238000000034 method Methods 0.000 claims description 35
- 238000013475 authorization Methods 0.000 claims description 12
- 230000001419 dependent effect Effects 0.000 claims description 6
- 230000000977 initiatory effect Effects 0.000 claims description 2
- 230000006870 function Effects 0.000 description 23
- 230000008569 process Effects 0.000 description 11
- 238000012795 verification Methods 0.000 description 11
- 238000012545 processing Methods 0.000 description 10
- 239000000243 solution Substances 0.000 description 10
- 238000010200 validation analysis Methods 0.000 description 10
- 239000003795 chemical substances by application Substances 0.000 description 6
- 238000004891 communication Methods 0.000 description 6
- 230000003287 optical effect Effects 0.000 description 6
- 230000001902 propagating effect Effects 0.000 description 5
- 238000012546 transfer Methods 0.000 description 5
- 238000010586 diagram Methods 0.000 description 4
- 239000000428 dust Substances 0.000 description 4
- 238000003860 storage Methods 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 238000009826 distribution Methods 0.000 description 3
- 230000000644 propagated effect Effects 0.000 description 3
- 230000004044 response Effects 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 2
- 238000004422 calculation algorithm Methods 0.000 description 2
- 238000013479 data entry Methods 0.000 description 2
- 238000005065 mining Methods 0.000 description 2
- 230000008520 organization Effects 0.000 description 2
- 208000011580 syndromic disease Diseases 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000012550 audit Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000003139 buffering effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000010348 incorporation Methods 0.000 description 1
- 238000002347 injection Methods 0.000 description 1
- 239000007924 injection Substances 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000006855 networking Effects 0.000 description 1
- 230000000737 periodic effect Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 238000013138 pruning Methods 0.000 description 1
- 238000012797 qualification Methods 0.000 description 1
- 238000009877 rendering Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000010561 standard procedure Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/32—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
- H04L9/321—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving a third party or a trusted authority
- H04L9/3213—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving a third party or a trusted authority using tickets or tokens, e.g. Kerberos
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/30—Public key, i.e. encryption algorithm being computationally infeasible to invert or user's encryption keys not requiring secrecy
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/32—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
- H04L9/3247—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving digital signatures
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/50—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols using hash chains, e.g. blockchains or hash trees
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L2209/00—Additional information or applications relating to cryptographic mechanisms or cryptographic arrangements for secret or secure communication H04L9/00
- H04L2209/46—Secure multiparty computation, e.g. millionaire problem
- H04L2209/463—Electronic voting
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computing Systems (AREA)
- Theoretical Computer Science (AREA)
- Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
一种用于为区块链的投票事务生成输入和输出的计算机程序,所述投票事务用于投票,所述计算机程序使一个或多个处理器被配置为:从投票协调者接收投票指令,所述投票指令包括一组投票选项和一个或多个公钥;呈现显示所述投票选项的用户界面;接收对所述投票选项中的一个投票选项的用户选择;以及生成用于包括在所述投票事务中的输入‑输出对;其中,输入的非签名部分包括标识未花费事务输出的输出点,所述输入的签名部分包括单个签名标志和相关联的签名,其至少对所述输入‑输出对的所述非签名部分和所述输入‑输出对中的输出进行签名,但不对所述投票事务的任何其他输出进行签名,所述输入‑输出对中的所述输出包括所述公钥中的一个公钥。
Description
技术领域
本公开涉及区块链事务中使用的签名标志。
背景技术
区块链是指一种分布式数据结构,其中在分布式对等(P2P)网络(以下称为“区块链网络”)中的多个节点中的每个节点处维护区块链的副本,并且广泛公开该副本。区块链包括一系列数据区块,其中每个区块包括一个或多个事务(transaction)。除所谓的“coinbase事务”外,每个事务都指向序列中的先前事务,该序列可以跨越一个或多个区块,回到一个或多个coinbase事务。coinbase事务将在下文进一步讨论。提交给区块链网络的事务包括在新区块中。新区块的创建过程通常称为“挖掘”,该过程涉及多个节点中的每个节点争相执行“工作量证明”,即,基于等待被包括在区块链的新区块中的一组定义的有序且核实有效的未决事务的表示解决加密难题。应当注意的是,区块链可以在一些节点处被修剪(prune),并且区块的发布可以通过仅发布区块头来实现。
区块链中的事务可用于以下目的中的一个或多个:传送数字资产(即,一定数量的数字通证);对虚拟化分类账或注册表中的一组条目进行排序;接收和处理时间戳条目;和/或对索引指针按时间排序。也可利用区块链实现区块链上的层级附加功能。例如,区块链协议可允许在事务中存储附加的用户数据或数据索引。能够存储在单个事务中的最大数据容量没有预先指定的限制,因此可以并入越来越复杂的数据。例如,这可用于在区块链中存储电子文档、音频或视频数据。
区块链网络的节点(通常称为“矿工”)执行分布式事务注册和验证过程,这将后续更详细地描述。总之,在该过程中,节点核实事务并将这些事务***到区块模板中,这些事务尝试为该区块模板标识有效的工作量证明解。一旦找到有效的解,新区块便会被传播到网络的其它节点,从而使得每个节点能够在区块链上记录新区块。为了将事务记录在区块链中,用户(例如,区块链客户端应用程序)将该事务发送到网络中的节点中的一个节点进行传播。接收该事务的节点可以争相寻找将核实有效的事务并入新区块的工作量证明解。每个节点被配置为执行相同的节点协议,该协议将包括用于确认事务有效的一个或多个条件。无效事务将不会传播或并入到区块中。假定事务已经核实有效,从而在区块链上被接受,则该事务(包括任何用户数据)将因此在区块链网络中的每个节点上作为不可改变的公共记录进行注册和索引。
成功解决工作量证明难题可创建最新区块的节点通常被奖励一个称为“coinbase事务”的新事务,该事务分发数字资产数额,即通证数量。无效事务的检测和拒绝是通过竞争节点的行动来执行的,这些竞争节点充当网络的代理并且通过激励报告和阻止不正当行为。信息的广泛发布使得用户可以连续地审计节点的性能。仅发布区块头使得参与者可以确保区块链具有持续完整性。
在“基于输出的”模型(有时称为基于UTXO的模型)中,给定事务的数据结构包括一个或多个输入和一个或多个输出。任何可花费输出包括指定数字资产数额的元素,该元素可从进行中的事务序列导出。可花费输出有时称为UTXO(“未花费事务输出”)。输出还可以包括锁定脚本,该锁定脚本指定输出的未来赎回条件。锁定脚本是限定核实和传送数字通证或资产所必需的条件的谓词。事务(除coinbase事务之外)的每个输入包括指向先前事务中的此类输出的指针(即引用),并且还可以包括解锁脚本,用于解锁指向输出的锁定脚本。因此,考虑一对事务,将其称为第一事务和第二事务(或“目标”事务)。第一事务包括指定数字资产数额的至少一个输出,并且包括定义解锁该输出的一个或多个条件的锁定脚本。第二目标事务包括至少一个输入和解锁脚本,该至少一个输入包括指向第一事务的输出的指针;该解锁脚本用于解锁第一事务的输出。
在此类模型中,当第二目标事务被发送到区块链网络以在区块链中传播和记录时,在每个节点处应用的有效性条件之一将是解锁脚本满足在第一事务的锁定脚本中定义的一个或多个条件中的所有条件。另一条件将是第一事务的输出尚未被另一早期有效事务赎回。根据这些条件中的任何一个条件发现目标事务无效的任何节点都不会传播该事务(作为有效事务,但可能注册无效事务),也不将该事务包括在要记录在区块链中的新区块中。
另一种事务模型是基于账户的模型。在这种情况下,每个事务均不通过参考过去事务序列中先前事务的UTXO来定义转移的数额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由节点单独存储到区块链中,并不断更新。
发明内容
在区块链事务中,签名有三个目的:提供对正在花费的资金的所有权或合法控制的证据;授权所述花费;以及确保事务信息的完整性。第三个功能确保在不使所述签名无效的情况下无法更改所述事务的具体详细信息。例如,对输出进行签名可以确保,一旦所述事务被广播到网络,任何人都无法拦截所述事务并修改分配资金的地址。
对于某些基于输出的事务模型,通常在对事务进行签名时,签名方创建签名,所述签名应用于所述事务中定义的所有输入和输出。然而,通过在创建签名时使用不同的标签(称为sighash标志),可以使签名具有特定性,从而使其仅应用于或“背书”所述事务的某些元素。
在多方就单个事务进行协作的情况下,传统的sighash ALL签名方法需要各方之间进行一些初始通信以确定事务详细信息,然后才能继续进行签名。这可能效率低下,并且在许多情况下会产生不能准确反映各方之间关系的相互依赖关系。相比之下,组合不同的sighash标志可以为各方提供对所述事务的不同部分进行独立签名的灵活性。
使用这种灵活性的示例性功能是投票,其中每个投票者仅对与其投票相关的输入和输出进行签名。因此,投票可以保持匿名。无法使用标准sighash ALL签名模型进行投票,这是因为在签名之前需要知道所有输入和输出,这可为投票者提供在对投票结果不满意时拒绝提供签名的机会,并因此核实所述投票无效。
根据本文公开的一个方面,提供了一种用于为区块链的投票事务生成输入和输出的计算机程序,所述投票事务用于投票,所述计算机程序存储在非暂时性介质上,所述非暂时性介质在由一个或多个计算机处理器执行时,使所述一个或多个处理器被配置为:从投票协调者接收投票指令,所述投票指令包括一组投票选项和由所述投票协调者定义的一个或多个公钥;控制显示器以呈现显示所述一组投票选项的用户界面;接收对由所述用户界面处的用户输入定义的所述一组投票选项中的一个投票选项的用户选择;以及,生成用于包括在所述投票事务中的输入-输出对,其中所述投票事务的不同索引处具有一个或多个其他输入-输出对;其中,所述输入-输出对中的输入的非签名部分包括标识区块链事务的未花费事务输出的输出点,并且,所述输入的签名部分包括签名单个标志和相关联的签名,其至少对所述输入-输出对的所述非签名部分和所述输入-输出对中的输出进行签名,但不对所述投票事务的任何其他输出进行签名,并且,所述输入-输出对中的所述输出包括所述投票指令的所述一个或多个公钥中的一个公钥。
根据本文公开的第二方面,提供了一种用于生成区块链的投票事务的计算机程序,所述计算机程序存储在非暂时性介质上,所述非暂时性介质在由一个或多个处理器执行时,使所述一个或多个处理器被配置为:接收多个输入-输出对;生成投票事务,所述投票事务:在一组投票索引中的每个投票索引中,包括所述接收的输入-输出对中的一个输入-输出对;和,在授权索引中,包括输入和输出,所述输入包括具有全部签名标志的投票协调者的签名,使得所述投票协调者的所述签名对所述投票事务的所有输入和输出进行签名;以及,将所述投票事务传输到区块链。
根据本文公开的第三方面,提供了一种区块链事务,所述区块链事务包含在计算机可读介质上并且包括:输入,用于有效地花费所述区块链事务的输入中指示的可花费事务输出;以及,至少一个输出,包括定义签名要求和所需要的签名标志的一段锁定脚本,并且在与后续区块链事务中的一段解锁脚本级联时,核实所述解锁脚本的签名有效,从所述解锁脚本中提取所使用的签名标志,并将所述使用的签名标志与所述需要的签名标志进行比较,以使得:如果所述使用的签名标志与所述需要的签名标志不匹配和/或所述签名无效,则所述后续区块链事务无效。
附图说明
为了帮助理解本公开的实施例并示出如何实施此类实施例,现将仅通过举例的方式参考附图进行说明,其中:
图1是一种用于实现区块链的***的示意性框图;
图2示意性地示出了可记录在区块链中的事务的一些示例;
图3A示出了客户端应用程序的示意性框图;
图3B示出了可由图3A的客户端应用程序表示的示例性用户界面的示意性模型;
图4示出了用于处理事务的一些节点软件的示意性框图;
图5是示例性通证发行事务;
图6是用于要求所有合格投票者投票的投票的示例性投票事务;
图7是用于法定人数投票的示例性投票事务;
图8是通证发行事务和投票事务的输入和输出之间关系的示意图;
图9示出了使用区块链提供投票的示例性方法;
图10示出了投票的示例性方法。
具体实施方式
示例性***概述
图1示出了一种用于实现区块链150的示例性***100。***100可以包括分组交换网络101,通常是诸如互联网的广域互联网。分组交换网络101包括多个区块链节点104,该多个区块链节点可以被设置成在分组交换网络101内形成对等(P2P)网络106。虽然未示出,但是区块链节点104可以被设置为近完全图。因此,每个区块链节点104高度连接到其它区块链节点104。
每个区块链节点104包括对等体的计算机设备,不同的节点104属于不同的对等体。每个区块链节点104包括处理装置,该处理装置包括一个或多个处理器,例如一个或多个中央处理单元(CPU)、加速器处理器、专用处理器和/或现场可编程门阵列(FPGA),以及其它设备,例如专用集成电路(ASIC)。每个节点还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。存储器可包括一个或多个存储器单元,其采用一个或多个存储器介质,例如诸如硬盘等磁介质、诸如固态硬盘(SSD)、闪存或电可擦可编程只读存储器(EEPROM)等电子媒介和/或诸如光盘驱动器等光学介质。
区块链150包括一系列数据区块151,其中在分布式或区块链网络106中的多个区块链节点104中的每个节点处维护区块链150的相应副本。如上所述,维护区块链150的副本不一定意味着完全存储区块链150。相反,只要每个区块链节点150存储每个区块151的区块头(下面讨论),区块链150就可以进行数据修剪。区块链中的每个区块151均包括一个或多个事务152,其中该上下文中的事务是指一种数据结构。数据结构的性质将取决于用作事务模型或计划的一部分的事务协议类型。给定的区块链全程使用一个特定的事务协议。在一种常见的事务协议中,每个事务152的数据结构至少包括一个输入和至少一个输出。每个输出指定将数字资产的数量表示为财产的数额,其一个示例是输出被密码锁定到的用户103(需要该用户的签名或其它解进行解锁,从而进行赎回或花费)。每个输入指向先前事务152的输出,从而链接这些事务。
每个区块151还包括区块指针155,其指向区块链中先前创建的区块151,以定义区块151的顺序。每个事务152(除coinbase事务之外)包括指向先前事务的指针,以定义事务序列的顺序(注:事务152的序列可进行分支)。区块151的区块链一直追溯到创始区块(Gb)153,该创始区块是区块链中的第一区块。区块链150中早期的一个或多个原始事务152指向创始区块153,而非先前事务。
每个区块链节点104被配置为将事务152转发到其它区块链节点104,从而使得事务152在整个网络106中传播。每个区块链节点104被配置为创建区块151,并将相同区块链150的相应副本存储在其相应的存储器中。每个区块链节点104还维护等待并入到区块151中的事务152的有序集(或“池”)154。有序池154通常称为“内存池”。在本文中,该术语并不意在限制于任何特定的区块链、协议或模型。该术语是指节点104已接受为有效的有序事务集,并且对于该有序事务集,强制节点104不接受试图花费相同输出的任何其它事务。
在给定的当前事务152j中,输入(或每个输入)包括指针,该指针引用事务序列中先前事务152i的输出,指定该输出将在当前事务152j中被赎回或“花费”。通常,先前事务可以是有序集154或任何区块151中的任何事务。尽管为了确保当前事务有效,将需要存在先前事务152i并核实其有效,但是在创建当前事务152j甚至向网络106发送当前事务152j时,不必存在先前事务152i。因此,在本文中,“先前”是指由指针链接的逻辑序列中的前任,而不一定是时间序列中的创建时间或发送时间,因此,不一定排除无序创建或发送事务152i、152j的情况(参见下面关于孤立事务的讨论)。先前事务152i同样可以称为先行事务或前任事务。
当前事务152j的输入还包括输入授权,例如先前事务152i的输出被锁定到的用户103a的签名。反过来,当前事务152j的输出可以加密锁定到新用户或实体103b。因此,当前事务152j可将先前事务152i的输入中定义的数额转移到当前事务152j的输出中定义的新用户或实体103b。在某些情况下,事务152可具有多个输出,以在多个用户或实体间分割输入数额(其中一个可以是原始用户或实体103a,以便进行变更)。在某些情况下,事务还可以具有多个输入,将一个或多个先前事务的多个输出中的数额汇总在一起,并重新分配到当前事务的一个或多个输出。
根据基于输出的事务协议,例如比特币,当诸如个体用户或组织这类的一方103希望颁布新的事务152j时(由该方采用的自动程序或人为地),该颁布方将该新事务从其计算机终端102发送到接收者。颁布方或接收者将最终向网络106的一个或多个区块链节点104(现在通常是服务器或数据中心,但原则上也可以是其它用户终端)发送该事务。另外还不排除颁布新事务152j的一方103可以将事务直接发送到一个或多个区块链节点104,并且在一些示例中,可以不将事务发送到接收者。接收事务的区块链节点104根据在每个区块链节点104处应用的区块链节点协议来检查事务是否有效。区块链节点协议通常要求区块链节点104检查新事务152j中的加密签名是否与预期签名相匹配,这取决于事务152的有序序列中的先前事务152i。在这种基于输出的事务协议中,这可以包括检查新事务152j的输入中包括的一方103的密码签名或其它授权是否与新事务分配的先前事务152i的输出中定义的条件匹配,其中该条件通常包括至少检查新事务152j的输入中的密码签名或其它授权是否解锁新事务的输入所链接到的先前事务152i的输出。条件可以至少部分地由包括在先前事务152i的输出中的脚本来定义。或者,这可仅由区块链节点协议单独确定,或可通过其组合确定。无论采用哪种方式,如果新事务152j有效,区块链节点104会将其转发到区块链网络106中的一个或多个其它区块链节点104。这些其它区块链节点104根据相同的区块链节点协议应用相同的测试,并因此将新事务152j转发到一个或多个其它节点104等等。通过这种方式,新事务在区块链节点104的整个网络中进行传播。
在基于输出的模型中,给定输出(例如,UTXO)是否分配(例如,花费)的定义是,根据区块链节点协议,其是否通过另一个随后事务152j的输入有效赎回。事务有效的另一个条件是其试图赎回的先前事务152i的输出尚未被另一个事务赎回。同样,如果无效,则事务152j将不会在区块链150中传播(除非被标记为无效并且被传播用于提醒)或记录。这可防止重复花费,即事务处理者对同一个事务的输出分配超过一次。另一方面,基于账户的模型通过保持账户余额防止重复花费。因为同样存在定义的事务顺序,账户余额在任何时候均具有单一定义的状态。
除了核实事务有效之外,区块链节点104还争相成为在通常称为挖矿的过程中创建事务区块的第一个节点,而该过程由“工作量证明”支持。在区块链节点104处,新事务被添加到尚未出现在记录在区块链150上的区块151中的有效事务的有序池154。然后,区块链节点争相通过尝试解决加密难题以组装有序事务集154中事务152的新有效事务区块151。通常情况下,这包括搜索“随机数”值,从而当随机数与未决事务有序池154的表示并置且进行哈希处理时,哈希值的输出满足预定条件。例如,预定条件可以是哈希值的输出具有某个预定义的前导零数。注意,这仅仅是一种特定类型的工作量证明难题,并且不排除其它类型。哈希函数的特性是,相对于其输入,其具有不可预测的输出。因此,该搜索只能通过强力执行,从而在试图解决难题的每个区块链节点104处消耗大量的处理资源。
解决难题的第一区块链节点104在网络106上宣布难题解决,提供解决方案作为证明,然后网络中的其它区块链节点104则可以轻松检查该解决方案(一旦给出哈希值的解决方案,就可以直接检查该解决方案是否使哈希值的输出满足条件)。第一区块链节点104将一个区块传播到接受该区块的其它节点达成阈值共识,从而执行协议规则。然后,有序事务集154被每个区块链节点104记录为区块链150中的新区块151。区块指针155还分配给指向该区块链中先前创建的区块151n-1的新区块151n。创建工作量证明解所需的大量工作(例如采用哈希的形式)发出信号通知第一节点104的意图以遵循区块链协议。这些规则包括如果它分配与先前核实有效的事务相同的输出,则不接受事务为有效,否则称之为重复花费。一旦创建,区块151就不能修改,因为它在区块链网络106中的每个区块链节点104处进行标识和维护。区块指针155还向区块151施加顺序。由于事务152记录在网络106中每个区块链节点104处的有序区块中,因此提供了事务的不可改变公共分类账。
应当注意的是,在任何给定时间争相解决难题的不同区块链节点104可以基于在任何给定时间尚未发布的事务的池154的不同快照来这样做,具体取决于它们何时开始搜索解或接收事务的顺序。解决相应难题的人员首先定义新区块151n中包括的事务152及其顺序,并且更新当前的未发布事务池154。然后,区块链节点104继续争相从新定义的未发布事务有序池154中创建区块,等等。此外,还存在解决可能出现的任何“分叉”的协议,其中两个区块链节点104彼此在很短的时间内解决难题,从而在节点104之间传播区块链的冲突视图。简言之,分叉方向最长的成为最终区块链150。应当注意的是,这不会影响网络的用户或代理,因为同一事务将出现在两个分叉中。
根据比特币区块链(和大多数其它区块链),成功构造新区块104的节点被授予在分配附加限定数量数字资产的新特殊类型事务中新分配附加的、接受的数额的数字资产的能力(与代理间或用户间事务相反,该事务将一定数量的数字资产从一个代理或用户转移到另一个代理或用户)。这种特殊类型的事务通常称为“coinbase事务”,但是也可以称为“启动事务”或“产生事务”。它通常形成新区块151n的第一事务。工作量证明发出信号通知构造新区块的节点的意图以遵循协议规则,从而允许稍后赎回该特定事务。在可以赎回该特殊事务之前,区块链协议规则可能需要成熟期,例如100个区块。通常,常规(非生成)事务152还将在其输出中的一个输出中指定附加事务费用,以进一步奖励创建其中发布该事务的区块151n的区块链节点104。该费用通常称为“事务费用”,并在下文中讨论。
由于事务核实和发布中涉及的资源,通常至少每个区块链节点104采用包括一个或多个物理服务器单元的服务器的形式,或者甚至整个数据中心。但是,原则上来说,任何给定区块链节点104均可采用一个用户终端或联网在一起的一组用户终端的形式。
每个区块链节点104的存储器均存储被配置为在区块链节点104的处理装置上运行的软件,以根据区块链节点协议执行其相应的角色并处理事务152。应当理解的是,在本文中归因于区块链节点104的任何动作均可通过在相应计算机设备的处理装置上运行的软件执行。节点软件可以在应用层或诸如操作***层或协议层的较低层或这些层任意组合的一个或多个应用中实现。
扮演消费用户角色的多方103中的每一方的计算机设备102也连接到网络101。这些用户可以与区块链网络106交互,但不参与核实事务或构造区块。其中一些用户或代理103可以充当事务中的发送者和接收者。其它用户可以与区块链150交互,而不必充当发送者或接收者。例如,一些当事方可以充当存储区块链150的副本(例如,已经从区块链节点104获得区块链的副本)的存储实体。
各方103中的一些或所有当事方可以作为不同网络的一部分连接,例如覆盖在区块链网络106之上的网络。区块链网络的用户(经常称为“客户端”)可以被称为是包含区块链网络106的***的一部分;然而,这些用户不是区块链节点104,因为它们不执行区块链节点所需的角色。相反,每一方103可以与区块链网络106交互,从而通过连接到区块链节点106(即,与区块链节点106通信)来利用区块链150。出于说明目的,示出了双方103及其相应的设备102:第一方103a及其相应的计算机设备102a,以及第二方103b及其相应的计算机设备102b。应当理解的是,更多此类当事方103及其相应的计算机设备102可能存在并参与***100,但为了方便起见,未进行说明。每一方103均可以是个人或组织。仅出于说明目的,在本文中,第一方103a称为爱丽丝,第二方103b称为鲍勃,但应当理解的是,这并不仅限于爱丽丝或鲍勃,且本文对爱丽丝或鲍勃的任何引用均可分别用“第一方”和“第二方”替换。
每一方103的计算机设备102包括相应的处理装置,其包括一个或更多个处理器,例如一个或更多个CPU、图形处理单元(GPU)、其他加速器处理器、特定应用程序处理器和/或FPGA。每一方103的计算机设备102还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。该存储器可包括一个或更多个存储器单元,其采用一个或更多个存储器介质,例如诸如硬盘等磁介质、诸如SSD、闪存或EEPROM等电子媒介和/或诸如光盘驱动器等的光学介质。每一方103的计算机设备102上的存储器存储软件,其包括被设置为在处理装置上运行的至少一个客户端应用程序105的相应实例。应当理解的是,在本文中归因于给定方103的任何行动均可通过在相应计算机设备102的处理装置上运行的软件执行。每一方103的计算机设备102包括至少一个用户终端,例如台式或笔记本电脑、平板电脑、智能手机或诸如智能手表等的可穿戴设备。给定方103的计算机设备102还可包括一个或更多个其他网络资源,诸如通过用户终端访问的云计算资源。
客户端应用程序105最初可通过例如从服务器下载的适当计算机可读存储介质,或通过诸如可移动SSD、闪存密钥、可移动EEPROM、可移动磁盘驱动器、软盘或磁带等的可移动存储设备、诸如CD或DVD ROM等的光盘或可移动光驱等提供至任何给定方103的计算机设备102。
客户端应用程序105至少包括“钱包”功能。这有两个主要功能。其中一个功能是使相应方103能够创建、授权(例如签名)事务152并将其发送到一个或多个位比特币节点104,然后在区块链节点104的网络中传播,从而包括在区块链150中。另一个功能是向相应方汇报其目前拥有的数字资产数额。在基于输出的***中,该第二功能包括整理分散在区块链150中属于相关方的各种事务152的输出中定义的数额。
注意:虽然各种客户端功能可以描述为集成到给定客户端应用程序105中,但这不一定是限制性的,相反,在本文中所描述的任何客户端功能可以在由两个或更多个不同应用程序组成的套件中实现,例如经由API进行接口连接或一个应用程序作为另一个应用程序的插件。更通俗地说,客户端功能可以在应用层或诸如操作***的较低层或这些层的任意组合实现。下面将根据客户端应用程序105进行描述,但应当理解的是,这不是限制性的。
每个计算机设备102上的客户端应用程序或软件105的实例可操作地耦合到网络106的区块链节点104中的至少一个。这可以启用客户端105的钱包功能,以将事务152发送至网络106。客户端105还可联络区块链节点104,以在区块链150中查询相应方103作为接收者的任何事务(或实际上在区块链150中检查其它方的事务,因为在实施例中,区块链150是在某种程度上通过其公开可见性提供事务信任的公共设施)。每个计算机设备102上的钱包功能被配置为根据事务协议制定和发送事务152。如上所述,每个区块链节点104运行软件,该软件被配置为根据区块链节点协议核实事务152并转发事务152以便在区块链网络106中传播。事务协议和节点协议相互对应,给定事务协议和给定节点协议一起实现给定的事务模型。相同的事务协议用于区块链150中的所有事务152。网络106中的所有节点104使用相同的节点协议。
当给定方103(比方说爱丽丝)希望发送拟包含在区块链150中的新事务152j时,她将根据相关事务协议(使用其客户端应用程序105中的钱包功能)制定新事务。然后,她将事务152从客户端应用程序105发送到她所连接的一个或多个区块链节点104。例如,这可能是与爱丽丝的计算机102最佳连接的区块链节点104。当任何给定区块链节点104接收新事务152j时,其将根据区块链节点协议及其相应的角色进行处理。这包括首先检查新接收的事务152j是否满足变为“有效”的特定条件,具体示例稍后将详细讨论。在一些事务协议中,有效条件可通过事务152中包含的脚本在每个事务的基础上进行配置。或者,条件可仅仅是节点协议的内置功能,或通过组合脚本和节点协议进行定义。
如果新接收的事务152j通过有效性测试(即:“有效”的条件下),接收事务152j的任何区块链节点104将向在区块链节点104处维护的有序事务集154中添加新的核实有效事务152。进一步地,接收事务152j的任何区块链节点104随后将核实有效事务152传播至网络106中的一个或多个其它区块链节点104。由于每个区块链节点104应用相同的协议,因此假定事务152j有效,这意味着事务很快将在整个网络106中传播。
一旦进入在给定区块链节点104处维护的未决事务有序池154,该区块链节点104将开始争相解决其各自的包含新事务152的池154的最新版本上的工作量证明难题(请记住,其它区块链节点104可以尝试基于不同的事务池154来解决难题。但是,首先解决难题的人将定义包括在最新区块151中的事务集合。最终,区块链节点104将解决有序池154的一部分的难题,该有序集154包括爱丽丝的事务152j)。一旦包括新事务152j的池154完成工作量证明,其将不可变地成为区块链150中区块151中的一个区块的一部分。每个事务152包括指向早前事务的指针,因此事务的顺序也被不可变地记录下来。
不同的区块链节点104可以首先接收给定事务的不同实例,并且因此在一个实例被发布到新区块151中之前具有关于哪个实例“有效”的冲突视图,此时所有区块链节点104同意所发布的实例是唯一的有效实例。如果区块链节点104将一个实例接受为有效实例,然后发现第二实例已记录在区块链150中,则区块链节点104必须接受这一点,并将丢弃(即,视为无效)其最初接受的实例(即,在区块151中尚未公布的实例)。
作为基于账户的事务模型的一部分,由一些区块链网络操作的另一种类型的事务协议可称为“基于账户的”协议。在基于账户的情况下,每个事务均不通过参考过去事务序列中先前事务的UTXO来定义转移的数额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由网络的节点单独存储到区块链中,并不断更新。在此类***中,事务使用账户的运行事务记录(也称为“头寸”)进行排序。该值由发送者签名作为其加密签名的一部分,并作为事务引用计算的一部分进行哈希处理。此外,可选的数据字段也可以在事务中签名。例如,如果数据字段中包含先前事务的ID,该数据字段可指向先前事务。
基于UTXO的模型
图2示出了示例性事务协议。这是基于UTXO的协议的示例。事务152(简称“Tx”)是区块链150的基本数据结构(每个区块151包括一个或多个事务152)。下面将通过参考基于输出或基于“UTXO”的协议进行描述。但这并不限于所有可能的实施例。应当注意的是,虽然参考比特币描述了示例性基于UTXO的协议,但是它同样可以在其它示例区块链网络上实现。
在基于UTXO的模型中,每个事务(“Tx”)152包括数据结构,其包括一个或多个输入202和一个或多个输出203。每个输出203可包括未花费事务输出(UTXO),其可用作另一新事务的输入202的来源(如果UTXO尚未赎回)。UTXO包括指定数字资产数额的值。这表示分布式分类账上的一组通证。UTXO还可包含其来源事务的事务ID以及其它信息。事务数据结构还可包括标头201,其可包括输入字段202和输出字段203的大小指示符。标头201还可包括事务的ID。在实施例中,事务ID是事务数据(不含事务ID本身)的哈希值,且存储在提交至节点104的原始事务152的标头201中。
比方说爱丽丝103a希望创建转移相关数字资产数额至鲍勃103b的事务152j。在图2中,爱丽丝的新事务152j标记为“Tx1”。该新事务获取在序列中先前事务152i的输出203中锁定至爱丽丝的数字资产数额,并至少将此类数额中的一部分转移至鲍勃。在图2中,先前事务152i标记为“Tx0”。Tx0和Tx1只是任意的标记,其不一定意味着Tx0指区块链151中的第一事务且Tx1指池154中的后续事务。Tx1可指向仍具有锁定至爱丽丝的未花费输出203的任何先前(即先行)事务。
当爱丽丝创建其新事务Tx1时,或至少在她将该新事务发送至网络106时,先前事务Tx0可能已经有效并包括在区块链150的区块151中。该事务此时可能已包括在区块151中的一个区块中,或者可能仍在有序集154中等待,在这种情况下,该事务将很快包括在新区块151中。或者,Tx0和Tx1可以创建并一起发送至网络106;或者,如果节点协议允许缓冲“孤立”事务,Tx0甚至可以在Tx1之后发送。本文事务序列上下文中使用的“先前”和“后续”一词是指由事务中指定的事务指针定义的序列中的事务顺序(哪个事务指向哪个其他事务等等)。它们同样可以替换为“前任”和“继任”、“先行”和“后代”或“父项”和“子项”等。这不一定指其创建、发送至网络106或到达任何给定区块链节点104的顺序。然而,指向先前事务(先行事务或“父事务”)的后续事务(后代事务或“子事务”)不会有效除非父事务有效。在父事务之前到达区块链节点104的子事务被视为孤立事务。根据节点协议和/或节点行为,其可被丢弃或缓冲一段时间,以等待父事务。
先前事务Tx0的一个或更多个输出203中的一个包括特定的UTXO,标记为UTXO0。每个UTXO包括指定UTXO表示的数字资产数额的值以及锁定脚本,该锁定脚本定义后续事务的输入202中的解锁脚本必须满足的条件,以使后续事务有效,从而成功赎回UTXO。通常情况下,锁定脚本将数额锁定至特定方(该数额的事务的受益人)。即,锁定脚本定义解锁条件,该解锁条件通常包括以下条件:后续事务的输入中的解锁脚本包括先前事务被锁定到的一方的加密签名。
锁定脚本(亦称scriptPubKey)是节点协议识别的域特定语言中写入的一段代码。此类语言的特定示例称为“脚本(Script)”(S大写),其可由区块链网络所使用。锁定脚本指定花费事务输出203所需的信息,例如爱丽丝签名的要求。解锁脚本出现在事务的输出中。解锁脚本(亦称scriptSig)是提供满足锁定脚本标准所需信息的域特定语言中写入的一段代码。例如,其可包含鲍勃的签名。解锁脚本出现在事务的输入202中。
因此在示出的示例中,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>,该解锁脚本包括爱丽丝的加密签名,该签名由爱丽丝通过将其密钥对中的私钥应用于预定的部分数据(有时在密码学中称为“消息”)创建。爱丽丝需要签名以提供有效签名的数据(或“消息”)可通过锁定脚本、节点协议或其组合进行定义。
当新事务Tx1到达区块链节点104时,该节点应用节点协议。这包括一起运行锁定脚本和解锁脚本,以检查解锁脚本是否满足锁定脚本中定义的条件(其中该条件可包括一个或更多个标准)。在实施例中,这涉及并置两个脚本:
<Sig PA><PA>||[Checksig PA]
其中“||”表示并置,“<…>”表示将数据放在堆栈上,“[…]”表示由锁定脚本组成的函数(在该示例中指基于堆栈的语言)。同样,脚本可以使用公共堆栈一个接一个地运行,而不是并置脚本。无论采用哪种方式,当一起运行时,脚本使用爱丽丝的公钥PA(包括在Tx0的输出的锁定脚本中),以认证Tx1的输入中的解锁脚本是否包含爱丽丝签名预期部分的数据时的签名。也需要包括预期的部分数据本身(“消息”),以便执行此认证。在实施例中,签名的数据包括整个Tx1(因此不需要包括一个单独的元素来明文指定签名的部分数据,因为其本身便已存在)。
消息m是从要签名的事务的具体详细信息中导出的。由于该消息从签名到验证都必须相同,因此该过程确保在不使签名核实无效的情况下无法修改消息中包括的事务数据。
如上所示,消息是通过以设定顺序级联事务信息的某些元素来生成的。在验证签名期间,消息不是显式发送的,而是由验证者基于广播事务中的数据重新创建的;事务信息通过在签名中使用的相同过程级联并进行双重哈希处理以产生消息摘要,e。如果用于重新创建消息的事务的任何部分在签名生成之后已更改,则消息将不相同,并且验证将失败。
这种在签名消息中使用事务详细信息的过程在事务广播到发布到区块链之间的延迟期间可提供重要的安全元素。然而,由于在不使签名核实无效的情况下无法更新事务的任何“已签名”(即,包括在签名消息中)元素,因此一些事务字段永远不能包括在签名消息中。这些字段是每个输入的解锁脚本(必须更新以在生成签名之后包括签名)和事务ID(TxID),其是完整事务的双重哈希(包括解锁脚本中的签名)。由于这两个字段都必须包含签名(或从中导出),因此只有在签名生成之后才能确定。
本领域技术人员将熟悉通过公私密码进行验证的细节。基本上而言,如果爱丽丝已使用其私钥加密签署消息,则给定爱丽丝的公钥和明文中的消息,诸如节点104等其它实体可验证消息必须已经由爱丽丝签名。签署通常包括对消息进行哈希,签署哈希值和将此标记到消息作为签名,从而使公钥的任何持有者能够验证签名。因此,应当注意的是,在实施例中,在本文中对签名特定数据片段或事务部分等的任何引用可以意味着对该数据片段或事务部分的哈希值进行签名。
如果Tx1中的解锁脚本满足Tx0的锁定脚本中指定的一个或多个条件(因此,在所示示例中,如果在Tx1中提供了爱丽丝的签名并进行验证),则区块链节点104认为Tx1有效。这意味着区块链节点104会将Tx1添加到待定事务有序池154。区块链节点104还会将事务Tx1转发到网络106中的一个或多个其它区块链节点104,以便其会在整个网络106中传播。一旦Tx1有效并包括在区块链150中,这会将UTXO0从Tx0定义为已花费。应当注意的是,Tx1仅在花费未花费事务输出203时才有效。如果其试图花费另一事务152已经花费的输出,则即使满足所有其它条件,Tx1也将无效。因此,区块链节点104还需要检查先前事务Tx0中引用的UTXO是否已经花费(即,其是否已经形成另一有效事务的有效输入)。这是为何区块链150对事务152施加定义的顺序很重要的原因之一。在实践中,给定区块链节点104可维护单独的数据库,标记已花费事务152的UTXO 203,但最终定义UTXO是否已花费取决于是否在区块链150中形成了另一有效事务的有效输入。
如果给定事务152的所有输出203中指定的总数额大于其所有输入202所指向的总数额,则这是大多数事务模型中的另一失效依据。因此,此类事务不会传播或包括在区块151中。
请注意,在基于UTXO的事务模型中,给定UTXO需要作为一个整体使用。不能“留下”UTXO中定义为已花费的一部分数额,而同时又花费另一部分。但UTXO的数额可以在后续事务的多个输出之间分割。例如,Tx0的UTXO0中定义的数额可以在Tx1中的多个UTXO之间分割。因此,如果爱丽丝不想将UTXO0中定义的所有数额都给鲍勃,她可以使用剩余部分在Tx1的第二输出中自己找零,或者支付给另一方。
在实践中,爱丽丝通常还需要包括用于比特币节点104的费用,该比特币节点104在区块151中成功包含爱丽丝的事务104。如果爱丽丝未包括此类费用,则Tx0可能会被区块链节点104拒绝,并且因此尽管在技术上有效,但可能不会传播并且包括在区块链150中(如果区块链节点104不希望接受事务152,节点协议不强迫区块链节点104接受)。在一些协议中,事务费用不需要其自身的单独输出203(即不需要单独的UTXO)。相反,输入202指向的总数额与给定事务152的输出203指定的总数额之间的任何差额都将自动提供给发布事务的区块链节点104。例如,假设指向UTXO0的指针是Tx1的唯一输入,并且Tx1仅具有一个输出UTXO1。如果在UTXO0中指定的数字资产数额大于在UTXO1中指定的数额,则可以由赢得工作量证明竞赛以创建包含UTXO1的区块的节点104分配该差值。替代地或附加地,这不一定排除可以在其自身事务152的其中一个UTXO 203中明确指定事务费用。
爱丽丝和鲍勃的数字资产由区块链150中任何位置的任何事务152中的锁定至他们的UTXO组成。因此,通常情况下,给定方103的资产分散在整个区块链150的各种事务152的UTXO中。区块链150中的任何位置均未存储定义给定方103的总余额的一个数字。客户端应用程序105的钱包功能的作用是将锁定至相应方且在其它随后事务中尚未花费的各种UTXO值整理在一起。为实现这一点,其可以查询存储在任何一个位比特币节点104处的区块链150的副本。
应当注意的是,脚本代码通常用示意图表示(即使用非精确语言)。例如,可以使用操作码(opcode)来表示特定功能。“OP_...”是指脚本语言的特定操作码。举例来说,OP_RETURN是脚本语言操作码,当在锁定脚本的开始处在操作码前加上OP_FALSE时,操作码创建事务的不可花费输出,该输出可以在事务内存储数据,从而将数据不可改变地记录在区块链150中。例如,数据可包括需存储在区块链中的文件。
通常,事务的输入包含对应于公钥PA的数字签名。在实施例中,这基于使用椭圆曲线secp256k1的ECDSA。数字签名对特定的数据段进行签名。在实施例中,对于给定事务,签名将对部分事务输入以及部分或全部事务输出进行签名。对输出的特定部分进行签名取决于SIGHASH标志。SIGHASH标志通常是包含在签名末尾的4字节代码,用于选择签名的输出(并因此在签名时固定)。
六种不同的标志类型允许签名选择性地背书并因此确定所有输入和输出或各种子集的详细信息。下面基于解锁索引2中的输入的签名示出了不同的集合。已背书的输入和输出以粗体示出。
每个表格顶部显示的标志名称指示消息中包括哪些输出:ALL、NONE或SINGLE。每个标志有两种变体,这两种变体指示签名消息中包括哪些输入:“标准”变体(ALL、NONE、SINGLE;图2中表格的顶行)包括所有输入,而“任何人可以支付(ACP)”变体(ALL|ACP、NONE|ACP、SINGLE|ACP;底行)仅包括签名解锁的输入。对于单个标志变体(SINGLE或SINGLE|ACP),应当注意的是,已签名的单个输出始终是位于输入要解锁到的匹配索引位置处的输出。
消息中受sighash标志选择影响的字段是Hash(Outpoints)、Hash(nSeqs)、Hash(Outputs)和sigHashFlag字段本身。在计算哈希字段时,清空不包括的输入和输出(基于sighash标志),并且按顺序级联其余数据并对其进行哈希处理。例如,对于sighash ALL|ACP签名,删除索引0(Outpointi)和索引1(Outpointj)中的输入的信息,但保留所有输出的详细信息,从而产生以下哈希字段:
Hash(Outpoints)=Hash([TxIDk][indexk])
Hash(nSeqs)=Hash([nSeqk])
Hash(Outputs)=Hash([valuew][lockScriptLengthw][lockScriptw][valuex]...
[lockScriptLengthx][lockScriptx][valuey][lockScriptLengthy]...
[lockScripty][valuez][lockScriptLengthz][lockScriptz])
对于sighash SINGLE签名,保留所有输入,而仅保留一个输出–在索引2中与签名的位置匹配的输出,从而得出:
Hash(Outpoints)=Hash([TxIDi][indexi][TxIDj][indexj][TxIDk][indexk])
Hash(nSeqs)=Hash([nSeqi][nSeqj][nSeqk])
Hash(Outputs)=Hash([valuey][lockScriptLengthy][lockScripty])
消息字符串中的其他字段不受sighash标志的影响。无论签名授权哪个输入,版本和锁定时间字段(始终包括在签名消息中)对于基于同一事务的所有签名都是相同的。其余字段(outpointk、lockScriptLengthk、lockScriptk、valuek和nSeqk)与要签名的输入直接相关,因此将根据创建签名以解锁的输入而更改,但是不受sighash标志选择的影响,因为要解锁的输入必须始终进行签名。
将签名消息与匹配的私钥一起传递到ECDSA签名算法以生成签名(r,s)。为了将该签名包括在区块链事务中,必须将其转换为单个字符串,该字符串放置在其授权的输入的解锁脚本字段中。通过级联签名的两个元素r和s,并使用DER标准将其编码为字节格式来创建该字符串。
在消息中,将sighash标志作为最后一个字节附加,其中每个sighash标志由特定值表示,如下表所示,以提供序列化签名:sig(a,m)=[r][s][sigHashFlag]。应当注意的是,对于具有支付到公钥哈希(P2PKH)锁定脚本的输出点,在将签名放置在解锁脚本字段之前,为签名进一步附加其相关联的公钥。在验证期间,对于事务中的每个签名,基于事务信息和sighash标志来重新创建消息,并且使用该消息检查签名的有效性。
标志名称 | 字节值 | 具有分叉ID的字节值 |
ALL | 0x01 | 0x41 |
NONE | 0x02 | 0x42 |
SINGLE | 0x03 | 0x43 |
ALL|ACP | 0x81 | 0xC1 |
NONE|ACP | 0x82 | 0xC2 |
SINGLE|ACP | 0x83 | 0xC3 |
这六个sighash标志可提供对从仅一个输入(NONE|ACP)到所有输入和输出(ALL)的任何内容进行签名的灵活性(通过将其包括在签名消息中)。对于sighash ALL之外的标志,这意味着可以在不使签名核实无效的情况下更改从签名消息中排除的事务信息。与使用sighash ALL的标准方法相比,这可提供更大的灵活性。例如,“任何人可以支付”标志变体不会对要签名的输入之外的输入的详细信息施加任何限制,这允许其他各方在不使彼此的签名核实无效的情况下向事务中添加输入(即,“支付”)。
锁定脚本有时称为“scriptPubKey”,指其通常包括相应事务被锁定到的当事方的公钥。解锁脚本有时称为“scriptSig”,指其通常提供相应的签名。但是更通俗地说,在区块链150的所有应用中,UTXO赎回的条件并不一定包括对签名进行验证。更通俗地说,脚本语言可用于定义任何一个或多个条件。因此,可以优选更为通用的术语“锁定脚本”和“解锁脚本”。
侧信道
如图1所示,爱丽丝和鲍勃的计算机设备102a、120b中的每个计算机设备上的客户端应用程序都可以包括附加通信功能。此附加功能可使爱丽丝103a建立与鲍勃103b的单独侧信道107(在任何一方或第三方的鼓动下)。侧信道107使得能够脱离区块链网络交换数据。此类通信有时称为“链下”通信。例如,这可用于在爱丽丝与鲍勃之间交换事务152,而不将该事务(尚未)注册到区块链网络106上或将其发布到链150上,直到其中一方选择将其广播到网络106上。以这种方式共享事务有时称为共享“事务模板”。事务模板可能缺少形成完整事务所需的一个或多个输入和/或输出。替代地或附加地,侧信道107可用于交换任何其它事务相关数据,例如密钥、议付数额或条款、数据内容等。
通过与区块链网络106相同的分组交换网络101可建立侧信道107。替代地或附加地,侧信道107可以经由诸如移动蜂窝网络的不同网络或者诸如无线局域网络的局域网建立,甚至经由爱丽丝和鲍勃的设备102a、102b之间的直接有线或无线链路建立。通常,在本文中任何地方所指的侧信道107可以包括经由一项或多项联网技术或通信介质的任何一条或多条链路,这些链路用于“链下”交换数据,即脱离区块链网络106交换数据。在使用多条链路的情况下,链下链路束或集合整体上可以称为侧信道107。因此,应当注意的是,如果说爱丽丝和鲍勃通过侧信道107交换某些信息或数据等,则这不一定意味着所有这些数据都必须通过完全相同的链路或甚至相同类型的网络发送。
客户端软件
图3A示出了用于实现本公开方案的实施例的客户端应用程序105的示例性实施方式。客户端应用程序105包括事务引擎401和用户界面(UI)层402。根据上文讨论的方案以及稍后将进一步详细讨论的内容,事务引擎401被配置为实现客户端105的基础事务相关功能,诸如制定事务152,通过侧信道301接收和/或发送事务和/或其他数据,和/或发送事务至一个或更多个节点104以通过区块链网络106传播。根据本文公开的实施例,每个客户端105的事务引擎401包括函数403,该函数被配置为执行以下各项操作中的一项或多项:
·通过生成通证发行事务来生成通证;
·通过以下方式发起投票:定义投票选项;为投票分配一个或多个公钥;以及将投票选项和一个或多个公钥传输到投票者;
·生成与其中一个投票者的投票对应的输入-输出对,并将该输入-输出对传输到投票协调者;
·生成包括所接收的输入-输出对的投票事务;以及
·确定是否满足投票条件。
该UI层402被配置为通过相应用户的计算机设备102的用户输入/输出(I/O)方式呈现用户界面,包括通过设备102的用户输出方式向相应用户103输出信息,和通过设备102的用户输入方式接收来自相应用户103的输入。例如,用户输出方式可包括提供视觉输出的一个或显示多个屏(触摸或非触摸屏)、提供音频输出的一个或更多个扬声器、和/或提供触觉输出的一个或更多个触觉输出设备等。用户输入方式可包括例如一个或更多个触摸屏的输入阵列(可与用于输出方式的那个/那些相同或不同);一个或更多个基于光标的设备,诸如鼠标、轨迹板或轨迹球;一个或更多个麦克风和语音或声音识别算法,用于接收语音或声音输入;一个或更多个基于手势的输入设备,用于接收手动或身体手势形式的输入;或者一个或更多个机械按钮、开关或控制杆等。
注:虽然本文中的各种功能可以被描述为集成到同一客户端应用程序105中,但这并不一定构成限制,相反,它们可以在两个或更多个不同应用程序组成的一套程序中实现,例如一个应用程序作为另一个应用程序的插件或经由API(应用程序编程接口)进行接口。比如,事务引擎401的功能可以在单独的应用程序中实现,而不是在UI层402中实现,或者诸如事务引擎401的给定模块的功能可以在多个应用程序之间分割。同时,也不排除部分或全部描述的功能可以在比如操作***层实现。在本文任何位置引用单个或给定应用程序105或诸如此类的情况下,应当理解的是这只是作为示例,并且更通俗地说,所描述的功能可以在任何形式的软件中实现。
图3B给出了用户界面(UI)300的示例的模型,该UI可由客户端应用程序105a的UI层402在爱丽丝的设备102a上呈现。应当理解的是,类似的UI可以由客户端105b在鲍勃的设备102b或任何其他方的设备上呈现。
通过图示的方式,图3B从爱丽丝的角度示出了UI 300。该UI 300可包括一个或更多个UI元素301、302、303,该一个或更多个UI元素通过用户输出方式呈现为不同的UI元素。
例如,UI元素可包括一个或更多个用户可选择的元素301,这些元素可以是屏幕上的不同按钮、菜单中的不同选项或者诸如此类。用户输入方式被设置成使用户103(在这种情况下为爱丽丝103a)能够选择或以其它方式操作其中一个选项,诸如通过点击或触摸屏幕上的UI元素,或者说出所需选项的名称(注:本文使用的“手动”一词仅用于与自动进行对比,而不一定限于用手执行操作)。这些选项使用户(爱丽丝)能够执行以下操作:选择投票指令中提供的一组预定义投票选项中的一个投票选项以进行投票;在定义投票选项时选择一个或多个建议的投票选项;选择要包括在已完成投票事务中的所接收的输入-输出对;或者,从用户目录中选择要为其生成通证的一组用户。
替代地或附加地,UI元素可以包括一个或多个数据输入字段302,通过该数据输入字段,用户可以输入文本以定义要包括在OP_RETURN中的数据或要包括在投票指令中的投票选项。这些数据输入字段通过用户输出方式呈现,例如屏幕上,并且数据可通过用户输入方式输入到字段中,例如键盘或触摸屏。或者,数据可以例如基于语音识别口头地接收。
替代地或附加地,UI元素可包括向用户输出信息的一个或更多个信息元素303。例如,这/这些可以在屏幕上呈现或可听见。
应当理解的是,呈现各种UI元素、选择选项和输入数据的特定方式并不重要。这些UI元素的功能稍后将进行更详细地讨论。还应当理解的是,图3中示出的UI 300只是一个图示模型,在实践中,它可包括一个或更多个进一步的UI元素,为了简洁起见,未对其进行说明。
节点软件
图4示出了在基于UTXO或基于输出的模型的示例中,在网络106的每个区块链节点104上运行的节点软件450的示例。应当注意的是,另一实体可以运行节点软件450,而不被分类为网络106上的节点104,即,不执行节点104所需的动作。节点软件450可以包含但不限于协议引擎451、脚本引擎452、堆栈453、应用级决策引擎454以及一个或多个区块链相关功能模块455的集合。每个节点104可以运行节点软件,该节点软件包含但不限于以下所有三个:共识模块455C(例如,工作量证明)、传播模块455P和存储模块455S(例如,数据库)。协议引擎401通常被配置为识别事务152的不同字段,并根据节点协议处理此类字段。当接收到具有指向另一先前事务152i(Txm-1)的输出(例如,UTXO)的输入的事务152j(Txj)时,协议引擎451标识Txj中的解锁脚本并将其传递给脚本引擎452。协议引擎451还基于Txj的输入中的指针来标识和检索Txi。Txi可以在区块链150上发布,在这种情况下,协议引擎可以从存储在节点104处的区块链150的区块151的副本中检索Txi。或者,Txi还可以在区块链150上发布。在这种情况下,协议引擎451可以从节点104维护的未发布有序事务集154中检索Txi。无论采用哪种方式,脚本引擎451都会标识Txi的引用输出中的锁定脚本,并将其传递给脚本引擎452。
因此,脚本引擎452具有Txi的锁定脚本和来自Txj的相应输入的解锁脚本。例如,在图2中示出了事务标记的Tx0和Tx1,但是同样的事务也可以应用于任何事务对。如前所述,脚本引擎452一起运行两个脚本,这将包括根据所使用的基于堆栈的脚本语言(例如脚本)将数据放置到堆栈453上和从堆栈453检索数据。
通过同时运行脚本,脚本引擎452确定解锁脚本是否满足锁定脚本中定义的一个或多个标准,即解锁脚本是否对包括锁定脚本的输出进行解锁?脚本引擎452将该确定的结果返回给协议引擎451。如果脚本引擎452确定解锁脚本确实满足在相应的锁定脚本中指定的一个或多个标准,则返回结果“TRUE”。否则,返回结果“FALSE”。
在基于输出的模型中,来自脚本引擎452的结果“TRUE”是事务有效性的条件之一。通常,还必须满足由协议引擎451评估的一个或多个进一步协议级条件;例如,Txj的输入中所指定的数字资产的总数额不超过其输出中指向的总数额,并且Txi的指向输出尚未被另一有效事务花费。协议引擎451评估来自脚本引擎452的结果以及一个或多个协议级条件,并且只有当它们都为TRUE时,协议引擎才核实事务Txj有效。协议引擎451将事务是否有效的指示输出到应用级决策引擎454。只有在Txj确实有效的条件下,决策引擎454才可以选择同时控制共识模块455C和传播模块455P,以执行其就Txj.的相应区块链相关功能。这包括共识模块455C,向节点的相应有序事务集154添加Txj,用于并入区块151中;以及传播模块455P,将Txj转发到网络106中的另一个区块链节点104。可选地,在实施例中,应用级决策引擎454可以在触发这些函数中的一个或两个函数之前应用一个或多个附加条件。例如,决策引擎可以只选择在事务有效且预留足够事务费用的条件下发布事务。
此外,还应当注意的是,在本文中,术语“TRUE”和“FALSE”不一定限于返回仅以单个二进制数(位)形式表示的结果,尽管这确实是一种可能的实现方式。更通俗地说,“TRUE”可以指指示成功或肯定结果的任何状态,而“FALSE”可以指指示不成功或不肯定结果的任何状态。例如,在基于账户的模型中,可以对签名的隐式协议级核实和智能合约的附加肯定输出的组合来指示结果为“TRUE”(如果两个单独的结果均为TRUE,则认为总体结果为TRUE)。
通证
一些事务包括与不同用户相关联的输入,例如下面描述的投票事务。为了限制谁可以对事务做出贡献,向所允许的贡献者发行通证,这使所允许的贡献者能够在事务中提供输入和输出。
将结合在投票中的使用情况来描述通证。
下面和图5中示出了示例性通证发行事务。该事务由负责要使用通证生成的事务的一方的设备生成。在投票的情况下,该方是投票协调者。
通证发行事务500具有单个输入和解锁脚本506,该单个输入包括标识事务ID和未花费事务输出的索引的输出点504,该解锁脚本包括投票协调者的具有sighash ALL标志的签名,使得通证发行事务500的所有输入和输出都使用投票协调者的签名进行签名。
通证发行事务500具有多个输出。存在一组通证510以及与协调者相关联的输出,其中每个合格投票者一个通证。与投票协调者相关联的输出包括未花费事务输出和锁定脚本,该锁定脚本将UTXO锁定到协调者的公钥。
在图5中,存在3个通证,每个通证具有对应的锁定脚本508,该锁定脚本标识该通证被锁定到的合格投票者。该通证是具有低值或标称值(nominal value)的未花费事务输出,使得它可以视为尘埃(dust)UTXO。这意味着,如果投票者不投票,投票协调者只会损失少量数字资产,并且投票者几乎没有动机不投票。锁定脚本还包括签名条件,该签名条件定义了当投票者使用通证投票时必须使用的sighash标志。在法定人数投票(quorum vote)的情况下,只有一部分投票者需要投票,因此在投票之前无法知道输入,签名条件定义了必须使用SINGLE|ACP sighash标志。另一方面,如果所有投票者都必须投票,使得在投票之前知道所有输入,签名条件可以定义单个sighash标志(single sighash flag),即在签名条件中定义SINGLE|ACP或SINGLE。
当使用通证时,签名条件检查签名的最后一个字节是否等于与所定义的签名条件相关联的特定值,该最后一个字节指示用于签名的sighash标志。例如,为了检查是否使用了sighash SINGLE|ACP(字节值0x83),可以在锁定脚本的开头包括以下一系列OP代码:
OP_TOALTSTACK OP_DUP OP_1OP_SPLIT OP_SWAP OP_2OP_MINUS OP_SPLIT OP_NIP<0x83>OP_EQUALVERIFY OP_FROMALTSTACK
可以在附录A中找到对该代码的解释。应当理解的是,所给出的代码仅是示例性SCRIPT代码,并且本领域技术人员将知道可以用于实现相同结果的其他SCRIPT代码。
合格投票者随后可以通过提供标识通证发行事务和锁定到投票者的UTXO的输出点、通证被锁定到的投票者的签名以及通证的锁定脚本中指示的sighash标志,来在投票事务中使用他们的通证。
如上所述的通证可以用于多方对同一事务做出贡献的其他事务。通证提供了一种限制各方可以对事务做出贡献的方式,以及一种轻松标识未授权方贡献的方式。
投票方法
在投票中,多方对单个事务做出贡献。
当使用sighash ALL应用签名时,必须在签名开始之前定义包括所有输入和输出的详细信息的整个事务,因为一旦应用了具有ALL标志的签名,就不能进一步编辑输入或输出。这意味着各方必须首先协作定义事务,然后再对事务进行第二次签名。相比之下,使用不同的sighash标志可以通过允许各方独立设置不同的输出并应用签名来在各方之间提供一定程度的自主性,而无需预定义所有事务详细信息。
由于各方在不同的时间进行投票,并且每一方选择的投票选项最好保持匿名,因此各方使用单个sighash标志对其输入进行签名,使得签名消息中仅包括该方提供的输出。为了防止任何投票者在另一投票者不知道的情况下将另一投票者的投票从事务中移除,由投票协调者生成该事务,一旦所有投票都已接收并包括在内,该协调者就会编译投票事务并使用ALL sighash标志授权投票事务。
ACP标志变体适合在存在多个输入的情况下使用,因为它们允许独立定义输入。同样,SINGLE标志变体允许在未确定其他输出的情况下对特定输出进行签名。这两个特征意味着,SINGLE|ACP标志可以用于对位于匹配索引位置处的输入-输出对进行签名,而不会对其他输入和输出的详细信息或数量施加任何限制。这为将这些输入-输出对组合成单个事务提供了相当大的自由度:由于所有输入和输出都经过签名,因此完整事务有效的唯一要求是,输入的组合值必须足以涵盖所有已分配的输出加上适当的事务费用。例如,如果输入值超过输出值,由一组四个独立签名对形成的如下所示事务Tx和Tx’都是有效的。
然而,尽管sighash SINGLE|ACP可提供极大的灵活性,但是也潜在地具有延展性。使用SINGLE|ACP进行签名的任何输入-输出对都可以在不使原始签名核实无效的情况下复制并包括在竞争事务中。如果拦截者将更改后事务广播到网络,则不确定将该事务的哪个版本发布到区块链,因为网络上的一些节点可能会在原始版本之前接收更改后版本。如果签名对中的输入的值大于输出的值,这个问题会特别突出:任何多余的值都可以分配到更改后事务中拦截者的地址。因此,为了抑制干扰,SINGLE|ACP签名对不应保留任何未分配的输入值。
定义投票
投票协调者定义投票。
存在用于投票的一组预定义选项,投票者必须选择其中一个预定义选项。这种情况的一个示例是选举投票,其中投票者选择竞选候选人中的一个候选人。投票可以包括“其他”选项,其可以允许用户输入他们自己的答案。
投票协调者定义一组选项,例如候选人列表。投票协调者可以将不同的公钥分配给每个选项。这些分配存储在数据库中。公钥可以用于生成地址。当投票者选择其中一个预定义投票选项时,未花费事务输出被锁定到与所选选项相关联的公钥。
投票者可能能够提供其他用户定义的输入。例如,投票者可以选择投票选项,并通过在数据输入字段中键入评论来提供进一步的评论以包括在投票结果中。
投票协调者定义允许投票者输入文本。当投票者参与投票时,投票的未花费事务输出被锁定到所选投票选项的公钥,并且文本被呈现在事务的OP_RETURN中。
全组投票
考虑一个希望进行保密投票的组,该组的每个成员都必须投票。如上所述,投票选项应由投票协调者预定义,并且在所有投票都已投完之前,投票者不应看到彼此的选择。在事务中,个人投票可以通过单个输出的详细信息来表示(例如,通过将所有投票选择与特定输出地址关联),前提是输出可以由单个投票方独立设置和签名。为了实现这一点,投票事务应包含来自每个投票者的输入,以及使用单个sighash标志进行签名的匹配输出。输入可以是在投票之前向该组中的每个成员发行的标称值的投票通证。
例如,对于一个由三个投票者(爱丽丝、鲍勃和查理)和一个协调者(黛利拉)组成的组,可以按如下方式进行投票:
1.黛利拉执行事务,该事务创建将充当投票通证的三个尘埃UTXO,分别为爱丽丝、鲍勃和查理分配一个。
2.黛利拉将这些通证UTXO作为输入连同她控制的附加输入一起添加到投票事务模板,该附加输入包含足以涵盖事务费用的资金。她将该模板连同与投票中每个选项对应的输出地址列表一起发送给爱丽丝、鲍勃和查理。
3.爱丽丝、鲍勃和查理各自设置他们指定的输出详细信息,以反映他们的投票选择,并使用放置在其输入的解锁脚本中的sighash SINGLE来创建签名。签名SINGLE不会对其他索引中设置的输出施加任何限制,因此它们不需要知道其他各方的投票选择即可生成有效签名。所有投票方均应将其部分签名事务(表示其投票)返回给黛利拉。例如,鲍勃的投票可能采用以下形式:
4.一旦黛利拉收到所有投票,她就会将其组合成单个投票事务,创建签名以使用sighash ALL来核实她的输入的花费有效,并广播该事务,从而提供投票的不可变记录。
虽然黛利拉被要求设置投票模板并整理投票,但是她没有任何机会干预结果。通过在任何一方签名之前预定义输入,该组确保所有各方都必须提供投票以便产生有效的事务。同样,由于输入只能由持有预先指定密钥的各方核实有效,因此任何投票都不能由另一方(包括黛利拉)伪造。
图6是用于全组投票的投票事务600的示例,其中投票通证是使用图5的通证发行事务发行的。投票事务600包括四个输入和四个输出。
在第0个索引中,存在由第一投票者提供的第一输入-输出对。输入包括非签名部分和签名部分。非签名部分包括指示图5中通证发行事务的索引0处的通证的输出点,签名部分包括SINGLE sighash标志和通证被锁定到其公钥的第一投票者的签名。输出包括数字资产值和锁定脚本,该数字资产值等于通证的值,该锁定脚本包括用户已选择的投票选项(投票选项1)的地址。签名对投票事务600的所有输入以及投票事务600的第0个索引处的输出进行签名,但不对投票事务600的其他输出进行签名。也就是说,签名消息包括四个输入,并且仅包括第0个索引中的输出。
在第1个索引和第2个索引中分别提供类似的输入-输出对,其中第1个索引中的输入-输出对指示具有第二投票者的签名和SINGLE sighash标志的通证发行事务的索引1处的通证、等于通证值的未花费事务输出值以及由第二投票者选择的投票选项3的地址,并且第2个索引中的输入-输出对指示具有第三投票者的签名和SINGLE sighash标志的通证发行事务的索引2处的通证、等于通证值的未花费事务输出值以及由第三投票者选择的投票选项1的地址。
索引3处的输入包括指示投票协调者的UTXO的输出点和具有ALL sighash标志的投票协调者的签名。索引3处的输出包括UTXO和锁定脚本,该UTXO的值等于输入中指示的UTXO的值减去事务费用(因为每个通证的完整值被锁定到投票选项的公钥),该锁定脚本包括投票协调者的公钥。如果索引0至索引2中投票的输出的UTXO值小于输入中指示的UTXO值,使得每个投票都会产生事务费用,则索引3的输入中引用的UTXO与索引3的输出的UTXO之间的差值只需等于单个投票未涵盖的事务费用的数额。
投票者提供的输入-输出对所在的索引可以称为投票索引。在图6的示例中,这些索引是索引0、索引1和索引2。投票协调者在其中提供其签名的索引(在这里是索引3)可以称为授权索引,因为投票协调者对所有输入和输出进行签名。应当理解的是,可以在事务600中的任何索引处提供投票和授权索引,只要投票协调者仅在所有投票索引均已提供之后对输入和输出进行签名即可。
投票事务600还包括事务ID、输入计数4和输出计数4。
图8示出了投票事务600与通证发行事务500之间的关系。与投票对应的投票事务600的每个输入(在索引0至索引2处)指示如上所述的通证发行事务500的输出。当区块链节点核实投票事务600有效时,一起运行与同一UTXO相关联的锁定脚本和解锁脚本,以检查解锁脚本是否满足锁定脚本的要求。这包括在通证的锁定脚本包括此类签名条件的情况下检查sighash标志值。
通证发行事务500的输入被示为指向将UTXO锁定到投票协调者的公钥的上一个区块链事务800的输出。上一个事务可以包括用于花费与上一个投票(未示出)相关联的UTXO的输入,使得用于上一个投票的数字资产被重复使用。
在全组投票中,可以使用SINGLE或SINGLE|ACP sighash标志。如果使用通证,如上和图6所示,投票协调者在生成投票事务之前就知道输入,因此投票者可以使用SINGLEsighash标志。在这种情况下,用户还可以使用SINGLE|ACP sighash标志,而不会影响任何其他投票者投票的能力。
替代地,不发行通证,从而排除上述步骤1,并且投票者通过花费先前已分配给投票者的预定义值的未花费事务输出进行投票。也就是说,投票协调者未向投票者提供投票的“成本”,相反投票者必须支付才能投票。在这种情况下,为促进投票,投票的成本可以是微不足道的。投票协调者在投票之前不知道投票者在投票时要提供的输出点,因此投票者使用SINGLE|ACP sighash标志。
上述通证具有“尘埃”UTXO值,该值较小。例如,当事务的找零余额非常小时,可能会创建此类较小值。这些尘埃UTXO可能不包含足以涵盖事务费用的值,从而使它们无法单独发挥作用。如果不使用通证,投票协调者只会损失较小数额。
法定人数投票
在一些情况下,并非所有各方都可能会被要求返回响应,而是只要该组内阈值数量的成员(法定人数quorum)参与,就同意投票有效。在这种情况下,由于无法预定义确切的输入(因为不知道哪些合格投票者将返回投票),因此应使用SINGLE|ACP标志对投票通证进行签名。
1.协调者应向所有合格投票者发行投票通证。这些投票通证应具有附加花费要求(在锁定脚本中定义),使得它们必须使用SINGLE|ACP标志进行签名。
该签名条件是锁定脚本中的额外条件,用于检查签名的最后一个字节(指示用于签名的sighash标志)是否等于特定值。例如,为了检查是否使用了sighash SINGLE|ACP(字节值0x83),可以在锁定脚本的开头包括以下一系列OP代码:
OP_TOALTSTACK OP_DUP OP_1OP_SPLIT OP_SWAP OP_2OP_MINUS OP_SPLIT OP_NIP<0x83>OP_EQUALVERIFY OP_FROMALTSTACK
可以在附录A中找到对该脚本的解释。
2.选择投票的任何合格投票者应在投票截止日期之前将已签名投票通证返回给协调者。如果需要,投票者可以设置锁定时间,使得投票在投票截止日期之前无效。
3.一旦投票截止日期已过,协调者将所提交的全部投票收集到单个事务中。他们应检查所使用的全部通证对该投票是否有效,以及是否已达到所需法定人数。这可以手动完成,也可以通过智能合约完成,例如,检查所有投票输入是否引用Tx0,以及通证输入的总值是否高于所需值(nQxBSV,其中nQ是法定人数所需的投票数量)的智能合约。如果满足这些条件,协调者将执行以下操作:添加最终输入和输出以涵盖事务费用;使用sighash ALL进行签名;以及广播最终投票事务。
应当注意的是,如果协调者出错并且未包括合格投票,他们可能会简单地创建包含已错过投票的第二事务。同样,如果由于某种原因,SINGLE|ACP投票包括在单独的事务中,并且在主投票事务之前被挖掘,则协调者可以添加对TxID的引用,其中投票包括在最终输出的OP_RETURN中。
图7示出了用于法定人数投票的投票事务700的示例,其中使用了图5中发行的通证。投票事务700类似于用于全投票的投票事务600,然而只有两个投票者进行了投票。第二投票者没有投票,因此只有第一投票者和第三投票者的输入-输出对分别包括在索引0和索引1处的投票事务700中,尽管投票可以任意顺序在任意索引处提供。索引2包括与投票协调者相关联的输入和输出,如图6的投票事务600的第3个索引中所示。因此,投票事务700的输入计数和输出计数都是3。
与全组投票一样,在一些实施例中可以不发行通证。取而代之的是,投票者提供指示未花费事务输出的输出点,该未花费事务输出具有预定义值以涵盖投票成本。在一些情况下,该成本可以是促进投票的最低成本。在其他情况下,为了阻止对投票几乎不感兴趣的投票者参与投票,或者为了阻止投票者出于使投票结果产生偏差之目的而多次投票,该成本可能较高。
法定人数投票的一个具体示例是民意调查(opinion poll)。在该示例中,无法预先定义投票者,因此需要使用SINGLE|ACP标志对输入进行签名。民意调查设置的工作方式如下:
1.民意调查发起者爱丽丝公开发布两个或多个民意调查选项的详细信息。每个民意调查选项应与爱丽丝可以解锁的地址相关联。
2.想要在民意调查中登记投票的任何人都可以创建具有以下属性的SINGLE|ACP签名输入-输出对:
·输出应为爱丽丝定义的其中一个民意调查选项地址;
·输入应具有最小值,以阻止垃圾投票;
·输出的值应与输入的值匹配;
·锁定时间应设置为与民意调查截止日期匹配。
3.每个“投票”对都直接发送给爱丽丝,爱丽丝将它们组合成单个事务。如果需要,她会添加最终输入以支付事务费用,并使用sighash ALL进行签名。
4.一旦事务由区块链节点核实有效并发布到区块链,该事务就会提供民意调查结果记录。无论选择哪个民意调查选项,爱丽丝都会受益于每个受访者通过他们的输入贡献的值。
与SINGLE标志相比,SINGLE|ACP标志的延展性意味着,当爱丽丝广播最终事务时,某人可能会在最终事务到达网络之前拦截该最终事务,并基于仍然有效的合格投票的子集创建替代事务。然而,拦截者将无法重定向民意调查受访者贡献的任何值,因为输出地址是固定的,并且这些值与输入值匹配,因此唯一的潜在影响将是更改民意调查结果。在这种情况下,爱丽丝仍然可以创建包含所排除民意调查响应的第二事务,以便她可以收集通过这些输入贡献的值。尽管如此,引入服务提供者可能是值得的,该服务提供者将在每个民意调查中收取一定比例的值来防止该延展性,例如通过与区块生产者(或服务自身的区块生产能力)签订的合约,该合约允许民意调查事务直接发送到核心网络,而无需在更大范围内进行广播。
图9示出了使用区块链提供投票的示例性方法。左侧的动作是在区块链外执行的动作,右侧的动作是区块链节点在区块链上执行的动作。
在步骤S902中,投票协调者定义投票选项,并为该投票分配至少一个公钥。在分配单个公钥的情况下,投票者选择的投票选项在事务的OP_RETURN中返回,其中投票的所有UTXO锁定到该投票的单个公钥。在多个公钥的情况下,一个公钥与每个投票选项相关联,使得投票的UTXO锁定到所选投票选项的公钥。存储投票选项与公钥之间的关联。投票协调者设定必须收到投票的时间。投票协调者通过运行计算机程序的用户设备定义投票选项,该计算机程序呈现如图3A和图3B所示的用户界面。
在步骤S904中,投票协调者还定义投票者和签名要求。投票协调者定义谁有资格投票,以及所需的投票者数量,即是全组投票还是法定人数投票。签名要求至少在一定程度上取决于投票是否为全组投票。在该步骤中,投票协调者还定义任何投票权重或其他特殊投票特权,例如否决权投票。
在步骤S906中,投票协调者基于在步骤S904中定义的投票者要求来生成通证发行事务500。区块链节点接收通证发行事务500(步骤S908),核实该事务有效(步骤S910),并且将该事务发布到区块链(步骤S912)。
一旦核实有效并发布,通证就锁定到投票者的公钥。在步骤S914中,投票者接收通证。
在步骤S916中,投票协调者将投票选项和定义的一个或多个公钥分发给投票者。投票成本、投票截止日期和通证发行事务500的事务ID等其他信息可以包括在所分发的投票信息中。
希望参与投票的每个投票者定义他们的输入-输出对,指示他们已选择的投票选项,并提供签名,以使用所需的sighash标志来花费他们的投票通证。这些信息传输到投票协调者的设备,在步骤S918中,该设备接收输入-输出对。
一旦投票截止日期已过,或者所有投票均已收到,投票协调者就会检查所需数量的参与者是否已提交输入-输出对,以及输入是否包括标识为投票颁发的通证的输出点。如果满足这些投票条件,则在步骤S920中,投票协调者生成包括所接收的全部输入-输出对的投票事务600、700。如果已接收到任何无效的输入-输出对,例如来自没有资格投票或不使用通证投票的各方的输入-输出对,则可以忽略和丢弃无效的输入-输出对。
区块链节点在步骤S922中接收投票事务600、700,在步骤S924中核实该事务有效,并且在步骤S926中将该事务发布到区块链。
一旦发布,在步骤S928中,投票协调者就可以访问投票数据。如果每个投票选项与不同的公钥相关联,则可以通过访问与公钥相关联的不同地址来确定投票数据或结果。每个地址处的UTXO的数量或者作为投票事务600、700的结果在该地址处接收的数量与通过每个投票选项接收的投票数量成比例,包括投票的任何权重。这可提供一种高效、准确的计票方法。
或者,一旦将投票事务600、700本身存储到区块链以访问投票数据,就可以访问该投票事务。这可提供一种查看OP_RETURN中数据的方法。使用OP_RETURN进行的投票由投票协调者或其计算机设备进行计数。
然后,在步骤S930,投票协调者可以将投票结果分发给投票者。
如上所述,通过将投票发布到区块链,更容易跟踪投票结果和投票参与者。投票也是不可变的,因此结果比手动计票更可靠。
上面使用的术语“投票协调者”是指控制用户设备的用户和在用户设备上运行的计算机程序,该用户设备被配置为在计算机设备上实现方法步骤。
应当理解的是,图9的这些方法步骤中的一些方法步骤可以按照不同的顺序执行,也可以同时执行。例如,定义投票者的步骤S904可以是第一步骤,或者与步骤S902同时执行。在步骤S914中,直到投票者已接收到通证,才可以执行定义投票选项的步骤S902。对于本领域技术人员来说,这些方法步骤的其他可选排序将是显而易见的。
图10示出了由投票者进行投票的示例性方法。通过在投票方的用户设备的处理器上运行计算机程序,在该设备上实现该方法。投票方使用客户端应用程序300来提供输入。
在步骤S1002中,从投票协调者接收投票指令。投票指令包括由投票协调者定义的投票选项和与投票选项相关联的公钥。在步骤S1004中,将投票选项作为用户可选项301呈现在用户设备的显示器上。
用户选择或以其他方式输入他们选择的投票选项。在步骤S1006中,在UI 300处检测该选择。
在步骤S1008中,使用所接收的投票指令来确定与所选投票选项相关联的公钥。
在步骤S1010中,生成用于投票者投票的输入-输出对。输入包括输出点和一方的具有单个sighash标志的签名,并且输出包括与用户选择的投票选项和所需数额的数字资产相关联的公钥。
然后,在步骤S1012中,用户设备将该输入-输出对传输到投票协调者以包括在投票事务中。
如果投票协调者还生成投票通证,则投票指令包括关于这些通证的信息,例如标识通证的输出点和投票值(在投票者可以拆分他们的通证以进行多次投票的情况下)。在步骤S1010中由用户设备生成的输入包括标识通证的输出点,并且输出包括与该方希望分配给所选投票选项的投票数量成比例的值。
然而,如果没有发行通证,则投票指令包括投票的成本,并且输入包括标识具有等于该成本的值的UTXO的输出点。
如果只有单个公钥与投票相关联,则从该方法中移除确定公钥的步骤(步骤S1008),并且输出包括与投票相关联的单个公钥。
如上所述,投票者能够通过UI 300的数据输入字段302以投票者提供的文本的形式输入用户定义的评论或投票选项。投票者提供的文本包括在输出中,以包括在投票事务的OP_RETURN中。
变体
匿名性:在本文描述的设置中,投票者知道与每个投票通证相关联的身份,因此一旦最终事务已广播,就可以标识各方的投票选择。然而,协调者不必公开标识向每个投票者发行了哪个通证,并且如果通证发行到先前未公开链接到投票者的地址,则可以进行秘密投票。
可重用/可转让投票:通过输出地址指示投票的替代方案是在输出的OP_RETURN数据中表示投票选择。这可以允许将通证分配回同一用户(通过将输出地址设置为其自己的地址),以便可以在后续投票中重用通证。这将在预期同一组各方定期投票的情况下简化该过程,因为协调者不需要为每个投票发行通证。这还将提供每个成员的投票历史记录(如果需要,可以如上所述从投票者的身份中提取)。该***可以允许投票具有可转让性:如果投票者希望为他们的投票指定代理,他们可以将通证转让到该代理的地址,而不是他们自己的地址。
加权:不需要在投票者之间平均分发投票。可以加权方式发行通证,以实现基于资历或投资等的层级结构。可以通过向每个用户发行的通证的数量来实现加权,或者通过向每个投票者发行具有可变值的单个通证来实现加权。如果通证的发行数量可变,则投票者可能能够将其通证划分为支持多个选项的投票,其中一个投票具有预定义值。因此,具有较大权限的投票者可以决定是进行支持多个选项的投票,还是进行支持具有较大权重的一个选项,亦或是两者的组合。
细粒度投票:如果为每个投票者发行多个通证(无论在成员之间是加权的还是相等的),这将使投票者有机会拆分其投票以指示偏好。例如,在十个通证中,投票者可能会选择将其中八个通证分配给选项A,将零个通证分配给选项B,并且将两个通证分配给选项C。
特殊通证:可以发行附有特殊条件的通证。例如,可以向一组中的高级成员发行否决权通证。这可以代替常规通证(或附加于常规通证)来提交,并且例如可能具有使整个投票或所选投票选项无效的效果。特殊通证可以由投票协调者或智能合约基于它们的UTXO来标识,并且在创建通证时可以在OP_RETURN中声明使用条件。
嵌入额外信息:与在一组预定义替代方案之间直接选择相比,将数据包括在每个输出的OP_RETURN中可以使响应更加精细。该空间可以用于允许对投票选择进行可选评论,或者更正式地要求每个投票者提供反馈。例如,在学术研究中,许多期刊要求一篇论文在被接受发表之前经过几位独立专家的同行评审。这可以通过本文描述的投票来实现,其中输出地址反映总体建议(拒绝、修改和重新提交、接受等),并且OP_RETURN提供用于完整评论的空间。在所有评审者返回投票和评论之前,表示针对原稿做出的决定的事务将是无效的,这将提供决定过程的不可变记录。此外,还可以定义投票,使得投票协调者不提供任何投票选项,而是投票者在OP_RETURN中提供他们的投票选项,例如在请求反馈的情况下。在这种情况下,只需要为投票定义一个地址,所有选票的值都会转到单个地址。
多用途投票通证事务:通证发行事务可以在与事务的OP_RETURN中提供的每个通证相关联的锁定脚本中包括附加信息。这些附加信息可以是投票指令。当通证发行事务被发布并且用户获知通证已发行时,投票者设备上的程序访问OP_RETURN中提供的投票指令,并向用户呈现适当的信息。这允许在发行通证时不可变地存储投票指令。
通证/投票者检查软件:投票者或投票协调者设备上的客户端应用程序105等软件可以负责检查投票者是否有资格进行投票和/或是否使用了正确的sighash标志。为了检查投票者资格,软件可以检查输入-输出对中的签名是否与合格投票相关联,例如,通过与合格投票者列表进行比较,或通过检查是否使用了有效通证(如果已发行通证)。例如,该软件可以对照存储在程序中的预定义sighash标志规则,或者对照在通证发行事务中定义的sighash标志条件,来检查所使用的sighash标志。在这种情况下,可以在通证发行事务的OP_RETURN中定义sighash标志条件。当根据要求检查所使用的sighash标志时,该软件访问该通证发行事务。然后,如果满足标准,则将输入-输出对仅传输到投票协调者,或者将其包括在投票事务中,使得任何输入-输出对都不会导致投票事务无效。
上述签名程序提供了如何组合多个sighash标志以实现复杂签名***的综合示例。具体地,本文描述的***使个人有机会在不放弃独立性的情况下就联合事务进行协作。这些***还概述了交换部分形成、部分签名的事务如何作为沟通工具,而不是在使用sighash ALL进行签名时所需的初步对话,从而进一步显著简化签名程序。
结论
一旦给出本文的公开内容,所公开技术的其它变体或用例对于本领域技术人员可能变得显而易见。本公开的范围不受所描述的实施例限制,而仅受随附权利要求限制。
例如,上面的一些实施例已经根据比特币网络106、比特币区块链150和比特币节点104进行了描述。然而,应当理解的是,比特币区块链是区块链150的一个特定示例,并且上述描述通常可以应用于任何区块链。也就是说,本发明决不限于比特币区块链。更一般地,以上对比特币网络106、比特币区块链150和比特币节点104的任何引用可以分别参考区块链网络106、区块链150和区块链节点104来替换。区块链、区块链网络和/或区块链节点可以共享如上所述的比特币区块链150、比特币网络106和比特币节点104的部分或全部所述特性。
在本发明的优选实施例中,区块链网络106是比特币网络,并且比特币节点104至少执行对区块链150的区块151进行创建、发布、传播和存储中的所有所述功能。不排除可能存在仅执行这些功能中的一个或部分功能但不是全部功能的其它网络实体(或网络元件)。也就是说,网络实体可以执行传播和/或存储区块的功能,而不创建和发布区块(请记住,这些实体不被认为是优选的比特币网络106的节点)。
在本发明的其他实施例中,区块链网络106可以不是比特币网络。在这些实施例中,不排除节点可以执行对区块链150的区块151进行创建、发布、传播和存储中的至少一个或部分功能但不是所有功能。例如,在这些其它区块链网络上,“节点”可用于指被配置为创建和发布区块151但不存储和/或传播这些区块151到其它节点的网络实体。
甚至更通俗地说,上面对术语“比特币节点”104的任何引用可以用术语“网络实体”或“网络元件”代替,其中这样的实体/元件被配置为执行对区块进行创建、发布、传播和存储中的一些或全部角色。这种网络实体/元件的功能可以在硬件中实现,方法与上面参照区块链节点104所述的方式相同。
应当理解的是,上述实施例仅通过示例的方式进行描述。更通俗地说,可根据下述任何一个或多个语句提供一种方法、装置或程序。
语句1.一种用于为区块链的投票事务生成输入和输出的计算机程序,所述投票事务用于投票,所述计算机程序存储在非暂时性介质上,所述非暂时性介质在由一个或多个计算机处理器执行时,使所述一个或多个处理器被配置为:从投票协调者接收投票指令,所述投票指令包括一组投票选项和由所述投票协调者定义的一个或多个公钥;控制显示器以呈现用户界面,所述用户界面显示所述一组投票选项;接收对所述一组投票选项中的一个投票选项的用户选择,其是由所述用户界面处的用户输入定义的;以及,生成输入-输出对,所述输入-输出对用于包括在所述投票事务中,其中所述投票事务的不同索引处具有一个或多个其他输入-输出对;其中,所述输入-输出对中的输入的非签名部分包括输出点,所述输出点标识区块链事务的未花费事务输出,并且,所述输入的签名部分包括签名单个标志和相关联的签名,其至少对所述输入-输出对的所述非签名部分和所述输入-输出对中的输出进行签名,但不对所述投票事务的任何其他输出进行签名,并且,所述输入-输出对中的所述输出包括所述投票指令的所述一个或多个公钥中的一个公钥。
语句2.根据语句1所述的计算机***,其中所述一个或多个处理器还被配置为:将所述输入-输出对传输到所述投票协调者以生成所述投票事务。
语句3.根据语句1或2所述的计算机程序,其中所述一组投票选项中的每个投票选项与不同的公钥相关联,其中所述一个或多个处理器还被配置为:确定与所述选择的投票选项相关联的所述公钥;其中所述输出包括所述确定的公钥。
语句4.根据前述任一项语句所述的计算机***,其中所述投票指令还包括标识未花费事务输出的投票通证,其中所述输入-输出对中的所述输入的所述输出点标识所述投票通证。
语句5.根据前述任一项语句所述的计算机程序,其中所述输入-输出对与一组预定义投票者中的一个投票者相关联,其中所述一组预定义投票者的子集被要求生成相应的输入-输出对,其中所述单个签名标志是单个-任何人可以支付签名标志,使得所述签名仅对所述输入-输出对中的所述输入和所述输出进行签名,而不对所述投票事务的其他输入或输出进行签名。
语句6.根据前述任一项语句所述的计算机程序,其中所述一个或多个处理器还被配置为:接收用户定义的输入,所述输入包括信息,所述信息用于包含在OP_RETURN中;其中所述输入-输出对中的所述输出还包括所述信息。
语句7.一种用于生成区块链的投票事务的计算机程序,所述计算机程序存储在非暂时性介质上,所述非暂时性介质在由一个或多个处理器执行时,使所述一个或多个处理器被配置为:接收根据前述任一项语句所述的多个输入-输出对;生成投票事务,所述投票事务:在一组投票索引中的每个投票索引中,包括所述接收的输入-输出对中的一个输入-输出对,以及,在授权索引中,包括输入和输出,所述输入包括投票协调者的签名,其具有“全部签名”标志,使得所述投票协调者的所述签名对所述投票事务的所有输入和输出进行签名;以及,将所述投票事务传输到区块链。
语句8.根据语句7所述的计算机程序,其中所述一个或多个处理器还被配置为:确定是否已接收到预定义数量的输入-输出对。
语句9.根据语句7或8所述的计算机程序,其中所述一个或多个处理器被配置为:生成投票指令,其中生成所述投票指令的过程包括:检测发起投票的用户输入;将至少一个公钥与所述投票关联;以及,使所述投票指令可由一组投票者中的每个投票者的用户设备访问。
语句10.根据语句9所述的计算机程序,其中所述一个或多个处理器被配置为:生成一组通证,其中所述一组通证中的每个通证是与所述一组投票者中的一个投票者相关联的未花费事务输出。
语句11.根据语句10所述的计算机程序,其中所述投票指令包括与接收投票者相关联的通证,所述投票指令可由所述接收投票者的计算机设备访问。
语句12.根据语句7至11中任一项所述的计算机程序,其中所述一个或多个处理器还被配置为:访问所述至少一个公钥中的每个公钥的地址。
语句13.根据语句7至12中任一项所述的计算机程序,其中所述一个或多个处理器还被配置为:在区块链节点已经核实所述投票事务有效之后访问所述投票事务。
语句14.根据语句7至13中任一项所述的计算机程序,其中所述一个或多个处理器还被配置为:确定由所述接收的输入-输出对的输出点指示的所述未花费事务输出是否足以涵盖事务费用;其中,如果所述未花费事务输出不足以涵盖所述事务费用,则所述授权索引处的所述输入包括输出点,所述输出点指示足以涵盖所述输入-输出对未涵盖的所述事务费用的数额的未花费事务输出。
语句15.根据前述任一项语句所述的计算机程序,其中由所述输入-输出对中的所述输入的所述输出点标识的所述未花费事务输出具有与投票数量成比例的值,其中单个投票具有预定义值。
语句16.根据语句4或11或其任何从属语句所述的计算机程序,其中所述通证与定义签名标志的锁定脚本相关联,在对包括所述通证的所述输入的所述非签名部分进行签名时必须使用所述签名标志。
语句17.一种区块链事务,所述区块链事务包实施在计算机可读介质上并且包括:输入,用于有效地花费所述区块链事务的输入中指示的可花费事务输出;以及,至少一个输出,包括定义签名要求和所需要的签名标志的一段锁定脚本,并且在与后续区块链事务中的一段解锁脚本级联时,核实所述解锁脚本的签名有效,从所述解锁脚本中提取所使用的签名标志,并将所述使用的签名标志与所述需要的签名标志进行比较,以使得:如果所述使用的签名标志与所述需要的签名标志不匹配和/或所述签名无效,则所述后续区块链事务无效。
语句18.根据语句17所述的区块链事务,其中所述签名标志由所述签名的最后一个字节指示,其中将所述使用的签名标志与所述需要的签名标志进行比较的步骤包括:将所述签名的所述最后一个字节与指示所述锁定脚本中定义的所述需要的签名标志的值进行比较,其中如果所述签名的所述最后一个字节等于指示所述需要的签名标志的所述值,则所述使用的签名标志和所述需要的签名标志匹配。
语句19.根据语句17或18所述的区块链事务,其中所述通证用于投票事务,其中所述可花费输出具有与投票数量成比例的值。
语句20.根据语句17至19中任一项所述的区块链事务,其中所述区块链事务包括与一组授权方中的每一方相关联的输出,其中所述授权方被授权为所述后续区块链事务提供输入和输出。
语句21.根据语句20所述的区块链事务,其中所述一组授权方的子集被要求为所述后续区块链事务提供输入和输出,其中所述需要的签名标志是单个-任何人可以支付签名标志,用于仅授权在所述后续区块链事务中的相同索引处提供的所述输入和所述输出。
语句22.根据语句20所述的区块链事务,其中所述一组授权方中的所有方被要求为所述后续区块链事务提供输入和输出,其中所述需要的签名标志是单个-全部签名标志,用于授权所述后续事务的所有输入并且仅授权与所提供的解锁脚本相同的索引处的输出。
语句23.根据语句17至22中任一项所述的区块链事务,其中所述区块链事务是通证发行事务,所述通证发行事务的输出定义了仅足以将所述区块链事务记录到区块链中的微不足道的数额(nominal amount)的数字资产。
语句24.一种用于为区块链的投票事务生成输入和输出的方法,所述投票事务用于投票,所述方法包括:从投票协调者接收投票指令,所述投票指令包括一组投票选项和由所述投票协调者定义的一个或多个公钥;呈现用户界面,所述用户界面显示所述一组投票选项;接收对所述一组投票选项中的一个投票选项的用户选择,其由所述用户界面处的用户输入定义;以及,生成用于包括在所述投票事务中的输入-输出对,其中所述投票事务的不同索引处具有一个或多个其他输入-输出对;其中,所述输入-输出对中的输入的非签名部分包括输出点,所述输出点标识区块链事务的未花费事务输出,并且,所述输入的签名部分包括“单个签名”标志和相关联的签名,其至少对所述输入-输出对的所述非签名部分和所述输入-输出对中的输出进行签名,但不对所述投票事务的任何其他输出进行签名,并且,所述输入-输出对中的所述输出包括所述投票指令的所述一个或多个公钥中的一个公钥。
语句25.一种用于生成区块链的投票事务的方法,所述方法包括:接收根据任一项前述权利要求所述的多个输入-输出对;生成投票事务,所述投票事务:在一组投票索引中的每个投票索引中,包括所述接收的输入-输出对中的一个输入-输出对,以及,在授权索引中,包括输入和输出,所述输入包括具有“全部签名”标志的投票协调者的签名,使得所述投票协调者的所述签名对所述投票事务的所有输入和输出进行签名;以及,将所述投票事务传输到区块链。
语句26.一种计算机***,所述计算机***包括被配置为执行根据语句1或其任何从属语句所述的计算机程序的至少一个计算设备,以及被配置为执行根据语句7或其任何从属语句所述的计算机程序的至少一个计算设备。
语句27.一种用于生成区块链事务的计算机程序,所述计算机程序存储在非暂时性介质上,所述非暂时性介质在由一个或多个处理器执行时,使所述一个或多个处理器被配置为生成所述区块链事务,所述区块链事务包括:输入,用于有效地花费所述区块链事务的输入中指示的可花费事务输出;以及,至少一个输出,包括定义签名要求和所需要的签名标志的一段锁定脚本,并且在与后续区块链事务中的一段解锁脚本级联时,核实所述解锁脚本的签名有效,从所述解锁脚本中提取所使用的签名标志,并将所述使用的签名标志与所述需要的签名标志进行比较,使得:如果所述使用的签名标志与所述需要的签名标志不匹配和/或所述签名无效,则所述后续区块链事务无效。
附录A
该部分解释了可以在标准P2PKH锁定脚本之前添加的脚本SCRIPT代码,以创建附加检查,即检查当UTXO花费时是否使用特定的sighash标志对其进行签名。
使用ECDSA创建并为比特币事务编码的数字签名以指示签名序列长度的字节开始,并以指示sighash标志的字节结束。例如,总长度为47个字节并使用SINGLE|ACP标志签名的签名将采用0x47<sig>83的形式。为了检查签名时是否使用了特定的sighash标志,希望检查该签名的最后一个字节是否等于某个值。
在该示例中,假设跟在sighash校验码之后的锁定脚本是P2PKH脚本。因此,解锁脚本将采用<sig><P>的形式,并且在执行锁定脚本之前,将这两个项推送到堆栈。
以下各行按从下(左)到上(右)的顺序表示堆栈上的项,每个项包含在[]中。缩进的蓝色文本表示下一个OP代码。第一次使用每个OP代码时,其后为该代码功能的简要说明。
解锁脚本将签名和相关联的公钥推送到堆栈:
[0x47<sig>83]<P>
OP_TOALTSTACK将堆栈顶部的项发送到ALT堆栈
[0x47<sig>83]
OP_DUP复制堆栈顶部的项
[0x47<sig>83][0x47<sig>83]
OP_1将值1推送到堆栈
[0x47<sig>83][0x47<sig>83][0x01]
OP_SPLIT在顶部堆栈项指示的位置(以字节为单位)处将堆栈上的倒数第二项拆分为两个项
[0x47<sig>83][0x47][<sig>83]
OP_SWAP反转两个顶部堆栈项的位置
[0x47<sig>83][<sig>83][0x47]
OP_2将值2推送到堆栈
[0x47<sig>83][<sig>83][0x47][0x02]
OP_SUB从倒数第二项中减去顶部堆栈项的值
[0x47<sig>83][<sig>83][0x45]
OP_SPLIT
[0x47<sig>83][<sig>][0x83]
OP_NIP从堆栈中移除倒数第二项
[0x47<sig>83][0x83]
<0x83>(非OP代码,指示将项[0x83]推送到堆栈)
[0x47<sig>83][0x83][0x83]
OP_EQUALVERIFY检查前两个堆栈项是否相同,如果相同则继续评估脚本,否则将执行标记为失败
[0x47<sig>83]
OP_FROMALTSTACK将顶部项从ALT堆栈返回到主堆栈
[0x47<sig>83]<P>
最终状态将签名和公钥保留在堆栈上,这是标准P2PKH脚本进行核实所必需的。
Claims (27)
1.一种用于为区块链的投票事务生成输入和输出的计算机程序,所述投票事务用于投票,所述计算机程序存储在非暂时性介质上,所述非暂时性介质在由一个或多个计算机处理器执行时,使所述一个或多个处理器被配置为:
从投票协调者接收投票指令,所述投票指令包括一组投票选项和由所述投票协调者定义的一个或多个公钥;
控制显示器以呈现显示所述一组投票选项的用户界面;
接收对由所述用户界面处的用户输入定义的所述一组投票选项中的一个投票选项的用户选择;以及
生成用于包括在所述投票事务中的输入-输出对,其中所述投票事务的不同索引处具有一个或多个其他输入-输出对;
其中,所述输入-输出对中的输入的非签名部分包括标识区块链事务的未花费事务输出的输出点,并且,所述输入的签名部分包括签名单个标志和相关联的签名,其至少对所述输入-输出对的所述非签名部分和所述输入-输出对中的输出进行签名,但不对所述投票事务的任何其他输出进行签名,并且,所述输入-输出对中的所述输出包括所述投票指令的所述一个或多个公钥中的一个公钥。
2.根据权利要求1所述的计算机***,其中所述一个或多个处理器还被配置为:将所述输入-输出对传输到所述投票协调者以生成所述投票事务。
3.根据权利要求1或2所述的计算机程序,其中所述一组投票选项中的每个投票选项与不同的公钥相关联,其中所述一个或多个处理器还被配置为:确定与所述选择的投票选项相关联的所述公钥;其中所述输出包括所述确定的公钥。
4.根据前述任一项权利要求所述的计算机***,其中所述投票指令还包括标识未花费事务输出的投票通证,其中所述输入-输出对中的所述输入的所述输出点标识所述投票通证。
5.根据前述任一项权利要求所述的计算机程序,其中所述输入-输出对与一组预定义投票者中的一个投票者相关联,其中所述一组预定义投票者的子集被要求生成相应的输入-输出对,其中所述单个签名标志是单个-任何人可以支付签名标志,使得所述签名仅对所述输入-输出对中的所述输入和所述输出进行签名,而不对所述投票事务的其他输入或输出进行签名。
6.根据前述任一项权利要求所述的计算机程序,其中所述一个或多个处理器还被配置为:接收用户定义的输入;其中所述输入-输出对中的所述输出还包括所述用户定义的输入的信息和核实所述输出无效的操作码。
7.一种用于生成区块链的投票事务的计算机程序,所述计算机程序存储在非暂时性介质上,所述非暂时性介质在由一个或多个处理器执行时,使所述一个或多个处理器被配置为:
接收根据前述任一项权利要求所述的多个输入-输出对;
生成投票事务,所述投票事务包括:
在一组投票索引中的每个投票索引中的,所述接收的输入-输出对中的一个输入-输出对;和
在授权索引中的,输入和输出,所述输入包括具有全部签名标志的投票协调者的签名,使得所述投票协调者的所述签名对所述投票事务的所有输入和输出进行签名;以及
将所述投票事务传输到区块链。
8.根据权利要求7所述的计算机程序,其中所述一个或多个处理器还被配置为:确定是否已接收到预定义数量的输入-输出对。
9.根据权利要求7或8所述的计算机程序,其中所述一个或多个处理器被配置为:
生成投票指令,其中生成所述投票指令的过程包括:
检测发起投票的用户输入;
将至少一个公钥与所述投票关联;以及
使所述投票指令可由一组投票者中的每个投票者的用户设备访问。
10.根据权利要求9所述的计算机程序,其中所述一个或多个处理器被配置为:生成一组通证,其中所述一组通证中的每个通证是与所述一组投票者中的一个投票者相关联的未花费事务输出。
11.根据权利要求10所述的计算机程序,其中所述投票指令包括与接收投票者相关联的通证,所述投票指令可由所述接收投票者的计算机设备访问。
12.根据权利要求7至11中任一项所述的计算机程序,其中所述一个或多个处理器还被配置为:访问所述至少一个公钥中的每个公钥的地址。
13.根据权利要求7至12中任一项所述的计算机程序,其中所述一个或多个处理器还被配置为:在区块链节点已经核实所述投票事务有效之后访问所述投票事务。
14.根据权利要求7至13中任一项所述的计算机程序,其中所述一个或多个处理器还被配置为:确定由所述接收的输入-输出对的输出点指示的所述未花费事务输出是否足以涵盖事务费用;
其中,如果所述未花费事务输出不足以涵盖所述事务费用,则所述授权索引处的所述输入包括输出点,所述输出点指示足以涵盖所述输入-输出对未涵盖的所述事务费用的数额的未花费事务输出。
15.根据前述任一项权利要求所述的计算机程序,其中由所述输入-输出对中的所述输入的所述输出点标识的所述未花费事务输出具有与投票数量成比例的值,其中单个投票具有预定义值。
16.根据权利要求4或11或其任何从属权利要求所述的计算机程序,其中所述通证与定义签名标志的锁定脚本相关联,在对包括所述通证的所述输入的所述非签名部分进行签名时必须使用所述签名标志。
17.一种区块链事务,所述区块链事务包含在计算机可读介质上并且包括:
输入,用于有效地花费所述区块链事务的输入中指示的可花费事务输出;以及
至少一个输出,包括定义签名要求和所需要的签名标志的一段锁定脚本,并且在与后续区块链事务中的一段解锁脚本级联时,核实所述解锁脚本的签名有效,从所述解锁脚本中提取所使用的签名标志,并将所述使用的签名标志与所述需要的签名标志进行比较,以使得:如果所述使用的签名标志与所述需要的签名标志不匹配和/或所述签名无效,则所述后续区块链事务无效。
18.根据权利要求17所述的区块链事务,其中所述签名标志由所述签名的最后一个字节指示,其中将所述使用的签名标志与所述需要的签名标志进行比较的步骤包括:将所述签名的所述最后一个字节与指示所述锁定脚本中定义的所述需要的签名标志的值进行比较,其中如果所述签名的所述最后一个字节等于指示所述需要的签名标志的所述值,则所述使用的签名标志和所述需要的签名标志匹配。
19.根据权利要求17或18所述的区块链事务,其中所述通证用于投票事务,其中所述可花费输出具有与投票数量成比例的值。
20.根据权利要求17至19中任一项所述的区块链事务,其中所述区块链事务包括与一组授权方中的每一方相关联的输出,其中所述授权方被授权为所述后续区块链事务提供输入和输出。
21.根据权利要求20所述的区块链事务,其中所述一组授权方的子集被要求为所述后续区块链事务提供输入和输出,其中所述需要的签名标志是单个-任何人可以支付签名标志,用于仅授权在所述后续区块链事务中的相同索引处提供的所述输入和所述输出。
22.根据权利要求20所述的区块链事务,其中所述一组授权方中的所有方被要求为所述后续区块链事务提供输入和输出,其中所述需要的签名标志是单个-全部签名标志,用于授权所述后续事务的所有输入并且仅授权与所提供的解锁脚本相同的索引处的输出。
23.根据权利要求17至22中任一项所述的区块链事务,其中所述区块链事务是通证发行事务,所述通证发行事务的输出定义了仅足以将所述区块链事务记录到区块链中的微不足道的数额的数字资产。
24.一种用于为区块链的投票事务生成输入和输出的方法,所述投票事务用于投票,所述方法包括:
从投票协调者接收投票指令,所述投票指令包括一组投票选项和由所述投票协调者定义的一个或多个公钥;
呈现显示所述一组投票选项的用户界面;
接收对由所述用户界面处的用户输入定义的所述一组投票选项中的一个投票选项的用户选择;以及
生成用于包括在所述投票事务中的输入-输出对,其中所述投票事务的不同索引处具有一个或多个其他输入-输出对;
其中,所述输入-输出对中的输入的非签名部分包括标识区块链事务的未花费事务输出的输出点,并且,所述输入的签名部分包括签名单个标志和相关联的签名,其至少对所述输入-输出对的所述非签名部分和所述输入-输出对中的输出进行签名,但不对所述投票事务的任何其他输出进行签名,并且,所述输入-输出对中的所述输出包括所述投票指令的所述一个或多个公钥中的一个公钥。
25.一种用于生成区块链的投票事务的方法,所述方法包括:
接收根据权利要求1至16中任一项所述的多个输入-输出对;
生成投票事务,所述投票事务:
在一组投票索引中的每个投票索引中,包括所述接收的输入-输出对中的一个输入-输出对;和
在授权索引中,包括输入和输出,所述输入包括具有全部签名标志的投票协调者的签名,使得所述投票协调者的所述签名对所述投票事务的所有输入和输出进行签名;以及
将所述投票事务传输到区块链。
26.一种计算机***,所述计算机***包括被配置为执行根据权利要求1或其任何从属权利要求所述的计算机程序的至少一个计算设备,以及被配置为执行根据权利要求7或其任何从属权利要求所述的计算机程序的至少一个计算设备。
27.一种用于生成区块链事务的计算机程序,所述计算机程序存储在非暂时性介质上,所述非暂时性介质在由一个或多个处理器执行时,使所述一个或多个处理器被配置为生成所述区块链事务,所述区块链事务包括:
输入,用于有效地花费所述区块链事务的输入中指示的可花费事务输出;以及
至少一个输出,包括定义签名要求和所需要的签名标志的一段锁定脚本,并且在与后续区块链事务中的一段解锁脚本级联时,核实所述解锁脚本的签名有效,从所述解锁脚本中提取所使用的签名标志,并将所述使用的签名标志与所述需要的签名标志进行比较,使得:如果所述使用的签名标志与所述需要的签名标志不匹配和/或所述签名无效,则所述后续区块链事务无效。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GB2020452.5 | 2020-12-23 | ||
GBGB2020452.5A GB202020452D0 (en) | 2020-12-23 | 2020-12-23 | Transaction signature flags |
PCT/EP2021/082626 WO2022135809A1 (en) | 2020-12-23 | 2021-11-23 | Transaction signature flags |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116636180A true CN116636180A (zh) | 2023-08-22 |
Family
ID=74221221
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202180087079.4A Pending CN116636180A (zh) | 2020-12-23 | 2021-11-23 | 事务签名标志 |
Country Status (6)
Country | Link |
---|---|
US (1) | US20240106650A1 (zh) |
EP (1) | EP4268419A1 (zh) |
JP (1) | JP2024500923A (zh) |
CN (1) | CN116636180A (zh) |
GB (1) | GB202020452D0 (zh) |
WO (1) | WO2022135809A1 (zh) |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2588072A (en) * | 2019-05-24 | 2021-04-21 | Nchain Holdings Ltd | Malleability of transactions for inclusion in a blockchain |
-
2020
- 2020-12-23 GB GBGB2020452.5A patent/GB202020452D0/en not_active Ceased
-
2021
- 2021-11-23 EP EP21819415.7A patent/EP4268419A1/en active Pending
- 2021-11-23 US US18/268,869 patent/US20240106650A1/en active Pending
- 2021-11-23 WO PCT/EP2021/082626 patent/WO2022135809A1/en active Application Filing
- 2021-11-23 CN CN202180087079.4A patent/CN116636180A/zh active Pending
- 2021-11-23 JP JP2023538683A patent/JP2024500923A/ja active Pending
Also Published As
Publication number | Publication date |
---|---|
GB202020452D0 (en) | 2021-02-03 |
EP4268419A1 (en) | 2023-11-01 |
JP2024500923A (ja) | 2024-01-10 |
US20240106650A1 (en) | 2024-03-28 |
WO2022135809A1 (en) | 2022-06-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR102443960B1 (ko) | 블록체인에서 복수개의 거래를 기록하는 방법 및 시스템 | |
US20240022631A1 (en) | Malleability of transactions for inclusion in a blockchain | |
CN115997369A (zh) | 用于在区块链网络中验证数据的方法和装置 | |
CN116210016A (zh) | 共生通证*** | |
CN115997229A (zh) | 区块链上的协议 | |
CN116508291A (zh) | 默克尔证明实体 | |
CN117480758A (zh) | 用于验证区块链上的通证的计算机实现的方法和*** | |
CN116157796A (zh) | 警报账户 | |
CN116097264A (zh) | 电子文件签名 | |
CN117751550A (zh) | 分层共识 | |
WO2023117471A1 (en) | Methods and systems for recipient-facilitated blockchain transactions | |
CN118044151A (zh) | 传播锁定脚本 | |
CN117280653A (zh) | 多方区块链地址方案 | |
CN117795516A (zh) | 一种计算机实现的方法和*** | |
CN117546167A (zh) | 多级区块链 | |
CN116671061A (zh) | 节点版本控制 | |
US20230036852A1 (en) | Single-use tokens | |
CN116057920A (zh) | 连接到区块链网络 | |
CN116745794A (zh) | 区块链相关验证方法和*** | |
CN116547945A (zh) | 默克尔证明实体 | |
CN116636180A (zh) | 事务签名标志 | |
WO2021140376A1 (en) | Single-use tokens | |
CN116671064A (zh) | 多重签名事务 | |
CN117337436A (zh) | 多方区块链地址方案 | |
CN117678191A (zh) | 消息交换*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |