如何在DAPP應用實現自帶錢包轉帳功能?

image

1

爲何DAPP生態須要自帶錢包功能?

區塊鏈是一個偉大的發明,它改變了生產關係。不少生態,有了區塊鏈技術,能夠由全公司員工的"全員合夥人"變成了全平臺的」全體合夥人」了,是真正的共享經濟模式。css

image

什麼意思呢?舉例來講,如今不少互聯網平臺,好比淘寶,普通消費者只是一個利益貢獻者,這個平臺運營的好很差跟用戶沒有關係。但在有代幣的平臺上,每個用戶的角色都發生了轉變:他們不僅僅是某個平臺的用戶,還持有了它的代幣。這些代幣通常都是有限的,使用這個平臺的人數越多,代幣的需求就會越旺盛,代幣在市場上供需就會傾斜,就會漲價。html

因此這時候用戶跟平臺方,實際上是站在同一邊的。也就是說,在+互聯網時代,經過使用互聯網技術提高信息流通效率後,消費者培養了淘寶這個獨角獸平臺,可是這個受益主要被馬雲團隊享受,創造了一箇中國首富,平臺的廣大用戶並無獲得平臺增加紅利的好處。可是,在+區塊鏈時代,全部的用戶都是平臺的利益相關方,都是創業者。他們會隨着這個平臺的增加而一塊兒受益,這個夢想的力量也就會更大。前端

目前DAPP業務生態中,不少項目不自帶錢包或者交易所的。我認爲DAPP只帶錢包功能將會是一個基本配置。以下圖理解,node

image

1) 當生態中沒有TOKEN經濟時,這個平臺是固態的,誰是用戶,誰是利益平臺最終受益方,是靜態固化的。這是通用的+互聯網模式,海量的用戶製造了BATJ等獨角獸企業,但他們永遠只是貢獻者,自身沒有從中分享更多的利益。linux

2) 當生態中包含TOKEN,而後經過上交易所完成利益變換時,我認爲這時的生態是液態的。生態中的利益兌換能夠經過交易所進行轉換。可是這樣沒法去中心化,沒法去中介化,存在着不便捷和被收費的問題。這種模式下,沒法造成通證經濟的自循環生態。同時因爲交易所的資產安全,被攻擊,對現實金融生態的影響等緣由,是不少國家明令禁止的。android

3) 當生態中除了TOKEN,還自帶錢包後,我認爲這個區塊鏈生態才過渡到氣態。在氣態下,通證和資產的兌換是無處不在,很是方便的。認同這個平臺的管理方和用戶方自成循環體系,高效的促進了生態內的資產流通。ios

七部委的規定「任何所謂的代幣融資交易平臺不得從事法訂貨幣與代幣、「虛擬貨幣」相互之間的兌換業務」,說明限制的是中心化交易所的作法,並無禁止DAPP自帶錢包功能。這應該也是鼓勵的一種方式,DAPP生態自循環,不會影響現有金融秩序。git

以輝哥看,DAPP自帶錢包將會是區塊鏈項目的一個標配功能。github

2

錢包的分類

2.1 以太坊客戶端Ethereum Wallet,Geth,DAPP自帶錢包的區別web

1) Ethereum Wallet等應用

Ethereum Wallet客戶端對應的是Mist項目,如今此客戶端大多都稱爲Ethereum Wallet,也有稱做Mist客戶端的,知道它們兩個指的是同一個客戶端便可。此客戶端使用JavaScript進行開發,支持windows、linux和OSX三類操做系統,是一個圖形化操做界面的客戶端。介紹到這裏,你們可能就明白了,若是你想經過API來調用以太坊的接口,選擇此方式是行不通的。

Ethereum Wallet客戶端主要是爲用戶提供可視化操做的客戶端,下載安裝以後經過相應的圖形化界面便可進行建立帳戶、轉帳、查詢餘額等操做。

Ethereum Wallet客戶端主要功能:

  • 建立帳戶

  • 兌換以太幣:內置了比特幣、其它競爭幣與以太幣兌換功能

  • 部署智能合約:代幣合約、衆籌合約、自治組織合約等

  • 以太幣轉帳操做

  • 備份錢包等其餘功能

