學(xué)習(xí)一:以太坊錢包

三個(gè)概念:BIP32、BIP44、BIP39

BIP32 定義 Hierarchical Deterministic wallet (簡(jiǎn)稱 "HD Wallet"),是一個(gè)系統(tǒng)可以從單個(gè)seed產(chǎn)生樹(shù)狀結(jié)構(gòu)儲(chǔ)存多組 keypairs(私鑰和公鑰)

BIP39 定義錢包助記詞和seed生成規(guī)則,一般由 12 -24個(gè)單字組成,稱為 mnemonic。助記詞列表,https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

BIP44 基于 BIP32 的系統(tǒng),賦予樹(shù)狀結(jié)構(gòu)中的各層特殊的意義。讓同一個(gè) 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 子套件來(lái)創(chuàng)建 HD 錢包。

ethereumjs-util:Ethereum 的一個(gè)工具庫(kù)。

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 中第一個(gè)帳戶的第一組 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
    },
    /**
     * 通過(guò)助記詞恢復(fù)錢包
     */
    getWalletByMnemonic: async (mnemonic, pwd) => {
        // 通過(guò)助記詞和設(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 中第一個(gè)帳戶的第一組 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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容