折腾了几天终于有一个很简陋的钱包了(UI和前端知识太菜了)。目前支持标一些简单的功能。
https://github.com/XuHugo/HDWallet
1、支持标准BIP44的助记词倒入与生成;
2、以太币转账;
3、ERC20代币转账;
分为几个部分,
提示信息:用于显示钱包的一些信息;
网络选择:支持主网,测试网络之间的选择。
助记词:支持标准BIP44的助记词生成,点击show address即可;把BIP44生成的助记词倒入助记词中,可以将账户导入钱包;
账户信息:显示账户的一些基本信息,地址,余额,私钥这个不是必须的,为了测试用,暂时没有删除。
交易信息:转账时填写的必要信息,基本都好理解,只解释一下几个选项,to address,token转账的时候,需要填写token的合约地址;token data,token转账时,填写转账的to address,其他时可以不填写;Token value,token转账时,填写token的数量,其他时间可以不写。
HDWallet钱包目录主要有以下文件和目录:
HDWallet
│ app.js -后端文件
│ package.json -环境配置文件
├─node_modules -Nodeb.js库模块
└─public
├─css
│ bootstrap.min.css -前端排版文件
├─html
│ index.html - 前端主页
└─js
hooked-web3-provider.min.js
lightwallet.min.js
web3.min.js
main.js - 钱包实现主要函数
1、Hooked-web3-Provider模块库,提供自定义程序提供方(custom provider),它使用HTTP与节点通信。这个提供方的独特之处在于,它允许使用密钥签署合约实例的sendTransation()调用,因此不再需要创建交易的数据部分了。
2、LightWallet,它是一个实现BIP32,BIP39和BIP44的HD钱包。LightWallet提供API来创建和签署交易,或者使用LightWallet生成的地址和密钥加密和解密数据。
3、ETH节点使用的是infura,暂时不自己搭建节点,比较好费时间。
助记词的生成
var new_seed = lightwallet.keystore.generateRandomSeed();
获取账户信息
38 lightwallet.keystore.createVault({
39 password: password,
40 seedPhrase: seed,
41 hdPathString: hdPath
42 },function(err, ks){
43 ks.keyFromPassword(password,function(err,pwDerivedKey){
44 if(err)
45 {
46 document.getElementById("info").innerHTML=err;
47 }
48 else
49 {
50 ks.generateNewAddress(pwDerivedKey);
51 var addresses = ks.getAddresses();
52
53 var nets = document.getElementById("network").value;
54 var net = select_net(nets);
55 var web3 = new Web3(new Web3.providers.HttpProvider(net));
56 var html = "";
57 var address = addresses[0];
58 var private_key = ks.exportPrivateKey(address,pwDerivedKey);
59 var balance = web3.eth.getBalance("0x"+address);
60 html = html + "";
61 html = html + "Address:0x"+ address+ "
";
62 html = html + "Private Key:0x" + private_key + "
";
63 html = html + "Balance:"+web3.fromWei(balance,"ether")+"ether
";
64 html = html + " ";
65 document.getElementById("list").innerHTML = html;
66 }
67 });
发送交易
107 var web3 = new Web3(provider);
108
109 var from = document.getElementById("from_address").value;
110 var to = document.getElementById("to_address").value;
111 var gasprice = web3.toWei(document.getElementById("gas_price").value, "Gwei");
112 var data = document.getElementById("data").value;
113 var value = web3.toWei(document.getElementById("ether").value, "ether");
114 var gas = document.getElementById("gas").value;
115 var t_value = document.getElementById("amount").value;
116 if (data!="")
117 {
118 var amount = t_value.toString(16);
119 var len =64-amount.length;
120 var o="0";
121 o=o.repeat(len);
122 data="0xa9059cbb"+"000000000000000000000000"+data.slice(2)+o+amount;
123 document.getElementById("info").innerHTML ="data:"+ data;
124 }
125 if(gas=="")
126 gas=21000;
127 web3.eth.sendTransaction({
128 from: from,
129 to: to,
130 value: value,
131 gas: gas,
132 gasPrice: gasprice,
133 data: data
134 }, function(error, result){
135 if(error)
136 {
137 document.getElementById("info").innerHTML ="sendtransaction:"+ error;
138 }
139 else
140 {
141 document.getElementById("info").innerHTML = "Txn hash: " + result;
142 }
143 })
1、metask地址导入与生成
metask账户地址,网络,余额等信息,再对比一些我自己钱包。
看一下我的钱包,导入助记词后显示结果。
2、ERC20代币转账
交易hash:0xc2c906fd6606388cda1918a0c5901a6995f9b14db10a7eefaa73b3548a3782b2
ERC20代币:0x4BBd18D7E502f6a012BeeDF418F8672B0fF72f10
交易详细信息可以看记录
第一个版本基本完成了,问题漏洞还很多,后续会按照计划进行补充。稍后会把源码分享出来。
https://github.com/XuHugo/HDWallet