实现比特币钱包原理和JS的例子

摘要:例如:047B8FDBF808E1F2015E2F61FE1565956C8EAE9715D1F0F9DD54F9D4114D1FA390F7070A689887D27A95C713F5219CE0D81EF4782662BDACD6730A96B47A444152P2PKH地址计算比特币P2PKH地址是从公钥中计算的来的?...

实现比特币钱包原理和JS的例子

我们可以通过各种不同的方式生成比特币钱包,使用比特币核心客户端或在线钱包服务或从硬件钱包制造商那里获得。

比特币钱包的构成?

它包含两个密钥私钥、公钥和公共地址。私钥用于支付硬币(即签署交易),而公钥用于验证交易的签名。

因为公钥很长,所以缩短了建立地址的方式,然后在交易中变得更容易阅读、更简洁、更不容易出错。

地址是您公开发布的链接地址,以接收比特币。

根据维基百科提供的内容,以下是从公钥到地址转换的流程图:

实现比特币钱包原理和JS的例子

如何生成比特币钱包密钥?

步骤:

1.生成一个长度为32个字节的随机数,作为您的私钥。

随机数必须真正随机,或者应从加密伪随机数生成器中生成。例如:

3e7bc8f5be6ba3d568baeb52be2ef6c8d6f2608063976cdbba83eba83e88d6f2668d668ba8d6ba83

2.使用ECDSA算法计算私钥

使用ECDSA算法计算上一步产生的私钥,以创建长度为65字节的公钥。 0x04作为前缀。例如:

2015EF61FE156566C8EAE97151FF9D5F9D4F9D414D1FA390F7070A6870070A6877A951F1FE1F971FF9D1F9D1F70F7070A67070A677A97F5219CEF47262BDACD6730A96B4444

P2PKH地址计算

BTCP2PKH地址是从公钥中计算出来的?具体方法如下:

1.使用SHA256算法对公钥进行哈希计算

5f78e9baed7b7bd1747ba6f80a6f8ba7d8ba7ba7ba7baed8

2.二次哈希计算

使用RIPMED-160算法再次对从前一步导出的哈希进行哈希处理,结果如下:

5b16b42cb0f1cd40d

3.添加前缀

上一步计算哈希添加00作为前缀

005b16b42cb0f1cd40d

4.三次哈希计算验证

从上一步收到的哈希再次使用SHA256算法进行两次哈希计算,从结果中取出前四个字节作为哈希算法校验和

5970e168686068860a4ca466660a467a16787a168888860a4ca46a667a1677a167a188ba18

5、二次哈希添加验证和

计算步骤4校验和前四个数字作为后缀添加到步骤3输出中。

0005b17b42cb0f1cd40d40c200000f10f50e23b

6. Base58编码转换,得到结果

最后,我们用Base58表示法对结果字节进行编码,然后最终得到比特币地址。

19j8ZiPrau8NRi4RFLRF

使用JS案例生成BTCP2PKH地址

在这里,我们将主要发布几个重要的代码段。如有必要,我们可以联系昆虫索要所有代码。代码主要客户学习和演示原理,请不要将代码客户实际,否则相关漏洞造成损失,概不负责。

实现比特币钱包原理和JS的例子

使用的依赖库: crypto-js(github/brix/crypto-js),BigIntegerEllipticCurve实现库存的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 从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.HA25RIPMED1600(pubkey).toString();

hashHex = "00".concat(hashHex);

var doubleHashHex = this.HashHA256(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};

}

相关推荐