以上全部功能操做都是啓動客戶端程序以後,經過操做界面或菜單進行操做。智能合約部分須要事先編寫好對應的代碼,經過客戶端進行發佈。 屬於此類獨立錢包APP應用的還有imToken等。

2)Geth錢包介紹

Geth是go-ethereum項目的客戶端,也是目前使用最普遍的客戶端。支持windows、linux和OSX三類操做系統。針對此係統網上有大量的資料能夠參考,github上的wiki文檔使用說明也比較詳細,(https://github.com/ethereum/go-ethereum/wiki)。經過此客戶端能夠進行基本全部的以太坊相關操做。

Geth客戶端主要功能:

  • JavaScript Console:經過後臺進行命令操做;

  • Management API:管理相關的API;

  • JSON-RPC server:JSON-RPC相關調用API 不管經過API或則console均可以進行相關操做,好比:

  • 帳號管理(建立帳號、鎖定帳號、解除鎖定等);

  • 查詢帳戶信息;

  • 查詢交易信息;

  • 查詢gasPrice;

  • 交易;

  • 挖礦&中止挖礦;

  • 部署智能合約

  • 等其餘相關功能。

使用Geth客戶端能夠經過對接API(目前交易平臺經常使用的方式),或直接經過命令行進行操做。與Ethereum Wallet相比,沒有可視化的操做界面,基本上都是經過命令來完成的。

Geth錢包是Ethereum生態的技術實現的一部分,不是爲了給終端用戶使用的應用型錢包。

3)DAPP自帶錢包介紹

DAPP自帶錢包是在Geth基礎上開發出來的移動端 App或者網頁版錢包,例如彩貝APP帳號自帶的ColorBay通證轉帳功能的錢包。這個錢包依附於彩貝APP,不能獨立存在。

2.2 中心化錢包和非中心化的區別

根據私鑰存儲的位置可分爲兩類:

  • 中心化私鑰存儲的錢包,好比火幣的錢包;

  • 去中心化錢包,私鑰存儲在用戶端,好比 imtoken 錢包,彩貝錢包。

1)去中心化錢包

去中心化錢包不是本節要講的重點,這裏只給你們簡單介紹一下。不管是中心化的錢包或去中心化的錢包,在 App 層面都是很輕量級的,App 內是不會內置一個 Geth 節點,交易的查詢或發送都是經過服務器來進行操做,不一樣點是交易簽名的私鑰由誰來保管和負責。

去中心化的錢包有個關鍵詞:助記詞。能夠用下面的表達式來形容助記詞的做用:

私鑰 = 助記詞 = keystore+密碼

經過上面的公式能夠看出助記詞的重要做用,也是去中心錢包功能的一個亮點。當在這類錢包中建立一個帳戶以後,錢包會根據生成的私鑰文件,生成一套助記詞,可爲英文可爲中文,經過助記詞能夠反向計算出 keystore + 密碼。助記詞由用戶手抄存放在安全的地方,當進行交易時,輸入助記詞對交易進行簽名,發送交易。當助記詞丟失,也就意味着失去了私鑰,而錢包通常不會保存用戶的私鑰信息,資產將永久丟失。

去中心化錢包的好處是不用擔憂平臺從中做梗,不用擔憂平臺被黑客攻擊而致使資產損失,但要求我的有必定的私鑰保存能力。

2) 中心錢包

所謂中心化錢包就是將全部的私鑰文件存儲在錢包服務商的服務器內,由服務商來保管這些私鑰文件,也就是說資產屬於你,但私鑰不禁你保管。這樣作的好處是用戶根本不用記住私鑰,只用記住在平臺所開設的帳戶、登陸密碼和支付密碼便可。即便忘記了密碼,仍是能夠經過平臺提供的忘記密碼進行找回,固然,這樣就不具備去中心化錢包的優勢了。

彩貝錢包屬於依附彩貝生態的中心化錢包,幫助彩貝社區完成通證經濟的閉環生態建設。

3

錢包的核心功能

錢包對外呈現可能有不一樣的功能,充值、提現、轉帳等,但從本質上來講只有一個功能,那就是轉帳。區塊鏈本質上就是一個帳本,記錄着一筆筆交易,錢包固然離不開這個本質。

