三個概念:BIP32允蚣、BIP44、BIP39
BIP32 定義 Hierarchical Deterministic wallet (簡稱 "HD Wallet")呆贿,是一個系統(tǒng)可以從單個seed產(chǎn)生樹狀結(jié)構(gòu)儲存多組 keypairs(私鑰和公鑰)
BIP39 定義錢包助記詞和seed生成規(guī)則嚷兔,一般由 12 -24個單字組成,稱為 mnemonic做入。助記詞列表冒晰,https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
BIP44 基于 BIP32 的系統(tǒng),賦予樹狀結(jié)構(gòu)中的各層特殊的意義竟块。讓同一個 seed 可以支援多幣種壶运、多帳戶等 (btc一般是 m/44'/0'/0’/0,eth一般是 m/44'/60'/0'/0
1浪秘、安裝依賴
npm install bip39 ethereumjs-wallet ethereumjs-util --save
bip39:隨機(jī)產(chǎn)生新的 mnemonic code蒋情,并可以將其轉(zhuǎn)成 binary 的 seed。
ethereumjs-wallet:生成和管理公私鑰耸携,下面使用其中 hdkey 子套件來創(chuàng)建 HD 錢包棵癣。
ethereumjs-util:Ethereum 的一個工具庫。
2夺衍、test.js
var bip39 = require('bip39')
var hdkey = require('ethereumjs-wallet/hdkey')
var util = require('ethereumjs-util')
const myWallet = {
/**
* 生成錢包
*/
createWallet: async () => {
// 生成助記詞
var mnemonic = bip39.generateMnemonic()
console.log('mnemonic------', mnemonic) // hundred shrimp bacon poem enable trim yard slight smile suffer normal cinnamon
// 隨機(jī)數(shù)種子(生成 HD Wallet 首先將 mnemonic code 轉(zhuǎn)成 binary二進(jìn)制的 seed)
var seed = await bip39.mnemonicToSeed(mnemonic)
console.log('seed------', seed)
// 生成 Master Key 地址 "m/44'/60'/0'/0/0" 使用 seed 生成 HD Wallet狈谊。
var hdwallet = hdkey.fromMasterSeed(seed)
console.log('hdwallet------', hdwallet)
// 從路徑 m/44'/60'/0'/0/0 導(dǎo)入 Master Key 并生成 Wallet 中第一個帳戶的第一組 keypair。
var key = hdwallet.derivePath("m/44'/60'/0'/0/0")
console.log('key------', key)
// 使用 keypair 中的私鑰產(chǎn)生 address沟沙。
var privateAddress = util.bufferToHex(key._hdkey._privateKey)
console.log('私鑰address------', privateAddress) // 0x724aecb752fbd954d68c8fe172b0f5d312f12fcd0c3f82bf9c9a76e0df55eaa7
// // 使用 keypair 中的公鑰產(chǎn)生 address河劝。
var address = util.pubToAddress(key._hdkey._publicKey, true)
console.log('公鑰addressBuffer------', address)
// // 獲得以太坊錢包地址
// address = util.toChecksumAddress(address.toString('hex'))
// console.log('十六進(jìn)制的以太坊錢包address------', address)
// 獲得以太坊錢包地址。
var address = util.bufferToHex(key._hdkey._publicKey)
console.log('十六進(jìn)制的以太坊錢包address------', address) // 0x036994d6dda1902c1612154c092828dc326591b22d867f20f69c8a2f43f08ed52d
return address
},
/**
* 通過助記詞恢復(fù)錢包
*/
getWalletByMnemonic: async (mnemonic, pwd) => {
// 通過助記詞和設(shè)定密碼獲取隨機(jī)數(shù)種子
var seed = await bip39.mnemonicToSeed(mnemonic)
// 生成 Master Key 地址 "m/44'/60'/0'/0/0" 使用 seed 生成 HD Wallet尝胆。
var hdWallet = hdkey.fromMasterSeed(seed)
// 從路徑 m/44'/60'/0'/0/0 導(dǎo)入 Master Key 并生成 Wallet 中第一個帳戶的第一組 keypair丧裁。
var key = hdWallet.derivePath("m/44'/60'/0'/0/0")
// 導(dǎo)出私鑰 address。
var privateAddress = util.bufferToHex(key._hdkey._privateKey)
console.log('私鑰address------', privateAddress)
// 獲得以太坊錢包地址含衔。
var address = util.bufferToHex(key._hdkey._publicKey)
console.log('十六進(jìn)制的以太坊錢包address------', address)
}
}
myWallet.createWallet()
myWallet.getMyPrivateByMnemonic('hundred shrimp bacon poem enable trim yard slight smile suffer normal cinnamon')
3煎娇、執(zhí)行node test.js
image.png