第十四課 如何在DAPP應用實現自帶錢包轉賬功能?

筆名輝哥發表於2018-11-15

第十四課 如何在DAPP應用實現自帶錢包轉賬功能?

1,為什麼DAPP生態需要自帶錢包功能?

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

第十四課 如何在DAPP應用實現自帶錢包轉賬功能?

什麼意思呢?舉例來說,現在很多網際網路平臺,比如淘寶,普通消費者只是一個利益貢獻者,這個平臺運營的好不好跟使用者沒有關係。但在有代幣的平臺上,每一個使用者的角色都發生了轉變:他們不單單是某個平臺的使用者,還持有了它的代幣。這些代幣一般都是有限的,使用這個平臺的人數越多,代幣的需求就會越旺盛,代幣在市場上供需就會傾斜,就會漲價。所以這時候使用者跟平臺方,其實是站在同一邊的。也就是說,在+網際網路時代,通過使用網際網路技術提升資訊流通效率後,消費者培養了淘寶這個獨角獸平臺,但是這個受益主要被馬雲團隊享受,創造了一箇中國首富,平臺的廣大使用者並沒有得到平臺增長紅利的好處。但是,在+區塊鏈時代,所有的使用者都是平臺的利益相關方,都是創業者。他們會隨著這個平臺的增長而一起受益,這個夢想的力量也就會更大。 目前DAPP業務生態中,很多專案不自帶錢包或者交易所的。我認為DAPP只帶錢包功能將會是一個基本配置。如下圖理解, 1) 當生態中沒有TOKEN經濟時,這個平臺是固態的,誰是使用者,誰是利益平臺最終受益方,是靜態固化的。這是通用的+網際網路模式,海量的使用者製造了BATJ等獨角獸企業,但他們永遠只是貢獻者,自身沒有從中分享更多的利益。 2) 當生態中包含TOKEN,然後通過上交易所完成利益變換時,我認為這時的生態是液態的。生態中的利益兌換可以通過交易所進行轉換。但是這樣無法去中心化,無法去中介化,存在著不便捷和被收費的問題。這種模式下,無法形成通證經濟的自迴圈生態。同時由於交易所的資產安全,被攻擊,對現實金融生態的影響等原因,是很多國家明令禁止的。 3) 當生態中除了TOKEN,還自帶錢包後,我認為這個區塊鏈生態才過渡到氣態。在氣態下,通證和資產的兌換是無處不在,非常方便的。認同這個平臺的管理方和使用者方自成迴圈體系,高效的促進了生態內的資產流通。

第十四課 如何在DAPP應用實現自帶錢包轉賬功能?
七部委的規定“任何所謂的代幣融資交易平臺不得從事法定貨幣與代幣、“虛擬貨幣”相互之間的兌換業務”,說明限制的是中心化交易所的做法,並沒有禁止DAPP自帶錢包功能。這應該也是鼓勵的一種方式,DAPP生態自迴圈,不會影響現有金融秩序。

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

2,錢包的分類

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

1) Ethereum Wallet等應用

Ethereum Wallet客戶端對應的是Mist專案,現在此客戶端大多都稱為Ethereum Wallet,也有稱作Mist客戶端的,知道它們兩個指的是同一個客戶端即可。此客戶端使用JavaScript進行開發,支援windows、linux和OSX三類作業系統,是一個圖形化操作介面的客戶端。介紹到這裡,大家可能就明白了,如果你想通過API來呼叫以太坊的介面,選擇此方式是行不通的。 Ethereum Wallet客戶端主要是為使用者提供視覺化操作的客戶端,下載安裝之後通過相應的圖形化介面即可進行建立賬戶、轉賬、查詢餘額等操作。 Ethereum Wallet客戶端主要功能: 1] 建立賬戶 2] 兌換以太幣:內建了比特幣、其它競爭幣與以太幣兌換功能 3] 部署智慧合約:代幣合約、眾籌合約、自治組織合約等 4] 以太幣轉賬操作 5] 備份錢包等其他功能 以上所有功能操作都是啟動客戶端程式之後,通過操作介面或選單進行操作。智慧合約部分需要事先編寫好對應的程式碼,通過客戶端進行釋出。 屬於此類獨立錢包APP應用的還有imToken等。