具體功能說明:

  • 充值是錢包的外部帳戶向錢包的地址轉帳;

  • 提現是錢包的帳戶向錢包以外的地址轉帳;

  • 轉帳功能包括錢包內地址互轉和向錢包外地址轉帳;

在這個過程中也對應着錢包帳戶資金的增長與減小。

3.1 用戶地址如何分配

用戶在使用錢包的時候確定須要有一個屬於當前帳戶對應在區塊鏈上的地址,這個地址如何生成呢?很多開發人員是這樣實現的:每次當用戶註冊時就調用 Geth 節點的personal_newAccount方法生成一個地址,並將地址存放在 Geth 節點默認的位置。這種方式能夠實現,但從技術上和安全上來說是不可取的。

  • 性能瓶頸之一,調用 Geth 節點生成地址很是耗時,特別是當節點在處理一些同步或高消耗的工做時。

  • 性能瓶頸之二,當 Geth 節點下的私鑰愈來愈多,Geth 啓動會變得漫長。

  • 安全問題,Geth 節點對外要廣播交易,又要保存敏感的私鑰信息,安全問題巨大。

**優化以後的作法是事先批量生成地址,當用戶註冊時只用把地址分配給用戶便可。**這樣作的好處是:

  • 私鑰的存儲與 Geth 節點相隔離,確保私鑰與外網的隔離性,從而確保私鑰的安全;

  • 性能的保障,當用戶註冊時只是將數據庫的數據創建了一個關聯,而不用去執行費時的加密算法來生成私鑰和文件。

  • 此種方法生成 Web3j 提供了相應的建立方法,可在無 Geth 節點的狀況下經過代碼直接生成符合私鑰規則的公私鑰。固然,若是有開發能力也能夠經過 Geth 的源代碼中的私鑰生成方法抽離出一個單獨的與網絡無關的生產私鑰程序。

3.2  充值交易

在比特幣的錢包中,有子帳戶的概念,只須要在一個總帳戶下建立 N 多子帳號,用戶充值到此子帳號的比特幣一樣的會顯示在錢包上,同時又提供了查詢一個地址全部交易的方法。遺憾的是以太幣並無提供此類接口,只能經過遍歷區塊交易的方法來判斷是否有對應帳戶的充值交易。

相關操做:

  • 查詢區塊高度,比對是不是新生成的區塊,eth_blockNumber;

  • 查看區塊內容及詳細交易,eth_gethBlockByNumber;

    比對交易的 toAddress 是否爲本錢包的地址,若是是則記錄此筆交易到數據庫,並記錄交易狀態(pending、確認次數等);

  • 保證入庫和記帳的冪等性,由於會屢次查詢到同一筆交易。

  • 確認次數 並非咱們查詢區塊鏈中的交易就說明這邊交易已經成功了,比特幣是默認確認12此以後,此交易幾乎不會被篡改,以太坊默認6次,那麼怎麼計算確認次數呢?

確認次數 = 當前區塊高度 - 交易所在區塊高度 + 1

此處注意事項:交易有可能會被孤立,在執行此公式時須要驗證一下區塊中此交易是否仍是在那個區塊上,是否已經被回滾。一樣的,要作好冪等性保障。

3.3 提現交易

提現交易一樣涉及到上提到的知識點,同時它又有須要額外注意的事項。 提現地址的合法性檢查,可參考源代碼中的校驗,此合法性檢查能夠避免後續不少問題的出現,好比 nonce 值的維護。

交易的金額檢查,nonce 值檢查,特別是私鑰與 Geth 節點分離以後本身來維護私鑰時 nonce 值會是一個很大的問題,好比前一筆交易失敗,nonce 值須要回退,此時後一筆交易已經發出,由於前一筆 nonce 沒有被補齊,後一筆遲遲不會被交易。這些都須要業務進行特殊判斷和處理。 查詢一個地址 nonce,eth_getTransactionCount。

3.4 提現與轉帳

提現與轉帳都是發起一筆交易,在以太坊的 json-rpc 中已經提到能夠經過 eth_sendTransaction 和 personal_sendTransaction 直接進行轉帳,這是 Geth 節點所支持的。轉帳前能夠經過 unlock 方法先將帳戶解鎖,這些以前章節都有提到過。

