Skip to content

HD 钱包

目录

  1. HD 钱包概述
  2. BIP 32
  3. BIP 39
  4. BIP 44
  5. 密钥推导
  6. 实际应用
  7. 常见问题

HD 钱包概述

什么是 HD 钱包

HD = Hierarchical Deterministic(分层确定性)

特点:
  1. 从一个种子生成无限个地址
  2. 地址之间有层级关系
  3. 可从母密钥推导子密钥
  4. 所有地址都可追踪回母密钥

HD 钱包的优势

相比传统钱包:

1. 备份简化
   一个种子词组代表整个钱包
   不需要备份每个私钥

2. 灵活性
   可以为每个目的生成不同的地址
   例:收入地址、支付地址、找零地址

3. 隐私性
   每次交易都可使用新地址
   难以追踪所有权

4. 可扩展性
   支持多链和多账户

BIP 32

分层推导

概念:
  从一个根密钥推导整个"树"

树形结构:
  m (主密钥)
  ├── m/0 (子密钥 0)
  │   ├── m/0/0 (孙密钥 0)
  │   └── m/0/1 (孙密钥 1)
  ├── m/1 (子密钥 1)
  └── m/2 (子密钥 2)

路径表示法:
  m/i/j/k:m 是主密钥,i/j/k 是推导路径

密钥推导方式

普通推导

从公钥推导子公钥是可能的

用途:
  可以从公钥推导子公钥
  无需访问私钥

风险:
  如果某个子密钥泄露
  可能恢复母密钥(需要链码)

硬化推导

从公钥无法推导子公钥

表示:
  使用撇号:m/44' 或 m/44H

计算方式:
  需要私钥参与

用途:
  提高安全性
  防止链码攻击

标准:
  账户级别使用硬化
  m/44'/0'/0'

BIP 39

种子词(Seed Words)

目的:
  将随机种子转换为可记忆的单词列表

标准格式:
  12 或 24 个单词
  从预定义的 2048 个词汇中选择

例:
  abandon ability able about above absolute
  absent absorb abstract abuse access accident
  account accuse achieve acid acoustic acquire

种子词生成

过程:

1. 生成随机熵
   128 或 256 比特

2. 计算校验和
   熵的 SHA-256 的前 N 位
   128 比特 → 4 位校验和

3. 转换为单词
   每个单词代表 11 比特
   128 + 4 = 132 比特 = 12 个单词
   256 + 8 = 264 比特 = 24 个单词

4. 转换为种子
   使用 PBKDF2 和密码(通常为空)
   生成 512 比特的种子

安全性:
  24 个单词 = 2^256 可能性
  同私钥大小

BIP 44

账户结构

标准化的钱包结构:

m / purpose / coin_type / account / change / address_index

含义:

m:主密钥

purpose:44(BIP 44 标准)或 49(P2SH)或 84(SegWit)等

coin_type:
  0 = 比特币主网
  1 = 比特币测试网
  2 = 莱特币
  ...

account:
  0, 1, 2...
  用户创建的账户

change:
  0 = 外链(接收地址)
  1 = 内链(找零地址)

address_index:
  0, 1, 2...
  地址序号

示例:
  m/44'/0'/0'/0/0 → 主网第一账户的第一个接收地址
  m/44'/0'/0'/1/0 → 主网第一账户的第一个找零地址

密钥推导

推导过程

从根密钥推导子密钥:

需要:
  1. 母密钥
  2. 链码(chain code)
  3. 索引号

计算:

普通子密钥 (n >= 0):
  I = HMAC-SHA512(母链码, 母公钥 || index)
  L = I 左 256 比特
  R = I 右 256 比特
  
  子密钥 = (母密钥 + L) mod n
  子链码 = R

硬化子密钥 (n >= 2^31):
  I = HMAC-SHA512(母链码, 0x00 || 母私钥 || index)
  (其他相同)

例子

从种子词生成比特币地址:

1. 种子词
   "abandon ability able..." (12 或 24 个)

2. 生成根私钥
   种子 → BIP 32 根 → 主私钥 m

3. 推导账户
   m/44' → 标准账户
   m/44'/0' → 比特币
   m/44'/0'/0' → 第一账户

4. 推导外链
   m/44'/0'/0'/0 → 接收地址

5. 推导个别地址
   m/44'/0'/0'/0/0 → 第一个地址
   m/44'/0'/0'/0/1 → 第二个地址
   ...

每个地址都不同,都来自同一个种子词

实际应用

钱包兼容性

支持 BIP 44 的钱包:
  Ledger Nano S/X
  Trezor
  MetaMask
  Coinbase Wallet
  Trust Wallet
  多数现代钱包

互操作性:
  不同钱包可以从同一种子词恢复相同地址
  保证可移植性

多币种支持

BIP 44 支持多币种:

比特币(coin_type = 0):
  m/44'/0'/account'/change/index

测试比特币(coin_type = 1):
  m/44'/1'/account'/change/index

莱特币(coin_type = 2):
  m/44'/2'/account'/change/index

以太坊(coin_type = 60):
  m/44'/60'/account'/change/index

允许一个种子词管理多条链

多账户使用

单个种子词支持多个账户:

账户 0:m/44'/0'/0'/0/0-19
账户 1:m/44'/0'/1'/0/0-19
账户 2:m/44'/0'/2'/0/0-19

用途:
  1. 隔离不同目的的资金
  2. 不同的隐私级别
  3. 账户恢复

常见问题

Q1: 种子词泄露了怎么办?

A:

  • 立即转移所有资金到新钱包
  • 使用新的种子词
  • 旧的种子词对应的所有地址都不安全

Q2: 能否改变 HD 路径?

A:

  • 可以自定义路径
  • 但会导致与标准钱包不兼容
  • 通常不推荐

Q3: 为什么需要链码?

A:

  • 用于密钥推导的秘密参数
  • 没有链码无法生成相同的子密钥
  • 重要的像私钥一样

Q4: BIP 32/39/44 的关系?

A:

  • BIP 32:定义 HD 密钥推导
  • BIP 39:定义种子词
  • BIP 44:定义标准路径结构

Q5: 为什么有的地址看起来不同?

A:

  • 不同的地址类型(P2PKH、P2SH、SegWit)
  • 不同的网络(主网、测试网)
  • 是同一个密钥的不同表示形式