主页 > 华为怎么下载imtoken > 【技术】如何用Javascript五步创建BTC钱包?

【技术】如何用Javascript五步创建BTC钱包?

华为怎么下载imtoken 2023-02-01 05:44:06

比特币钱包怎么创建_比特币和莱特币钱包_比特币怎么比特币钱包

竹三七_图片

这是一篇关于 Medium 的文章。 作者 Tom Goldenberg,commandiv 的首席技术官兼联合创始人。

在本文中,我们将使用 JavaScript 编程语言来实现比特币的核心协议。 到本文结束时,我们可以运行连接节点的网络并通过比特币网络发送交易,就像比特币一样。

首先,我们将创建一个钱包。 比特币钱包不存储在区块链上。 相反,它们由用户个人管理并由交易引用。 钱包由以下部分组成,按排列顺序生成:

❶ 私钥

❷ 公钥

❸ 公钥哈希 (PKH)

❹ 公共广播

❺ 私钥WIF(WIF:钱包导入格式钱包导入格式)

钱包不需要联网

需要理解的一个重要概念是,您无需连接到互联网即可生成比特币钱包地址。 因为生成地址的方法依赖于数学,所以不需要连接到服务器、网站或其他服务。

我们看一下生成私钥的代码:

const secureRandom = require(‘secure-random’); 
let privateKey = secureRandom.randomBuffer(32); 
console.log(‘> Private key created: ‘, privateKey.toString(‘hex’));

比特币钱包怎么创建_比特币和莱特币钱包_比特币怎么比特币钱包

竹三七_图片

很简单的! 您已经生成了您的比特币私钥!

它到底是什么? 好吧,您可能已经知道它是一个 32 字节的二进制数组。 由于一个字节有8位,所以总共有256位。

如果要知道生成相同私钥的概率,那就是2²⁵⁶,这是一个天文数字,简直比地球上所有的沙子都多。

2²⁵⁶,但不完全是

有一个问题需要说明。 并非上面生成的所有私钥都是有效的。 只有小于此值的私钥(十六进制)才能用于比特币:

比特币怎么比特币钱包_比特币和莱特币钱包_比特币钱包怎么创建

0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140。

比特币钱包怎么创建_比特币和莱特币钱包_比特币怎么比特币钱包

图片

原因如下:比特币使用椭圆曲线密码术 (ECC),并且只能接受低于该数字的私钥。

和。 比特币使用的椭圆曲线加密版本是secp256k1,所以修改后的代码如下:

const max = Buffer.from(“0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140”, ‘hex’); 
let isInvalid = true; 
let privateKey; 
while (isInvalid) {       
  privateKey = secureRandom.randomBuffer(32); 
  if (Buffer.compare(max, privateKey) === 1) 
 {
  isInvalid = false; 
 }
} 
console.log(‘> Private key: ‘, privateKey.toString(‘hex’));

我们使用 while 循环生成私钥,直到找到小于最大数量的私钥。 这应该不难,因为 max 的值接近 2²⁵⁶。

生成公钥

一旦我们有了一个有效的私钥,我们就可以使用椭圆库为我们创建公钥。 椭圆曲线的密码学能力是惊人的! - 我可以使用我的私钥创建签名,任何人都可以在不知道我的私钥的情况下验证它。 相当了不起!

椭圆曲线密码学需要深厚的数学功底,这里就不深究了。 如果您有兴趣了解它的工作原理,我推荐以下资源。 提示:它涉及复杂的空间几何和荒谬的大素数。

● 椭圆曲线密码学维基百科

比特币和莱特币钱包_比特币怎么比特币钱包_比特币钱包怎么创建

● 椭圆曲线数字签名算法的原始RFC

● ECC数字签名论文

以下是精通比特币作者对ECC的总结:

椭圆曲线密码术是一种基于离散对数问题的非对称或公钥密码术,由椭圆曲线点上的加法和乘法表示。 -密钥密码学比特币钱包怎么创建,由椭圆曲线上的加法和乘法表示。¹)

现在我们将使用 ellipticJavaScript 库来生成我们的公钥:

比特币钱包怎么创建_比特币和莱特币钱包_比特币怎么比特币钱包

图片

const keys = ecdsa.keyFromPrivate(privateKey);
const publicKey = keys.getPublic(‘hex’);
console.log(‘> Public key created: ‘, publicKey);

掘金

John Oliver 最近(2018 年 3 月)展示了一段视频剪辑,其中一名男子用比特币进行类比——这就像试图用鸡块做一只活鸡。 虽然这个类比听起来很荒谬,但却是事实。 因为,散列是一种无法逆转的单向过程。

尽管我们当前的私钥和公钥足以创建数字签名,但比特币的安全性更高。

