比特币(Bitcoin)的概念最初由中本聪在2008年11月1日提出,并于2009年1月3日正式诞生 [1] 。根据中本聪的思路设计发布的开源软件以及建构其上的P2P网络。比特币是一种P2P形式的虚拟的加密数字货币。点对点的传输意味着一个去中心化的支付系统。
与所有的货币不同,比特币不依靠特定货币机构发行,它依据特定算法,通过大量的计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为,并使用密码学的设计来确保货币流通各个环节安全性。P2P的去中心化特性与算法本身可以确保无法通过大量制造比特币来人为操控币值。基于密码学的设计可以使比特币只能被真实的拥有者转移或支付。这同样确保了货币所有权与流通交易的匿名性。比特币与其他虚拟货币最大的不同,是其总数量非常有限,具有极强的稀缺性。该货币系统曾在4年内只有不超过1050万个,之后的总数量将被永久限制在约2100万个。
下面教程就是用JavaScript 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网络
还没有评论,来说两句吧...