HD WALLET是分层推导确定性钱包, 管理着私钥.
# 具体原理
参考这几篇文章
https://www.jianshu.com/p/e0bca6eafa58
https://learnblockchain.cn/2018/10/25/eth-web-wallet_1
https://learnblockchain.cn/article/784
# BIP44路径规则
定义了五层路径规则
m/purpse’/coin_type’/account’/change/address_index
m:主扩展密钥
purpose: bip44/bip45
coin_type: 币种
account: 钱包账户
change: 0 对外 / 1 找零
address_index: 地址索引
# 路径如何与分层对应上

# 使用ethers.js库创建HD钱包
“`
// 使用ethers.js库
// 生成16byte的数据(对应12个助记词)
let seed = ethers.utils.randomBytes(16);
// 生成英文助记词
let mnemonic = ethers.utils.entropyToMnemonic(seed,’en’);
// 使用助记词生成对应路径的钱包
// address 0x613B8c0016634185B73f27566185f1F95a63a8Ed
let wt = ethers.Wallet.fromMnemonic(mnemonic,”m/44’/60’/0’/0/0″);
// address 0x850BF6c7e76433947c5980663974Eb22533E9096
wt = ethers.Wallet.fromMnemonic(mnemonic,”m/44’/60’/0’/0/1″);
“`
# metamask
在每次重新安装metamask后, 使用相同的助记词, 推导出的账户地址都不变. 而且在创建新账户时也都保证一定的顺序.
因为在重新导入后, 相同助记词推导出相同的主密钥, 在路径相同的情况下, 生成的地址也相同. 在创建新账户时, 增加address_index “m/44’/60’/0’/0/1” “m/44’/60’/0’/0/2″就可以得到新的地址.

# BNB币种
查看BNB币种是[714](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) 那计算的路径应该是 “m/44’/714’/0’/0/1” 使用相同的助记词, 应该得出不同的wallet.但实际证明地址还是和ETH币种一样的.为啥导入BSC网络后(BNB)地址不变呢?
查看[BSC文档](https://bnbsmartchain.com/binance-extension-wallet-v1-114-release/), account中描述BNB使用的是与ETH一样的路径.
“`For example hardware wallets use them from a single root you can generate separate keys for Bitcoin (with path m/44’/0’/0’/0) and Ethereum (path m/44’/60’/0’/0).
Binance Chain extension wallet would use a similar way to generate keys as Ethereum, i.e. derive the private key using BIP32/BIP44 with HD prefix as “44’/60’/”, which is the same as Ethereum’s derivation path.
“`
可以看到BNB和ETH一样用的是“44’/60’/”前缀, 所以计算出来的地址也一样.
HD WALLET是分层推导确定性钱包, 管理着私钥.
具体原理
参考这几篇文章 https://www.jianshu.com/p/e0bca6eafa58 https://learnblockchain.cn/2018/10/25/eth-web-wallet_1 https://learnblockchain.cn/article/784
BIP44路径规则
定义了五层路径规则 m/purpse’/coin_type’/account’/change/address_index m:主扩展密钥 purpose: bip44/bip45 coin_type: 币种 account: 钱包账户 change: 0 对外 / 1 找零 address_index: 地址索引
路径如何与分层对应上
使用ethers.js库创建HD钱包
// 使用ethers.js库
// 生成16byte的数据(对应12个助记词)
let seed = ethers.utils.randomBytes(16);
// 生成英文助记词
let mnemonic = ethers.utils.entropyToMnemonic(seed,'en');
// 使用助记词生成对应路径的钱包
// address 0x613B8c0016634185B73f27566185f1F95a63a8Ed
let wt = ethers.Wallet.fromMnemonic(mnemonic,"m/44'/60'/0'/0/0");
// address 0x850BF6c7e76433947c5980663974Eb22533E9096
wt = ethers.Wallet.fromMnemonic(mnemonic,"m/44'/60'/0'/0/1");
metamask
在每次重新安装metamask后, 使用相同的助记词, 推导出的账户地址都不变. 而且在创建新账户时也都保证一定的顺序. 因为在重新导入后, 相同助记词推导出相同的主密钥, 在路径相同的情况下, 生成的地址也相同. 在创建新账户时, 增加address_index “m/44’/60’/0’/0/1” “m/44’/60’/0’/0/2″就可以得到新的地址.
BNB币种
查看BNB币种是714 那计算的路径应该是 “m/44’/714’/0’/0/1” 使用相同的助记词, 应该得出不同的wallet.但实际证明地址还是和ETH币种一样的.为啥导入BSC网络后(BNB)地址不变呢? 查看BSC文档, account中描述BNB使用的是与ETH一样的路径.
Binance Chain extension wallet would use a similar way to generate keys as Ethereum, i.e. derive the private key using BIP32/BIP44 with HD prefix as “44’/60’/”, which is the same as Ethereum’s derivation path.
可以看到BNB和ETH一样用的是“44’/60’/”前缀, 所以计算出来的地址也一样.
本文参与区块链技术网 ,好文好收益,欢迎正在阅读的你也加入。
- 发表于 2022-10-15 13:31
- 阅读 ( 269 )
- 学分 ( 4 )
- 分类:智能合约