以太坊錢包大致分兩類
- 基于geth原生錢包
隨機生成256位私鑰,用密碼加密后生成json字符串并存儲成keystore文件。
- 基于BIP協(xié)議生成
這部分只是將原生錢包的生成私鑰部分做了修改,用BIP協(xié)議替代了隨機256位私鑰。
BIP是比特幣的升級協(xié)議
BIP32是為了方便管理私鑰,用一個seed生成密鑰樹。
BIP39協(xié)議是用助記詞方式編碼了seed。助記詞和seed是等效的,助記詞是seed的另一種編碼格式。
BIP44協(xié)議進一步擴展了地址應(yīng)用范圍,覆蓋比特幣,以太坊等多種格式地址。
基于web3的實現(xiàn):
//助記詞,引用
bip39 = require('bip39');
hdkey = require('ethereumjs-wallet/hdkey');
util = require('ethereumjs-util');
//生成助記詞
mnemonic = bip39.generateMnemonic();
//根據(jù)助記詞,生成seed,獲取key(公私鑰對)
seed = bip39.mnemonicToSeed(mnemonic);
hdWallet = hdkey.fromMasterSeed(seed);
//key0
key0 = hdWallet.derivePath("m/44'/60'/0'/0/0");
//key1
key1 = hdWallet.derivePath("m/44'/60’/0’/0/1");
.............
//根據(jù)key0生成錢包地址
address0 = util.toChecksumAddress(util.pubToAddress(key0._hdkey._publicKey, true).toString('hex'));
//獲取key0私鑰
privateKey0 = "0x" + key0._hdkey._privateKey.toString('hex');
//用私鑰獲取以太坊賬戶account0
account0 = web3.eth.accounts.privateKeyToAccount(privateKey0);
//加密私鑰并生成keystore的json文件
acc0json = web3.eth.accounts.encrypt(privateKey, 'password');
//用keystore文件獲取以太坊賬戶account0
account0 = web3.eth.accounts.decrypt(acc0json,'password');