各管各的钥匙分支:BIP-45 给多方多签钱包定的派生路径 图 1
各管各的钥匙分支:BIP-45 给多方多签钱包定的派生路径 · 图 1

三个人共用一个两签钱包,最难的不是签名,而是发地址。今天谁对外收款,如果他临时向另外两人索要一组新公钥,另外两人恰好不在线,这笔生意就卡住了;如果三人各自闷头生成地址,又可能撞出一模一样的地址收进两笔钱。2014 年 4 月 25 日,BitPay 的三位工程师 Manuel Araoz、Ryan Charles 和 Matias Alejo Garcia 提交 BIP-45,用一条派生路径把这件事变成纯本地计算。状态最终为 Complete,是对 BIP-43 用途约定的一次具体应用。

路径写作 m / 45’ / cosigner_index / change / address_index。逐层看:第一层 45 硬分叉,表明这棵子树按本规范使用,和 BIP-44 的 44’ 同理;第二层是共同签名人编号,每位合作方占一条自己的分支,分支内再分收款链(0)与找零链(1),最底层才是逐号递增的地址索引,除 45’ 外全部用普通派生。编号怎么定不由人商量,而是把每人的 purpose 扩展公钥做字典序排序后依次取 0、1、2——任何人在任何地方拿到全部公钥,排出来的号都一样,这就消灭了「谁的分支是几」的协调问题。

流程上的关键假设是:生成地址不需要通信,签名才需要。每位共同签名人只向其他人公开自己硬化到 45’ 一层的扩展公钥(并加密保存),私有密钥永远留在本机。轮到某人收款时,他知道自己分支上已用过的索引,把同一个「下一号」路径分别套进所有人分享的公钥树上,推出 N 把该序号的公钥,按字典序排好拼成多签脚本,对应的 P2SH 地址即可公开。整个过程其他人可以全程离线,因为公钥树是提前换过的,展开只是算术。发币找零同理,只是换到 change 为 1 的那条链并单独计数。

签名阶段才出现协议:一位合伙人创建交易提案,动用(可以属于任何一方分支的)多签地址里的输出,其他人核对后在自己的路径上派生出对应私钥签名,攒够 m 个签名后任何一方可广播。原文坦率地承认,提案本身的结构与接受拒绝协议不在本文范围,「我认为那该属于另一个 BIP」——这个留白后来由 PSBT 部分补上。

规范还规定了两条扫描纪律。从外部种子导入钱包时,要对每一位共同签名人的分支都分别扫描,即使前面的分支一片空白也不能跳过——这和 BIP-44 只扫两条链的逻辑明显不同,因为空分支以后也可能被人用起来。地址缺口上限取 20:连续 20 个地址没有任何交易记录就认为后面没有已用地址;软件在用户要生成超过缺口限制的收款地址时应当发出警告。判断标准是「有没有交易」而不是「有没有余额」,哪怕地址归零也要继续扫。

设计上的取舍都写进了理由一节:给每人单开分支,就是为了避免两个人同时生成同一个地址、同时收到两笔款项。理想状态是每个地址最多接收一次付款。这个「分支隔离」思路和今天描述符钱包里的多账户展开异曲同工,只是 BIP-45 把账户维度让给了「人」。

常见误区有三个。其一,把 45’ 和 44’ 当成两条互斥的钱包:同一个种子可以同时长出 44’ 单签树和 45’ 多签树,用途层的作用正是分家。其二,以为共同签名人要共享主私钥或主公钥:规范明确只共享硬化后的 purpose 扩展公钥。其三,把字典序编号当成随机或先到先得:顺序完全由公钥字节决定,任何一方换钥匙都要全组重新定序。

一笔对照账:一个 2-of-3 钱包里,三号收款人上一号收款地址用过索引 4,他要新地址只需算 m/45’/2/0/5 在三人树上的三把公钥——零次网络请求;而如果钱包没有这套约定,他至少要等两个人中的任何一个上线。约定不改变密码学,只改变谁必须什么时候在线。

快速问答。问:现在还有什么软件按 BIP-45 派生?答:Electrum 的多签导入流程是它最知名的实现者之一;新建多签更常见的方案是描述符或多方 ECDSA 协议。问:它为什么只写 P2SH 不写隔离见证?答:立项时 P2SH 是多签的唯一通用载体,规范保持了那个年代的形状。问:换了一个共同签名人怎么办?答:本 BIP 不处理密钥轮换,那是协作协议层的事。

风险提示:本文是钱包机制科普,不构成投资建议;多签地址一旦派生链条记错,可能永久找不回资金,重要金额请先用小额走通完整收发与签名流程。

各管各的钥匙分支:BIP-45 给多方多签钱包定的派生路径 图 2
各管各的钥匙分支:BIP-45 给多方多签钱包定的派生路径 · 图 2