热门搜索:和平精英 原神 街篮2 

您的位置:首页 > > 教程攻略 > web3.0 >比特币(BTC)契约第三部分:SIGHASH_ANYPREVOUT

比特币(BTC)契约第三部分:SIGHASH_ANYPREVOUT

来源:互联网 更新时间:2026-07-09 10:14

今天我们来深入聊聊比特币二层网络里一个相当关键的底层技术——SIGHASH_ANYPREVOUT(简称APO,BIP-118)。这是在Taproot升级之后引入的一种新型签名哈希类型。它的核心创新点,其实挺有意思的:在签名的时候,不再需要绑定具体的输入UTXO,只需要对输出进行签名就够了。这一下子就打开了灵活支出逻辑的大门。

APO的技术意义,很大程度上是作为闪电网络Eltoo升级方案的技术基石。它能大幅降低节点需要存储的状态数据量,让通道工厂和轻量级瞭望塔的构建变得更现实。说到底,这对于提升比特币二层网络的扩展性能,是一个相当重要的技术突破。

简单来说,APO允许一个比特币签名去授权任何满足条件的UTXO,而不是死死地绑定在一个固定的输出点上。这意味着,对于Lightning、Vault以及各种Layer-2协议来说,可以提前做好“预签名交易”,并且这些交易可以在不同的UTXO之间灵活“重新绑定”,而不需要每次都重新搞一套密钥管理,省事不少。

说到SIGHASH_ANYPREVOUT的历史,它其实不是凭空冒出来的。BIP-118里写得清楚,它源于2015年Joseph Poon和Thaddeus Dryja在闪电网络白皮书中设想的“SIGHASH_NOINPUT”概念。后来在2016年2月,Joseph Poon在比特币开发者邮件列表里正式把它提了出来。

需要强调的是,SIGHASH_ANYPREVOUT并不是一个全新的操作码,而是给SIGHASH标志增加了一个新的提议值,并且是作为一次软分叉升级来设计的。这又是什么意思呢?SIGHASH标志是跟在签名后面的,它决定了交易的哪些部分是被签名覆盖的,CHECKSIG操作码会去检查这个标志。至于到底用哪个标志,完全由签名者说了算,scriptPubKey这边并不会强制要求。由于软分叉升级的技术细节,这个SIGHASH_ANYPREVOUT提案目前只适用于从Taproot地址发起的交易。

如下图1所示,比特币之前已经有好几种标准的SIGHASH模式了。比如SIGHASH_ALL,签名必须覆盖所有的输入、所有的输出,甚至连具体的输出点(outpoint)都要签上,这就把授权牢牢绑定在一个精确的UTXO上了。而SIGHASH_NONE则宽松一些,只需要对输入签名,输出完全不约束。还有个SIGHASH_SINGLE,它对所有输入签名,但只对和被签名输入索引相同的那个输出签名。另外还有个ANYONECANPAY修饰符,允许单个输入独立签名,灵活性更高了一点点。但关键在于,这些模式没一个能允许签名省略对输出点(outpoint)的承诺。而SIGHASH_ANYPREVOUT的出现,就是把这个限制给去掉了。

BTC契约三:ANYPREVOUT

BIP-118定义了两种ANYPREVOUT的变体,它们的区别在于签名摘要里省略了多少上一输出的信息,具体可以看图2。在SIGHASH_ANYPREVOUT模式下,输出点(outpoint)被排除在摘要之外了,但签名仍然会承诺上一笔输出的金额和scriptPubKey,以及输入的nSequence。而在SIGHASH_ANYPREVOUTANYSCRIPT模式下,就连金额和scriptPubKey也被排除在外了,这意味着签名和花费的UTXO的锁定脚本彻底解绑。至于其他所有的承诺,都还是遵循标准的Taproot签名消息结构,并依赖于所选的基础标志,比如SIGHASH_ALL或者SIGHASH_SINGLE。

比特币(BTC)契约第三部分:SIGHASH_ANYPREVOUT

因为输出点(outpoint)被省略了,理论上同一个签名就可以用来授权任何满足剩余提交字段的兼容UTXO。举个例子,假如你有一笔用“ANYPREVOUT | ALL”模式预签好的交易,后来同一个地址又收到了另一个0.5 BTC的UTXO。这时候,即使你创建原始签名的私钥已经找不到了,这笔预签名交易也可以拿来重用,声称这0.5 BTC的产出。反过来,如果新的UTXO余额超过了0.5 BTC,而原始签名里又没包含找零输出,那矿工就能把多余的部分拿走。这种“可重新绑定”的特性,正是ANYPREVOUT在二层协议中大放异彩的原因——同一份预签名交易要能适用于多种可能上链的UTXO,总不能给每个UTXO都重新签一次吧?

对于类似“契约”这样的应用场景,大家最关心的通常是SIGHASH_ANYPREVOUT这个基础变体,因为它还保留了对上一输出scriptPubKey的承诺。它允许签名在兼容的UTXO之间重复使用,同时又能确保资金始终被锁定在同一个锁定脚本之下。而ANYPREVOUTANYSCRIPT这种变体,因为把最后的绑定也去掉了,反而不太适合契约式的应用。

和上一篇文章聊到的OP_CTV类似,SIGHASH_ANYPREVOUT也是对预签名交易现有逻辑的一次改进。它本身并不支持递归契约或者交易内省这样更高级的功能。它的核心贡献在于,放松了签名和特定UTXO之间的绑定,让签名能在多个兼容的UTXO之间灵活复用。

有趣的是,一些技术研究表明,移除输出点(outpoint)的承诺还可能催生出一个叫做“恢复密钥构造”(recovery key construction)的东西。简单说,就是从一个固定的签名和消息对中,可以推导出公钥,进而让任何人都无法证明对应的私钥存在。这样一来,UTXO的密钥路径就被证明无法使用,任何花费行为都必须走脚本路径。这在依赖脚本路径强制执行的构造中,可以避免使用临时密钥,因为临时密钥的核心目的就是让密钥路径不可用。这个发现出现在Jacob Swambo等人在2020年发表的论文《比特币契约:三种控制未来的方式》中,不过目前仍是个理论构想,并非BIP-118直接给出的设计。

当然,SIGHASH_ANYPREVOUT也不是没有风险的,最核心的一个就是签名重放。由于这些签名不承诺特定的输出点(outpoint),只要新的UTXO满足了剩余的已提交字段,同一个签名就可能被用来消耗一个和原意完全不同的UTXO。这种风险在某些特定配置下会更突出:比如当使用“ANYPREVOUT | SINGLE”模式时,输出量可以被重新排列;或者存在一个独立的、scriptPubKey和金额都相同的UTXO时(对应ANYPREVOUT模式);又或者同一个公钥以兼容的文本出现时(对应ANYPREVOUTANYSCRIPT模式);甚至矿工可以通过影响交易排序和包含性来利用这些条件。不过说到底,这些风险场景要么是故意钻空子,要么就是开发者或用户在设计协议时,没把重放的条件考虑周全。

热门手游

相关攻略

手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc