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

     折腾了几天终于有一个很简陋的钱包了(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

     

    你可能感兴趣的:(数字货币钱包,数字货币钱包)