本文深入探讨了比特币交易中数字签名哈希标志(SIGHASH flags)的作用和类型。详细解释了DER签名的结构,以及SIGHASH ALL、NONE、SINGLE三种基本类型及其ANYONECANPAY修饰符的应用方式,并提供了各种标志的使用场景示例,旨在帮助读者理解如何使用这些标志来构建灵活的交易。
数字签名是一种“用于证明消息的真实性的数学方案”(Antonopoulos,2017)。它在比特币交易中得到应用,可以证明交易是由“已知的”发送者创建的,“已知的”发送者不能否认广播的交易,并且交易从源到目的地没有被更改。签名是通过将交易(或部分交易)传递给哈希函数,然后通过使用所有者的私钥的签名函数来创建的。
签名可以应用于交易的全部或部分,我们可以通过检查签名哈希标志来判断。这些标志是附加到签名末尾的 8 位字符,它们很重要,因为它们使交易能够以不同的方式构建。可以构建的最简单的交易类型是只有一个输入(引用 UTXO)并支付给单个输出地址的交易。但是,交易可以有多个输入和输出,输入引用来自不同所有者的 UTXO,这些所有者可以签署他们的输入。通过这种方式,可以创建一个部分构造的交易,所有者协作收集所有需要的签名,以使原本无效的交易有效。使用签名哈希(SIGHASH)标志,签名可以指示交易的哪些部分包含在哈希中。
本文简要解释了签名的结构以及如何识别 SIGHASH 标志、SIGHASH 标志的类型、SIGHASH 类型的应用方式以及可以使用它们的场景。
数字签名使用 Distinguished Encoding Rules (DER) 进行序列化,DER 编码了序列化数字签名 S(r,s) 的标准。这些签名按顺序包含以下部分:
图 1:DER 签名结构
签名哈希标志有三种类型:ALL、NONE 和 SINGLE。图 3 显示了每种类型的字节表示。
图 2:SIGHASH 类型
对于 SIGHASH ALL,给定交易 Tx,签名适用于 Tx 的所有输入和所有输出(参见绿色边框)。SIGHASH ALL 通过以下方式应用:
公式 1:SIGHASH ALL 交易的哈希函数
公式 2:签名算法
其中 e 是签名者的私钥,S(r,s) 是签名。
图 3:SIGHASH ALL
如果其任何细节发生更改,则交易将变为无效,因为签名也会更改并变为无效。
对于 SIGHASH NONE,签名适用于 Tx 的所有输入(参见绿色边框),但不适用于任何输出。应用过程如下所述:
公式 3:SIGHASH NONE 交易的哈希函数
对于 SIGHASH NONE,可以修改任何输出而不使签名无效,但如果修改任何一个输入,则签名将变为无效。
图 4:SIGHASH NONE
对于 SIGHASH SINGLE,给定交易 Tx 的所有输入都被签名,并且一个输出与被签名的输入之一具有相同的索引。这本质上是“授权所有其他输入与特定输出一起使用”(Song,2019,第 133 页)。
更改指定的输出或任何输入都会使签名无效。
图 5:SIGHASH SINGLE
存在一个 ANYONECANPAY 修饰符标志,可以将其添加到上述适用于交易中单个输入的标志中。Rosenbaum (2019) 认为 ANYONECANPAY 修饰符标志是一种仅提交到输入的方式,通过设置或不设置它,而现有的 SIGHASH 类型(ALL、NONE、SINGLE)是一种仅提交到输出的方式。
图 6:ANYONECANPAY 修饰符
对于为 ALL 设置的 ANYONECANPAY,可以对除所选输入(索引 0)和输出之外的所有输入进行更改(参见下图)。
图 7:ALL|ANYONECANPAY
为 NONE 设置的 ANYONECANPAY 意味着可以对除当前输入之外的所有输出和输入进行更改。
图 8:NONE|ANYONECANPAY
为 SINGLE 设置的 ANYONECANPAY 意味着可以对除与当前输入具有匹配索引的输出之外的所有输出进行更改。可以修改、添加和/或删除所有其他输入。
图 9:SINGLE|ANYONECANPAY
下表显示了可以使用这些标志的用例摘要
表 1:SIGHASH 标志的用例
在审查探索闪电网络所需的比特币基础知识时,我深入研究了签名哈希标志的细节。这些标志标记了交易中由签名签名的部分,并提供了构建交易的灵活方式。我解释了如何从 DER 签名的结构中识别这些标志,存在的 6 种类型的标志(包括修饰符),以及如何将其中一些标志应用于交易。
如果你能提供任何反馈,我将不胜感激。如果你发现本文有帮助/有用或发现事实不符,请随时在此处发表评论或通过 Twitter @engb_os 与我联系。
注意:
- 原文链接: enigbe.medium.com/signat...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!