由 Kyrian Alexstaff 作家撰写 由 Korbinian Kettnakerstaff 编辑审阅 由凯里安·亚历克斯斯塔夫 作家 撰写 由 Korbinian Kettnakerstaff 编辑审阅 研究发表于 2026 年 7 月 7 日 APO 让比特币签名授权任何兼容的 UTXO,而不是一个固定的出点。它允许针对闪电网络、保险库和第 2 层协议进行可重新绑定的预签名交易,而无需新的密钥管理开销。 这是 Cointelegraph Research 有关比特币契约的技术文章系列的第 3 部分。要阅读上一篇文章,请点击此处。 BIP 118 中提出的 SIGHASH_ANYPREVOUT 建立在 Joseph Poon 和 Thaddeus Dryja 2015 年闪电网络论文中提到的早期 SIGHASH_NOINPUT 概念的基础上,后来由 Joseph Poon 于 2016 年 2 月在比特币开发邮件列表上正式提出。

SIGHASH_ANYPREVOUT 不是一个新的操作码,而是 SIGHASH 标志的提议新值,旨在作为比特币的软分叉升级进行部署。 SIGHASH 标志附加到签名后,确定交易的哪些部分已签名并将由 CHECKSIG 操作码检查。所选标志由签名者选择,而不是由 scriptPubKey 强制执行。由于与软分叉中的可升级性相关的技术细节,SIGHASH_ANYPREVOUT 提案仅扩展到来自主根地址的支出。

多种标准 SIGHASH 模式已经存在,如图 1 所示。如果标志设置为 SIGHASH_ALL,则签名必须覆盖所有输入、所有输出以及所花费的特定输出点,从而以加密方式将授权绑定到该确切的 UTXO。出点是交易 ID 和输出索引的组合,它们共同唯一地标识交易正在消耗哪个 UTXO。使用 SIGHASH_NONE,仅需要对输入进行签名,而输出不受约束。 SIGHASH_SINGLE 变体对所有输入进行签名,但仅对与被签名的输入具有相同索引的输出进行签名。 ANYONECANPAY 修饰符允许单个输入独立于其他输入进行签名,从而引入了进一步的灵活性。至关重要的是,这些现有模式都不允许签名省略对出点的承诺。 SIGHASH_ANYPREVOUT 删除了该限制。

BIP-118 定义了两个 ANYPREVOUT 变体,它们在摘要中省略了多少先前输出,如图 2 所示。在 SIGHASH_ANYPREVOUT 下,输出点从摘要中排除,但签名仍然提交先前输出的 amount 和 scriptPubKey,以及输入的 nSequence。在 SIGHASH_ANYPREVOUTANYSCRIPT 下,金额和 scriptPubKey 也被排除,这意味着签名根本不绑定到已用输出的锁定脚本。所有其他承诺均遵循标准 Taproot 签名消息构造,并取决于所选的基本标志,例如 SIGHASH_ALL 或 SIGHASH_SINGLE。

由于摘要中省略了输出点,因此相同的签名可以授权花费任何满足剩余提交字段的兼容 UTXO。例如,使用 ANYPREVOUT | 预签名的交易如果同一地址后来收到另一个 0.5 BTC 的 UTXO,即使用于创建原始签名的私钥不再可用,产生 0.5 BTC 输出的 ALL 也可以重复使用。然而,如果新的 UTXO 持有超过 0.5 BTC,那么多余的部分将被矿工损失,除非原始签名包含找零输出。这一重新绑定属性使得 ANYPREVOUT 对于第 2 层协议非常有用,其中相同的预签名交易必须应用于多个可能的链上 UTXO,而不需要为每个协议都提供新签名。 对于类似契约的应用程序,ANYPREVOUT 变体保留对先前输出的 scriptPubKey 的承诺,并且通常是最相关的。它们允许在兼容的 UTXO 之间重复使用签名,同时确保资金仍然绑定到相同的锁定脚本。 ANYPREVOUTANYSCRIPT 完全删除了这种绑定,因此不太适合契约式应用程序。

与 OP_CTV 类似,SIGHASH_ANYPREVOUT 改进了通过预签名事务已经可以实现的逻辑,但其本身并不能实现递归契约或事务自省。相反,它放松了签名和特定 UTXO 之间的绑定,允许签名在多个兼容的 UTXO 之间重用。 一些研究还指出,删除出点承诺使得恢复密钥构造成为可能——也就是说,可以从固定签名和消息对派生出公钥,从而证明任何人都不知道相应的私钥,从而使 UTXO 的密钥路径证明是不可花费的,并强制通过脚本路径进行任何支出。它将避免对临时密钥的需要,否则需要临时密钥来使密钥路径在依赖于仅脚本路径强制执行的构造中变得不可使用。这一观察结果出现在 Jacob Swambo 等人的《比特币契约:控制未来的三种方法》中。 (2020),尽管它仍然是一个理论构建,而不是 BIP-118 中提出的设计。

与 SIGHASH_ANYPREVOUT 签名相关的主要风险是签名重放。由于这些签名不会提交到特定的出点,因此只要新的 UTXO 满足剩余的提交字段,相同的签名就可以用于花费与最初预期不同的 UTXO。这种风险在特定配置中变得更加明显:当 ANYPREVOUT |使用SINGLE,可以重新排列输出数量;当存在具有相同 scriptPubKey 和金额的单独 UTXO 时,在 ANYPREVOUT 的情况下;当相同的公钥出现在兼容脚本中时,在 ANYPREVOUTANYSCRIPT 的情况下;或者当矿工可以影响交易排序和包含以利用这些条件时。然而,这些场景需要故意误用或者用户或开发人员在协议设计期间未能考虑重放条件。 在我们接下来的