比特幣錢包開發:新建子賬號與匯出子賬號私鑰
目標
獲取錢包子賬號地址
獲取錢包餘額
索取BTC測試幣
新建錢包子賬號地址
匯出子賬號私鑰
前言
在前面的內容我們已經獲取了我的所有錢包,本章的內容就是對我的錢包進行操作,比如:獲取錢包子賬號地址、獲取錢包餘額獲、新建錢包子賬號地址、匯出子賬號私鑰等功能。
一、獲取錢包子賬號地址
在每次交易時都會將餘額轉到一個新的子地址,通過新的子地址產生交易,這樣做的目的就是為了提高賬號的安全性。同樣,在接受別人轉賬時,也最好提供新的子賬號地址接受。那麼我們先來獲取錢包所擁有的子賬號地址。
在bitcore-wallet-client庫中獲取子賬號地址提供的API是getMainAddresses()方法,具體引數可以檢視文件詳情,這裡我們可以不傳引數,示例如下

輸出如下

C8D7B051-47E4-402D-B053-2B7E512722CF
注意:在對錢包操作錢一定要用import()方法解鎖錢包。
返回的資料addresses是一個數組,元素是賬號地址物件,wallet1錢包當前只有一個字賬號地址,路徑“m/0/0”,地址是“moveF5KCAs5ZLwu9Cgwtw3Gh25CiC51KQz”。
二、獲取錢包餘額
在bitcore-wallet-client庫中獲取錢包餘額提供的API是getBalance()方法,具體引數可以檢視文件詳情,這裡我們可以不傳引數,示例如下

輸出如下

C0ED20DE-93C1-44F6-BD8F-15115E62E56B
返回的資料是一個物件,包含如下字斷
totalAmount: 總的餘額。
lockedAmount: 鎖定餘額。
totalConfirmedAmount: 所有的確認的餘額。
lockedConfirmedAmount: 鎖定的餘額。
availableAmount: 可用餘額。
availableConfirmedAmount: 可用的確認的餘額。
byAddress:金額來源於哪個子地址,它是一個數組,元素是物件,包含的字斷有
address:該地址擁有餘額。
path:該地址的路徑。
amount:該地址擁有餘額的數量。
從輸出可以看到餘額為0,如何獲取BTC餘額呢?
在主網中可以通過如下方式獲取BTC:
提供自己的任意一個子賬號地址,通過別人轉賬獲取。
在錢包應用程式中通過幣幣交易獲取。
在交易所中通過BTC體現獲取。
在測試網路中可以通過如下方式獲取BTC:
提供自己的任意一個子賬號地址,通過別人轉賬獲取。
到coinfaucet網站索取BTC測試幣。
下面介紹測試網中的第二種方式“到coinfaucet網站索取BTC測試幣”,在下一章內容中介紹第一種方式。
三、索取BTC測試幣
在開發過程中,必須擁有BTC餘額才便於開發測試,在正式網路中進行測試,轉賬需要消費gas,另外速度慢,所以我們將在測試網路中進行開發和測試,除錯成功後將網路型別字斷替換為“livenet”即可切換到比特幣正式網路中。
第一步:開啟coinfaucet網站,如下圖

76F1075F-FF34-4CF1-AFAE-75C49FCC9545
第二步:講上面解鎖的“wallet1”錢包的地址“moveF5KCAs5ZLwu9Cgwtw3Gh25CiC51KQz”貼上到上圖的輸入框中。

8A461CF6-698F-4B7B-92F9-82C73387006E
第三步:通過驗證碼後會提示幣已經轉到了指定賬號地址,然後提示本IP地址還需12小時才能再次索取BTC測試幣。

B7B5D886-C952-473D-815B-CE5A10BB6082
第四步:我們再次執行程式碼獲取錢包餘額,輸出如下。

3C9FFB67-7861-4D27-860D-FEBC8D3E3A59
可看到該賬號“moveF5KCAs5ZLwu9Cgwtw3Gh25CiC51KQz”擁有可用餘額12121737。
注意:程式碼中的比特幣餘額都是以Satoshi為單位進行計算和傳遞,所以我們前端在顯示的時候需要將它轉換為BTC單位,進位是10^8。因此該賬號當前擁有的餘額是0.12121737BTC。
四、新建錢包子賬號地址
到此為止我們的錢包只有一個子賬號地址,要獲取更多的子賬號地址,就是獲取路徑“m/0/1”、“m/0/2”......"m/0/2^31"的子地址,可以通過API呼叫createAddress()實現,它會根據路徑按照0~2^31的順序建立,它的用法很簡單,在建立錢包的時候也都呼叫過。下面再看下它的完整實現。

輸出如下

E79CB8B4-39AA-4ED8-97DD-4AB3DB718E2A
再次為“wallet1”錢包建立了子賬號地址,因為該錢包只有路徑“m/0/0”的地址被建立,所以現在建立的地址路徑是“m/0/1”,地址是“mwtTPpQWGkQabUqgAwSN62SfhNYVV76BHZ”。
下面我們再來檢視一下該錢包的子賬號地址與餘額。

可見該錢包的餘額0.12121737BTC還是由第一個賬號擁有,它的子賬號地址則有了兩個,分別是“m/0/0”與“m/0/1”。
驗證二:使用助記詞轉換網站
再開啟助記詞轉換網站驗證wallet1錢包,它的助記詞是“same subway develop fun fancy library sand rain hamster ship floor define”, 密碼是“1234qwer”。

2BE72BA3-CBF4-46FC-A195-F51388EF8FC8
可見與程式碼中的結果一致。
五、匯出子賬號私鑰
現在我們來匯出“wallet1”錢包中“m/0/1”路徑的私鑰。需要通過credentials認證物件呼叫getDerivedXPrivKey()方法獲取到derivedXPrivKey,derivedXPrivKey再通過路徑獲取到指定賬號的keyPair,那麼keyPair裡面就有私鑰了。

輸出如下

40B18343-5B78-4A70-9CE8-F5C2E60B5782
根據輸出可以看到成功獲取到了“m/0/1”路徑的私鑰、公鑰、地址資料,與助記詞轉換網站的資料也一致。
六、完整原始碼
1. controllers/wallet.js
編輯controllers資料夾下的wallet.js檔案,實現獲取錢包子賬號地址、獲取錢包餘額獲、新建錢包子賬號地址、匯出子賬號私鑰功能。

2. controllers/web.js
編輯controllers資料夾下的web.js檔案,後端實現返回錢包賬號詳細頁面。




七、專案執行效果

786E6166-FA63-4B85-9486-6ECE71C8CDC8
專案原始碼Github地址
版權宣告:部落格中的文章版權歸博主所有,未經授權禁止轉載,轉載請聯絡作者(微信:lixu1770105)取得同意並註明出處。
未經授權禁止轉載、改編,轉載請註明出處!