diff --git a/benchmarks/index.js b/benchmarks/index.js index 778f23c0..9f73898b 100644 --- a/benchmarks/index.js +++ b/benchmarks/index.js @@ -1,34 +1,42 @@ -'use strict' +'use strict'; -var assert = require('assert'); var benchmark = require('benchmark'); -var bitcoinconsensus = require('../'); var bitcoin = require('bitcoin'); var async = require('async'); - -var maxTime = 10; +var maxTime = 20; console.log('Benchmarking Bitcoind.js native interface versus Bitcoind JSON RPC interface'); console.log('----------------------------------------------------------------------'); -// The primary methods needed are: -// getInfo === works -// getRawTransactioni === getrawtransaction "txid" ( verbose ) +// To run the benchmarks a fully synced Bitcore Core directory is needed. The RPC comands +// can be modified to match the settings in bitcoin.conf. + +// The primary methods that are needed: +// getInfo === works +// getRawTransaction === getrawtransaction "txid" ( verbose ) // sendRawTransaction === sendrawtransaction "hexstring" ( allowhighfees ) // getTransaction === either I need txindex turned on -or- the wallet turned on // Wallet functionality isn't needed, and libbitcoind.so could be compiled with the --disable-wallet flag. -var fixtureData = { +var blockHashes = [ + '00000000fa7a4acea40e5d0591d64faf48fd862fa3561d111d967fc3a6a94177', + '000000000017e9e0afc4bc55339f60ffffb9cbe883f7348a9fbc198a486d5488', + '000000000019ddb889b534c5d85fca2c91a73feef6fd775cd228dea45353bae1', + '0000000000977ac3d9f5261efc88a3c2d25af92a91350750d00ad67744fa8d03' +]; + +var fixtureData = { transactions: [ '5523b432c1bd6c101bee704ad6c560fd09aefc483f8a4998df6741feaa74e6eb', 'ff48393e7731507c789cfa9cbfae045b10e023ce34ace699a63cdad88c8b43f8', '5d35c5eebf704877badd0a131b0a86588041997d40dbee8ccff21ca5b7e5e333', '88842f2cf9d8659c3434f6bc0c515e22d87f33e864e504d2d7117163a572a3aa', ] -} +}; var bitcoind = require('../')({ - directory: '~/.libbitcoind-example' + directory: '~/.bitcoin', + testnet: true }); bitcoind.on('error', function(err) { @@ -37,42 +45,64 @@ bitcoind.on('error', function(err) { bitcoind.on('open', function(status) { bitcoind.log('status="%s"', status); +}); + +bitcoind.on('ready', function() { + + bitcoind.log('status="%s"', 'chaintip ready.'); + var client = new bitcoin.Client({ host: 'localhost', port: 18332, - user: 'bitpaytest', + user: 'bitcoin', pass: 'local321' }); async.series([ function(next) { - function bitcoindJsonRpc() { + var c = 0; + var hashesLength = blockHashes.length; - client.getInfo(); -// var item = Math.floor((Math.random() * fixtures.length)); -// var data = fixtureData.transactions[item]; -// -// client.getTransaction(data, function(err, tx) { -// assert.equal(err, null); -// }); + function bitcoindGetBlockNative(deffered) { + if (c >= hashesLength) { + c = 0; + } + var hash = blockHashes[c]; + bitcoind.getBlock(hash, function(err, block) { + if (err) { + throw err; + } + deffered.resolve(); + }); + c++; } - function bitcoindNative() { - - bitcoind.getInfo(); -// var item = Math.floor((Math.random() * fixtures.length)); -// var data = fixtureData.transaction[item]; -// -// bitcoind.getTransaction(data, function(err, tx) { -// assert.equal(err, null); -// }); + function bitcoindGetBlockJsonRpc(deffered) { + if (c >= hashesLength) { + c = 0; + } + var hash = blockHashes[c]; + client.getBlock(hash, false, function(err, block) { + if (err) { + throw err; + } + deffered.resolve(); + }); + c++; } var suite = new benchmark.Suite(); - suite.add('bitcoind json rpc', bitcoindJsonRpc, { maxTime: maxTime }); - suite.add('bitcoind native', bitcoindNative, { maxTime: maxTime }); + suite.add('bitcoind getblock (native)', bitcoindGetBlockNative, { + defer: true, + maxTime: maxTime + }); + + suite.add('bitcoind getblock (json rpc)', bitcoindGetBlockJsonRpc, { + defer: true, + maxTime: maxTime + }); suite .on('cycle', function(event) { diff --git a/lib/bitcoind.js b/lib/bitcoind.js index 3515e834..9557412e 100644 --- a/lib/bitcoind.js +++ b/lib/bitcoind.js @@ -369,7 +369,7 @@ Bitcoin.prototype.getBlock = function(blockhash, callback) { if (bitcoin.stopping) return []; return bitcoindjs.getBlock(blockhash, function(err, block) { if (err) return callback(err); - return callback(null, bitcoin.block(block)); + return callback(null, block); }); }; diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index 10ceccd2..a513b343 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -347,7 +347,14 @@ async_blocks_ready(uv_work_t *req) { data->result = std::string(""); while(!chainActive.Tip()) { - usleep(1E4); + usleep(1E6); + } + + CBlockIndex* tip = chainActive.Tip(); + uint256 tipHash = tip->GetBlockHash(); + + while(mapBlockIndex.count(tipHash) == 0) { + usleep(1E6); } } @@ -876,8 +883,11 @@ async_get_block_after(uv_work_t *req) { const CBlock& cblock = data->cblock; CBlockIndex* cblock_index = data->cblock_index; - Local jsblock = NanNew(); - cblock_to_jsblock(cblock, cblock_index, jsblock, false); + CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION); + ssBlock << cblock; + std::string strHex = HexStr(ssBlock.begin(), ssBlock.end()); + + Local jsblock = NanNew(strHex); const unsigned argc = 2; Local argv[argc] = {