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 操作select相关方法函数
Dec 06 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
May 13 Javascript
JS面向对象编程浅析
Aug 28 Javascript
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
jQuery简单实现日历的方法
May 04 Javascript
javascript实现unicode与ASCII相互转换的方法
Dec 10 Javascript
javascript动态获取登录时间和在线时长
Feb 25 Javascript
jQuery中的一些小技巧
Jan 18 Javascript
jquery中绑定事件的异同
Feb 28 Javascript
浅谈箭头函数写法在ReactJs中的使用
Aug 22 Javascript
10个在JavaScript开发中常遇到的BUG
Dec 18 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 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简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
Vue.js用法详解
2017/11/13 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
python动态参数用法实例分析
2015/05/25 Python
python实现Virginia无密钥解密
2019/03/20 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python实现按行分割文件
2019/07/22 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
Django之form组件自动校验数据实现
2020/01/14 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
python批量生成条形码的示例
2020/10/10 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
学生出入校管理制度
2014/01/16 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
合理化建议书
2015/02/04 职场文书