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兼容标准的表格变色效果
Jun 28 Javascript
仿迅雷焦点广告效果(JQuery版)
Nov 19 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
Jul 31 Javascript
div失去焦点事件实现思路
Apr 22 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
Jan 15 Javascript
jQuery layui常用方法介绍
Jul 25 Javascript
微信小程序 navigation API实例详解
Oct 02 Javascript
js模拟百度模糊搜索的实例
Aug 04 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
vue实现页面滚动到底部刷新
Aug 16 Javascript
在vue+element ui框架里实现lodash的debounce防抖
Nov 13 Javascript
js加减乘除精确运算方法实例代码
Jan 17 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+JS实现搜索自动提示(实例)
2013/06/09 PHP
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
js实现DIV的一些简单控制
2007/06/04 Javascript
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
JS实现小星星特效
2019/12/24 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python函数的周期性执行实现方法
2016/08/13 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
python中的变量如何开辟内存
2018/06/26 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
python pygame实现方向键控制小球
2019/05/17 Python
python绘制地震散点图
2019/06/18 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
校长岗位职责
2013/11/26 职场文书
宿舍使用违章电器检讨书
2014/01/12 职场文书
岗位聘任书范文
2014/03/29 职场文书
运动会演讲稿
2014/05/07 职场文书
2014年科协工作总结
2014/12/09 职场文书
业务员岗位职责范本
2015/04/03 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书