2)Geth錢包介紹

Geth是go-ethereum專案的客戶端,也是目前使用最廣泛的客戶端。支援windows、linux和OSX三類作業系統。針對此係統網上有大量的資料可以參考,github上的wiki文件使用說明也比較詳細,【點選跳轉到文件地址】。通過此客戶端可以進行基本所有的以太坊相關操作。

1] 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.1 中心化錢包和非中心化的區別

根據私鑰儲存的位置可分為兩類: 1)中心化私鑰儲存的錢包,比如火幣的錢包; 2)去中心化錢包,私鑰儲存在使用者端,比如 imtoken 錢包,彩貝錢包。

1)去中心化錢包

去中心化錢包不是本節要講的重點,這裡只給大家簡單介紹一下。無論是中心化的錢包或去中心化的錢包,在 App 層面都是很輕量級的,App 內是不會內建一個 Geth 節點,交易的查詢或傳送都是通過伺服器來進行操作,不同點是交易簽名的私鑰由誰來保管和負責。 去中心化的錢包有個關鍵詞:助記詞。可以用下面的表示式來形容助記詞的作用:

私鑰 = 助記詞 = keystore+密碼
複製程式碼

通過上面的公式可以看出助記詞的重要作用,也是去中心錢包功能的一個亮點。當在這類錢包中建立一個賬戶之後,錢包會根據生成的私鑰檔案,生成一套助記詞,可為英文可為中文,通過助記詞可以反向計算出 keystore + 密碼。助記詞由使用者手抄存放在安全的地方,當進行交易時,輸入助記詞對交易進行簽名,傳送交易。當助記詞丟失,也就意味著失去了私鑰,而錢包一般不會儲存使用者的私鑰資訊,資產將永久丟失。 去中心化錢包的好處是不用擔心平臺從中作梗,不用擔心平臺被黑客攻擊而導致資產損失,但要求個人有一定的私鑰儲存能力。

2) 中心錢包

所謂中心化錢包就是將所有的私鑰檔案儲存在錢包服務商的伺服器內,由服務商來保管這些私鑰檔案,也就是說資產屬於你,但私鑰不由你保管。這樣做的好處是使用者根本不用記住私鑰,只用記住在平臺所開設的賬戶、登入密碼和支付密碼即可。即使忘記了密碼,還是可以通過平臺提供的忘記密碼進行找回,當然,這樣就不具有去中心化錢包的優點了。 彩貝錢包屬於依附彩貝生態的中心化錢包,幫助彩貝社群完成通證經濟的閉環生態建設。

3,錢包的核心功能

錢包對外呈現可能有不同的功能,充值、提現、轉賬等,但從本質上來說只有一個功能,那就是轉賬。區塊鏈本質上就是一個賬本,記錄著一筆筆交易,錢包當然離不開這個本質。 具體功能說明: 1)充值是錢包的外部賬戶向錢包的地址轉賬; 2)提現是錢包的賬戶向錢包之外的地址轉賬; 3)轉賬功能包括錢包內地址互轉和向錢包外地址轉賬; 在這個過程當中也對應著錢包賬戶資金的增加與減少。

3.1 使用者地址如何分配

使用者在使用錢包的時候肯定需要有一個屬於當前賬戶對應在區塊鏈上的地址,這個地址如何生成呢?不少開發人員是這樣實現的:每次當使用者註冊時就呼叫 Geth 節點的personal_newAccount方法生成一個地址,並將地址存放在 Geth 節點預設的位置。這種方式可以實現,但從技術上和安全上來講是不可取的。 效能瓶頸之一,呼叫 Geth 節點生成地址非常耗時,特別是當節點在處理一些同步或高消耗的工作時。 效能瓶頸之二,當 Geth 節點下的私鑰越來越多,Geth 啟動會變得漫長。 安全問題,Geth 節點對外要廣播交易,又要儲存敏感的私鑰資訊,安全問題巨大。 **優化之後的做法是事先批量生成地址,當使用者註冊時只用把地址分配給使用者即可。**這樣做的好處是: 私鑰的儲存與 Geth 節點相隔離,確保私鑰與外網的隔離性,從而確保私鑰的安全; 效能的保障,當使用者註冊時只是將資料庫的資料建立了一個關聯,而不用去執行費時的加密演算法來生成私鑰和檔案。 此種方法生成 Web3j 提供了相應的建立方法,可在無 Geth 節點的情況下通過程式碼直接生成符合私鑰規則的公私鑰。當然,如果有開發能力也可以通過 Geth 的原始碼中的私鑰生成方法抽離出一個單獨的與網路無關的生產私鑰程式。

