Node.Js生成比特币地址代码解析

使用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

这就是我们经常看到的传统意义上的比特币钱包地址了。

您可能感兴趣的文章:

  • Python实现类似比特币的加密货币区块链的创建与交易实例
  • python做量化投资系列之比特币初始配置
(0)

相关推荐

  • python做量化投资系列之比特币初始配置

    本文实例为大家分享了python比特币初始配置的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- """ Created on Fri Jan 13 10:36:19 2017 @author: yunjinqi E-mail:yunjinqi@qq.com Differentiate yourself in the world from anyone else. """ #用于访问OKCOIN 现货REST A

  • Python实现类似比特币的加密货币区块链的创建与交易实例

    虽然有些人认为区块链是一个早晚会出现问题的解决方案,但是毫无疑问,这个创新技术是一个计算机技术上的奇迹.那么,究竟什么是区块链呢? 区块链 以比特币(Bitcoin)或其它加密货币按时间顺序公开地记录交易的数字账本. 更通俗的说,它是一个公开的数据库,新的数据存储在被称之为区块(block)的容器中,并被添加到一个不可变的链(chain)中(因此被称为区块链(blockchain)),之前添加的数据也在该链中.对于比特币或其它加密货币来说,这些数据就是一组组交易,不过,也可以是其它任何类型的数据

  • Node.Js生成比特币地址代码解析

    使用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 ra

  • JS寄快递地址智能解析的实现代码

    去年做了些前端内容,最近在整理一些稍微有点用的内容,比如智能解析地址,用户只要输入:张三1351111111江苏省扬州市广陵区XX小区X楼xxx室,就能解析出姓名.电话.省市区.地址信息了.是不是很方便? 项目地址暂时没有放,大家可以关注我的个人码云地址https://gitee.com/w9 纯JavaScript,无需Jquery,轻量级的JS包.可参考以下代码: let defaultData = []; const mCity = {}; const mArea = {}; /** *

  • JavaScript+Node.js写一款markdown解析器

    目录 1. 准备工作 2. 处理图片&超链接 3. 处理blockquote 4. 处理标题 5. 处理字体 6. 处理代码块 7. 处理列表 8. 处理表格 9. 调用方法 1. 准备工作 首先编写getHtml函数,传入markdown文本字符串,这里使用fs读取markdown文件内容,返回值是转换过后的字符串. const fs = require('fs'); const source = fs.readFileSync('./test.md', 'utf-8'); const get

  • Node.js生成HttpStatusCode辅助类发布到npm

    作为一个好的Restfull Api不仅在于service url的语义,可读性,幂等,正交,作为http状态码也很重要,一个好的Http Status Code给使用者一个很好的响应,比如200表示正常成功,201表示创建成功,409冲突,404资源不存在等等.所以在做一个基于node.js+mongodb+angularjs的demo时发现node.js express没有提供相应的辅助类,但是本人不喜欢将201,404这类毫无语言层次语义的东西到处充斥着,所以最后决定自己写一个,但是同时本

  • xtemplate node.js 的使用方法实例解析

    工程下安装XTemplate并使用它的方法实例说明: 1.安装xtpl 复制代码 代码如下: npm install xtpl xtemplate --save 2.在views目录添加test.xtpl文件,其内容为 this is {{title}}! 4.集成到Express中,只需要在app.js中,设置模板引擎即可 var print = require('./routes/print'); //此行代码放入app.js的require 声明代码段下边 app.set('view en

  • python和node.js生成当前时间戳的示例

    Python # coding=utf-8 import time import sys def func(): # 格式化输出时间 s1 = int(time.strftime("%Y%m%d%H%M%S", time.localtime())) # 时间戳,由于默认是秒需要转换为毫秒输出 s2 = int(round(time.time() * 1000)) return s1, s2 def once(): '''如果没有指明命令行参数则运行一次''' s1, s2 = func

  • Node.js 中如何收集和解析命令行参数

    前言 在开发 CLI(Command Line Interface)工具的业务场景下,离不开命令行参数的收集和解析. 接下来,本文介绍如何收集和解析命令行参数. 收集命令行参数 在 Node.js 中,可以通过 process.argv 属性收集进程被启动时传入的命令行参数: // ./example/demo.js process.argv.slice(2); // 命令行执行如下命令 node ./example/demo.js --name=xiaoming --age=20 man //

  • js生成随机数的过程解析

    一.预备知识 Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ 1.0 之间的一个伪随机数.[包含0不包含1] //比如0.8647578968666494 Math.ceil(Math.random()*10); // 获取从1到10的随机整数 ,取0的概率极小. Math.round(Math.random()); //可均衡获取0到1的随机整数. Math.floo

  • 基于python3生成标签云代码解析

    这篇文章主要介绍了基于python3生成标签云代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 标签云是现在大数据里面最喜欢使用的一种展现方式,其中在python3下也能实现标签云的效果,贴图如下: -------------------进入正文--------------------- 首先要安装以下几个库: #!/usr/bin/python3.4 # -*- coding: utf-8 -*- # http://www.lfd.uc

  • 关于Node.js中频繁修改代码重启服务器的问题

    我们可以使用一个第三方命名行工具,nodemon 来帮我们解决频繁修改代码重启服务器问题. nodemon 是一个基于 Node.js 开发的第三方命令行工具,我们使用的时候需要独立安装. (1)安装 安装命令如下: # 在任意目录执行该命令都可以 # 也就是说,所有需要 --global 来安装的包都可以在任意目录下执行 npm install --global nodemon 例如:我在cmd命令行当前目录下输入npm install --global nodemon 怎么检查安装成功:使用

随机推荐