國內最專業
盈幣寶資訊中心

比特幣錢包原理及JS實現實例

比特幣錢包

我們可以通過多種不同的方式生成比特幣錢包,使用比特幣核心客戶端或使用在線錢包服務或從硬件錢包製造商處獲取等。

比特幣錢包的組成?

它包含兩個密鑰私鑰,公鑰和公共地址。私鑰用於硬幣的支付(即簽署交易),而公鑰用於驗證交易的簽名。

由於公鑰很長,因此縮短了創建地址的方式,使其在交易時變得更易讀,更簡潔,更不容易出錯。

地址是你公開發布以接收比特幣的鏈接地址。

根據維基百科提供的內容,以下是公鑰到地址轉化的流程圖:

比特幣錢包

如何生成比特幣錢包密鑰?

步驟:

1.生成一個長度為32個字節的隨機數,做為你的私鑰。

隨機數必須是真正隨機的,或者應該從加密強偽隨機數生成器生成。比如:

af3e7bcc8f5be6b0ba3d568baeb52b2e2ef6c8d6f2608063976c9bcdbbd0ba83

2.利用ECDSA算法,算得私鑰

利用ECDSA算法對上一步驟產生的私鑰做計算,以創建長度為65字節的公鑰。0x04作為前綴。例如:

047B8FDBF808E1F2015E2F61FE1565956C8EAE9715D1F0F9DD54F9D4114D1FA390F7070A689887D27A95C713F5219CE0D81EF4782662BDACD6730A96B47A444152

P2PKH地址計算

比特幣P2PKH地址是從公鑰中計算的來的?具體步驟如下:

1.使用SHA256算法對公鑰進行哈希計算

5f0e78e99baed7e6297bd17494e2f80aa6fcf9dbd8a7e57b0522fb4ee85ca510

2.二次哈希計算

使用RIPMED-160算法再次哈希對從先前步驟導出的哈希進行哈希處理,結果如下:

5b17e6bb442cb0f1cd40d04c26a0ed10fc558e90

3.添加前綴

給上一步計算得到哈希添加00作為前綴

005b17e6bb442cb0f1cd40d04c26a0ed10fc558e90

4.三次哈希計算校驗和

從上一步驟接收到的哈希再次使用SHA256算法進行兩次哈希計算,從結果中取出前四個字節作為校驗和。

5970e23b87fbac16806d89960a4e3ca43c16ae6607546aa11797c38128b4f1e3

5、二次哈希添加校驗和

將步驟4計算得到的校驗和前四個數字作為後綴添加到步驟3的輸出中。

005b17e6bb442cb0f1cd40d04c26a0ed10fc558e905970e23b

6. Base58編碼轉化,得到結果

最後,我們使用Base58表示法對結果字節進行編碼,從而最終得到比特幣地址。

19Jf89ZiPrau8NRi4ru7rWAFLRf2xBPjai

生成比特幣P2PKH地址利用JS實例

這兒我們將主要貼出幾個重要代碼段,全部代碼如有需要,請聯繫蟲蟲索取。代碼主要用戶學習和原理演示,請不要將此代碼用戶實際,否則產生相關漏洞造成損失,概不負責。

比特幣錢包

用的使用的依賴庫: crypto-js(github/brix/crypto-js),BigInteger和EllipticCurve的javascript實現庫(students.stanford.edu/~tjw/jsbn/)。

利用隨機數字生成私鑰

以下的代碼fetchEntropy函數生成隨機數字以創建私鑰,然後生成比特幣地址格式函數formatAddress。

function(num) {

var url = this.URL.concat(num);

var objArray = [];

var that = this;

return this.fetchEntropy(url).then(function(keyArray) {

objArray = keyArray.map(function(key) {

return that.formatAddress(key);

});

return objArray;

});

}

利用Fetch api從QRNG量子隨機數發生器獲取隨機數

下一個代碼片段使用fetch api從QRNG服務器獲取隨機數據,因此請確保在支持fetch api的瀏覽器中運行此代碼。

function(url) {

return fetch(url).then(function(response) {

var contentType = response.headers.get(“content-type”);

if(contentType && contentType.includes(“application/json”)) {

return response.json();

}

throw new TypeError(“Oops, we haven’t got JSON!”); }).then(function(json) {

return json.data;

});

}

使用量子隨機數發生器服務器來獲取隨機數據

下面的代碼片段將密鑰作為輸入,使用elliptic curves(橢圓曲線)算法創建公鑰,然後格式化公鑰以使其成為比特幣地址。

function(key) {

var pubkey = this.util.bytesToHex(this.getPubKey(key.toUpperCase())).toUpperCase();

var hashHex = this.hashSHA256RIPMED160(pubkey).toString();

hashHex = “00”.concat(hashHex);

var doubleHashHex = this.doubleHashSHA256(hashHex).toString();

var checksum = doubleHashHex.slice(0,8);

hashHex = hashHex.concat(checksum);

addStr = this.Base58.encode(this.util.hexToBytes(hashHex));

return { sk:key.toUpperCase(),pk:pubkey,bitcoinAddr:addStr};

}

 

文章來源: 蟲蟲蒐奇

讚(0)

【盈幣寶Bingbon】
專業數字資產管理平臺來為您解決數字資產理財、交易等金融服務,致力於幫助使用者達到數字資產增值!
那麼好的盈幣寶APP當然要趕快下載來用,越快下載越快獲利喔!佛系理財就靠bingbon盈幣寶!

已經有許多許多人搭上這班財富列車
你還在等什麼!趕緊加入Bingbon盈幣寶!
財富的頂尖世界在等著你!

註冊連結:http://bit.ly/2qHh3hJ