BIP-44 派生路径:钱包如何生成地址
当你设置一个加密货币钱包并生成一个助记词时,这一组种子需要在几十条不同区块链上生成成千上万个地址,每个地址都有自己的私钥、公钥和地址格式。BIP-44 定义了实现这一点的组织结构:从单一根密钥派生出的分层密钥树,以及保证钱包可互操作的标准化路径表示法。
对于需要在不同钱包中恢复资金、管理多币种资产组合,或在恢复助记词后排查“余额丢失”问题的人来说,理解派生路径至关重要。
密钥派生层级
BIP-32:基础
BIP-44 构建在 BIP-32(分层确定性钱包)之上。BIP-32 定义了一种方法:从单一主密钥派生出无限的密钥对树。BIP-32 引入了两个核心概念:
子密钥派生 — 从任意扩展密钥(私钥或公钥加链码)都可以在不同索引下派生子密钥。每个子密钥又可继续派生自己的子密钥,从而形成树状结构。
加固派生 vs 普通派生 — 普通派生允许从父公钥派生子公钥(适用于只读钱包)。加固派生要求父私钥,并在分支之间提供更强的安全隔离。加固索引通常用撇号表示(例如 44')。
BIP-43:Purpose 字段
BIP-43 规定了一个约定:将派生树的第一层用于表示“purpose”(用途),也就是遵循的 BIP 标准。BIP-44 使用 44',BIP-49 使用 49'(用于兼容 SegWit 的 P2SH 地址),BIP-84 使用 84'(用于原生 SegWit),BIP-86 使用 86'(用于 Taproot)。
BIP-44:完整路径
BIP-44 定义了五层派生路径:
m / purpose' / coin_type' / account' / change / address_index
每一层都有明确含义:
| Level | Field | Hardened | Description |
|---|---|---|---|
| 1 | Purpose | Yes (44') | 标识派生标准 |
| 2 | Coin Type | Yes | 标识加密货币 |
| 3 | Account | Yes | 将资金分隔为逻辑账户 |
| 4 | Change | No (0 or 1) | 外部链 (0) 或内部找零链 (1) |
| 5 | Address Index | No (0, 1, 2...) | 顺序地址编号 |
Purpose (44')
在 BIP-44 标准派生中,purpose 字段始终为 44'。其他常见值:
49'— BIP-49(P2SH 封装 SegWit)84'— BIP-84(原生 SegWit / Bech32)86'— BIP-86(Taproot / P2TR)
这些值定义了不同的地址类型,并在各自 BIP 中说明。
Coin Type
coin type 用于标识派生密钥属于哪种加密货币。已注册的 coin type 包括:
| Coin | Coin Type | Path Prefix |
|---|---|---|
| Bitcoin | 0' | m/44'/0' |
| Bitcoin Testnet | 1' | m/44'/1' |
| Litecoin | 2' | m/44'/2' |
| Dogecoin | 3' | m/44'/3' |
| Ethereum | 60' | m/44'/60' |
| Ethereum Classic | 61' | m/44'/61' |
| Cosmos | 118' | m/44'/118' |
| Solana | 501' | m/44'/501' |
| Cardano | 1815' | m/44'/1815' |
| Polkadot | 354' | m/44'/354' |
完整的 coin type 注册表维护于 SLIP-44,包含 1,000 多个条目。
Account
account 层允许用户在同一个钱包内创建多个独立逻辑账户,类似拥有多个银行账户。默认是账户 0':
m/44'/0'/0'— Bitcoin 账户 0m/44'/0'/1'— Bitcoin 账户 1m/44'/60'/0'— Ethereum 账户 0
账户层使用加固派生,这意味着知道某个账户的扩展公钥并不会泄露其他账户的密钥,从而提供账户间的隐私隔离。
Change
change 层用于区分:
- 0(外部链) — 提供给他人用于收款的地址。
- 1(内部链) — 钱包内部用于将找零返回给自己的地址。
在 Bitcoin 的 UTXO 模型中,花费一个交易输出时必须消耗整个输出。比如你从一个 1 BTC 输出中发送 0.5 BTC,剩余 0.5 BTC 会发送到由你钱包控制的找零地址。找零链将这类地址与收款地址分开,便于管理并提升隐私。
Ethereum 及其他基于账户的区块链不会以同样方式使用找零链,因为它们没有 UTXO 模型。Ethereum 钱包通常只使用外部链(change = 0)。
Address Index
address index 是链内地址的顺序编号。每生成一个新地址,钱包就会递增该计数器:
m/44'/0'/0'/0/0— 第一个收款地址m/44'/0'/0'/0/1— 第二个收款地址m/44'/0'/0'/0/2— 第三个收款地址m/44'/0'/0'/1/0— 第一个找零地址m/44'/0'/0'/1/1— 第二个找零地址
主流加密货币的派生路径
Bitcoin
Bitcoin 针对不同的地址类型使用不同派生路径:
| Standard | Path | Address Type | Prefix | Example |
|---|---|---|---|---|
| BIP-44 | m/44'/0'/0' | Legacy (P2PKH) | 1... | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa |
| BIP-49 | m/49'/0'/0' | SegWit-compat (P2SH-P2WPKH) | 3... | 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy |
| BIP-84 | m/84'/0'/0' | Native SegWit (P2WPKH) | bc1q... | bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 |
| BIP-86 | m/86'/0'/0' | Taproot (P2TR) | bc1p... | bc1p5d7rjq7g6rdk2yhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297 |
恢复时很重要: 如果你在新钱包中恢复助记词后看不到余额,可能是新钱包扫描的派生路径与原钱包不同。请尝试在 Legacy、SegWit、Taproot 地址类型之间切换,或手动指定派生路径。
Ethereum
Ethereum 通常使用单一路径:
m/44'/60'/0'/0/0 — 第一个账户
m/44'/60'/0'/0/1 — 第二个账户(某些钱包)
但有些钱包(如 Ledger Live)会在 account 层派生多个账户:
m/44'/60'/0'/0/0 — 账户 0
m/44'/60'/1'/0/0 — 账户 1
m/44'/60'/2'/0/0 — 账户 2
而另一些钱包(如 MetaMask)会递增 address index:
m/44'/60'/0'/0/0 — 账户 1
m/44'/60'/0'/0/1 — 账户 2
m/44'/60'/0'/0/2 — 账户 3
这种不一致会在恢复时造成困惑。务必记录生成该助记词的钱包软件。
Solana
Solana 使用 Ed25519(与 secp256k1 不同的椭圆曲线),路径为:
m/44'/501'/0' — Phantom, Solflare
m/44'/501'/0'/0' — 某些实现
Cardano
Cardano 使用不同的密钥派生方案(Ed25519-BIP32 / CIP-1852),路径为:
m/1852'/1815'/0'/0/0 — 第一个支付地址
m/1852'/1815'/0'/2/0 — 第一个质押密钥
注意这里 purpose 字段是 1852'(CIP-1852,以 Ada Lovelace 出生年份命名),而不是 44'。
加固派生与普通派生
理解加固派生与普通派生的区别对安全非常关键。
普通(非加固)派生
- 使用索引 0 到 2^31 - 1。
- 在不持有父私钥的情况下,可从父扩展公钥派生子公钥。
- 优点: 支持只读钱包(例如服务器只用 xpub 就能生成新的收款地址,无需持有私钥)。
- 风险: 如果攻击者同时获得某个子私钥和父扩展公钥,就可以计算出父私钥以及同级其他私钥。
加固派生
- 使用索引 2^31 到 2^32 - 1(写作 0' 到 2^31 - 1')。
- 派生子密钥时必须使用父扩展私钥。
- 优点: 子密钥泄露不会导致父级或同级密钥泄露。
- 风险: 无法仅凭父扩展公钥派生子公钥(该层无法实现只读功能)。
为什么 BIP-44 前三层使用加固派生
purpose、coin type 和 account 都是加固层(44'/0'/0'),原因是:
- 某个地址私钥(非加固的第 5 层)泄露,不应导致整个账户泄露。
- 各账户应彼此隔离。
- 不同币种应彼此隔离。
change 和 address index 层是非加固(0/0),以便只读钱包在没有主私钥时也能生成收款地址。
Gap Limit(地址间隙限制)
钱包不会扫描无限数量的地址。BIP-44 引入了“gap limit”概念:钱包在停止前会连续扫描的未使用地址数量。标准 gap limit 是 20。
如果你生成了地址 0 到 25,但只有 0、5、10、25 收到过资金,钱包会:
- 扫描地址 0 — 有交易,继续。
- 扫描地址 1–4 — 未使用,但仍在 gap limit 内。
- 扫描地址 5 — 有交易,重置 gap 计数器。
- 继续扫描,直到遇到连续 20 个无交易地址。
问题: 如果你生成了大量超出 gap limit 的地址(商户收款处理器常见),恢复钱包时可能找不到全部资金。恢复时你可能需要在钱包设置中提高 gap limit。
使用 SafeSeed Key Derivation Tool 交互式探索 BIP-44 派生路径。输入助记词(请使用测试助记词,不要使用真实助记词),查看不同派生路径如何为不同币种生成不同地址。所有处理都在你的浏览器中完成。
扩展密钥:xpub、ypub、zpub
扩展密钥会将密钥材料与派生路径元数据一起编码:
| Prefix | Standard | Address Type | Network |
|---|---|---|---|
| xpub / xprv | BIP-44 | Legacy (P2PKH) | Mainnet |
| ypub / yprv | BIP-49 | SegWit-compat (P2SH-P2WPKH) | Mainnet |
| zpub / zprv | BIP-84 | Native SegWit (P2WPKH) | Mainnet |
| tpub / tprv | BIP-44 | Legacy (P2PKH) | Testnet |
前缀会告诉钱包软件应派生哪种地址类型。如果你导出 xpub 并导入到期待 zpub 的钱包中,你将看到不同(错误)的地址。
扩展公钥隐私警告
分享 xpub(或 ypub/zpub)会让接收方能够:
- 派生你过去和未来的全部收款地址。
- 跟踪你的完整交易历史和余额。
- 将你的地址关联起来,破坏“每笔交易用新地址”带来的隐私优势。
除非对方是你完全信任、可访问你财务隐私的对象(例如你的会计,或你自己服务器上的只读钱包),否则不要分享扩展公钥。
常见派生路径问题
“我恢复了助记词,但余额显示为 0”
这是最常见的派生路径问题。可能原因:
- 地址类型错误 — 你使用的是 SegWit 地址(BIP-84,
m/84'/0'/0'),但新钱包在扫描 Legacy 路径(BIP-44,m/44'/0'/0')。切换地址类型。 - coin type 错误 — 某些钱包早期实现对所有币都使用 coin type 0。
- 账户错误 — 你可能使用了账户 1 或更高。
- gap limit — 你使用过的地址超出了默认的 20。
- 自定义派生路径 — 某些钱包使用非标准路径。
“同一个助记词,我的两个钱包显示不同地址”
如果两个钱包从同一助记词生成了不同地址,说明它们使用了不同派生路径或地址类型。检查两个钱包中的派生设置。
恢复检查清单
从助记词恢复钱包时:
- 确认钱包支持 BIP-39。
- 选择正确的地址类型(Legacy、SegWit 或 Taproot)。
- 检查派生路径与原钱包一致。
- 如果你使用过很多地址,增大 gap limit。
- 如果创建过多个账户,检查所有账户(不只是账户 0)。
进阶:自定义派生路径
一些进阶场景需要自定义派生路径:
- 多签配置 — BIP-48 为多签钱包定义了派生路径:
m/48'/0'/0'/2'(用于原生 SegWit 多签)。 - Lightning Network — 某些 Lightning 实现为通道密钥使用自定义派生路径。
- 隐私钱包 — Wasabi 等注重隐私的钱包可能使用特定路径。
务必记录你使用的派生路径。如果无法重建精确路径,就无法恢复资金。
FAQ
加密货币中的派生路径是什么?
派生路径是一种结构化表示法,用于指定如何在分层确定性(HD)钱包中从主种子派生某个特定密钥或地址。格式为 m/purpose'/coin_type'/account'/change/address_index,每一层都会将范围收窄到派生树中的一个具体密钥。
为什么不同加密货币使用不同 coin type?
不同 coin type 可确保同一助记词在每条区块链上生成彼此独立、互不相关的密钥。这样可以避免跨链相互干扰,并确保某条链上的密钥泄露不会影响其他链。
我可以把同一个助记词用于 Bitcoin 和 Ethereum 吗?
可以。同一个 BIP-39 助记词可以为 Bitcoin 和 Ethereum(以及许多其他加密货币)派生密钥。它们使用不同派生路径:Bitcoin 为 m/44'/0'/0',Ethereum 为 m/44'/60'/0',因此派生出的密钥和地址完全独立。
派生路径中的撇号 (') 是什么意思?
撇号表示加固派生。加固派生需要父私钥,并提供更强的安全隔离:子密钥泄露不会暴露父级或同级密钥。非加固层(无撇号)允许从父公钥派生子公钥。
为什么我恢复助记词后钱包显示零余额?
最常见原因是派生路径不匹配。你的原钱包可能使用了不同地址类型(Legacy、SegWit、Taproot),而不同地址类型对应不同派生路径。请在恢复钱包中切换地址类型,或手动指定原钱包使用的派生路径。
什么是 gap limit,为什么它重要?
gap limit 是钱包在认为“后续地址未被使用”之前会扫描的连续未使用地址数量。BIP-44 标准将其设为 20。如果你生成了大量地址(例如商户收款场景),部分有资金的地址可能超出 gap limit,恢复时不可见。可在钱包设置中提高 gap limit 以找回这些地址。
所有钱包都使用 BIP-44 吗?
大多数现代钱包支持 BIP-44 或其后继标准(BIP-49、BIP-84、BIP-86)。但也有钱包使用专有派生路径。例如 Electrum 使用自己的助记词和派生方案。务必记录是哪个钱包生成了你的助记词,以及它使用的派生路径。