但針對私鑰單獨存儲的狀況,上面的方式並不適用,可經過將交易先簽名再廣播的模式:

  • 簽名交易(可自主開發,可利用節點自己),eth_sign。

  • 廣播交易,可經過 eth_sendRawTransaction 進行廣播。

  • 錢包的內部轉帳只不過是 from 和 to 地址都是錢包的地址而已,業務層進行適當的處理。 經過這種模式,節點與外界打交道,僅有的功能就是廣播交易,在此以前的全部操做均可以經過內網進行操做,極大的確保的私鑰和交易的安全性。

更多功能查看官網的go-ethereum GETH錢包[RPC,API]連接(https://github.com/ethereum/go-ethereum/wiki)。

4

實現WEB WALLET錢包分配和轉帳功能

4.1 庫模塊介紹

建立DAPP 錢包或者PC WEB錢包,須要在Geth基礎上實現功能。本章介紹2個庫模塊,下降錢包實現的難度。

1)Hooked-web3-Provider模塊

Hooked-web3-Provider模塊庫(https://www.npmjs.com/package/hooked-web3-provider)提供自定義程序提供方(custom provider),它使用HTTP與geth通訊。這個提供方的獨特之處在於,它容許使用密鑰簽署合約實例的sendTransation()調用,所以再也不須要建立交易的數據部分了。

自定義程序提供方實際上重寫了web3.eth.sendTransaction()方法的實現,因此基本上它容許簽署合約實例的sendTransaction()調用以及web3.eth.sendTransation()調用。合約實例的sendTransaction()方法在內部生成交易數據,並調用web3.eth.sendTransation()廣播交易。

2)LightWallet模塊

LightWallet是一個實現BIP32,BIP39和BIP44(https://github.com/bitcoin/bips)的HD錢包。LightWallet提供API來建立和簽署交易,或者使用LightWallet生成的地址和密鑰加密和解密數據。

LightWallet API被分紅4個命名空間,即keystore、signing、encryption和txutils。signing、encrpytion和txutils分別用來提供API以簽名交易,非對稱的密碼和建立交易,而keystore命名空間用於建立keystore、生成種子等。keystore是一個存儲加密種子和密鑰的對象。

若是使用Hooked-Web3-Provider,keystore命名空間實現交易簽名者方法,該方法要求籤署we3.eth.sendTransation()調用。所以keystore命名空間對於在其中發現的地址能夠自動建立和簽署交易。實際上,LightWallet的主要目的是成爲Hooked-Web3-Provider的一個簽名提供方。

能夠配置密鑰存儲實例,來建立和簽署交易或者加密和解密數據。簽署交易用secp256k1參數,加密和解密用curve25519參數。

LightWallet的種子是一個12詞的助記符,容易記住但不容易進行破解。它不是任意12個詞,而是LightWallet生成的種子。LightWallet生成的種子在選擇詞和其餘東西方面有特定的屬性。

4.2 重點代碼介紹

此環境代碼部署在輝哥的Ubuntu虛擬機上測試成功。若是不懂如何安裝Ubuntu虛擬機的,可參考《第一課 如何在WINDOWS環境下搭建以太坊開發環境》(https://www.jianshu.com/p/683ea7d62a39)完成配置。

1)代碼結構分析

WebWallet錢包目錄主要有如下文件和目錄,各目錄功能描述解釋以下:

WebWallet │  app.js    -管理整個應用的App對象 │  package.json -環境配置文件 ├─node_modules -Nodeb.js庫模塊,不作修改 │ └─public ├─css │      bootstrap.min.css -前端排版文件 │ ├─html │      index.html - 前端主頁 │ └─js hooked-web3-provider-Formatted.min.js - 格式化可讀的「hooked-web3-provider.min.js」文件,供閱讀參考 hooked-web3-provider.min.js - 實現hooked-web3-provider功能庫文件 lightwallet-Formatted.min.js  - 格式化可讀的「lightwallet.min.js」文件 lightwallet.min.js   - 實現lightwallet功能庫文件 main.js - 本案例實現主要函數 web3.min.js -web3.js的實現文件

2)重點代碼解讀

