术语表 /地址与密钥
P2SH 多重签名
- P2SH 多重签名是什么?
- P2SH 多重签名将一个 m-of-n 赎回脚本隐藏在以3开头的地址之后,而520字节的脚本上限使其最多只能容纳15个公钥。
规定于 BIP-16。
一个2-of-3赎回脚本为105字节:2的操作码、三个33字节的压缩公钥及其推送前缀、3的操作码,以及 OP_CHECKMULTISIG。花费一个输入大约需要297个 vbyte,约为原生 SegWit 单密钥输入的三倍。从2012年起,直到见证数据获得折扣之前,这一直是标准的共同托管方式。
运作方式
P2SH 多重签名的赎回脚本直接列出签名阈值:先是所需的签名数量,然后是每一个参与者的公钥,再是公钥总数,最后是 OP_CHECKMULTISIG。资金尚未花费时无人能看到这个脚本,因为输出只承诺其20字节的哈希。
15个公钥的上限是算术结果,并非人为设定的策略。15个压缩公钥,每个34字节(含推送前缀),合计510字节;再加上两个数量操作码和 OP_CHECKMULTISIG,达到513字节,恰好在单个栈元素520字节的限制之内。第16个公钥则放不下。Bitcoin 的共识规则允许 OP_CHECKMULTISIG 最多使用20个公钥,但 P2SH 赎回脚本在物理上无法容纳这么多。
花费路径上有一个古老的怪异之处。OP_CHECKMULTISIG 从栈中弹出的元素比它实际使用的多一个,这是最初实现中的一个缺陷,不经硬分叉就无法消除。签名者的变通办法是先推入一个占位元素,而 BIP-147要求该元素必须为空,这一要求在区块481,824与 SegWit 一同激活。因此一个完整的输入依次为:空推送、签名、签名、赎回脚本。
在哪里会遇到它
在2013年至2018年间建立的企业财库、继承安排和交易所冷存储,大多是 P2SH 多重签名。较早的点对点交易平台上的担保托管使用2-of-3,由平台持有第三把密钥,这样在发生纠纷时,任何一方交易者都无法单独完全控制这些比特币,纠纷也就得以解决。
备份要求常常让人措手不及。每位共同签名者都需要其他所有共同签名者的扩展公钥,或记录这些公钥的描述符,因为仅凭一份助记词无法重建赎回脚本。如果您持有三个私钥中的两个,却没有任何公钥,就无法花费。请将描述符与助记词备份一起记录下来,并在这套安排存入您在意的资金之前测试一次恢复。
如今新建的签名阈值安排改用 P2WSH 或 Taproot,因为同样的策略花费成本低得多,也没有15个公钥的上限。现有的 P2SH 保管库仍会像以前一样正常运作,不存在强制迁移。
P2SH 多重签名 vs 多重签名
多重签名是一种策略,P2SH 多重签名是写下这一策略的一种方式。同样的2-of-3要求,可以存在于比特币最早规则中的裸多重签名输出里,存在于 P2SH 赎回脚本里,存在于 P2WSH 见证脚本里,或者在 Taproot 下存在于单个聚合公钥之内,该公钥像普通支付一样花费,完全不显示签名阈值。选择 P2SH 是在权衡手续费、15个公钥的上限,以及您的整个签名安排在首次转移资金时就会公开这一事实。