本文作者:问几许

比特币 | 用 JavaScript 生成比特币钱包

问几许 4年前 ( 2019-05-10 ) 4497 抢沙发
比特币 | 用 JavaScript 生成比特币钱包摘要: 比特币(Bitcoin)的概念最初由中本聪在2008年11月1日提出,并于2009年1月3日正式诞生 [1]  。根据中本聪的思路设计发布的开源软件以...
比特币(Bitcoin)的概念最初由中本聪在2008年11月1日提出,并于2009年1月3日正式诞生 [1]  。根据中本聪的思路设计发布的开源软件以及建构其上的P2P网络。比特币是一种P2P形式的虚拟的加密数字货币。点对点的传输意味着一个去中心化的支付系统。

与所有的货币不同,比特币不依靠特定货币机构发行,它依据特定算法,通过大量的计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为,并使用密码学的设计来确保货币流通各个环节安全性。P2P的去中心化特性与算法本身可以确保无法通过大量制造比特币来人为操控币值。基于密码学的设计可以使比特币只能被真实的拥有者转移或支付。这同样确保了货币所有权与流通交易的匿名性。比特币与其他虚拟货币最大的不同,是其总数量非常有限,具有极强的稀缺性。该货币系统曾在4年内只有不超过1050万个,之后的总数量将被永久限制在约2100万个。

下面教程就是用JavaScript NodeJs去生成一个简易的比特币钱包。

开发环境

NodeJS

node -v     // v10.15.3 
npm  -v     // 6.9.0

依赖库安装

Github : https://github.com/bitcoinjs/bitcoinjs-lib

npm install bitcoinjs-lib    // 5.0.3
npm install bip39            // 3.0.2

生成助记词

JavaScript implementation of Bitcoin BIP39 : Mnemonic code for generating deterministic keys

const bip39 = require('bip39');

const mnemonic = bip39.generateMnemonic()
// => 'lawsuit adult soul suit ridge daring loop brand urge convince alcohol robust'
bip39.validateMnemonic(mnemonic)
// => true

通过助既词生成私钥和地址

const bitcoin = require('bitcoinjs-lib'),
      bip39 = require('bip39');
      
let network ='bitcoin'; // or 'testnet',不传参数默认为主网
let seed = bip39.mnemonicToSeed(mnemonic), 
    root = bitcoin.bip32.fromSeed(seed, bitcoin.networks[network]),
    keyPair = root.derivePath("m/44'/0'/0'/0/0"),
    privateKey = keyPair.toWIF(),    // 私钥:L2tduuvVupopVxJ8tFtmGf5KXxKoaJBRFUKU1VCoTX3dtskwwAhF
    publicKey = keyPair.publicKey,
    { address } = bitcoin.payments.p2pkh({ pubkey: publicKey });     
    // 地址:12WDVW25gZtY4BYTnfTunGc9SDg1wdWjwg

通过私钥生成地址

network == undefined ? network = 'bitcoin' : network;

let keyPair = bitcoin.ECPair.fromWIF(privatekey, bitcoin.networks[network]),
    publicKey = keyPair.publicKey,
    { address } = bitcoin.payments.p2pkh({ pubkey: publicKey });

随机生成私钥以及地址

network == undefined ? network = 'bitcoin' : network;

let keyPair = bitcoin.ECPair.makeRandom({ network: bitcoin.networks[network] }),
   privatekey = keyPair.toWIF(),
   publicKey = keyPair.publicKey,
   { address } = bitcoin.payments.p2pkh({ pubkey: publicKey });

发起一对一交易

let alice = bitcoin.ECPair.fromWIF('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy'); 
    // L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy为Alice的私钥
    //  let lbtcVersion = 65282;
    let txb = new bitcoin.TransactionBuilder(bitcoin.networks[network]),
    //  txb.setVersion(Number(setVersion));
    
    txb.addInput('61d520ccb74288c96bc1a2b20ea1c0d5a704776dd0164a396efec3ea7040349d', 0); 
    // Alice's previous transaction output, has 15000 satoshis
    txb.addOutput('1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP', 12000);    // (in)15000 - (out)12000 = (fee)3000, this is the miner fee

    txb.sign(0, alice);     // 签名
    txb.build().toHex();    // 最后将交易十六进制编码广播到BTC网络



文章版权及转载声明

作者:问几许本文地址:https://wenjixu.com/blog/117.html发布于 4年前 ( 2019-05-10 )
文章转载或复制请以超链接形式并注明出处问几许

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,4497人围观)参与讨论

还没有评论,来说两句吧...