协议演进 / BIP/比特币改进提案 / BIP-45
BIP-45
为多人共管的 m-of-n 多签钱包定派生结构:每位共签人一条独立分支,凭彼此的用途层公钥即可离线生成全部 P2SH 多签地址,无需逐次沟通。本 BIP 目前处于已完成状态。
一、档案卡
| 编号 | BIP-45 |
|---|---|
| 标题 | Structure for Deterministic P2SH Multisignature Wallets |
| 作者 | Manuel Araoz <[email protected]>, Ryan X. Charles <[email protected]>, Matias Alejo Garcia <[email protected]> |
| 指定日期 | 2014-04-25 |
| 层级 | Applications(应用) |
| 类型 | Specification(规范类) |
| 状态 | Complete(已完成) |
| 阅读版 | https://bips.dev/45 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0045.mediawiki |
二、放在哪一族
BIP-45 是 HD 钱包派生路径族中专管多签的一支,与单人多账户的 BIP-44 并列。它是 BIP-43 的一个具体应用(原文摘要明说),建立在 BIP-32 之上,地址形态固定为 P2SH 多签。
同族关系:
BIP-32:派生算法底座
BIP-43:用途字段规则,本篇 purpose = 45'
BIP-44:单人钱包的多账户层级,与本篇是平行结构,不是上下级
BIP-48:后来的多签层级,把脚本类型(p2sh-p2wsh / p2wsh)也编进路径,是多签结构在 SegWit 时代的对应物
三、它要解决什么
多人共管一笔资金(如公司的 m-of-n 多签金库)时,原文先列明它的工作假设:
- n 个参与方共享一个 m-of-n 钱包;
- 每一方独立生成自己的主私钥,互不经手对方的私钥;
- 所有地址都用多签 P2SH;
- 用 BIP-32 派生公钥,再组装多签脚本与对应的 P2SH 地址;
- 生成地址不应需要各方之间通信——每一方都必须能独立生成全部公钥;
- 而创建交易与签名,则必须各方通信协作。
难点在第四、第五条之间:私钥各管各的,地址却要全员一致。若没有统一的派生结构,每一方长出的地址序列会对不上,共享钱包无从建立;每次收款都逐一协商地址,又违背“生成地址无需通信”。
BIP-45 的目标,就是给这类分层确定性 P2SH 多方多签钱包(原文简称 HDPM 钱包)定一套标准的创建、使用、导入与存储方式,使不同实现之间可以互通。
四、规则本身
4.1 四层路径
m / purpose' / cosigner_index / change / address_index
purpose(用途):常量 45,按 BIP-43 的建议取值,路径写作 m / 45' / *,硬化派生。
cosigner_index(共签人索引):标识为哪个共签人创建 P2SH 多签地址。各方的顺序不靠协商指定,而是由各方用途层公钥的字典序排序独立得出——每一方在本地对同一组公钥排序,得到同一套索引。非硬化派生。软件只使用与 N 位共签人依次对应的索引(如 2-of-3 钱包用 0、1、2)。
一个关键细节:各方之间不共享主公钥,只共享硬化派生后的用途层扩展公钥,并以此派生下级扩展公钥。
change(找零):0 为外部链(收款地址,对外可见),1 为内部链(找零地址,不对外可见)。非硬化派生。例如共签人 2 的找零地址走 m / 45' / 2 / 1 / *,收款地址走 m / 45' / 2 / 0 / *。
address_index(地址索引):从 0 起顺序编号。非硬化派生。
4.2 地址如何生成
每位参与方生成自己的一对扩展主密钥,只把用途层扩展公钥分享给其他人(原文说该公钥加密存储)。于是每一方都能派生出所有人的下级公钥,但只能掌握自己的私钥。
生成某个地址时:用同一条路径,分别在每位共签人的树上各派生一个公钥;把这 N 个公钥按字典序排序,组装多签脚本,再哈希成 P2SH 地址。每条路径对应一个地址,而这个地址的公钥来自不同的树。
给每位共签人一条独立分支,是为了避免两个人同时生成同一个地址、让同一地址收到多笔付款——原文的设计理由说得很明确:理想情况下每个地址至多收到一笔付款,且由对应分支的共签人发起请求。
- 收款:共签人只在自己的分支上生成地址。他知道自己分支上最后用过的索引(只有他在这条分支上生成地址),于是取下一个索引,用同一路径在所有人的树上派生公钥,算出新地址,其他人无需在线。例:共签人 2 上次用过的索引是 4,下一个收款地址路径为
m/45'/2/0/5。 - 找零:付款时同样在自己分支上取下一个找零索引,例:共签人 5 的找零路径为
m/45'/5/1/12。
4.3 交易创建与签名
先由一方创建交易提案(Transaction Proposal),花掉某个 P2SH 多签地址上的输出;提案发送给其他各方,各方决定是否签名。同意者用生成该地址公钥的同一路径派生自己的私钥并签名。签名数达到 m 后,任一共签人即可把交易广播上链。
提案本身的结构、接受与拒绝提案的协议,原文明确说不属于本 BIP,应由另一份 BIP 定义。
4.4 地址发现与间隔上限
从外部导入种子时,对每一位共签人都要:派生其节点 m / 45' / cosigner_index,再对其外部链与内部链逐一扫描地址。判断依据是交易历史而非余额。
与 BIP-44 不同:这里每条共签人分支都必须检查,哪怕前面的分支没有交易也不能提前停——因为各分支独立生成地址,空分支后面完全可能还有用过的分支。
间隔上限同样为 20:连续 20 个未使用地址之后即停止搜索该链;用户在外部链上要越过此限生成新地址时,软件应警告。
4.5 兼容实现
原文列出的兼容钱包是 Copay(BitPay)。
五、谁必须动
普通持币人(作为共签人):独立保管自己的种子,只分享用途层扩展公钥,绝不能分享主私钥或主公钥之外的私钥材料。收款时可以在自己分支上自行生成新地址,无需召集其他共签人。
钱包开发者:需实现四层路径、共签人索引的字典序定序、跨树取公钥组装多签脚本与 P2SH 地址、逐分支的发现算法与 20 的间隔上限,并处理交易提案的收集签名流程。
全节点与矿工:不受影响。链上只看到普通的 P2SH 多签交易,看不出背后的派生结构。
共识层:无变化。
六、现在算不算数,以及一个常见误读
状态为 Complete(已完成):规范本身已经定稿。它定义的 P2SH 多签结构是 SegWit 之前多签钱包互通的方案;后来的多签实践另有 BIP-48 按脚本类型(p2sh-p2wsh、p2wsh)组织路径。读 BIP-45 的价值,在于理解“私钥分持、地址共生”这一多签钱包基本格局是如何被标准化的。
常见误读:
“共签人要共同生成地址,就必须把各自的主公钥交给一个协调方保管。”
不对。原文明确规定主公钥不相互共享,共享的只是硬化派生后的用途层扩展公钥;排序定索引、各方本地派生,让每个人都能独立算出同一批地址。把“能生成你的公钥”误读成“能动你的私钥”,更是两回事:任何一方都只能派生自己的私钥。
七、延伸
- 阅读版:https://bips.dev/45
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0045.mediawiki
- 相关:BIP-32 分层确定性钱包、BIP-43 用途字段、BIP-44 多账户层级、BIP-48 多脚本层级
- 仓库总目录:https://github.com/bitcoin/bips