3.2 充值交易

在比特幣的錢包中,有子賬戶的概念,只需要在一個總賬戶下建立 N 多子賬號,使用者充值到此子賬號的比特幣同樣的會顯示在錢包上,同時又提供了查詢一個地址所有交易的方法。遺憾的是以太幣並沒有提供此類介面,只能通過遍歷區塊交易的方法來判斷是否有對應賬戶的充值交易。 相關操作: 1)查詢區塊高度,比對是否是新生成的區塊,eth_blockNumber; 2)檢視區塊內容及詳細交易,eth_gethBlockByNumber; 比對交易的 toAddress 是否為本錢包的地址,如果是則記錄此筆交易到資料庫,並記錄交易狀態(pending、確認次數等); 3) 保證入庫和記賬的冪等性,因為會多次查詢到同一筆交易。 4)確認次數 並不是我們查詢區塊鏈中的交易就說明這邊交易已經成功了,比特幣是預設確認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]連結。

4,實現WEB WALLET錢包分配和轉賬功能

4.1 庫模組介紹

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

4.1.1 Hooked-web3-Provider模組

Hooked-web3-Provider模組庫(官網地址)提供自定義程式提供方(custom provider),它使用HTTP與geth通訊。這個提供方的獨特之處在於,它允許使用金鑰簽署合約例項的sendTransation()呼叫,因此不再需要建立交易的資料部分了。自定義程式提供方實際上重寫了web3.eth.sendTransaction()方法的實現,所以基本上它允許簽署合約例項的sendTransaction()呼叫以及web3.eth.sendTransation()呼叫。合約例項的sendTransaction()方法在內部生成交易資料,並呼叫web3.eth.sendTransation()廣播交易。

4.1.2 LightWallet模組

LightWallet是一個實現BIP32,BIP39和BIP44(官網地址)的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環境下搭建以太坊開發環境》文章完成配置。

4.2.1 程式碼結構分析

WebWallet錢包目錄主要有以下檔案和目錄,各目錄功能描述解釋如下: WebWalletapp.js -管理整個應用的App物件 │ package.json -環境配置檔案 ├─node_modules -Nodeb.js庫模組,不做修改 │
└─public ├─cssbootstrap.min.css -前端排版檔案 │
├─htmlindex.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的實現檔案

4.2.2 重點程式碼解讀

重點實現程式碼在main.js檔案中。 1, 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助記詞,產生錢包地址。

2, 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可以產生相同的賬戶地址。

3. 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命令用法-引數詳解》說明: 1) --dev表示啟動開發環境; 2)--rpc表示啟用HTTP-RPC伺服器; 3)--rpccorsdomain "*"表示用於允許一些特定域與geth通訊。*萬用字元表示可與任何域名通訊。 4)--rpcaddr "0.0.0.0" 表示geth伺服器可以到達哪個IP地址。預設的是127.0.0.1。將它的值改為0.0.0.0,這表示該伺服器可以使用任何IP地址到達。 5) --rpcport "8545" 表示HTTP-RPC伺服器監聽埠(預設值:8545) 6) --mine表示開啟挖礦 1) --unlock=0表示解鎖賬號0,geth預設建立的賬戶,命令啟動後系統提示“Passphrase:”回車輸入密碼為空後即可解鎖賬號0。 執行成功後,輸入“eth.accounts”可以看到geth自動建立的一個預設賬戶地址為“0x5eaba24091f993917fb35188add523c501dc1354”。

第十四課 如何在DAPP應用實現自帶錢包轉賬功能?