重點實現代碼在main.js文件中。

  • generate_seed函數代碼
function generate_seed()

{

    /*產生12個單詞的助記詞*/

    var new_seed = lightwallet.keystore.generateRandomSeed();    

document.getElementById("seed").value = new_seed;

        /*產生錢包地址*/

    generate_addresses(new_seed);

}
複製代碼

generate_seed函數功能:
調用lightwallet函數產生seed助記詞,產生錢包地址。

  • generate_addresses函數代碼
function generate_addresses(seed)

{

    if(seed == undefined)

    {

        /*讀取輸入框的助記詞*/

        seed = document.getElementById("seed").value;

    }

  /*判斷是不是有效的助記詞*/ 

   if(!lightwallet.keystore.isSeedValid(seed))

    { 

       document.getElementById("info").innerHTML = "Please enter a valid seed";

        return;

    }

  /*須要產生多少個地址*/ 

   totalAddresses = prompt("How many addresses do you want to generate");

  /*獲取地址數量*/

    if(!Number.isInteger(parseInt(totalAddresses)))

    {

        document.getElementById("info").innerHTML = "Please enter valid number of addresses";

        return;

    } 

 /*隨機產生密碼*/ 

   var password = Math.random().toString(); 

 /*建立並顯示地址,私鑰和帳戶餘額*/ 

   lightwallet.keystore.createVault({ 

       password: password,

        seedPhrase: seed

    }, function (err, ks) {

          /*以用戶密碼做爲輸出,產生的Uint8類型的數組的對稱密鑰,這個密鑰用於加密和解密keystore*/ 

       ks.keyFromPassword(password, function (err, pwDerivedKey) {

            if(err)

            {                

document.getElementById("info").innerHTML = err; 

           } 

           else 

           { 

               /*經過seed助記詞密碼在keystore產生totalAddresses個地址/私鑰對。這個地址/私鑰對可經過ks.getAddresses()函數調用返回*/  

              ks.generateNewAddress(pwDerivedKey, totalAddresses); 

               var addresses = ks.getAddresses();                                 

 /*【注意】爲了能在其餘PC瀏覽器可以訪問,此處IP要改成UBUNTU所在的GETH環境的IP*/ 

               //var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); 

               var web3 = new Web3(new Web3.providers.HttpProvider("http://192.168.0.106:8545")); 

               var html = "";  

                  /*組裝地址/私鑰對爲HTML,以便顯示*/  

              for(var count = 0; count < addresses.length; count++) 

               {  

                  var address = addresses[count]; 

                   /*根據地址和pwDerivedKey生成私鑰*/  

                  var private_key = ks.exportPrivateKey(address, pwDerivedKey); 

                   /*獲取餘額*/ 

                   var balance = web3.eth.getBalance("0x" + address); 

                   html = html + "<li>"; 

                   html = html + "<p><b>Address: </b>0x" + address + "</p>";

                    html = html + "<p><b>Private Key: </b>0x" + private_key + "</p>";

                    html = html + "<p><b>Balance: </b>" + web3.fromWei(balance, "ether") + " ether</p>"; 

                   html = html + "</li>"; 

               }               

 document.getElementById("list").innerHTML = html; 

           } 

       });

    });

}
複製代碼

generate_seed函數功能說明: 根據助記詞和須要的地址數量產生帳戶地址,並顯示出來。

【說明】lightwallet實現了相同的SEED能夠產生相同的帳戶地址。

  • send_ether函數代碼
function send_ether()