比特币用户不是向某人的公钥汇款并公开密钥,而是向公钥的散列版本汇款。 这可以是公钥哈希或公共地址,两者都可以接受。

让我们看看如何做到这两点:

● 通过运行SHA-256 哈希算法和RIPEMD-160 哈希算法创建公钥。 它看起来像这样:

const sha256 = require(‘js-sha256’); 
const ripemd160 = require(‘ripemd160’); 
let hash = sha256(Buffer.from(msg, ‘hex’));
let publicKeyHash = new ripemd160().update(Buffer.from(hash, ‘hex’)).digest();

比特币和莱特币钱包_比特币怎么比特币钱包_比特币钱包怎么创建

● 要创建公共地址,需要额外的步骤。

第 1 步:将前缀“00”添加到我们的 publicKeyHash。

step2:接下来比特币钱包怎么创建,我们导出扩展公钥哈希的SHA-256哈希。

Step3:我们得到它的 SHA-256 ha。

第四步:将第一个字节存储为“校验和”。

Step5:我们将校验和添加到扩展公钥哈希中。

最后用base58编码对其进行编码。

哇! 我保证 - 通过在代码中查看它更容易理解:

比特币钱包怎么创建_比特币和莱特币钱包_比特币怎么比特币钱包

图片

function createPublicAddress(publicKeyHash) 
{ 
// step 1 - add prefix “00” in hex 
const step1 = Buffer.from(“00” + publicKeyHash, ‘hex’); 
// step 2 - create SHA256 hash of step 1 
const step2 = sha256(step1); 
// step 3 - create SHA256 hash of step 2 
const step3 = sha256(Buffer.from(step2, ‘hex’));
 // step 4 - find the 1st byte of step 3 - save as “checksum” 

比特币和莱特币钱包_比特币怎么比特币钱包_比特币钱包怎么创建

const checksum = step3.substring(0, 8); // step 5 - add step 1 + checksum const step4 = step1.toString(‘hex’) + checksum; // return base 58 encoding of step 5 const address = base58.encode(Buffer.from(step4, ‘hex’)); return address; }

生成私钥WIF

WIF 代表“钱包导入格式”。 该标准旨在让用户更轻松、更安全地从不同服务迁移钱包。

生成私钥 WIF 的过程与生成公共地址没有太大区别。 以下是步骤:

● 我们在私钥前加上“80”(十六进制)

● 我们导出扩展私钥的SHA-256 散列。

● 我们导出SHA-256 散列并保存第一个字节的校验和。

● 我们将校验和添加到扩展私钥并对其进行base58 编码。

比特币钱包怎么创建_比特币和莱特币钱包_比特币怎么比特币钱包

图片

这是代码:

function createPrivateKeyWIF(privateKey)
 {
   const step1 = Buffer.from(“80” + privateKey, ‘hex’);

比特币和莱特币钱包_比特币怎么比特币钱包_比特币钱包怎么创建

const step2 = sha256(step1); const step3 = sha256(Buffer.from(step2, ‘hex’)); const checksum = step3.substring(0, 8); const step4 = step1.toString(‘hex’) + checksum; const privateKeyWIF = base58.encode(Buffer.from(step4, ‘hex’)); return privateKeyWIF; }

检查工作

现在,我们已经生成了自己的比特币钱包,可以用来进行交易。 我们可以在 blockchain.info 中查看我们的地址以查看我们的余额。 请注意它是如何从我们的地址中推断出我们的公钥哈希值(“Hash 160”)的。

比特币钱包怎么创建_比特币和莱特币钱包_比特币怎么比特币钱包

图片

还有一些其他的工具可以验证我们的工作。 在此站点上,可以验证我们是否生成了正确的公共地址。 在另一个站点上,我们可以验证是否生成了正确的私钥 WIF。

比特币钱包怎么创建_比特币和莱特币钱包_比特币怎么比特币钱包

图片

验证您的钱包代码是否正常工作非常重要,因为可能会出现一些错误。 一种常见的方法是散列 ascii 私钥或公钥而不是实际数字,如这篇 Stack Overflow 帖子中所示。 这就是我们使用 Buffers 进行散列的原因。

综上所述

以上是创建比特币钱包所需的全部内容。

此处未提及的其他改进已过时,例如 HD 钱包、压缩密钥和受密码保护的私钥。

点击以下链接了解更多关于创建比特币钱包的信息:

● 关于比特币地址创建的 Stack Overflow 线程

● 基于 58 位编码的比特币 wiki

● 钱包导入格式上的比特币 wiki

编程愉快! 如果你喜欢这篇文章,请点个赞。

感谢您的阅读! 谢谢! _