
SIGHASH_ANYPREVOUT(简称APO,源自BIP-118提案)是伴随比特币Taproot升级而诞生的新型签名哈希类型。其核心突破在于解耦了签名与具体输入UTXO的强绑定关系,仅对输出端进行签名确认,从而赋予支出逻辑更高的灵活性。这一机制构成了闪电网络Eltoo改造的技术底座,通过大幅削减链上状态存储需求,助力通道工厂和轻量级瞭望塔的高效搭建,显著增强了比特币二层网络的扩展性能。
APO允许签名授权指向任意兼容的UTXO,而非局限于特定的输出点。这种特性使得Lightning网络、Vault协议以及Layer-2层解决方案能够部署可重新绑定的预签名交易,且无需承担额外的密钥管理负担。
这是Cointelegraph Research关于比特币契约的技术文章系列的第三部分。点击这里阅读上一篇文章。
根据BIP 118的描述,SIGHASH_ANYPREVOUT的概念渊源可追溯至Joseph Poon和Thaddeus Dryja在2015年发表的Lightning Network论文中提出的早期SIGHASH_NOINPUT设想。随后,Joseph Poon于2016年2月在比特币开发邮件列表上正式提出了该方案。
SIGHASH_ANYPREVOUT并非引入新的操作码,而是作为SIGHASH标志的一个新提议值,旨在通过软分叉方式升级比特币。SIGHASH标志附着于签名之后,用于界定交易中被签名的部分,并由CHECKSIG操作码进行验证。旗帜的选择权归属于签署者,scriptPubKey无权强制指定。鉴于软分叉升级的技术约束,SIGHASH_ANYPREVOUT提案目前仅适用于从主根地址发起的支出行为。
如图1所示,目前市面上已存在多种标准的SIGHASH模式。若设置标志为SIGHASH_ALL,签名必须涵盖所有输入、所有输出以及具体的出点(outpoint),从而将授权严格加密绑定至该精确的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的承诺,这通常是最关键的安全要素。它们允许签名在兼容UTXO间复用,同时确保资金始终绑定在同一锁定脚本下。相反,ANYPREVOUTANYSCRIPT完全去除了这种绑定,因此不太适合需要严格锁定的契约式应用。
与OP_CTV类似,SIGHASH_ANYPREVOUT增强了预签名事务已具备的逻辑表达能力,但其本身并不支持递归契约或事务自省功能。它主要通过放松签名与特定UTXO之间的绑定,允许签名在多个兼容UTXO之间重复使用来实现这一目标。
部分研究指出,移除出点承诺还为恢复密钥构造提供了可能性——即可以从固定的签名和消息对中推导出公钥,使得对应的私钥对任何人都可证明为“未知”,从而令UTXO的密钥路径在证明上处于不可用状态,强制所有花费行为必须走脚本路径。这将避免对临时密钥的需求,而临时密钥在依赖脚本路径强制执行的结构中是使密钥路径不可用的关键因素。这一观察出现在Jacob Swambo等人(2020年)的《比特币契约:三种控制未来的方式》一文中,尽管它目前仍属于理论构造,并非BIP-118提案中的设计初衷。
SIGHASH_ANYPREVOUT面临的主要风险是签名重放攻击。由于此类签名不承诺特定出点,只要新的UTXO满足剩余的提交字段,同一签名即可被用于花费与原意不同的UTXO。以下特定配置会加剧这种风险:当使用ANYPREVOUT | SIGHASH_SINGLE且输出量可重排时;当存在具有相同scriptPubKey和金额的独立UTXO时(如ANYPREVOUT场景);当同一公钥以兼容形式出现时(如ANYPREVOUTANYSCRIPT场景);或者当矿工能够影响交易排序和打包选择性时,可利用这些条件。然而,这些场景大多属于故意滥用,或是用户及开发者在协议设计阶段未能充分考量重放条件的结果。
在下一篇文章中,我们将开始探讨作为辅助工具的操作码。这些工具虽然扩展了比特币脚本或数据处理的表现力,但除非与其他操作码结合,否则无法实现契约功能。在下一类别中,我们将重点讨论OP_CHECKSIGFROMSTACK和OP_CAT。
以上就是比特币(BTC)契约第三部分:SIGHASH_ANYPREVOUT的详细内容,更多关于BTC契约三:ANYPREVOUT的资料请关注其它相关文章!