{

    var seed = document.getElementById("seed").value; 

 /*seed是否有效?*/   

 if(!lightwallet.keystore.isSeedValid(seed)) 

   { 

       document.getElementById("info").innerHTML = "Please enter a valid seed";

        return;

    } 

   var password = Math.random().toString();  

  lightwallet.keystore.createVault({ 

       password: password,

        seedPhrase: seed

    }, function (err, ks) {

          /*以用戶密碼做爲輸出,產生的Uint8類型的數組的對稱密鑰,這個密鑰用於加密和解密keystore*/ 

       ks.keyFromPassword(password, function (err, pwDerivedKey) {

            if(err)

            { 

               document.getElementById("info").innerHTML = err;            }  

          else

            { 

               ks.generateNewAddress(pwDerivedKey, totalAddresses); 

               ks.passwordProvider = function (callback) {                    callback(null, password); 

               };  

                              /*【注意】爲了能在其餘PC瀏覽器可以訪問,此處IP要改成UBUNTU所在的GETH環境的IP*/

          /*新建HookedWeb3Provider, 參考https://www.npmjs.com/package/hooked-web3-provider*/                    /**

                var provider = new HookedWeb3Provider({                    host: "http://localhost:8545",    

                transaction_signer: ks*/ 

               var provider = new HookedWeb3Provider({                    host: "http://192.168.1.135:8545", 

                   transaction_signer: ks                                     

 }); 

         /*以HookedWeb3Provider爲對象產生web3,

            不一樣於寵物商店案例的new Web3.providers.HttpProvider('http://localhost:8545');*/   

             var web3 = new Web3(provider);

                var from = document.getElementById("address1").value; 

               var to = document.getElementById("address2").value;

                var value = web3.toWei(document.getElementById("ether").value, "ether"); 

         /*從源地址錢包向目標地址錢包發送value的以太幣*/  

              web3.eth.sendTransaction({

                    from: from,

                    to: to, 

                   value: value, 

                   gas: 21000 

               }, function(error, result){

                    if(error)  

                  {                           

document.getElementById("info").innerHTML = error;   

                 } 

                   else

                    {                        

document.getElementById("info").innerHTML = "Txn hash: " + result; 

                   } 

               }) 

           }

        }); 

   });

}
複製代碼

send_ether函數功能說明: 該函數實現ETH轉帳功能。

【說明】爲了在你的測試機上能夠跑通代碼,必定注意修改IP地址爲代碼所在的機器IP。

5

WEB WALLET錢包功能測試

由於輝哥在本地配置的Ubuntu虛擬機屏幕比較小,採用使用Xshell 4進行SSH遠程登陸的方式,採用本地windows chrome瀏覽器的方式進行演示的方式。各位看官也能夠直接在Ubuntu上操做的方式完成。

Ubuntu機器的ip地址爲「192.168.1.135」,相關的main.js的2處IP地址也改成了「192.168.1.135」,並更新部署到Ubuntu工做目錄下。

5.1 啓動GETH開發實例

啓動Ubuntu遠程鏈接後,窗口輸入命令用於運行GETH環境。

geth --dev --rpc --rpccorsdomain "*" --rpcaddr "0.0.0.0" --rpcport "8545" --mine --unlock=0 --datadir testNet console 2>> test.log

針對GETH的命令參數稍做解釋,具體參考文章《第五課 以太坊客戶端Geth命令用法-參數詳解》。(https://www.jianshu.com/p/c0b62ce0aa44)

說明:

  • --dev表示啓動開發環境;

  • --rpc表示啓用HTTP-RPC服務器;

  • --rpccorsdomain ""表示用於容許一些特定域與geth通訊。通配符表示可與任何域名通訊。

  • --rpcaddr "0.0.0.0" 表示geth服務器能夠到達哪一個IP地址。默認的是127.0.0.1。將它的值改成0.0.0.0,這表示該服務器可使用任何IP地址到達。

  • --rpcport "8545" 表示HTTP-RPC服務器監聽端口(默認值:8545)

  • --mine表示打開挖礦

  • --unlock=0表示解鎖帳號0,geth默認建立的帳戶,命令啓動後系統提示「Passphrase:」回車輸入密碼爲空後便可解鎖帳號0。

運行成功後,輸入「eth.accounts」能夠看到geth自動建立的一個默認帳戶地址爲「0x5eaba24091f993917fb35188add523c501dc1354」。

image

5.2 啓動APP服務

在XShell 4新開一個窗口連接,進入到輝哥工程目錄~/work/WebWallet,而後啓動本APP。

node app.js

操做截圖以下:

image

5.3 Web Wallet基本功能操做

1)打開WEB錢包網址

image

2)點擊"Generate New Seed"產生種子

點擊"Generate New Seed"按鈕,輸入須要產生子帳戶地址個數,例如2個,

image

