HD 钱包
目录
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)
- 不同的网络(主网、测试网)
- 是同一个密钥的不同表示形式
