跳转到主要内容

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

每一层都有明确含义:

LevelFieldHardenedDescription
1PurposeYes (44')标识派生标准
2Coin TypeYes标识加密货币
3AccountYes将资金分隔为逻辑账户
4ChangeNo (0 or 1)外部链 (0) 或内部找零链 (1)
5Address IndexNo (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 包括:

CoinCoin TypePath Prefix
Bitcoin0'm/44'/0'
Bitcoin Testnet1'm/44'/1'
Litecoin2'm/44'/2'
Dogecoin3'm/44'/3'
Ethereum60'm/44'/60'
Ethereum Classic61'm/44'/61'
Cosmos118'm/44'/118'
Solana501'm/44'/501'
Cardano1815'm/44'/1815'
Polkadot354'm/44'/354'

完整的 coin type 注册表维护于 SLIP-44,包含 1,000 多个条目。

Account

account 层允许用户在同一个钱包内创建多个独立逻辑账户,类似拥有多个银行账户。默认是账户 0'

  • m/44'/0'/0' — Bitcoin 账户 0
  • m/44'/0'/1' — Bitcoin 账户 1
  • m/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 针对不同的地址类型使用不同派生路径:

StandardPathAddress TypePrefixExample
BIP-44m/44'/0'/0'Legacy (P2PKH)1...1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
BIP-49m/49'/0'/0'SegWit-compat (P2SH-P2WPKH)3...3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy
BIP-84m/84'/0'/0'Native SegWit (P2WPKH)bc1q...bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
BIP-86m/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'),原因是:

  1. 某个地址私钥(非加固的第 5 层)泄露,不应导致整个账户泄露。
  2. 各账户应彼此隔离。
  3. 不同币种应彼此隔离。

change 和 address index 层是非加固(0/0),以便只读钱包在没有主私钥时也能生成收款地址。

Gap Limit(地址间隙限制)

钱包不会扫描无限数量的地址。BIP-44 引入了“gap limit”概念:钱包在停止前会连续扫描的未使用地址数量。标准 gap limit 是 20。

如果你生成了地址 0 到 25,但只有 0、5、10、25 收到过资金,钱包会:

  1. 扫描地址 0 — 有交易,继续。
  2. 扫描地址 1–4 — 未使用,但仍在 gap limit 内。
  3. 扫描地址 5 — 有交易,重置 gap 计数器。
  4. 继续扫描,直到遇到连续 20 个无交易地址。

问题: 如果你生成了大量超出 gap limit 的地址(商户收款处理器常见),恢复钱包时可能找不到全部资金。恢复时你可能需要在钱包设置中提高 gap limit。

SafeSeed Tool

使用 SafeSeed Key Derivation Tool 交互式探索 BIP-44 派生路径。输入助记词(请使用测试助记词,不要使用真实助记词),查看不同派生路径如何为不同币种生成不同地址。所有处理都在你的浏览器中完成。

扩展密钥:xpub、ypub、zpub

扩展密钥会将密钥材料与派生路径元数据一起编码:

PrefixStandardAddress TypeNetwork
xpub / xprvBIP-44Legacy (P2PKH)Mainnet
ypub / yprvBIP-49SegWit-compat (P2SH-P2WPKH)Mainnet
zpub / zprvBIP-84Native SegWit (P2WPKH)Mainnet
tpub / tprvBIP-44Legacy (P2PKH)Testnet

前缀会告诉钱包软件应派生哪种地址类型。如果你导出 xpub 并导入到期待 zpub 的钱包中,你将看到不同(错误)的地址。

扩展公钥隐私警告

分享 xpub(或 ypub/zpub)会让接收方能够:

  • 派生你过去和未来的全部收款地址。
  • 跟踪你的完整交易历史和余额。
  • 将你的地址关联起来,破坏“每笔交易用新地址”带来的隐私优势。

除非对方是你完全信任、可访问你财务隐私的对象(例如你的会计,或你自己服务器上的只读钱包),否则不要分享扩展公钥。

常见派生路径问题

“我恢复了助记词,但余额显示为 0”

这是最常见的派生路径问题。可能原因:

  1. 地址类型错误 — 你使用的是 SegWit 地址(BIP-84,m/84'/0'/0'),但新钱包在扫描 Legacy 路径(BIP-44,m/44'/0'/0')。切换地址类型。
  2. coin type 错误 — 某些钱包早期实现对所有币都使用 coin type 0。
  3. 账户错误 — 你可能使用了账户 1 或更高。
  4. gap limit — 你使用过的地址超出了默认的 20。
  5. 自定义派生路径 — 某些钱包使用非标准路径。

“同一个助记词,我的两个钱包显示不同地址”

如果两个钱包从同一助记词生成了不同地址,说明它们使用了不同派生路径或地址类型。检查两个钱包中的派生设置。

恢复检查清单

从助记词恢复钱包时:

  1. 确认钱包支持 BIP-39
  2. 选择正确的地址类型(Legacy、SegWit 或 Taproot)。
  3. 检查派生路径与原钱包一致。
  4. 如果你使用过很多地址,增大 gap limit。
  5. 如果创建过多个账户,检查所有账户(不只是账户 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 使用自己的助记词和派生方案。务必记录是哪个钱包生成了你的助记词,以及它使用的派生路径。

相关指南