2018-6-20 13:33
來源: HiBlock-Net
1
區塊鏈是一個偉大的發明,它改變了生產關系。很多生態,有了區塊鏈技術,可以由全公司員工的"全員合伙人"變成了全平臺的”全體合伙人”了,是真正的共享經濟模式。
什么意思呢?舉例來說,現在很多互聯網平臺,比如淘寶,普通消費者只是一個利益貢獻者,這個平臺運營的好不好跟用戶沒有關系。但在有代幣的平臺上,每一個用戶的角色都發生了轉變:他們不單單是某個平臺的用戶,還持有了它的代幣。這些代幣一般都是有限的,使用這個平臺的人數越多,代幣的需求就會越旺盛,代幣在市場上供需就會傾斜,就會漲價。
所以這時候用戶跟平臺方,其實是站在同一邊的。也就是說,在+互聯網時代,通過使用互聯網技術提升信息流通效率后,消費者培養了淘寶這個獨角獸平臺,但是這個受益主要被馬云團隊享受,創造了一個中國首富,平臺的廣大用戶并沒有得到平臺增長紅利的好處。但是,在+區塊鏈時代,所有的用戶都是平臺的利益相關方,都是創業者。他們會隨著這個平臺的增長而一起受益,這個夢想的力量也就會更大。
目前DAPP業務生態中,很多項目不自帶錢包或者交易所的。我認為DAPP只帶錢包功能將會是一個基本配置。如下圖理解,
1) 當生態中沒有TOKEN經濟時,這個平臺是固態的,誰是用戶,誰是利益平臺最終受益方,是靜態固化的。這是通用的+互聯網模式,海量的用戶制造了BATJ等獨角獸企業,但他們永遠只是貢獻者,自身沒有從中分享更多的利益。
2) 當生態中包含TOKEN,然后通過上交易所完成利益變換時,我認為這時的生態是液態的。生態中的利益兌換可以通過交易所進行轉換。但是這樣無法去中心化,無法去中介化,存在著不便捷和被收費的問題。這種模式下,無法形成通證經濟的自循環生態。同時由于交易所的資產安全,被攻擊,對現實金融生態的影響等原因,是很多國家明令禁止的。
3) 當生態中除了TOKEN,還自帶錢包后,我認為這個區塊鏈生態才過渡到氣態。在氣態下,通證和資產的兌換是無處不在,非常方便的。認同這個平臺的管理方和用戶方自成循環體系,高效的促進了生態內的資產流通。
七部委的規定“任何所謂的代幣融資交易平臺不得從事法定貨幣與代幣、“虛擬貨幣”相互之間的兌換業務”,說明限制的是中心化交易所的做法,并沒有禁止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客戶端主要功能:
創建賬戶
兌換以太幣:內置了比特幣、其它競爭幣與以太幣兌換功能
部署智能合約:代幣合約、眾籌合約、自治組織合約等
以太幣轉賬操作
備份錢包等其他功能
以上所有功能操作都是啟動客戶端程序之后,通過操作界面或菜單進行操作。智能合約部分需要事先編寫好對應的代碼,通過客戶端進行發布。
屬于此類獨立錢包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
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 + "
";
html = html + "
Address: 0x" + address + "
";html = html + "
Private Key: 0x" + private_key + "
";html = html + "
Balance: " + web3.fromWei(balance, "ether) + " ether
";html = html + "";
}
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
因為輝哥在本地配置的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”。
5.2 啟動APP服務
在XShell 4新開一個窗口鏈接,進入到輝哥工程目錄~/work/WebWallet,然后啟動本APP。
node app.js
操作截圖如下:
5.3 Web Wallet基本功能操作
1)打開WEB錢包網址
2)點擊"Generate New Seed"產生種子
點擊"Generate New Seed"按鈕,輸入需要產生子賬戶地址個數,例如2個,
界面上顯示產生的助記詞seed和對應的賬戶信息:
記錄下相關信息:
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)})
操作截圖如下:
4)查看目標地址信息
點擊主頁的"Generate Details"按鈕,可以刷新賬戶信息。LightWallet庫函數中,只要是相同的seed,產生的賬戶地址是相同的。
點擊查看,可以發現目標賬戶地址"0xe45d865ed260fdf2409f66d4a9499a664943079c"收到了100個ETH。
賬戶信息
5)錢包內賬戶轉賬
目標:
從第一個賬戶地址“0xe45d865ed260fdf2409f66d4a9499a664943079c”轉發9個ETH到第二個賬戶地址“0x09da12a3c1e0675c29e14967a3be765b008205e4”
執行成功會更新提示Txn hash值。
此時點擊下“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區塊鏈技術布道群-筆名輝哥