主页 > 华为怎么下载imtoken > 【技术】如何用Javascript五步创建BTC钱包?
【技术】如何用Javascript五步创建BTC钱包?
竹三七_图片
这是一篇关于 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
编程愉快! 如果你喜欢这篇文章,请点个赞。
感谢您的阅读! 谢谢! _