
SIGHASH_ANYPREVOUT(简称 APO,对应 BIP-118)是比特币 Taproot 升级后引入的一种新型签名哈希类型。其核心突破在于:签名时无需绑定具体的输入 UTXO,仅对输出结果进行签名。这一机制实现了更灵活的支出逻辑,成为闪电网络 Eltoo 改造的技术基石。通过大幅降低状态存储需求,APO 助力通道工厂与轻量级瞭望塔的构建,显著提升了比特币二层扩展性能。
APO 允许比特币签名授权任何兼容的 UTXO,而非锁定在固定的输出点上。这使得 Lightning 网络、Vault 以及 Layer-2 协议能够使用可重新绑定的预签名交易,且无需额外的密钥管理开销。
本文是 Cointelegraph Research 关于比特币契约技术系列的第三部分。建议先行阅读前两部分以建立完整认知。
SIGHASH_ANYPREVOUT 的概念最早可追溯至 Joseph Poon 和 Thaddeus Dryja 在 2015 年 Lightning Network 论文中提出的 SIGHASH_NOINPUT 概念。2016 年 2 月,Joseph Poon 在比特币开发邮件列表上正式提出了该提案。它并非新的操作码,而是 SIGHASH 标志的一个新提议值,旨在通过软分叉升级引入比特币网络。SIGHASH 标志附加在签名之后,用于决定交易哪些部分已被签署,并由 CHECKSIG 操作码验证。旗帜的选择由签署者决定,而非由 scriptPubKey 强制执行。受软分叉技术细节限制,SIGHASH_ANYPREVOUT 提案目前仅适用于来自主根地址的支出。
如图 1 所示,比特币已存在多种标准 SIGHASH 模式。若标志设置为 SIGHASH_ALL,签名必须覆盖所有输入、所有输出及具体的输出点,从而将授权加密绑定到特定的 UTXO。输出点(outpoint)由交易 ID 和输出索引组成,唯一标识被消耗的 UTXO。相比之下,SIGHASH_NONE 仅对输入签名,输出不受约束;SIGHASH_SINGLE 对所有输入签名,但仅对与输入索引相同的输出签名。ANYONECANPAY 修饰符则允许单个输入独立签名,增加了灵活性。关键在于,这些现有模式均要求签名包含对输出点的承诺,而 SIGHASH_ANYPREVOUT 正是为了移除这一限制。

BIP-118 定义了两种 ANYPREVOUT 变体,主要区别在于摘要中省略的前一输出信息比例不同(如图 2 总结):
- SIGHASH_ANYPREVOUT: 输出点被排除在摘要之外,但签名仍承诺之前输出的数量和 scriptPubKey,以及输入的 nSequence。
- SIGHASH_ANYPREVOUTANYSCRIPT: 金额和 scriptPubKey 也被排除,意味着签名完全不绑定在已花费输出的锁定脚本上。
所有其他承诺遵循标准的 Taproot 签名消息结构,并依赖于所选的基础标志(如 SIGHASH_ALL 或 SIGHASH_SINGLE)。

由于摘要中省略了输出点,同一签名可以授权使用任何满足剩余提交字段的兼容 UTXO。例如,若一笔交易预先签名为 ANYPREVOUT | SIGHASH_ALL,当同一地址后续收到另一个 0.5 BTC 的 UTXO 时,即使创建原始签名的私钥已不可用,该签名仍可重复使用以产生 0.5 BTC 的输出。但若新 UTXO 金额超过 0.5 BTC,且原始签名未包含变更输出,矿工将损失多余部分。这种“重新绑定”特性使 ANYPREVOUT 在第二层协议中极具价值,因为同一预签名事务可适用于多个可能的链上 UTXO,无需为每个协议重新签名。
对于类似契约的应用,ANYPREVOUT 变体保留对前一输出 scriptPubKey 的承诺,确保资金绑定在同一锁定脚本下。而 ANYPREVOUTANYSCRIPT 完全去除了这种绑定,因此不太适合需要严格契约约束的场景。
与 OP_CTV 类似,SIGHASH_ANYPREVOUT 改进了预签名事务的逻辑能力,但本身不支持递归契约或事务自省。它主要通过放松签名与特定 UTXO 之间的绑定,允许签名在多个兼容 UTXO 间重复使用。
部分研究指出,移除输出点承诺可实现“密钥恢复构造”——即公钥可从固定签名和消息对中推导出来,使得对应的私钥对任何人都可证明为未知。这使 UTXO 的密钥路径可证明不可使用,强制任何花费必须通过脚本路径。这一机制避免了临时密钥的需求,而临时密钥在依赖脚本路径强制执行的构造中是使密钥路径不可用的关键。这一观察见于 Jacob Swambo 等人(2020年)的《比特币契约:三种控制未来的方式》,尽管它目前仍属理论构造,而非 BIP-118 的设计初衷。
SIGHASH_ANYPREVOUT 签名的主要风险在于签名重放。由于签名不承诺特定输出点,只要新 UTXO 满足剩余提交字段,同一签名即可用于花费与原意不同的 UTXO。以下场景会加剧重放风险:
- 使用 ANYPREVOUT | SIGHASH_SINGLE 且可重新排列输出金额;
- 存在具有相同 scriptPubKey 和金额的独立 UTXO;
- 同一公钥以兼容文字出现(如 ANYPREVOUTANYSCRIPT);
- 矿工可影响交易排序和包含性,利用上述条件。
然而,这些场景多为故意滥用,或源于用户/开发者在协议设计时未充分考虑重放条件。
在下一篇文章中,我们将探讨作为辅助工具的操作码。这些工具扩展了比特币脚本或数据处理的表达力,但除非与其他操作码结合,否则不实现契约功能。下一类将重点讨论 OP_CHECKSIGFROMSTACK 和 OP_CAT。


















