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 面向对象 继承
May 13 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
Aug 22 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
Jun 09 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
Oct 20 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
简单实现js鼠标跟随效果
Aug 02 Javascript
Javascript快速实现浏览器系统通知
Aug 26 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 Javascript
微信小程序公用参数与公用方法用法示例
Jan 09 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
Sep 28 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 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
php5 pdo新改动加载注意事项
2008/09/11 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
wxPython框架类和面板类的使用实例
2014/09/28 Python
Python中的ceil()方法使用教程
2015/05/14 Python
Python生成密码库功能示例
2017/05/23 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
Random 在 Python 中的使用方法
2018/08/09 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
建筑工程毕业生自我鉴定
2014/01/14 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
Python中异常处理用法
2021/11/27 Python
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技