术语表 /交易与手续费
SIGHASH_ANYONECANPAY
- SIGHASH_ANYONECANPAY 是什么?
- SIGHASH_ANYONECANPAY 是一种修饰符,它将所有其他输入从摘要中剔除,因此一个签名只覆盖其所花费的那一枚币,其他人可以自由加入该交易。
它不是独立的模式。该标志的值为128,与三种基础模式之一相加,得到129、130或131,每种组合回答的是不同的问题:签名者愿意让陌生人改动哪些内容。众筹和 ordinals 市场是它发挥作用的两个场景。
运作方式
设置该修饰符后,摘要的输入部分缩减为单一条目:所花费的 outpoint、其序列号,以及它所解锁的脚本。
其他所有输入都不再参与计算。按此规则签名的人既不知道也不关心还有多少人投入了币、按什么顺序投入,或之后是否还会有人加入,而且之后再添加输入也不会使先前生成的签名失效。这一特性就是该功能的全部意义,也是签名可以被收集的原因:多人可以在不同时间、不同设备上各自独立签名,再由某个人把这些签名汇集成一笔有效交易。
基础模式仍然决定输出部分,三种组合的行为差别很大。
- 129,即该修饰符加上全部输出规则,含义是“我的币投入,且付款必须恰好是这份清单”。可以增加输入,但不能增加输出。
- 130,即该修饰符加上无输出规则,是协议允许的最弱签名:投入一枚币,对资金最终流向没有任何表态。
- 131,即该修饰符加上单一输出规则,含义是“我的币投入,且我必须收到位于我对应索引的那个输出”。其他一切都不受限制。
在哪里会遇到它
有两种构造真正用到了它,二者都依赖于陌生人能够在不破坏已有签名的前提下追加资金。
第一种是保证合约,即比特币版本的众筹认捐。每位出资人对一份固定的输出清单(其中包含项目的收款输出)以数值129签名,每笔认捐就是一个输入。只有当认捐的输入总额覆盖输出时,这笔交易才会生效,因此筹资目标靠算术自行执行,无需担保托管方;未达目标的活动根本不会产生有效交易。认捐不花费任何成本,撤回也不花费任何成本,因为这些币从未移动。
第二种是预签名的市场报价。卖家对自己的铭文或符文输出以及想要的价格以数值131签名,将结果作为部分签名交易发布,任何买家都可以用自己的输入、自己的找零和手续费将其补全。无需挂牌合约,无需托管方,结算本身也无需信任任何对手方。
这里附带一项警告。数值130的签名一旦出现在公开内存池中,对第一个拾取它的人来说就是白拿的钱,而它与安全的组合之间只差一位。如果您在审查签名代码,请检查基础模式是否为硬编码的常量,以及修饰符是否是唯一允许变动的部分。
解读标志字节
把 sighash 标志字节拆成两半,它就不再晦涩。低位给出基础模式:1表示全部输出,2表示无输出,3表示单个对应输出。高位的值为128,即修饰符。因此,以81结尾的签名覆盖除其他输入之外的所有内容,83是市场所用的规则,而不带修饰符的普通01,则是您自己的钱包每次花费时生成的常规付款。