美文网首页以太坊 ethereum
BIP32 BIP39 BIP44 助记词 以太坊 账户

BIP32 BIP39 BIP44 助记词 以太坊 账户

作者: walker_1992 | 来源:发表于2021-07-14 13:42 被阅读0次

一、什么是HD钱包:

HD 钱包全称是分层确定性(Hierarchical Deterministic)钱包的缩写 HD Wallets,是目前广泛使用的虚拟货币钱包标准。HD钱包从单个根种子(root seed)中创建,为128到256位的随机数,任何兼容HD钱包的根种子也可重新创造整个HD钱包,所以拥有HD钱包的根种子就等于拥有了所有密钥,方便存储、导入及导出。

二、BIP32、BIP39、BIP44:

  • BIP32:定义 Hierarchical Deterministic wallet (简称 "HD Wallet"),是一个系统可以从单一个 seed 产生一树状结构储存多组 keypairs(私钥和公钥)。好处是可以方便的备份、转移到其他相容装置(因为都只需要 seed),以及分层的权限控制等

  • BIP39:将 seed 用方便记忆和书写的单字表示。一般由 12 个单字组成,称为 mnemonic code(phrase),一般为英文,中文称为助记词或助记码

  • BIP44:基于 BIP32 的系统,赋予树状结构中的各层特殊的意义。让同一个 seed 可以支援多币种、多帐户等。各层定义如下:
    m / purpose' / coin_type' / account' / change / address_index
    btc: m/44'/0'/0'/0
    eth: m/44'/60'/0'/0
    m 是固定的
    purpose 是固定的,值为44'
    Coin type
    这个代表的是币种,0代表比特币,1代表比特币测试链,60代表以太坊
    完整的币种列表地址
    Account
    代表这个币的账户索引,从0开始
    Change
    常量0用于外部(收款地址),常量1用于内部(也称为找零地址)。外部用于在钱包外可见的地址(例如,用于接收付款)。内部链用于在钱包外部不可见的地址,用于返回交易变更。 (所以一般使用0)
    address_index
    这就是地址索引,从0开始,代表生成第几个地址,官方建议,每个account下的address_index不要超过20

三、js实现

安装依赖包(npm/yarn 自己选一个)

$ yarn add bip39 ethereumjs-wallet ethereumjs-util 
$ npm install bip39 ethereumjs-wallet ethereumjs-util

代码实现

$ mkdir account_key && cd account_key
$ npm init //默认
$ vim index.js //将下述的代码copy到此文件
$ node index.js //运行 打印结果
const bip39 = require('bip39')
const {hdkey} = require('ethereumjs-wallet')
const util = require('ethereumjs-util')

//1 生成助记词 ;1.1 和 1.2 自己按需。

// 1.1 生成助记词 ;这里用生成的.
let mnemonic = bip39.generateMnemonic() 
// let mnemonic_chinese = bip39.generateMnemonic(128,null,bip39.wordlists.chinese_simplified)
// console.log("中文助记词: " + mnemonic_chinese)

// 1.2 生成助记词 ;这里用写死的.
// let mnemonic = "hold scale hybrid tank dilemma bullet ship language attitude rug tennis host"
console.log("助记词:" + mnemonic)

//2.将助记词转成seed
getSeed = async ()=>{
    let seed = await bip39.mnemonicToSeed(mnemonic)
    console.log("seed:" + util.bufferToHex(seed))
    return seed
}
//3.提取私钥,公钥,账户
obtainAccount = async ()=>{
    let seed = await getSeed()
    //3.通过hdkey将seed生成HD Wallet
    let hdWallet = await hdkey.fromMasterSeed(seed)

    for (let i = 0; i < 5; i++) {
        //4.生成钱包中在m/44'/60'/0'/0/i路径的keypair ethereum
        let key = await hdWallet.derivePath("m/44'/60'/0'/0/" + i)
        //5.从keypair中获取私钥
        console.log("私钥:" + util.bufferToHex(key._hdkey._privateKey))
        //6.从keypair中获取公钥
        console.log("公钥:" + util.bufferToHex(key._hdkey._publicKey))
        //7.使用keypair中的公钥生成地址
        let address = await util.pubToAddress(key._hdkey._publicKey, true)
        //编码地址
        console.log('account',i+1,'0x'+address.toString('hex'))

        console.log("- - - - - - - - - - - - - - - - - - - - - -")
    }
}
obtainAccount()

参考:
1, 理解开发HD 钱包涉及的 BIP32、BIP44、BIP39
2, 区块链HD多链钱包,同一种子管理生成BTC/ETH/EOS钱包助记词、私钥、地址!
2, 以太坊 助记词提取 账户 公钥 私钥 最新实现可用

相关文章

网友评论

    本文标题:BIP32 BIP39 BIP44 助记词 以太坊 账户

    本文链接:https://www.haomeiwen.com/subject/dujypltx.html