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

BIP-48 多签钱包的多脚本层级结构

在 BIP44 的账户骨架上多加一层“脚本类型”:48’ 路径之下,1’ 是嵌套 SegWit 多签、2’ 是原生 SegWit 多签,一个种子分管多种多签脚本。本 BIP 目前处于已部署状态。

一、档案卡

档案卡
编号BIP-48
标题Multi-Script Hierarchy for Multi-Sig Wallets
作者Fontaine <[email protected]>
指定日期2020-12-16
层级Applications(应用)
类型Specification(规范类)
状态Deployed(已部署)
阅读版https://bips.dev/48
官方原文https://github.com/bitcoin/bips/blob/master/bip-0048.mediawiki

二、放在哪一族

BIP-48 是 HD 钱包派生路径族中多签一支在 SegWit 时代的层级规范。它是 BIP-43 的一个具体应用(purpose = 48’),同时拼合了三份前置规范:

BIP-32:派生算法

BIP-43:用途字段规则

BIP-44:多账户层级,本篇的账户等层级沿用其模式,原文说本篇正是受 BIP-44 启发

BIP-67:经公钥排序的确定性 P2SH 多签地址——支持本篇的钱包天然支持 BIP-67 的确定性密钥排序,使所有多签地址/脚本都由排序后的公钥确定性地得出

与同族 BIP-45 的分工:BIP-45 定的是 P2SH 多签、按共签人分分支的结构;BIP-48 定的是单个确定性多签钱包内部、按脚本类型再分一层的账户层级。两者谈的不是同一套树。

三、它要解决什么

原文动机直接:业界事实上已经在普遍使用 m/48' 派生路径做分层确定性多签钱包,但这一做法没有成文标准。本篇的目的,是把既有的行业实践定义成规范,让其他开发者有据可循。

同时它要留出扩展口:多签的脚本形态会随协议演进而增加(当年已有嵌套 SegWit 与原生 SegWit 两种),若每出一种脚本类型就新写一份 BIP,既慢又容易让派生空间互相冲突。在路径里专设一层 script_type,未来的脚本类型只需往这一层追加取值即可纳入同一规范。

这套层级因此相当完备:多账户、每账户的外部/内部链、多种脚本类型、每链数以百万计的地址,都在一棵树内解决。

向后兼容被原文单列一节强调:已经有不少钱包在用 m/48' 方案,本 BIP 意在维持这一派生路径的既有真实用法,不作任何破坏性改动,以免现有用户丢币;已经支持 m/48' 的钱包无需改动即可合规。

四、规则本身

4.1 六层路径

m / purpose' / coin_type' / account' / script_type' / change / address_index

比 BIP-44 的五层多出一层 script_type。前四层用硬化派生,后两层用公开派生。

4.2 逐层含义

purpose(用途):常量 48’,按 BIP-43 的建议取值。硬化派生。

coin_type(币种):一个主节点(种子)可用于多个比特币网络;共用同一空间有缺点,这一层按网络分开,避免跨网络复用地址、改善隐私。取值:0 为主网,1 为测试网。硬化派生。

account(账户):沿用 BIP-44 的模式,把密钥空间切成独立用户身份,钱包不得跨账户混币;用户可按捐赠、储蓄、日常开支等用途分账户。账户从索引 0 起顺序编号。硬化派生。

script_type(脚本类型):把密钥空间按脚本类型再分一层,为未来脚本类型预留了顺延扩展的口子。本篇当时只覆盖两种:

原文给钱包的推荐默认值是 p2wsh,即 m/48'/0'/0'/2'。

change(找零):0 为外部链(收款地址,对外可见),1 为内部链(找零地址,不对外可见)。公开派生。

address_index(地址索引):从 0 起顺序编号。公开派生。

4.3 密钥排序

支持本篇的钱包同时须支持 BIP-67 的确定性密钥排序:组装多签脚本时公钥按确定性规则排序,使任何人从同一组公钥出发都得到同一个多签地址/脚本,不因各方排列顺序不同而生成不同地址。

4.4 路径示例

五、谁必须动

普通持币人(多签参与方):备份种子即可按本结构恢复多签账户;但恢复时必须选对 script_type——同一账户在 1’ 与 2’ 下是两套完全不同的地址,选错一层,看到的就是空钱包。

钱包开发者:需实现六层路径与 script_type 的取值约定、BIP-67 公钥排序,并以 p2wsh(2’)为默认脚本类型。已在用 m/48' 的实现按原文无需改动即可合规。

全节点与矿工:不受影响。派生结构在链下,链上只有 p2sh-p2wsh 或 p2wsh 的多签输出本身。

共识层:无变化。

六、现在算不算数,以及一个常见误读

状态为 Deployed。它与多数“先提案、后实现”的文档顺序相反:先有业界普遍使用 m/48' 的事实,再有本篇把它追认为标准。因此它的权威来自既有实践本身,原文也以此为限——不引入破坏性改动,不要求现有钱包返工。

常见误读:

“BIP-48 是 BIP-45 的升级版,多签钱包都应从 45 迁到 48。”

不对。两者结构不同、解决的问题也不同:BIP-45 按共签人分分支、地址固定为 P2SH;BIP-48 是单一种子内部按账户与脚本类型分层,覆盖 p2sh-p2wsh 与 p2wsh。它们是平行方案,不存在谁取代谁;钱包实现哪一套,取决于它采用的多签组织方式。

七、延伸

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