Node.Js生成比特币地址代码解析


Posted in Javascript onApril 21, 2018

使用Node.js,IDE采用sublime 3。

var randomBytes = require('randombytes')
var BigInteger = require('bigi')
var ecurve = require('ecurve')
var crypto = require('crypto')
var cs = require('coinstring')
var secp256k1 = ecurve.getCurveByName('secp256k1')
var randombytes = randomBytes(32).toString('hex')
var privateKey = new Buffer(randombytes, 'hex')

console.log("私钥:" + privateKey.toString('hex'))
var ecparams = ecurve.getCurveByName('secp256k1')
var curvePt = ecparams.G.multiply(BigInteger.fromBuffer(privateKey))
var x = curvePt.affineX.toBuffer(32)
var y = curvePt.affineY.toBuffer(32)

var publicKey = Buffer.concat([new Buffer([0x04]), x, y])
console.log("标准地址:" + publicKey.toString('hex'))


//compressed
publicKey = curvePt.getEncoded(true) //true forces compressed public key
console.log("compressed:" + publicKey.toString('hex'))


var sha = crypto.createHash('sha256').update(publicKey).digest()
var pubkeyHash = crypto.createHash('rmd160').update(sha).digest()

// pubkeyHash of compressed public key
console.log("pubkeyHash:" + pubkeyHash.toString('hex')) 


// address of compressed public key
console.log("压缩地址:" + cs.encode(pubkeyHash, 0x0)) //<-- 0x0 is for public addresses
//这里还缺失校验和Base58编码

console.log(cs.encode(privateKey, 0x80)) //<--- 0x80 is for private addresses


console.log(cs.encode(Buffer.concat([privateKey, new Buffer([0])]), 0x80)) // <-- compressed private address

生成比特币地址

1.生成随机私钥,私钥是一个32字节的数 例如:

8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3

2.椭圆曲线计算公钥 生成了私钥之后,我们使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的非压缩公钥,生成的公钥共65字节, 第一个字节是0x04,后32个字节是X坐标,32个字节是Y坐标: 公钥P.X:

59DEE66AB619C4A9E215D070052D1AE3A2075E5F58C67516B2E4884A88C79BE9 公钥P.Y: A5FA8CCD255FB0A7A75DB985072968C72B036ED97BA2EF2DECE2ABCA5BE14792

公钥:

0459DEE66AB619C4A9E215D070052D1AE3A2075E5F58C67516B2E4884A88C79BE9A5FA8CCD255FB0A7A75DB985072968C72B036ED97BA2EF2DECE2ABCA5BE14792

3.计算公钥的SHA-256哈希值

ae9c74647a8c2f50fd832e397e36dbad05d86db3fe3d959a7c8a07c1ddda40c6

4.计算 RIPEMD-160哈希值

05f9d05358aab2a28f19910036e67a7295b14aac

5.加入地址版本号(比特币主网 0x00)

0005f9d05358aab2a28f19910036e67a7295b14aac

其实这里就差不多了,也就是上面代码最后生成的压缩地址。

但在实际比特币中,还要加上校验

6.计算 SHA-256 哈希值

9f35b0c37977a302512c22f586dd8da4ae1d20399f2ad3f75df23fbc024b4b2d

7.再次计算 SHA-256 哈希值

4b4f9bc87616687957db64efaf4efb2c00d1d93d549a0b70b15812936046d0ac

8.取上一步结果的前4个字节(8位十六进制)

4b4f9bc8

9.把这4个字节加到第五步生成的压缩地址后边

0005f9d05358aab2a28f19910036e67a7295b14aac4b4f9bc8

10.用Base58编码

Base58由1-9和除i,l,0,o之外的英文字符组成。 对上一步的结果进行Base58编码,得到:

1YbeKoyePe8gxyAYh4E3Qyqb15Nnepmod

这就是我们经常看到的传统意义上的比特币钱包地址了。

Javascript 相关文章推荐
javascript:void(0)是什么意思示例介绍
Nov 17 Javascript
jQuery的each终止或跳过示例代码
Dec 12 Javascript
jquery仿搜索自动联想功能代码
May 23 Javascript
JavaScript组件开发完整示例
Dec 15 Javascript
springMVC结合AjaxForm上传文件
Jul 12 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
Mar 07 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 Javascript
基于Vue实现支持按周切换的日历
Sep 24 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
Feb 13 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
May 10 Javascript
vue路由守卫+登录态管理实例分析
May 21 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
Jan 05 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
Apr 21 #Javascript
JS装饰器函数用法总结
Apr 21 #Javascript
vue 之 .sync 修饰符示例详解
Apr 21 #Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 #Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
Apr 20 #Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
Apr 20 #jQuery
vue多页面开发和打包正确处理方法
Apr 20 #Javascript
You might like
表单复选框向PHP传输数据的代码
2007/11/13 PHP
PHP与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
PHP调用Twitter的RSS的实现代码
2010/03/10 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
理解Python中的With语句
2016/03/18 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
python简单区块链模拟详解
2019/07/03 Python
python join方法使用详解
2019/07/30 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
Numpy 多维数据数组的实现
2020/06/18 Python
Django返回HTML文件的实现方法
2020/09/17 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
金融专业个人的自我评价
2013/10/18 职场文书
程序员岗位职责
2013/11/11 职场文书
诚信贷款承诺书
2014/05/30 职场文书
网络技术专业求职信
2014/07/13 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
python 实现图片特效处理
2022/04/03 Python
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers