协议演进 / BIP/比特币改进提案 / BIP-45

BIP-45 确定性 P2SH 多签钱包的结构

为多人共管的 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 多签金库)时,原文先列明它的工作假设:

难点在第四、第五条之间:私钥各管各的,地址却要全员一致。若没有统一的派生结构,每一方长出的地址序列会对不上,共享钱包无从建立;每次收款都逐一协商地址,又违背“生成地址无需通信”。

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 地址。每条路径对应一个地址,而这个地址的公钥来自不同的树。

给每位共签人一条独立分支,是为了避免两个人同时生成同一个地址、让同一地址收到多笔付款——原文的设计理由说得很明确:理想情况下每个地址至多收到一笔付款,且由对应分支的共签人发起请求。

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 的价值,在于理解“私钥分持、地址共生”这一多签钱包基本格局是如何被标准化的。

常见误读:

“共签人要共同生成地址,就必须把各自的主公钥交给一个协调方保管。”

不对。原文明确规定主公钥不相互共享,共享的只是硬化派生后的用途层扩展公钥;排序定索引、各方本地派生,让每个人都能独立算出同一批地址。把“能生成你的公钥”误读成“能动你的私钥”,更是两回事:任何一方都只能派生自己的私钥。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。