界面上顯示產生的助記詞seed和對應的帳戶信息:

image

記錄下相關信息:

  • SEED:obtain warm allow bicycle mushroom fiber shell tower twenty corn cherry close

  • Address1: 0xe45d865ed260fdf2409f66d4a9499a664943079c

  • Address2: 0x09da12a3c1e0675c29e14967a3be765b008205e4

3)給目標地址發送ETH

回到geth環境,從系統帳戶account[0]給目標帳戶地址打100個ETH。

eth.sendTransaction({from: '0x5eaba24091f993917fb35188add523c501dc1354', to: '0xe45d865ed260fdf2409f66d4a9499a664943079c', value: web3.toWei(100, "ether")})

操做截圖以下:

image

4)查看目標地址信息

點擊主頁的"Generate Details"按鈕,能夠刷新帳戶信息。LightWallet庫函數中,只要是相同的seed,產生的帳戶地址是相同的。

點擊查看,能夠發現目標帳戶地址"0xe45d865ed260fdf2409f66d4a9499a664943079c"收到了100個ETH。

image

帳戶信息

5)錢包內帳戶轉帳

目標:

從第一個帳戶地址「0xe45d865ed260fdf2409f66d4a9499a664943079c」轉發9個ETH到第二個帳戶地址「0x09da12a3c1e0675c29e14967a3be765b008205e4」

image

執行成功會更新提示Txn hash值。

image

此時點擊下「Generate Detail」按鈕,發現2個帳戶餘額發生了9個ETH的變化。

至此,把DAPP應用中,爲何須要錢包功能,錢包功能的分類,一個演示基本的錢包實現基本講明白了。須要學習更多內容可參考官網接口文檔和說明。

6

參考文檔

1,ethereumjs-tx https://www.npmjs.com/package/ethereumjs-tx Github代碼: https://github.com/ethereumjs/ethereumjs-tx

2,hooked-web3-provider https://www.npmjs.com/package/hooked-web3-provider Github代碼: https://github.com/consensys/hooked-web3-provider

3,web端錢包源碼 1)eth web: https://github.com/ConsenSys/eth-lightwallet 2).android: https://github.com/walleth/walleth 3).IOS:     https://github.com/ethers-io/EthersWallet-ios

4,WEB3.JS完整文檔 https://github.com/ethereum/wiki/wiki/JavaScript-API WEB3.JS代碼 https://github.com/ethereum/web3.js

5,go-ethereum GETH錢包[RPC,API] https://github.com/ethereum/go-ethereum/wiki

6,以太坊錢包的開發 https://blog.csdn.net/u011494083/article/details/79654872 https://blog.csdn.net/u011494083/article/details/79655830 https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactioncount

7,第08課:開發以太坊錢包的基本思路與安全[中心化錢包和去中心化錢包講的不錯] https://blog.csdn.net/su_bo_2010/article/details/80419483

8,以太坊客戶端Ethereum Wallet與Geth區別簡介 https://blog.csdn.net/wuxianbing2012/article/details/79777921

9,[以太坊源代碼分析] V. 從錢包到客戶端 https://blog.csdn.net/teaspring/article/details/78350888

10,【區塊鏈開發】從零構建基於以太坊(Ethereum)錢包Parity聯盟鏈 https://ke.qq.com/course/254661

11,基於以太坊的電子錢包開發分析 https://mp.weixin.qq.com/s/YQNlYozCvDGxyACliKDsgA

12,《區塊鏈項目開發指南》- Narayan Prusty[India]

13,BIP32,BIP39協議-關於HD錢包和助記種子規範 https://github.com/bitcoin/bips

14,格式化JS工具 http://tool.oschina.net/codeformat/js

15,第03課:以太坊常見 JSON-RPC 接口解析 https://blog.csdn.net/su_bo_2010/article/details/80095187

本文做者:HiBlock區塊鏈技術佈道羣-筆名輝哥

原文發佈於簡書,原文地址:https://www.jianshu.com/p/139a71c0c497

轉載請聯繫做者

加微信baobaotalk_com,加入技術佈道羣

如下是咱們的社區介紹,歡迎各類合做、交流、學習:)

image
相關文章
相關標籤/搜索