比特币Covenants技术演进:详解SIGHASH_ANYPREVOUT机制

本系列第三篇聚焦于比特币协议中关键的签名标志扩展——SIGHASH_ANYPREVOUT。该提案源自BIP 118,建立在2015年闪电网络白皮书提出的SIGHASH_NOINPUT概念基础上,后由Joseph Poon于2016年正式在bitcoin-dev邮件列表中提出。

新签名标志的设计逻辑与部署路径

SIGHASH_ANYPREVOUT并非新增操作码,而是作为软分叉升级中的一项新签名标志值,用于改变交易签名所覆盖的范围。该标志由签名者自主选择,而非由锁定脚本强制规定。其设计仅适用于从Taproot地址发起的支出,体现了对可升级性的技术考量。在传统模式下,签名必须绑定特定的输出点(outpoint),即交易ID与输出索引的组合,以确保唯一性。而此新标志通过移除对输出点的承诺,实现了更灵活的资金使用方式。

现有标准签名模式对比分析

当前主流的SIGHASH模式包括SIGHASH_ALL(覆盖全部输入输出及指定出块)、SIGHASH_NONE(仅签名输入,不限制输出)、SIGHASH_SINGLE(匹配同索引输出)以及支持单个输入独立签名的ANYONECANPAY修饰符。这些模式均要求签名必须包含对具体输出点的承诺,而SIGHASH_ANYPREVOUT则突破了这一限制,允许签名脱离特定UTXO的约束。

两种变体的差异与适用场景

BIP-118定义了两种具体变体:SIGHASH_ANYPREVOUT与SIGHASH_ANYPREVOUTANYSCRIPT。前者虽排除输出点信息,但仍保留对前一笔输出金额和scriptPubKey的承诺,以及输入nSequence的约束;后者则进一步剥离金额与锁定脚本,使签名完全不受目标输出内容影响。两者均遵循基础标志(如ALL、SINGLE)下的标准消息结构,但承诺范围存在显著区别。

重新绑定能力及其实际价值

由于不绑定特定输出点,同一预签名可被重复用于多个满足条件的兼容UTXO。例如,一个为0.5 BTC输出生成的预签名,在后续收到相同金额的新资金后,无需重新签名即可使用。即使原始私钥已丢失,只要新UTXO符合金额与脚本要求,仍可完成花费。若新资金超过0.5 BTC且未设置找零输出,则超额部分将归矿工所有。这种特性对二层协议极具吸引力,避免了为每个可能的链上状态生成新签名。

Covenant应用中的适配性评估

对于基于Covenants的应用,保留scriptPubKey承诺的ANYPREVOUT变体更为适用,因为它既支持多UTXO复用,又维持了资金与锁定脚本之间的关联。相比之下,ANYPREVOUTANYSCRIPT因完全放弃脚本绑定,难以满足Covenant对资金路径控制的核心需求。尽管该机制提升了灵活性,但并不具备递归或交易内省功能,其本质是优化预签名流程,而非引入新范式。

理论延伸:密钥恢复构造的可能性

有研究指出,移除输出点承诺可能催生一种名为“密钥恢复”的构造方法——即从固定的签名与消息对中推导出公钥,使得其对应的私钥无法被任何已知实体掌握。这可强制将资金路径锁定为脚本执行模式,从而规避临时密钥的使用需求。这一设想源于Jacob Swambo等人2020年的论文《Bitcoin Covenants: Three Ways to Control the Future》,但尚未纳入BIP-118的正式设计范畴,仍属理论探索。

核心安全挑战:签名重放风险

最突出的风险在于签名重放——同一签名可能被用于花费非预期的另一笔符合条件的UTXO。当配置为ANYPREVOUT | SINGLE且输出金额可调整时,或存在具有相同脚本与金额的其他输出时,该风险尤为明显。此外,若同一公钥出现在多个兼容脚本中,也可能引发误用。矿工若能操控交易排序,亦可能利用这些漏洞获利。然而,此类问题大多源于设计疏漏或不当使用,而非协议本身缺陷。

下一阶段:辅助操作码的演进方向

在后续章节中,我们将转向一系列增强比特币脚本表达能力的辅助操作码。它们虽不单独构成Covenant功能,但作为底层工具,为复杂逻辑的实现提供支撑。接下来将重点解析OP_CHECKSIGFROMSTACK与OP_CAT等关键技术,揭示其在构建高级应用中的协同潜力。