术语表 /交易与手续费
SIGHASH_NONE
- SIGHASH_NONE 是什么?
- SIGHASH_NONE 是一种标志,它对交易的输入签名,但不对任何输出作出承诺,因此资金的去向对任何经手该交易的人都是开放的。
请把它视为一张空白支票。SIGHASH_NONE 输入授权了这笔支出,却不对收款方作任何说明,因此矿工或任何转发该交易的节点都可以在交易确认前改写所有输出。它的值为2,没有任何面向普通用户的钱包提供它,如果您在自己的交易中见到它,说明出了问题。
运作方式
构造这一摘要时,需要在哈希之前完全舍弃输出列表。
保留下来的内容仍然不少:交易版本、被签名输入的 outpoint、该输入自身的序列号、其所花费的脚本,以及锁定时间。所有其他输入的序列号都被置零,这是第二处自由度,因为它允许共同签名者在这份签名已经存在之后调整各自的相对时间锁。
没有保留下来的内容正是关键所在。由于没有任何输出被承诺,这份签名只表明:这笔币可以在该版本的交易中、于该时间或之后被花费。持有这笔半成品交易的人可以决定资金的去向,其中包括在网络上看到它的任何人,因为未确认的交易自广播的那一刻起就是公开的。
加上 ANYONECANPAY 修饰符后,该字节变为0x82,这是比特币所能产生的最弱的签名:它只覆盖一个输入,别无其他。
该标志自2009年1月的首个版本起就已存在,且从未被移除,因为移除它会使那些在无人考虑后果之前就已锁定的币无法动用。BIP143 和 BIP341 在为隔离见证和 Taproot 重新实现签名哈希时都如实保留了它,而不是悄悄舍弃。
在哪里会遇到它
SIGHASH_NONE 几乎不会出现在任何地方,这正是意料之中的事。
理论上的用途是这样一种协议:一方提供资金,另一方选择去向,而该对手方受签名之外的某种机制约束。没有任何广泛使用的比特币应用是这样工作的。需要灵活输入的构造转而使用 ANYONECANPAY,需要灵活输出的构造则使用预签名的备选方案,其中可能的去向事先已经固定。
因此,在实际网络中出现的 SIGHASH_NONE 签名,要么是程序错误,要么是正在发生的盗窃。内存池始终受到机器人的监控,它们会扫描可被花费的异常交易,带有此类签名的交易不会长时间无人察觉。编写签名代码的人应把这个标志视为永远不传入的整数,审计托管系统的人应确认该标志是常量,而不是由调用方提供的参数。
对于购买并持有比特币的人来说,结论很简单:您不会遇到它,您的钱包不会提供它,而要求您使用它签名的软件,应当远离。
SIGHASH_NONE vs SIGHASH_SINGLE
SIGHASH_NONE 不承诺任何输出;SIGHASH_SINGLE 恰好承诺一个输出,即与被签名输入处于同一索引位置的那个输出。这一个被承诺的输出彻底改变了签名的性质。使用 SIGHASH_SINGLE,签名者可以保证自己的收款,同时让交易的其余部分保持开放,这是构建互换和交易市场的一个可用组件。SIGHASH_NONE 则完全不为签名者提供任何保障,这也是为什么前者有实际应用,而后者主要出现在事故报告中。