一、前言
一组助记词可以推导多个账户,是因为在区块链钱包中,助记词(Mnemonic)实际上是 BIP39 标准下生成的一个种子,该种子通过 BIP32/BIP44 标准可以派生出无限多个账户地址。
这里我将以太坊Ethereum为例,讲解一下常见的推导路径,将会结合blockchain_utils为例,blockchain_utils 是一个功能较为全面的库,支持 BIP32、BIP39、BIP44 等多种钱包路径和账户推导标准,非常适合用来实现从助记词派生多个账户地址的功能。
二、推导路径(Derivation Path)
常见路径标准:
链 | 路径示例 | CoinType |
---|---|---|
比特币(BTC) | m/44’/60’/0’/0/0 | 0 |
以太坊(ETH) | m/44’/60’/0’/0/0 | 60 |
波场(TRON) | m/44’/195’/0’/0/0 | 195 |
火币链(HT) | m/44’/1010’/0’/0/0 | 1010 |
OK链(OKT) | m/44’/996’/0’/0/0 | 996 |
BSC链 | 和ETH一样 m/44’/60’/0’/0/0 | 60 |
路径结构解析:
m / purpose' / coin_type' / account' / change / index
解释说明:
- m:根路径。
- purpose:固定为 44’,表示使用 BIP44 标准。
- coin_type:货币类型,比如:
- 60 表示以太坊(Ethereum)
- 0 表示比特币(Bitcoin)
- account:账户索引,比如 0、1、2……
- change:是否为找零地址,一般是 0。
- index:派生出的地址索引,比如 0、1、2……
三、推导思路
假设你已经有助记词了,你可以这样生成多个地址:
- 使用助记词生成种子(seed);
- 使用种子生成主私钥(Master Private Key);
- 根据不同的路径(例如 m/44’/60’/0’/0/0 到 m/44’/60’/0’/0/9)推导出多个地址。
四、代码事例
引入依赖
dependencies:
flutter:
sdk: flutter
blockchain_utils: ^4.0.0
从助记词推导多个以太坊(Ethereum)地址
import 'package:blockchain_utils/blockchain_utils.dart';
void deriveEthAddresses(String mnemonic, {int count = 5}) {
// 1. 助记词转Seed
final seed = Mnemonic.createSeed(mnemonic);
// 2. 通过Seed创建HD钱包根私钥
final rootKey = HdPrivateKey.master(seed, Network.mainnet());
// 3. 推导路径 BIP44: m/44'/60'/0'/0/i
const basePath = "m/44'/60'/0'/0/";
for (int i = 0; i < count; i++) {
final derivedKey = rootKey.derivePath(basePath + i.toString());
// 获取私钥
final privateKeyHex = derivedKey.privateKey.toHex();
// 获取以太坊地址
final ethAddress = EthAddress.fromPrivateKey(derivedKey.privateKey).toString();
print('地址 $i: $ethAddress');
print('私钥 $i: $privateKeyHex\n');
}
}
运行
void main() {
const mnemonic = "clutch captain shoe salt awake harvest setup primary inmate ugly among become";
deriveEthAddresses(mnemonic, count: 5);
}
地址 0: 0x8f3c8d3e8b4b2a9fb8f9e04c9c55b918dcf94a36
私钥 0: 0xabcdef123456789...
地址 1: 0x5a8b8e3f6b3a2d9fb4f3e04b9c55c918dcf94b23
私钥 1: 0x123456abcdef789...
路径解释(BIP44)
项目 | 含义 |
---|---|
m/44’/60’/0’/0/0 | 以太坊默认地址路径 (BIP44标准) |
44’ | 目的 (Purpose) 固定为 44’ |
60’ | 币种 (Coin type) 以太坊是 60 |
0’ | 账户 (Account) |
0 | 外部 (Change) 一般为 0 |
0 | 地址索引 (Index) |
其他:生成TRON地址
// TRON地址
final tronKey = rootKey.derivePath("m/44'/195'/0'/0/0");
final tronAddress = TronAddress.fromPrivateKey(tronKey.privateKey);
print('TRON 地址: $tronAddress');
五、注意事项
- 不同链的路径不同,比如:
BTC: m/44'/0'/0'/0/0
ETH: m/44'/60'/0'/0/0
BSC(币安智能链):同 ETH 使用 m/44'/60'/0'/0/0
- 助记词推导的所有地址,都属于同一个钱包,共享同一套助记词。备份助记词,即可恢复所有地址。
- 这种方式非常常见,比如 imToken、MetaMask 等钱包,都是用助记词生成多个地址。
六、关于作者(ZFJ_张福杰)
- 官网:https://zfjsafe.com
- 博客:https://zfj1128.blog.csdn.net
- Github:https://github.com/zfjsyqk
- Gitee:https://gitee.com/zfj1128