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 相关文章推荐
js 禁止选择功能实现代码(兼容IE/Firefox)
Apr 23 Javascript
JS解决url传值出现中文乱码的另类办法
Apr 08 Javascript
使用js在页面中绘制表格核心代码
Sep 16 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
Apr 16 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
Apr 23 Javascript
纯js实现动态时间显示
Sep 07 Javascript
基于iScroll实现内容滚动效果
Mar 21 Javascript
Angular2 自定义表单验证器的实现方法
Dec 14 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 Javascript
微信小程序通过一个json实现分享朋友圈图片
Sep 03 Javascript
vue动态禁用控件绑定disable的例子
Oct 28 Javascript
BootstrapValidator实现表单验证功能
Nov 08 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
PHP音乐采集(部分代码)
2007/02/14 PHP
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
PHP 一个页面执行时间类代码
2010/03/05 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
jquery 插件开发方法小结
2009/10/23 Javascript
javascript整除实现代码
2010/11/23 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
python按比例随机切分数据的实现
2019/07/11 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
实习自我鉴定范文
2013/10/30 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
高中国旗下的演讲稿
2014/08/28 职场文书
承诺函范文
2015/01/21 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
python中Matplotlib绘制直线的实例代码
2021/07/04 Python