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实现焦点滚动图效果 具体方法
Jun 24 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
Dec 27 Javascript
Javascript的闭包详解
Dec 26 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
Sep 08 Javascript
JS触摸事件、手势事件详解
May 04 Javascript
js 获取html5的data属性实现方法
Jul 28 Javascript
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 Javascript
Vue前后端不同端口的实现方法
Sep 19 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
Sep 29 Javascript
Node.js path模块,获取文件后缀名操作
Nov 07 Javascript
vue中使用echarts的示例
Jan 03 Vue.js
JavaScript文档对象模型DOM
Nov 20 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
PHP4实际应用经验篇(2)
2006/10/09 PHP
php 小乘法表实现代码
2009/07/16 PHP
php实现简单文件下载的方法
2015/01/30 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
NodeJS实现同步的方法
2019/03/02 NodeJs
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
2018/10/17 Python
python取余运算符知识点详解
2019/06/27 Python
Python中os模块功能与用法详解
2020/02/26 Python
Python devel安装失败问题解决方案
2020/06/09 Python
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
2014年党支部承诺书
2014/05/30 职场文书
学生检讨书范文
2014/10/30 职场文书
小学教师读书笔记
2015/07/01 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
MySQL常见优化方案汇总
2022/01/18 MySQL
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android