数字货币钱包 实现一个以太坊钱包 XToken(0.0)

版权声明:1、本BLOG的目的、形式及内容。   此BLOG为个人维护BLOG,内容均来自原创及互连网转载。最终目的为收集整理自己需要的文章技术等内容,不涉及商业用途。 2、有关原创文章的版权   本BLOG上原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。 3、有关本站侵权   本BLOG所转载的内容,均是本人未发现有对文章版权声明的文章且无来自传统媒体。如 https://blog.csdn.net/xq723310/article/details/82950473

     折腾了几天终于有一个很简陋的钱包了(UI和前端知识太菜了)。目前支持标一些简单的功能。

     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 + "<li>";
 61             html = html + "<p><b>Address:</b>0x"+ address+ "</p>";
 62             html = html + "<p><b>Private Key:</b>0x" + private_key + "</p>";
 63             html = html + "<p><b>Balance:</b>"+web3.fromWei(balance,"ether")+"ether</p>";
 64             html = html + "</li>";
 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

交易详细信息可以看记录

第一个版本基本完成了,问题漏洞还很多,后续会按照计划进行补充。稍后会把源码分享出来。

猜你喜欢

转载自blog.csdn.net/xq723310/article/details/82950473
今日推荐