一钱包

1.1非对称加密, 助记词, PIN, WIF, 地址

1.1.1 非对称加密算法

非对称加密算法, 加密与解密使用不同的KEY, 我们分别称为私钥与公钥,其中可以通过私钥生成公钥

在比特币中, 私钥本质上就是一个256位的随机整数。

ECPair, 是指通过椭圆曲线算法生成 钥匙对。

1.1.2 助记词

在以太坊,私钥为128位的随机数,非常难以记忆。 从而提出了助记词来帮助记忆私钥。

|128bit (16字节)|4 (checksum)|

具体方法为, 在128位后面追加4位校验码。 长度变为了132位,然后分成12段,每段11位值查表得到一个单, 共记12个助记词

1.1.3 PIN

助记词本身已经代表私钥了, 但是这种文字很容易以明文显示展示出来, 为了安全。 以太坊可以提供加入个人密码,称之为PIN。以一种盐的形式混入到私钥中, 形成另一个实际私钥。

这就可以形成keystore文件,该文件含有加密后的私钥, 需要PIN来解密使用

1.1.4 WIF (Wallet Import Format)

比特币钱包导入格式,比特币的私钥为256位。 为了使私钥看起来更简洁,使用两种方式对私钥进行编码:

非压缩的私钥格式: (已经不在使用了)

私钥如:3cf316e3261041028bbced0a8d6b9d06e874d27b3093fe428741ce4458b4d1f3

BASE58(| 1 (0x80)| 256bit(64字节) | 4 (checksum) |) 即,

其中,checksum为两次sha256

可以直接通过wif.encode(0x80, privatekey, fase)生成

结果以5开头,如5JH8TRekVnj86FaSZEumgA4LDxzUSmLTNe5VUPcCHX8Z4qT4QKA

压缩的私钥格式:(当下正在使用格式)

BASE58(| 1 (0x80)| 256bit(64字节) | 1(0x01) | 4 (checksum) |) 即,

其中,checksum为两次sha256

可以直接通过wif.encode(0x80, privatekey, true)生成

结果以K或L开头,如KyGBudocz4pvJBLboJPvBpyhrE8g8igsQWepftnLouzLXejnQR88

bitcoinjs提供的ECPair总是使用压缩格式的私钥表示:

bitcoin = require('bitcoinjs-lib'),
BigInteger = require('bigi');
d = BigInteger.fromBuffer(Buffer.from(privatekey, 'hex')),
keyPair = new bitcoin.ECPair(d);

1.1.5 公钥

比特币

const bitcoin = require('bitcoinjs-lib');
wif = 'KyGBudocz4pvJBLboJPvBpyhrE8g8igsQWepftnLouzLXejnQR88',
ecPair = bitcoin.ECPair.fromWIF(wif); // 导入私钥
// 计算公钥:
let pubKey = ecPair.getPublicKeyBuffer(); // 返回Buffer对象
console.log(pubKey.toString('hex')); // 02或03开头的压缩公钥

1.1.6 地址

比特币

特币的地址并不是公钥,而是公钥的哈希,即从公钥能推导出地址,但从地址不能反推公钥,因为哈希函数是单向函数。

Base58(|1 (0x00) | 20 (hash160) | 4 (check) |)

首先对1+32=33字节的公钥数据进行Hash160(即先计算SHA256,再计算RipeMD160),得到20字节的哈希。然后,添加0x00前缀,得到1+20=21字节数据,再计算4字节校验码,拼在一起,总计得到1+20+4=25字节数据:

address = ecPair.getAddress(); // 返回String地址

如1PwKkrF366RdTuYsS8KWEbGxfP4bikegcS

以太坊

地址是通过对公钥做Keccak-256哈希,然后取最后的40位16进制字符得到的。

如:0x24602722816b6cad0e143ce9fabf31f6026ec622

1.2 HD钱包

BIP39:以mnemonic+用户口令为种子,通过计算后最终得到的64字节钱包种子。关于 bip 39  提案协议:https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki

以太坊

import Bip39 from 'bip39'
import util from 'ethereumjs-util'
import Wallet from 'ethereumjs-wallet'
var HDKey = require('ethereumjs-wallet/hdkey')
var _seed = Bip39.generateMnemonic();
console.log("助记词:", _seed)
var _pass = "123456"  // 这是用户自定义密码PINvar seedKey = Bip39.mnemonicToSeed(_seed, _pass)
var hdWallet = HDKey.fromMasterSeed(seedKey)
var key = hdWallet.derivePath("m/44'/60'/0'/0/" + _index)
var address = util.pubToAddress(key._hdkey._publicKey, true)
console.log("私钥:",key._hdkey._privateKey.toString('hex'))
console.log("公钥:",key._hdkey._publicKey.toString('hex'))
console.log("地址:",address.toString('hex'))