5.2 啟動APP服務

在XShell 4新開一個視窗連結,進入到輝哥工程目錄~/work/WebWallet,然後啟動本APP。

node app.js

操作截圖如下:

第十四課 如何在DAPP應用實現自帶錢包轉賬功能?

5.3 Web Wallet基本功能操作

1. 開啟WEB錢包網址

第十四課 如何在DAPP應用實現自帶錢包轉賬功能?
2. 點選"Generate New Seed"產生種子 點選"Generate New Seed"按鈕,輸入需要產生子賬戶地址個數,例如2個,
image.png
介面上顯示產生的助記詞seed和對應的賬戶資訊:
第十四課 如何在DAPP應用實現自帶錢包轉賬功能?
記錄下相關資訊:

  1. SEED:obtain warm allow bicycle mushroom fiber shell tower twenty corn cherry close
  2. Address1: 0xe45d865ed260fdf2409f66d4a9499a664943079c
  3. Address2: 0x09da12a3c1e0675c29e14967a3be765b008205e4

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

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

操作截圖如下:

第十四課 如何在DAPP應用實現自帶錢包轉賬功能?
4. 檢視目標地址資訊 點選主頁的"Generate Details"按鈕,可以重新整理賬戶資訊。LightWallet庫函式中,只要是相同的seed,產生的賬戶地址是相同的。 點選檢視,可以發現目標賬戶地址"0xe45d865ed260fdf2409f66d4a9499a664943079c"收到了100個ETH。
賬戶資訊
5. 錢包內賬戶轉賬 目標:從第一個賬戶地址“0xe45d865ed260fdf2409f66d4a9499a664943079c”轉發9個ETH到第二個賬戶地址“0x09da12a3c1e0675c29e14967a3be765b008205e4”

1
執行成功會更新提示Txn hash值。
2
此時點選下“Generate Detail”按鈕,發現2個賬戶餘額發生了9個ETH的變化。

至此,把DAPP應用中,為什麼需要錢包功能,錢包功能的分類,一個演示基本的錢包實現基本講明白了。需要學習更多內容可參考官網介面文件和說明。 #6. 知識對接服務 我們在知識星球開通了區塊鏈入門專欄,用於存放本專案的工程原始碼等內容,並建立專項微信群用於技術交流,歡迎加入。

知識星球分享碼

7,參考資料

1,ethereumjs-tx www.npmjs.com/package/eth… Github程式碼: github.com/ethereumjs/… 2,hooked-web3-provider www.npmjs.com/package/hoo… Github程式碼: github.com/consensys/h… 3,web端錢包原始碼 1)eth web: github.com/ConsenSys/e… 2).android: github.com/walleth/wal… 3).IOS: github.com/ethers-io/E… 4,WEB3.JS完整文件 github.com/ethereum/wi… WEB3.JS程式碼 github.com/ethereum/we… 5,go-ethereum GETH錢包[RPC,API] github.com/ethereum/go… 6,以太坊錢包的開發 blog.csdn.net/u011494083/… blog.csdn.net/u011494083/… github.com/ethereum/wi… 7,第08課:開發以太坊錢包的基本思路與安全[中心化錢包和去中心化錢包講的不錯] blog.csdn.net/su_bo_2010/… 8,以太坊客戶端Ethereum Wallet與Geth區別簡介 blog.csdn.net/wuxianbing2… 9,[以太坊原始碼分析] V. 從錢包到客戶端 blog.csdn.net/teaspring/a… 10,【區塊鏈開發】從零構建基於以太坊(Ethereum)錢包Parity聯盟鏈 ke.qq.com/course/2546… 11,基於以太坊的電子錢包開發分析 mp.weixin.qq.com/s/YQNlYozCv… 12,《區塊鏈專案開發指南》- Narayan Prusty[India] 13,BIP32,BIP39協議-關於HD錢包和助記種子規範 github.com/bitcoin/bip… 14,格式化JS工具 tool.oschina.net/codeformat/… 15,第03課:以太坊常見 JSON-RPC 介面解析 blog.csdn.net/su_bo_2010/…

相關文章