以太坊钱包大致分两类
- 基于geth原生钱包
随机生成256位私钥,用密码加密后生成json字符串并存储成keystore文件。
- 基于BIP协议生成
这部分只是将原生钱包的生成私钥部分做了修改,用BIP协议替代了随机256位私钥。
BIP是比特币的升级协议
BIP32是为了方便管理私钥,用一个seed生成密钥树。
BIP39协议是用助记词方式编码了seed。助记词和seed是等效的,助记词是seed的另一种编码格式。
BIP44协议进一步扩展了地址应用范围,覆盖比特币,以太坊等多种格式地址。
基于web3的实现:
//助记词,引用
bip39 = require('bip39');
hdkey = require('ethereumjs-wallet/hdkey');
util = require('ethereumjs-util');
//生成助记词
mnemonic = bip39.generateMnemonic();
//根据助记词,生成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");
.............
//根据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');
网友评论