比特币

var bitcoin = require('bitcoinjs-lib')
var bip39 = require('bip39')
var bip32 = require('bip32')var _seed = bip39.generateMnemonic();
console.log("助记词:", _seed)
var _pass = "123456"  // 这是用户自定义密码PINvar seed = bip39.mnemonicToSeed(_seed, _pass)
var root  = bip32.fromSeed(seed)
var child0 = root.derivePath("m/44'/0'/0'/0/"+ _index);
console.log("私钥",child0.privateKey.toString('hex'));
console.log("公钥",child0.publicKey.toString('hex'));var seedHex = bip39.mnemonicToSeedHex(_seed, _pass)
var hroot = bitcoin.HDNode.fromSeedHex(seedHex)
var hchild0 = hroot.derivePath("m/44'/0'/0'/0/" + _index);
console.log("地址:",hchild0.getAddress())

1.3 bitcore-lib 操作比特币

1.3.1 安装

npm i bitcore-lib

1.3.2 生成测试网地址

var bitcore = require('bitcore-lib');
var Networks = bitcore.Networks;
var PrivateKey = bitcore.PrivateKey;
// 设置成测试网络
Networks.defaultNetwork = Networks.testnet;
var testKey = PrivateKey.fromRandom();
console.log("private:", testKey.toString());
var pubKey = testKey.publicKey;
console.log("public:", pubKey.toString())
var address = testKey.toAddress();
console.log('address:', address.toString())

输出结果如下:
console.log("private:", testKey.toString());
private: 2e61e120df72942abdb3c93fce15ef82b855b7a2f1270707feecb34ff8a7730e
undefined
var pubKey = testKey.publicKey;
undefined
console.log("public:", pubKey.toString())
public: 038e2ae27f98b1ff10d4ff658cc846f2260b86123fca26a5edf29a943681a4ab01
undefined
var address = testKey.toAddress();
undefined
console.log('address:', address.toString())
address: mwZogrFFZhb8GqTSm4C7WFfSCJKeVovo4k

对于livenet生成地址如:1KLJV3ocK7w6JXH2f2BdShy2jiuETpTo59

1.3.3 转账

用安装引用包

