
本系列至今我们讨论了 multisig 是什么,以及 该选哪个门槛。两篇都在描述 multisig 钱包的行为 — m 把里的 n 把签名、链检查门槛、钱移动。两篇都没怎么讲钱包在底下到底是怎么拼起来的。这一篇就是。
短版本:SSP 给你创建钱包时,它不是随机生成两把密钥就完事。它按照一个有正式记录的标准 — BIP48 — 来生成,使得结果钱包是可互操作的、在 SSP 以外的软件里可恢复、在链上可被可预测地检查。这就是讲解 BIP48 是什么、它为什么存在,以及"这只钱包用 BIP48"为什么是 multisig 里最无聊却又最重要的句子之一的文章。
TL;DR
- 派生路径是从一个 seed phrase 到钱包中某把特定密钥(和地址)的那条路。BIP44 / BIP48 之类的标准化路径让不同的钱包软件从同一个 seed 到达同一组密钥。
- BIP48 是专门给 multisig 钱包写的规范。它说:这里是横跨主要输出脚本类型的、构成 2-of-3、3-of-5 等钱包的
m把密钥的标准派生路径。 - SSP 使用 BIP48。这意味着你 SSP 钱包生成的两个 seed 可以从任何其他 BIP48 兼容的钱包(Sparrow、Electrum、Bitcoin Core 的 descriptors)里使用 — 不只是从 SSP 本身。
- BIP48 修复了早一代 multisig 规范(BIP45)的一个问题:它把不同输出脚本类型(legacy、P2SH-wrapped SegWit、native SegWit、Taproot)的密钥干净地分开,使得一个 seed phrase 可以容纳全部而不发生冲突。
- 你不需要手动处理派生路径就能使用 SSP。但你应当知道它们存在,这样"钱包恢复"就不像是魔法 — 也好让你理解你的 seed 真正映射到了什么。
30 秒走马观花派生路径
在 BIP48 有任何意义之前,底下的机器先得存在。那台机器是 BIP32:hierarchical deterministic(HD)钱包。核心想法是一把主密钥 — 从一个 seed phrase 派生 — 能确定性地产生无限的子密钥之树。沿一条特定路径走,你总会到达同一把子密钥。走另一条,你会到另一把。
路径长这样:
m / purpose' / coin_type' / account' / change / index
例如,BIP44 路径 m / 44' / 0' / 0' / 0 / 0 到达BIP44 规则下 Bitcoin 第一个账户的第一个接收地址。把 coin_type 改成 60' 你就进入 Ethereum 的空间;把 purpose 改成 84' 你就进入 BIP84(native SegWit)的空间;以此类推。单引号(')表示 hardened 派生 — 子无法被反推回父。主密钥之后的每个段都是 32-bit 的数字,按惯例进行分区。
这一点常常被一带而过:路径是元数据,不是秘密。任何知道你路径以及你私钥(或扩展密钥)的人,都能派生出同样的地址。路径告诉钱包去哪儿找。Seed 告诉它那儿有什么。
要了解 seed 本身是什么的友好复习,seed phrase best practices 是前置读物。
BIP48 规定了什么
BIP48 住在 m / 48' / coin_type' / account' / script_type' / change / index。有意思的新增是 script_type' — 倒数第二段。
那一段编码这条路径服务的是哪种 multisig 输出:
0'→ P2SH(legacy 多重签名)1'→ P2SH-wrapped SegWit(P2WSH-in-P2SH)2'→ native SegWit(P2WSH)3'→ 等同 Taproot 的多重签名(按 BIP48 修订)
这一点要紧,因为现实中同一个 m-of-n cosigner 组合根据用了哪种输出脚本,会产生链上不同的地址。没有 BIP48,一只钱包可能默默使用一种类型,而恢复软件假设另一种,结果就是两只看起来应该派生同样币的钱包 — 但其实没有,因为它们计算的是不同的地址。
BIP48 还把 purpose' 段固定为 48',所以 multisig 路径不会和 BIP44/BIP49/BIP84 的 single-sig 路径相撞。一个 seed 可以同时承载一只在 BIP84 上的 single-sig 钱包和一只在 BIP48 上的 2-of-2 multisig 钱包,互不干扰。各自住在自己的子树里。
除了路径本身,BIP48 还规定了 cosigners 的公钥("xpubs")在构造 multisig 输出时应如何排序。其规范规则是公钥进入 redeem script 之前要按字典序排序。这消除了歧义 — 任何遵循 BIP48 的钱包,从同一组 xpubs 构造,会计算出同一个地址。没有那条规则,两只钱包可能把同样的密钥以不同的顺序组合,最终在用相同 redeem 规则的情况下落在不同地址上。
如果你想逐字阅读规范,它在 Bitcoin BIPs 仓库里(bips/bip-0048.mediawiki)。
SSP 在实践中是怎么使用 BIP48 的
当你设置一只 SSP 钱包时,会生成两个 seed phrase — 一个在浏览器扩展上,一个在 SSP Key 手机 App 上。每个 seed phrase 对应一把主私钥。从每把主私钥,SSP 在相关链(Bitcoin、Ethereum、Flux 以及 SSP 支持集中的其它链)上按 script_type' = 2' 派生 BIP48 路径(在 Bitcoin 上是 native SegWit;在其它适用的链上是等价的规范形式)。
然后两个签名者的 xpubs 互相交换。每一边现在都拥有按 BIP48 字典序排好的同一对 xpubs。基于这一对,每一边各自独立地算出同一个地址。两半永不共享私钥 — 只有公钥在设备之间移动。
当你收钱时,显示给你的地址就是从这两对 xpubs 算出来的 BIP48 派生地址。当你花钱时,每台设备用自己各自的私钥签同一笔交易。链上的 redeem script 引用两把公钥;网络检查两份签名。这就是整套协议。
为什么这在恢复场景里要紧:如果 SSP 作为产品明天消失了,你仍然手握两个符合 BIP48 的 seed phrase。把它俩都加载到 Sparrow(或任何其它支持 SSP 所用 BIP48 路径的 multisig 能力钱包)里,就重建出同一只钱包、在同样的地址、具备完整的花费能力。钱包不住在 SSP 里 — 它住在链上,而 seed 加上 BIP48 规范就足够从任何地方触达它。
这一性质很大程度上解释了为什么 self-custody-without-cold-storage 把一只 SSP 2-of-2 钱包当作一只正经钱包,而不是带有 custodial 味儿的好奇心。它可以基于开放标准被恢复。
为什么用 BIP48 而不是 BIP45(也不是 BIP44)
早一代的 multisig 规范是 BIP45。它是一次诚实的初尝:m / 45' / cosigner_index' / change / index,其中 cosigner_index' 编码你在该钱包中是第几个 cosigner。事后看,它有两个问题。
第一,cosigner_index' 把顺序烙进了路径本身。这意味着签名者被加入的顺序影响派生,使联合设置变得脆弱 — 顺序错了,你派生出的地址就和你的 cosigner 不一样。BIP48 通过把 cosigner index 完全从路径里去掉、改由公钥的字典序排序来处理,解决了这个问题。
第二,BIP45 不按脚本类型分。无论钱包用的是 legacy P2SH multisig 还是 SegWit-wrapped multisig,同一条路径会被复用。这就产生了上文描述的"地址冲突但不是同一批币"的问题。
更通用的 HD 规范 BIP44 从来没有声称自己覆盖 multisig。把 multisig 路径硬塞进 BIP44 会自找冲突。BIP48 是一次明确的修正:专用的 purpose number、显式的 script-type 槽位、以及确定性的密钥排序。今天大多数现代 multisig 钱包都收敛到它上面;它是事实上的标准。
要更深入地了解这一点如何连接到 multisig 的下一章 — Schnorr 聚合,让多份签名压成一份 — 本系列下一篇 Schnorr signatures and multisig aggregation 接续这条线。
这对互操作性意味着什么
"这只 multisig 钱包真的是 self-custodial 的吗?"的最干净测试是:我能不用它的软件就把它恢复出来吗?如果答案是能 — 用文档化的 seed、文档化的派生路径、标准工具 — 那么这只钱包就真的是你的。如果答案是不能,那它就带有隐藏的 custodial 成分。
SSP 对 BIP48 的合规正是让我们能回答能的原因。Seed phrase 是 BIP39(标准助记词),派生是 BIP48,地址构造按 BIP48 规范进行。任何说同样标准的钱包都能重建出该钱包。
这就是为什么入门篇 Meet SSP Wallet 把 SSP 框定为"带 2-of-2 multisig 的 self-custody",而不是某种被托管服务。底下的标准,就是这种框定诚实的原因。
这对你意味着什么
三个要点:
- 使用 SSP 不需要你背路径。 像
m/48'/0'/0'/2'/0/0这个号码,普通用户从不应该手打。但知道它存在,就让"我可以脱离 SSP 恢复这只钱包"成为真实主张而不是营销话术。 - 你的两个 seed 是可互操作的。 如果你哪天需要恢复到第三方 multisig 钱包,BIP48 + 你的两个 BIP39 seed + 链的
coin_type就是配方。self-custody 清单 把这件事列为演练步骤,是有原因的。 - 不使用 BIP48(或类似规范)的 multisig 钱包,值得被怀疑。 如果一个产品没法准确告诉你地址是如何从你密钥中派生的,那它不是 self-custody — 那是多了几步的 custody。符合标准是让"你的密钥,你的币"这个说法可被验证的关键。


