把下一笔交易算进脚本里:BIP-446 OP_TEMPLATEHASH 的模板哈希 图 1
把下一笔交易算进脚本里:BIP-446 OP_TEMPLATEHASH 的模板哈希 · 图 1

第二层协议长期背着一件行李:为了约定「下一步只能这么花」,各方要互相交换签好名的交易,谁多一次往返,谁就多一分被扣着不发的风险。2026 年 2 月 6 日,Greg Sanders、Antoine Poinsot 和 Steven Roose 提交 BIP-446,状态 Draft,提议给这个问题一个链上原语:OP_TEMPLATEHASH——在 Tapscript 里执行时,把「正在花我这个输出的那笔交易」的骨架算成一个哈希压上栈,脚本随后可以拿它做任何比较和组合。

它长得很「BIP-341」。模板哈希沿用 BIP-340 与 BIP-341 的 tagged hash 框架,新开一个叫 TemplateHash 的标签,内容是把这几段字节串起来:交易版本(4 字节小端)、锁时间(4 字节小端)、sha_sequences(全部输入序列的 SHA-256,BIP-341 已有)、sha_outputs(全部输出的 SHA-256,BIP-341 已有),再加关于本输入的 annex_present(有无 annex 的 1 字节)、input_index(第几个输入,4 字节小端),若有 annex 再追加 sha_annex。这些子字段全部复用 BIP-341 签名消息已经预计算好的部分,执行时最多只哈希 109 字节,比现有操作码哈希得都少——防二次方哈希的功劳直接白拿。

哪些字段被故意拿掉了,理由更值得读。hash_type 不要:输入是固定的,不存在 sighash 类型的选择问题。spend_type 化约成 annex_present:扩展标志位恒为 0,那就直接承诺 annex 有无。sha_prevouts 与 sha_scriptpubkeys 不承诺:如果连它们一起哈希,模板哈希写进输出自身时会形成哈希循环;承诺「其他全部输入」还会带来随输入数二次方的哈希量,并且让同一笔交易里花掉两个模板哈希锁定的币变成不可能。不锁定具体花掉哪些币也保留了一种容错——出错时还能换输入自救。sha_amounts 同样被砍:作者承认对可重绑签名而言承诺金额可作纵深防御,但省掉它换回的是纠错灵活性,多承诺的资金也只会变成手续费而不是永久锁死。

和老熟人 BIP-119 OP_CHECKTEMPLATEVERIFY 的分歧也写明了。OP_TEMPLATEHASH 只在 Tapscript 定义,不去动遗留 Script,风险面小;借 OP_SUCCESS 挂钩实现,能把哈希压上栈而不是像 CTV 那样只能做严格断言,作为构造块更省。CTV 会承诺花费交易的 scriptSig,单输入交易下才有 txid 稳定;Taproot 的 scriptSig 必须为空,所以 OP_TEMPLATEHASH 单输入时天然 txid 稳定。CTV 不承诺 annex,本提案承诺——不承诺反而会让基于 annex 的公开证明技术不得不多带签名。向后兼容是白送的:OP_SUCCESS206(0xce)原本让脚本无条件成功,给出意义只会收紧验证规则,不存在新旧规则下合法性翻转的区块。

一个执行画面能把语义钉死。用户预先造好一笔交易 A 的骨架——版本、锁时间、序列与输出都定死——然后创建一个 Taproot 输出,其中一片脚本写「OP_TEMPLATEHASH,然后与 A 的模板哈希常量比较,相等才放行 CHECKSIG」。此后任何人想让这笔钱动,唯一合法的花费交易就是 A 本尊:改任何被哈希覆盖的字段,压栈的模板哈希就对不上常量,脚本直接失败。而造这个输出的时候,用户从头到尾没有签过 A 一个字——预签名交易这种「先签后发」的交互需求被整段消掉,签名要么根本不需要,要么留给别的原语承担。

动机一节列了一张应用清单:替代闪电 commitment_signed 里互传 HTLC 签名的一环、让 Ark 的 VTXO 接收变成非交互、削减 LN-Symmetry 的往返、显著优化离散对数合约。理解成一句话:凡是「先签好下一笔再交换」的地方,都可能换成「链上核对模板哈希」。

常见误区有四个。其一,把它当成 CTV 换皮:一个进遗留 Script 做断言,一个进 Tapscript 做压栈,升级钩子、承诺字段、适用语境都不同。其二,以为它承诺了花掉的币:prevouts、amounts 都在承诺之外。其三,以为哈希包含见证:见证不进哈希,这正是 txid 稳定的来源。其四,以为已可上线使用:状态 Draft,激活方式留待以后决定。

快速问答。问:谁来验证这个哈希?答:矿工与全节点按共识规则重算,脚本里用相等比较消费。问:为什么数字全部 4 字节小端?答:与 BIP-341 签名消息保持一致,复用实现。问:它能让闪电彻底不需要状态签名吗?答:它移除的是承诺更新里的一部分交互,协议其余轮次仍在。

风险提示:本文是协议提案科普,不构成投资建议;主网尚无此操作码,任何宣称支持它的服务都应保持警惕。

把下一笔交易算进脚本里:BIP-446 OP_TEMPLATEHASH 的模板哈希 图 2
把下一笔交易算进脚本里:BIP-446 OP_TEMPLATEHASH 的模板哈希 · 图 2