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与asp.net(c#)互相调用方法
Dec 13 Javascript
js 判断checkbox是否选中的实现代码
Nov 23 Javascript
ajax中get和post的说明及使用与区别
Dec 23 Javascript
JS仿淘宝实现的简单滑动门效果代码
Oct 14 Javascript
JS实现单击输入框弹出选择框效果完整实例
Dec 14 Javascript
jQuery Validate插件实现表单强大的验证功能
Dec 18 Javascript
js检查是否关闭浏览器的方法
Aug 02 Javascript
解决浏览器会自动填充密码的问题
Apr 28 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 Javascript
jQuery实现消息弹出框效果
Dec 10 jQuery
详解Vue中Axios封装API接口的思路及方法
Oct 10 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 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
Terran历史背景
2020/03/14 星际争霸
用PHP产生动态的影像图
2006/10/09 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
封装好的省市地区联动控件附下载
2007/08/13 Javascript
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
Python中asyncore的用法实例
2014/09/29 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
wxPython色环电阻计算器
2019/11/18 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
销售人员中英文自荐信
2013/09/22 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
大学班级计划书
2014/04/29 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
产品销售计划书
2014/05/04 职场文书
合作经营协议书范本
2014/09/16 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python