npm install bitcore-explorers --save
var Insight = require('bitcore-explorers').Insight;
var insight = new Insight('testnet');
var bitcore = require('bitcore-lib');var Networks = bitcore.Networks;
var PrivateKey = bitcore.PrivateKey;
// 生成地址
var privateKey = PrivateKey('2e61e120df72942abdb3c93fce15ef82b855b7a2f1270707feecb34ff8a7730e', 'testnet');
var address = privateKey.toAddress()// 目标地址的私钥为:99d3bb48b0b9b3493fce26b05c2302359b4a81b93606af1a149c5c2deb2bca6b
// 目标地址为:mvWrzyVe1QMCcX3XrMEicXbt81Wd3Un35F
var address2 = PrivateKey('99d3bb48b0b9b3493fce26b05c2302359b4a81b93606af1a149c5c2deb2bca6b', 'testnet').toAddress();insight.getUnspentUtxos(address, function(err,utxos){if(err){console.log(err);}else{console.log(utxos);var tx = bitcore.Transaction();tx.from(utxos);tx.to(address2, 100000);tx.change(address);tx.sign(privateKey);console.log("transaction:", tx.toObject());txs = tx.serialize();var scriptIn = bitcore.Script(tx.toObject().inputs[0].script);console.log('input script string:', scriptIn.toString());var scriptOut = bitcore.Script(tx.toObject().outputs[0].script);console.log("output script string:", scriptOut.toString());//tx.addData();insight.broadcast(txs, function(err, returnedTxId){if (err){console.log(err);}else{console.log('successful broadcast:' + returnedTxId)}});        }
});

如果有报告如下类似错误:

at Object.bitcore.versionGuard (/home/u18/node_modules/bitcore-explorers/node_modules/bitcore-lib/index.js:12:11)

打开文件index.js
bitcore.versionGuard = function(version) {
改为:
bitcore.versionGuard = function(version) { return;

最终正确输出如下:

successful broadcast:1eff85255798bd3a91935912ff8046dc2511902a7fbbd24cf971f59957a8fae4

这个时候,就可以把这个交易编号拿https://live.blockcypher.com/btc-testnet/上面去查看了

非对称加密, 助记词, PIN, WIF相关推荐

  1. 比特币/以太坊/加密货币/网络/区块链/钱包助记词:密码学的角度上,24个单词比12个单词更安全吗

    我们从密码学角度来聊聊助记词. 随着区块链钱包的发展和分层确定性(HD)钱包技术的普及,越来越多的用户开始熟悉了一个叫"助记词"的概念,很多人都已经习惯了从一开始使用一个钱包的时候 ...

  2. 以太坊BIP39助记词到公钥地址的原理与细节

    以太坊基础-你真的懂吗 以太坊私钥 eg: fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19 由256位:不考虑0x前缀 ...

  3. PHP生成助记词和BTC、ETH、LTC地址

    本文作者:陈进坚 个人博客:https://jian1098.github.io CSDN博客:https://blog.csdn.net/c_jian 简书:https://www.jianshu. ...

  4. 以太坊---「地址、密码、私钥、助记词、Keystore 」那些事

    想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答!! 国内最好的以太系钱包当属 imToken,在使用钱包时,有几个名词必须深刻理解,不然就有可能造成区块链资产的损失,这 ...

  5. CoinU基本概念分享(什么是去中心化钱包、助记词丢失怎么办等)

    1.CoinU钱包如何"去中心化"? · CoinU钱包是一款去中心化的HD钱包,你的钱包助记词完全由你自己保管.你的所有资产都被存放在区块链网络中.CoinU钱包将不会对你的资产 ...

  6. 助记词创建以太坊钱包源码_墨客科普 | MOAC区块链钱包账号管理

    本文简单描述钱包账号管理的一些方法. 一.术语 1.1 gas,Gas Limit和Gas Price 在墨客区块链上,发送代币或调用智能合约.执行写入操作,需要支付矿工计算费用,计费是按照Gas计算 ...

  7. 你还在怕忘记网盘密码?商鼎云助记词登录保障你的安全

    大家对网盘都不陌生,我们日常会用它来备份文件.存放电影.但是你知道吗?在某搜索引擎下输入网盘密码,最先出来的竟然是「网盘密码怎么样破解」.「网盘密码忘了怎么打开」. 同样的问题我们输入云存储密码,却发 ...

  8. 1.16. BIP39协议:使用助记词生成确定性钱包

    以太坊系统学习教程: https://www.netkiller.cn/blockchain/bip39.html 1.16. BIP39协议:使用助记词生成确定性钱包 BIP:39 层:应用层 标题 ...

  9. 私钥,公钥,钱包地址,助记词,keyStore的区别

    私钥,公钥,钱包地址,助记词,keyStore的区别 私钥:本质上是一个包含64位的随机数,是随机生成的 公钥:公钥是由私钥经过加密算法后生成的,拥有私钥,可以算出公钥,拥有公钥却不能算出私钥 钱包地 ...

最新文章

  1. laravel中empty(),is_null() 以及isEmpty()
  2. php loading效果,利用CSS3打造十种Loading效果
  3. md文件编辑器_可能是颜值最高的微信Markdown编辑器,用Markdown的你一定会爱上
  4. linux驱动程序混合架构,嵌入式系统最小驱动框架(类似linux驱动程序架构)(示例代码)...
  5. PS教程第二课:PS安装
  6. 日访问量1万mysql_日访问量1万服务器
  7. 深度学习 --- BP算法详解(BP算法的优化)
  8. Android中GsonFormat的安装及使用
  9. js对特殊字符转义、时间格式化、获取URL参数
  10. 微服务框架Jersey:快速入门
  11. 2012-7-10可樂词汇积累#9315;
  12. 一文快速了解Docker和Kubernetes
  13. 街头篮球服务器位置,求街头篮球各个服务器IP地址
  14. LINUX centos7.6修改静态IP与配置参数NM_CONTROLLED
  15. 2022.11.11 CodeForces1324D Pair of Topics
  16. 关于Andorid加载高清大图(仿sina weibo 里面的长图效果)
  17. CAD坐标点、经纬度坐标点转ARCGIS矢量,求重叠面积
  18. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xbb in position 0: invalid start byte
  19. 【实战】如何避免背锅?
  20. 谭民机器人_科学网—中科院自动化所喻俊志,谭民研究员等:冰雪运动生物力学及其机器人研究进展 - 欧彦的博文...

热门文章

  1. 图文详解linux/windows mysql忘记root密码解决方案
  2. webpack之font-awesome
  3. 详解http和https的区别
  4. Duwamish配置持久化学习笔记
  5. 选择日期保存后日期变成前一天(avue date)
  6. 减治法解决俄式乘法问题(JAVA)
  7. php 收缩栏,HTML5每日一练之details展开收缩标签的应用
  8. 第一学期计算机网络作业,2010-2011学年第一学期计算机网络(33973)试卷
  9. arccatalog点要素显示不完,shp数据全图显示正常,放大要素不能显示的问题
  10. 笔记本上的小键盘计算机怎样用,笔记本数字小键盘不能用怎么办【解决方法】...