diff --git a/README.md b/README.md index 416d8d324..84b5290f1 100644 --- a/README.md +++ b/README.md @@ -28,58 +28,84 @@ Some examples are provided at the [examples](/examples) path. Here are some snip ## Validating an address Validating a Bitcoin address: -``` +```js var Address = require('bitcore/Address').class(); -var addr = new Address("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"); -try { - addr.validate(); - console.log("Address is valid."); -} catch(e) { - console.log(addr.data + " is not a valid address. " + e); -} +var addrStrings = [ + "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa", + "1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx", + "A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx", + "1600 Pennsylvania Ave NW", +].map(function(addr) { + return new Address(addr); +}); + +addrStrings.forEach(function(addr) { + + try { + addr.validate(); + console.log(addr.data + ": is valid"); + } catch(e) { + console.log(addr.data + ": is not a valid address. " + e); + } + +}); + ``` ## Monitoring Blocks and Transactions -``` -var networks = require('bitcore/networks'); -var Peer = require('bitcore/Peer').class(); +```js +var util = require('util'); +var networks = require('bitcore/networks'); +var Peer = require('bitcore/Peer').class(); var PeerManager = require('bitcore/PeerManager').createClass({ network: networks.testnet }); -var util= require('util'); +var handleBlock = function(info) { + + console.log('** Block Received **'); + console.log(info.message); -var handleBlock = function(b) { - console.log('block received:', util.inspect(b.message,{depth:null})); }; -var handleTx = function(b) { +var handleTx = function(info) { + var tx = info.message.tx.getStandardizedObject(); - console.log('block tx:', util.inspect(tx,{depth:null})); + + console.log('** Block TX **'); + console.log(tx); + }; -var handleInv = function(b) { - console.log('block inv:', util.inspect(info.message,{depth:null})); +var handleInv = function(info) { + + console.log('** Block Inv **'); + console.log(info.message); + var invs = info.message.invs; info.conn.sendGetData(invs); + }; - var peerman = new PeerManager(); -peerman.addPeer( new Peer('127.0.0.1',18333) ); + +peerman.addPeer( new Peer('127.0.0.1', 18333) ); + peerman.on('connection', function(conn) { - conn.on('inv', handleInv); + conn.on('inv', handleInv); conn.on('block', handleBlock); - conn.on('tx', handleTx); + conn.on('tx', handleTx); }); + peerman.start(); + ``` PeerManager will emit the following events: 'version', 'verack', 'addr', 'getaddr', 'error' 'disconnect'; and will relay events like: 'tx', 'block', 'inv'. Please see [PeerManager.js](PeerManager.js), [Peer.js](Peer.js) and [Connection.js](Connection.js) ## Creating and sending a Transaction through P2P -``` +```js var networks = require('bitcore/networks'); var Peer = require('bitcore/Peer').class(); var Transaction = require('bitcore/Transaction').class(); @@ -91,31 +117,37 @@ var PeerManager = require('bitcore/PeerManager').createClass({ }); var createTx = function() { - var TXIN='d05f35e0bbc495f6dcab03e599c8f5e32a07cdb4bc76964de201d06a2a7d8265'; - var TXIN_N=0; - var ADDR='muHct3YZ9Nd5Pq7uLYYhXRAxeW4EnpcaLz'; - var VAL='1.234'; - var txobj = {}; - txobj.version = 1; - txobj.lock_time = 0; - txobj.ins = []; - txobj.outs = []; - var txin = {}; - txin.s = coinUtil.EMPTY_BUFFER; //Add signature - txin.q = 0xffffffff; - var hash = new Buffer(TXIN, 'hex'); - hash.reverse(); - var vout = parseInt(TXIN_N); + var TXIN = 'd05f35e0bbc495f6dcab03e599c8f5e32a07cdb4bc76964de201d06a2a7d8265'; + var TXIN_N = 0; + var ADDR = 'muHct3YZ9Nd5Pq7uLYYhXRAxeW4EnpcaLz'; + var VAL = '1.234'; + + var txobj = { + version: 1, + lock_time: 0, + ins: [], + outs: [] + } + + var txin = { + s: coinUtil.EMPTY_BUFFER, // Add signature + q: 0xffffffff + }; + + var hash = new Buffer(TXIN.split('').reverse(), 'hex'); + + var vout = parseInt(TXIN_N); var voutBuf = new Buffer(4); + voutBuf.writeUInt32LE(vout, 0); txin.o = Buffer.concat([hash, voutBuf]); txobj.ins.push(txin); - var addr = new Address(ADDR); - var script = Script.createPubKeyHashOut(addr.payload()); + var addr = new Address(ADDR); + var script = Script.createPubKeyHashOut(addr.payload()); var valueNum = coinUtil.parseValue(VAL); - var value = coinUtil.bigIntToValue(valueNum); + var value = coinUtil.bigIntToValue(valueNum); var txout = { v: value, @@ -124,33 +156,55 @@ var createTx = function() { txobj.outs.push(txout); return new Transaction(txobj); + }; var peerman = new PeerManager(); -peerman.addPeer( new Peer('127.0.0.1',18333) ); +peerman.addPeer(new Peer('127.0.0.1', 18333)); + peerman.on('connect', function(conn) { + var conn = peerman.getActiveConnection(); - if (conn) + + if (conn) { conn.sendTx(createTx()); - conn.on('reject', function () { console.log('Transaction Rejected'); } ); + } + + conn.on('reject', function () { + console.log('Transaction Rejected'); + }); + }); + peerman.start(); ``` ## Consuming bitcoind RPC -``` -var RpcClient = require('../RpcClient').class(); -var config = { - protocol: 'http', - user: 'user', - pass: 'pass', - host: '127.0.0.1', - port: '18332', +```js +var util = require('util'); +var RpcClient = require('bitcore/RpcClient').class(); +var hash = process.argv[2] || '0000000000b6288775bbd326bedf324ca8717a15191da58391535408205aada4'; + + var config = { + protocol: 'http', + user: 'user', + pass: 'pass', + host: '127.0.0.1', + port: '18332', }; + var rpc = new RpcClient(config); -rpc.getBlock( hash, function(err, ret) { - console.log(err); - console.log(util.inspect(ret, { depth: 10} )); + +rpc.getBlock(hash, function(err, ret) { + + if(err) { + console.error("An error occured fetching block", hash); + console.error(err); + return; + } + + console.log(ret); + }); ``` Check the list of all supported RPC call at [RpcClient.js](RpcClient.js) diff --git a/examples/Address.js b/examples/Address.js index 6525d398b..f9679df80 100644 --- a/examples/Address.js +++ b/examples/Address.js @@ -1,7 +1,7 @@ +'use strict'; +// Replace '..' with 'bitcore' if you plan on using this code elsewhere. -// Replace path '..' to 'bitcore' if you are using this example -// in a different project var Address = require('../Address').class(); var addrStrings = [ @@ -9,10 +9,11 @@ var addrStrings = [ "1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx", "A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx", "1600 Pennsylvania Ave NW", -]; +].map(function(addr) { + return new Address(addr); +}); -addrStrings.forEach(function(addrStr){ - var addr = new Address(addrStr); +addrStrings.forEach(function(addr) { try { addr.validate(); @@ -20,4 +21,5 @@ addrStrings.forEach(function(addrStr){ } catch(e) { console.log(addr.data + ": is not a valid address. " + e); } + }); diff --git a/examples/PeerManager.js b/examples/PeerManager.js index cdc848caf..b089095e5 100644 --- a/examples/PeerManager.js +++ b/examples/PeerManager.js @@ -1,38 +1,48 @@ 'use strict'; -// Replace path '..' to 'bitcore' if you are using this example -// in a different project -var networks = require('../networks'); -var Peer = require('../Peer').class(); +// Replace '..' with 'bitcore' if you plan on using this code elsewhere. + +var util = require('util'); +var networks = require('../networks'); +var Peer = require('../Peer').class(); var PeerManager = require('../PeerManager').createClass({ network: networks.testnet }); -var util= require('util'); +var handleBlock = function(info) { + console.log('** Block Received **'); + console.log(info.message); -var handleBlock = function(b) { - console.log('block received:', util.inspect(b.message,{depth:null})); }; var handleTx = function(info) { + var tx = info.message.tx.getStandardizedObject(); - console.log('block tx:', util.inspect(tx,{depth:null})); + + console.log('** Block TX **'); + console.log(tx); + }; var handleInv = function(info) { - console.log('block inv:', util.inspect(info.message,{depth:null})); + + console.log('** Block Inv **'); + console.log(info.message); + var invs = info.message.invs; info.conn.sendGetData(invs); + }; - var peerman = new PeerManager(); -peerman.addPeer( new Peer('127.0.0.1',18333) ); -peerman.on('connection', function(conn) { - conn.on('inv', handleInv); - conn.on('block', handleBlock); - conn.on('tx', handleTx); -}); -peerman.start(); +peerman.addPeer( new Peer('127.0.0.1', 18333) ); + +peerman.on('connection', function(conn) { + conn.on('inv', handleInv); + conn.on('block', handleBlock); + conn.on('tx', handleTx); +}); + +peerman.start(); diff --git a/examples/Rpc.js b/examples/Rpc.js index 0d27c4402..e0749916d 100644 --- a/examples/Rpc.js +++ b/examples/Rpc.js @@ -1,23 +1,29 @@ +'use strict'; -var util = require('util'); +// Replace '..' with 'bitcore' if you plan on using this code elsewhere. -// Replace path '..' to 'bitcore' if you are using this example -// in a different project +var util = require('util'); var RpcClient = require('../RpcClient').class(); -var hash = process.argv[2] - || '0000000000b6288775bbd326bedf324ca8717a15191da58391535408205aada4'; +var hash = process.argv[2] || '0000000000b6288775bbd326bedf324ca8717a15191da58391535408205aada4'; var config = { - protocol: 'http', - user: 'user', - pass: 'pass', - host: '127.0.0.1', - port: '18332', + protocol: 'http', + user: 'user', + pass: 'pass', + host: '127.0.0.1', + port: '18332', }; - var rpc = new RpcClient(config); -rpc.getBlock( hash, function(err, ret) { - console.log(err); - console.log(util.inspect(ret, { depth: 10} )); + +rpc.getBlock(hash, function(err, ret) { + + if(err) { + console.error("An error occured fetching block", hash); + console.error(err); + return; + } + + console.log(ret); + }); diff --git a/examples/SendTx.js b/examples/SendTx.js index 9323d0bae..c64567384 100644 --- a/examples/SendTx.js +++ b/examples/SendTx.js @@ -1,42 +1,48 @@ -// Replace path '..' to 'bitcore' if you are using this example -// in a different project -var networks = require('../networks'); -var Peer = require('../Peer').class(); + +// Replace '..' with 'bitcore' if you plan on using this code elsewhere. + +var networks = require('../networks'); +var Peer = require('../Peer').class(); var Transaction = require('../Transaction').class(); -var Address = require('../Address').class(); -var Script = require('../Script').class(); +var Address = require('../Address').class(); +var Script = require('../Script').class(); +var coinUtil = require('../util/util'); var PeerManager = require('../PeerManager').createClass({ network: networks.testnet }); -var coinUtil = require('../util/util'); - var createTx = function() { - var TXIN='d05f35e0bbc495f6dcab03e599c8f5e32a07cdb4bc76964de201d06a2a7d8265'; - var TXIN_N=0; - var ADDR='muHct3YZ9Nd5Pq7uLYYhXRAxeW4EnpcaLz'; - var VAL='1.234'; - var txobj = {}; - txobj.version = 1; - txobj.lock_time = 0; - txobj.ins = []; - txobj.outs = []; - var txin = {}; - txin.s = coinUtil.EMPTY_BUFFER; //Add signature - txin.q = 0xffffffff; - var hash = new Buffer(TXIN, 'hex'); - hash.reverse(); - var vout = parseInt(TXIN_N); + var TXIN = 'd05f35e0bbc495f6dcab03e599c8f5e32a07cdb4bc76964de201d06a2a7d8265'; + var TXIN_N = 0; + var ADDR = 'muHct3YZ9Nd5Pq7uLYYhXRAxeW4EnpcaLz'; + var VAL = '1.234'; + + var txobj = { + version: 1, + lock_time: 0, + ins: [], + outs: [] + } + + var txin = { + s: coinUtil.EMPTY_BUFFER, // Add signature + q: 0xffffffff + }; + + var hash = new Buffer(TXIN.split('').reverse(), 'hex'); + + var vout = parseInt(TXIN_N); var voutBuf = new Buffer(4); + voutBuf.writeUInt32LE(vout, 0); txin.o = Buffer.concat([hash, voutBuf]); txobj.ins.push(txin); - var addr = new Address(ADDR); - var script = Script.createPubKeyHashOut(addr.payload()); + var addr = new Address(ADDR); + var script = Script.createPubKeyHashOut(addr.payload()); var valueNum = coinUtil.parseValue(VAL); - var value = coinUtil.bigIntToValue(valueNum); + var value = coinUtil.bigIntToValue(valueNum); var txout = { v: value, @@ -45,16 +51,24 @@ var createTx = function() { txobj.outs.push(txout); return new Transaction(txobj); + }; var peerman = new PeerManager(); -peerman.addPeer( new Peer('127.0.0.1',18333) ); +peerman.addPeer(new Peer('127.0.0.1', 18333)); + peerman.on('connect', function(conn) { + var conn = peerman.getActiveConnection(); - if (conn) + + if (conn) { conn.sendTx(createTx()); - conn.on('reject', function () { console.log('Transaction Rejected'); } ); + } + + conn.on('reject', function () { + console.log('Transaction Rejected'); + }); + }); + peerman.start(); - -