签名哈希标志

  • enigbe
  • 发布于 2022-04-12 12:34
  • 阅读 14

本文深入探讨了比特币交易中数字签名哈希标志(SIGHASH flags)的作用和类型。详细解释了DER签名的结构,以及SIGHASH ALL、NONE、SINGLE三种基本类型及其ANYONECANPAY修饰符的应用方式,并提供了各种标志的使用场景示例,旨在帮助读者理解如何使用这些标志来构建灵活的交易。

数字签名是一种“用于证明消息的真实性的数学方案”(Antonopoulos,2017)。它在比特币交易中得到应用,可以证明交易是由“已知的”发送者创建的,“已知的”发送者不能否认广播的交易,并且交易从源到目的地没有被更改。签名是通过将交易(或部分交易)传递给哈希函数,然后通过使用所有者的私钥的签名函数来创建的。

签名可以应用于交易的全部或部分,我们可以通过检查签名哈希标志来判断。这些标志是附加到签名末尾的 8 位字符,它们很重要,因为它们使交易能够以不同的方式构建。可以构建的最简单的交易类型是只有一个输入(引用 UTXO)并支付给单个输出地址的交易。但是,交易可以有多个输入和输出,输入引用来自不同所有者的 UTXO,这些所有者可以签署他们的输入。通过这种方式,可以创建一个部分构造的交易,所有者协作收集所有需要的签名,以使原本无效的交易有效。使用签名哈希(SIGHASH)标志,签名可以指示交易的哪些部分包含在哈希中。

本文简要解释了签名的结构以及如何识别 SIGHASH 标志、SIGHASH 标志的类型、SIGHASH 类型的应用方式以及可以使用它们的场景。

DER 签名结构

数字签名使用 Distinguished Encoding Rules (DER) 进行序列化,DER 编码了序列化数字签名 S(r,s) 的标准。这些签名按顺序包含以下部分:

  1. 十六进制值 [0x30] 的起始字节
  2. 签名序列的长度 [0x44][0x45]
  3. 十六进制值 0x02r-标记字节
  4. r 的长度 [0x21] || r 的大端表示
  5. 十六进制值 0x02s-标记字节
  6. s 的长度 [0x20] || s 的大端表示
  7. 1 字节 SIGHASH 后缀*

图 1:DER 签名结构

签名哈希标志的类型和应用

签名哈希标志有三种类型:ALL、NONE 和 SINGLE。图 3 显示了每种类型的字节表示。

图 2:SIGHASH 类型

对于 SIGHASH ALL,给定交易 Tx,签名适用于 Tx 的所有输入和所有输出(参见绿色边框)。SIGHASH ALL 通过以下方式应用:

  1. 创建交易的副本,
  2. 清空每个输入的 script_sigs,并用它们引用的 script_pubkey 替换。这样做是因为“签名是 script_sig 的一部分,……不能自己签名”(Song,2019,第 132 页)
  3. 确保在序列化交易 (Tx_ser) 之前没有其他字段设置为空。
  4. 将标志 0x01 添加到序列化交易的末尾,并通过哈希函数传递。
  5. 然后,此消息由签名算法签名以生成签名。

公式 1:SIGHASH ALL 交易的哈希函数

公式 2:签名算法

其中 e 是签名者的私钥,S(r,s) 是签名。

图 3:SIGHASH ALL

如果其任何细节发生更改,则交易将变为无效,因为签名也会更改并变为无效。

对于 SIGHASH NONE,签名适用于 Tx 的所有输入(参见绿色边框),但不适用于任何输出。应用过程如下所述:

  1. 创建交易的副本
  2. 清空所有输入的每个 script_sig,并用它们引用的 script_pubkey 替换
  3. 清空所有输出字段
  4. 序列化交易
  5. 将 0x02 附加到 Tx_ser,进行哈希处理,然后签名

公式 3:SIGHASH NONE 交易的哈希函数

对于 SIGHASH NONE,可以修改任何输出而不使签名无效,但如果修改任何一个输入,则签名将变为无效。

图 4:SIGHASH NONE

对于 SIGHASH SINGLE,给定交易 Tx 的所有输入都被签名,并且一个输出与被签名的输入之一具有相同的索引。这本质上是“授权所有其他输入与特定输出一起使用”(Song,2019,第 133 页)。

  1. 创建交易的副本
  2. 清空每个输入的 script_sigs,并用它们引用的 script_pubkey 替换
  3. 清空除特定输出之外的所有输出字段
  4. 序列化交易
  5. 将 0x03 附加到 Tx_ser,进行哈希处理,然后签名

更改指定的输出或任何输入都会使签名无效。

图 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 与我联系。

注意

  1. || 符号用于表示串联
  2. * SIGHASH 标志的长度应为一个字节,尽管实现将其序列化为 4 个字节。Pieter Wuille 在此处提供了一个可能的原因。

参考文献

  1. Antonopoulos, A. (2017). Mastering bitcoin: Programming the open blockchain
  2. Song, J. (2019). Programming bitcoin: Learn how to program bitcoin from scratch
  3. Rosenbaum, K. (2019). Grokking Bitcoin
  • 原文链接: enigbe.medium.com/signat...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
enigbe
enigbe
江湖只有他的大名,没有他的介绍。