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 控制非法字符的输入代码
Dec 04 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
Jan 02 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
Nov 30 Javascript
js完整倒计时代码分享
Sep 18 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
Sep 26 Javascript
vue2中filter()的实现代码
Jul 09 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
Apr 25 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
Nov 19 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
Apr 30 Javascript
vue选项卡切换登录方式小案例
Sep 27 Javascript
JS控制只能输入数字并且最多允许小数点两位
Nov 24 Javascript
JavaScript JSON使用原理及注意事项
Jul 30 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
再次研究下cache_lite
2007/02/14 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
js性能优化技巧
2015/11/29 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
python实现汉诺塔方法汇总
2016/07/25 Python
Python单例模式实例详解
2017/03/01 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
浅析PEP572: 海象运算符
2019/10/15 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
python 操作excel表格的方法
2020/12/05 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
美国时尚在线:Showpo
2017/09/08 全球购物
如何让Java程序执行效率更高
2014/06/25 面试题
统计岗位职责
2014/02/21 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
趣味运动会开幕词
2015/01/28 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python