学习一:以太坊钱包

作者: Jacky_MYD | 来源:发表于2019-08-09 09:58 被阅读1次

    三个概念:BIP32、BIP44、BIP39

    BIP32 定义 Hierarchical Deterministic wallet (简称 "HD Wallet"),是一个系统可以从单个seed产生树状结构储存多组 keypairs(私钥和公钥)

    BIP39 定义钱包助记词和seed生成规则,一般由 12 -24个单字组成,称为 mnemonic。助记词列表,https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

    BIP44 基于 BIP32 的系统,赋予树状结构中的各层特殊的意义。让同一个 seed 可以支援多币种、多帐户等 (btc一般是 m/44'/0'/0’/0,eth一般是 m/44'/60'/0'/0

    1、安装依赖

    npm install bip39 ethereumjs-wallet ethereumjs-util --save
    

    bip39:随机产生新的 mnemonic code,并可以将其转成 binary 的 seed。

    ethereumjs-wallet:生成和管理公私钥,下面使用其中 hdkey 子套件来创建 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
            
            // 随机数种子(生成 HD Wallet 首先将 mnemonic code 转成 binary二进制的 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 导入 Master Key 并生成 Wallet 中第一个帐户的第一组 keypair。
            var key = hdwallet.derivePath("m/44'/60'/0'/0/0") 
            console.log('key------', key)
    
            // 使用 keypair 中的私钥产生 address。
            var privateAddress = util.bufferToHex(key._hdkey._privateKey)
            console.log('私钥address------', privateAddress) // 0x724aecb752fbd954d68c8fe172b0f5d312f12fcd0c3f82bf9c9a76e0df55eaa7
    
            // // 使用 keypair 中的公钥产生 address。
            var address = util.pubToAddress(key._hdkey._publicKey, true) 
            console.log('公钥addressBuffer------', address)
    
            // // 获得以太坊钱包地址
            // address = util.toChecksumAddress(address.toString('hex'))
            // console.log('十六进制的以太坊钱包address------', address)
    
            // 获得以太坊钱包地址。
            var address = util.bufferToHex(key._hdkey._publicKey)
            console.log('十六进制的以太坊钱包address------', address) // 0x036994d6dda1902c1612154c092828dc326591b22d867f20f69c8a2f43f08ed52d
            return address
        },
        /**
         * 通过助记词恢复钱包
         */
        getWalletByMnemonic: async (mnemonic, pwd) => {
            // 通过助记词和设定密码获取随机数种子
            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 导入 Master Key 并生成 Wallet 中第一个帐户的第一组 keypair。
            var key = hdWallet.derivePath("m/44'/60'/0'/0/0") 
    
            // 导出私钥 address。
            var privateAddress = util.bufferToHex(key._hdkey._privateKey)
            console.log('私钥address------', privateAddress) 
    
            // 获得以太坊钱包地址。
            var address = util.bufferToHex(key._hdkey._publicKey)
            console.log('十六进制的以太坊钱包address------', address)
        }
    }
    myWallet.createWallet()
    myWallet.getMyPrivateByMnemonic('hundred shrimp bacon poem enable trim yard slight smile suffer normal cinnamon')
    

    3、执行node test.js

    image.png

    源码地址:https://github.com/Jacky-MYD/eth-wallet

    相关文章

      网友评论

        本文标题:学习一:以太坊钱包

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