Add tests and benchmarks for getTransaction

This commit is contained in:
Braydon Fuller 2015-07-15 14:16:15 -04:00
parent 89e757b25a
commit be3044d3d3
6 changed files with 88 additions and 67 deletions

View File

@ -11,22 +11,14 @@ console.log('-------------------------------------------------------------------
// 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 blockHashes = [
'00000000fa7a4acea40e5d0591d64faf48fd862fa3561d111d967fc3a6a94177',
'000000000017e9e0afc4bc55339f60ffffb9cbe883f7348a9fbc198a486d5488',
'000000000019ddb889b534c5d85fca2c91a73feef6fd775cd228dea45353bae1',
'0000000000977ac3d9f5261efc88a3c2d25af92a91350750d00ad67744fa8d03'
];
var fixtureData = {
transactions: [
blockHashes: [
'00000000fa7a4acea40e5d0591d64faf48fd862fa3561d111d967fc3a6a94177',
'000000000017e9e0afc4bc55339f60ffffb9cbe883f7348a9fbc198a486d5488',
'000000000019ddb889b534c5d85fca2c91a73feef6fd775cd228dea45353bae1',
'0000000000977ac3d9f5261efc88a3c2d25af92a91350750d00ad67744fa8d03'
],
txHashes: [
'5523b432c1bd6c101bee704ad6c560fd09aefc483f8a4998df6741feaa74e6eb',
'ff48393e7731507c789cfa9cbfae045b10e023ce34ace699a63cdad88c8b43f8',
'5d35c5eebf704877badd0a131b0a86588041997d40dbee8ccff21ca5b7e5e333',
@ -62,13 +54,14 @@ bitcoind.on('ready', function() {
function(next) {
var c = 0;
var hashesLength = blockHashes.length;
var hashesLength = fixtureData.blockHashes.length;
var txLength = fixtureData.txHashes.length;
function bitcoindGetBlockNative(deffered) {
if (c >= hashesLength) {
c = 0;
}
var hash = blockHashes[c];
var hash = fixtureData.blockHashes[c];
bitcoind.getBlock(hash, function(err, block) {
if (err) {
throw err;
@ -82,7 +75,7 @@ bitcoind.on('ready', function() {
if (c >= hashesLength) {
c = 0;
}
var hash = blockHashes[c];
var hash = fixtureData.blockHashes[c];
client.getBlock(hash, false, function(err, block) {
if (err) {
throw err;
@ -92,6 +85,34 @@ bitcoind.on('ready', function() {
c++;
}
function bitcoinGetTransactionNative(deffered) {
if (c >= txLength) {
c = 0;
}
var hash = fixtureData.txHashes[c];
bitcoind.getTransaction(hash, function(err, tx) {
if (err) {
throw err;
}
deffered.resolve();
});
c++;
}
function bitcoinGetTransactionJsonRpc(deffered) {
if (c >= txLength) {
c = 0;
}
var hash = fixtureData.txHashes[c];
client.getRawTransaction(hash, function(err, tx) {
if (err) {
throw err;
}
deffered.resolve();
});
c++;
}
var suite = new benchmark.Suite();
suite.add('bitcoind getblock (native)', bitcoindGetBlockNative, {
@ -104,6 +125,16 @@ bitcoind.on('ready', function() {
maxTime: maxTime
});
suite.add('bitcoind gettransaction (native)', bitcoinGetTransactionNative, {
defer: true,
maxTime: maxTime
});
suite.add('bitcoind gettransaction (json rpc)', bitcoinGetTransactionJsonRpc, {
defer: true,
maxTime: maxTime
});
suite
.on('cycle', function(event) {
console.log(String(event.target));

View File

@ -11,7 +11,9 @@ var bitcoind;
var should = chai.should();
var assert = chai.assert;
var sinon = require('sinon');
var txData = require('./livenet-tx-data.json');
var blockData = require('./livenet-block-data.json');
var testTxData = require('./livenet-tx-data.json');
var testBlockData = require('./testnet-block-data.json');
describe('Basic Functionality', function() {
@ -45,6 +47,19 @@ describe('Basic Functionality', function() {
});
});
describe('get transactions by hash', function() {
txData.forEach(function(data) {
var tx = bitcore.Transaction();
tx.fromString(data);
it('for tx ' + tx.hash, function(done) {
bitcoind.getTransaction(tx.hash, function(err, response) {
assert(response.toString('hex') === data, 'incorrect tx data for ' + tx.hash);
done();
});
});
});
});
describe('get blocks by hash', function() {
blockData.forEach(function(data) {
@ -78,22 +93,4 @@ describe('Basic Functionality', function() {
});
});
describe.skip('get the chain', function() {
var heights = [];
for (var i = 364599; i >= 0 ; i--) {
heights.push(i);
}
heights.forEach(function(height) {
it('block at height ' + height, function(done) {
bitcoind.getBlock(height, function(err, response) {
var block = bitcore.Block.fromBuffer(response);
console.log(block.hash);
done();
});
});
});
});
});

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
[
"0100000001eccd472c53ec7827eb8952a32d001ca95072ebe0a530f09cdf7219c0ce3f47be010000006a4730440220499cf8379c82301df2295c1581e1d683fec8cc201097efef748fcf3536532882022048c35b24485ec57f387745daf9fc50414ba76e50e914b53b9070f0a4a552f662012102a82fb2ce6e2ea8abb977d9825a2360c9447003dc91da5b8ffa5fc4b3c7808f3fffffffff020001b2c4000000001976a91442f0eb6de4628a6a7ae1afc85b027ff5e0aa25de88ac00437f1f690000001976a91443a3fc9d2ec090a08775957c364073e8b69cfe0688ac00000000",
"01000000021ae3aa69180bbf3d898cd31232224cfe6a2f21ff34051b6fc14f99528e2f0aee010000006b483045022100c9e8656a407fc1fb379b1669abbed3415483bcd20929ebc7fa2f7ecf7c7a7f7b022021dca2336f14df90f201ff8caa8d7a4b8e1760d07afecef880e0cfcbd13756d70121038f4478ad50111c8d04c692fcb6ce560f617a1d01b3056436ebf906d802a422afffffffff1ae3aa69180bbf3d898cd31232224cfe6a2f21ff34051b6fc14f99528e2f0aee030000008a4730440220275f9ab3083c78b368f1e33341275c776fc4af4105ee2646004e9ffb4cba639302202739d0063726a7bcea6681172892c8ab8c1c0b09b1a4d5ed1dc0cf9bea7b18990141048dcb436c4c027e8a5826bdf3c8b6cb326abe66a2d34a18aa473442d8c535f902da45df071964fc8304658b20f9dd1ed241dc48578bf775624a9bd8c52b92c389ffffffff02402b9b00000000001976a914f4f065395c82c6f28d3c73cef113d6da0f90d82a88ac5423f984000000001976a9145af0fe772e1600100b2000f8279f78ce66b7e1d588ac00000000",
"0100000002741453f89d091381329178b3d38cc213c21caede56f5a4a6b74e16ae9bd78b20000000006b483045022100bc0fa3e50ba16589664fd368139c02e3a9da55e20cceed340645b00f6466edac022068cad98f90006534afa2c38551248c6161861e32cb1af6ee1d0f75886263f9c20121038e9dac10e76c6c48a9b791de55f3ea009ee5d10532088f2eb9991d55b03b44e8ffffffff092910ede6e477e9589f8ce00807154378fcbd482d630b2c8cdd10243e74db79010000006b4830450221009cc13ef1acfdfc4535d888b1ea495b3c543e4fabdf38ce8cde4a37171136977c02201a0571e3ab3fd70ca4d97193fcd7999b35760ea4cac404edd1e50a338e50a28d012102e397fa30f882d076e393deec070d423138bd9544aa4cb53450b609713bb327aaffffffff02d5420400000000001976a914171e633a137d5c2275174380c6ca761d7e30365f88acb01a0200000000001976a914263ca88fd638fdb0e2ee8e2a16ec21ecea7a3d7e88ac00000000"
]

View File

@ -351,7 +351,7 @@ Bitcoin.prototype.getTx = function(txid, blockhash, callback) {
return bitcoindjs.getTransaction(txid, blockhash, function(err, tx) {
if (err) return callback(err);
return callback(null, bitcoin.tx(tx));
return callback(null, tx);
});
};
@ -531,7 +531,7 @@ Bitcoin.prototype.getBlocksByTime = function(options, callback) {
return bitcoindjs.getBlocksByTime(options, function(err, blocks) {
if (err) return callback(err);
return callback(null, blocks.map(function(block) {
return bitcoin.block(block)
return bitcoin.block(block);
}));
});
};

View File

@ -878,15 +878,16 @@ async_get_tx(uv_work_t *req) {
async_tx_data* data = static_cast<async_tx_data*>(req->data);
uint256 hash = uint256S(data->txid);
uint256 blockhash = uint256S(data->blockhash);
uint256 blockhash;
CTransaction ctx;
if (get_tx(hash, blockhash, ctx)) {
data->ctx = ctx;
data->blockhash = blockhash.GetHex().c_str();
} else {
if (!GetTransaction(hash, ctx, blockhash, true)) {
data->err_msg = std::string("Transaction not found.");
} else {
data->ctx = ctx;
data->blockhash = blockhash.GetHex();
}
}
static void
@ -908,12 +909,16 @@ async_get_tx_after(uv_work_t *req) {
node::FatalException(try_catch);
}
} else {
Local<Object> jstx = NanNew<Object>();
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << ctx;
std::string stx = ssTx.str();
Local<Value> rawNodeBuffer = node::Buffer::New(isolate, stx.c_str(), stx.size());
const unsigned argc = 2;
Local<Value> argv[argc] = {
Local<Value>::New(isolate, NanNull()),
Local<Value>::New(isolate, jstx)
rawNodeBuffer
};
TryCatch try_catch;
cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
@ -957,27 +962,6 @@ NAN_METHOD(GetInfo) {
NanReturnValue(obj);
}
static int
get_tx(uint256 txid, uint256& blockhash, CTransaction& ctx) {
if (GetTransaction(txid, ctx, blockhash, true)) {
return 1;
} else if (blockhash.IsNull()) {
CBlock block;
CBlockIndex* pblockindex = mapBlockIndex[blockhash];
if (ReadBlockFromDisk(block, pblockindex)) {
BOOST_FOREACH(const CTransaction& tx, block.vtx) {
if (tx.GetHash() == txid) {
ctx = tx;
blockhash = block.GetHash();
return -1;
}
}
}
}
return 0;
}
/**
* Helpers
*/