Add tests and benchmarks for getTransaction
This commit is contained in:
parent
89e757b25a
commit
be3044d3d3
|
@ -11,22 +11,14 @@ console.log('-------------------------------------------------------------------
|
||||||
// To run the benchmarks a fully synced Bitcore Core directory is needed. The RPC comands
|
// 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.
|
// 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 = {
|
var fixtureData = {
|
||||||
transactions: [
|
blockHashes: [
|
||||||
|
'00000000fa7a4acea40e5d0591d64faf48fd862fa3561d111d967fc3a6a94177',
|
||||||
|
'000000000017e9e0afc4bc55339f60ffffb9cbe883f7348a9fbc198a486d5488',
|
||||||
|
'000000000019ddb889b534c5d85fca2c91a73feef6fd775cd228dea45353bae1',
|
||||||
|
'0000000000977ac3d9f5261efc88a3c2d25af92a91350750d00ad67744fa8d03'
|
||||||
|
],
|
||||||
|
txHashes: [
|
||||||
'5523b432c1bd6c101bee704ad6c560fd09aefc483f8a4998df6741feaa74e6eb',
|
'5523b432c1bd6c101bee704ad6c560fd09aefc483f8a4998df6741feaa74e6eb',
|
||||||
'ff48393e7731507c789cfa9cbfae045b10e023ce34ace699a63cdad88c8b43f8',
|
'ff48393e7731507c789cfa9cbfae045b10e023ce34ace699a63cdad88c8b43f8',
|
||||||
'5d35c5eebf704877badd0a131b0a86588041997d40dbee8ccff21ca5b7e5e333',
|
'5d35c5eebf704877badd0a131b0a86588041997d40dbee8ccff21ca5b7e5e333',
|
||||||
|
@ -62,13 +54,14 @@ bitcoind.on('ready', function() {
|
||||||
function(next) {
|
function(next) {
|
||||||
|
|
||||||
var c = 0;
|
var c = 0;
|
||||||
var hashesLength = blockHashes.length;
|
var hashesLength = fixtureData.blockHashes.length;
|
||||||
|
var txLength = fixtureData.txHashes.length;
|
||||||
|
|
||||||
function bitcoindGetBlockNative(deffered) {
|
function bitcoindGetBlockNative(deffered) {
|
||||||
if (c >= hashesLength) {
|
if (c >= hashesLength) {
|
||||||
c = 0;
|
c = 0;
|
||||||
}
|
}
|
||||||
var hash = blockHashes[c];
|
var hash = fixtureData.blockHashes[c];
|
||||||
bitcoind.getBlock(hash, function(err, block) {
|
bitcoind.getBlock(hash, function(err, block) {
|
||||||
if (err) {
|
if (err) {
|
||||||
throw err;
|
throw err;
|
||||||
|
@ -82,7 +75,7 @@ bitcoind.on('ready', function() {
|
||||||
if (c >= hashesLength) {
|
if (c >= hashesLength) {
|
||||||
c = 0;
|
c = 0;
|
||||||
}
|
}
|
||||||
var hash = blockHashes[c];
|
var hash = fixtureData.blockHashes[c];
|
||||||
client.getBlock(hash, false, function(err, block) {
|
client.getBlock(hash, false, function(err, block) {
|
||||||
if (err) {
|
if (err) {
|
||||||
throw err;
|
throw err;
|
||||||
|
@ -92,6 +85,34 @@ bitcoind.on('ready', function() {
|
||||||
c++;
|
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();
|
var suite = new benchmark.Suite();
|
||||||
|
|
||||||
suite.add('bitcoind getblock (native)', bitcoindGetBlockNative, {
|
suite.add('bitcoind getblock (native)', bitcoindGetBlockNative, {
|
||||||
|
@ -104,6 +125,16 @@ bitcoind.on('ready', function() {
|
||||||
maxTime: maxTime
|
maxTime: maxTime
|
||||||
});
|
});
|
||||||
|
|
||||||
|
suite.add('bitcoind gettransaction (native)', bitcoinGetTransactionNative, {
|
||||||
|
defer: true,
|
||||||
|
maxTime: maxTime
|
||||||
|
});
|
||||||
|
|
||||||
|
suite.add('bitcoind gettransaction (json rpc)', bitcoinGetTransactionJsonRpc, {
|
||||||
|
defer: true,
|
||||||
|
maxTime: maxTime
|
||||||
|
});
|
||||||
|
|
||||||
suite
|
suite
|
||||||
.on('cycle', function(event) {
|
.on('cycle', function(event) {
|
||||||
console.log(String(event.target));
|
console.log(String(event.target));
|
||||||
|
|
|
@ -11,7 +11,9 @@ var bitcoind;
|
||||||
var should = chai.should();
|
var should = chai.should();
|
||||||
var assert = chai.assert;
|
var assert = chai.assert;
|
||||||
var sinon = require('sinon');
|
var sinon = require('sinon');
|
||||||
|
var txData = require('./livenet-tx-data.json');
|
||||||
var blockData = require('./livenet-block-data.json');
|
var blockData = require('./livenet-block-data.json');
|
||||||
|
var testTxData = require('./livenet-tx-data.json');
|
||||||
var testBlockData = require('./testnet-block-data.json');
|
var testBlockData = require('./testnet-block-data.json');
|
||||||
|
|
||||||
describe('Basic Functionality', function() {
|
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() {
|
describe('get blocks by hash', function() {
|
||||||
|
|
||||||
blockData.forEach(function(data) {
|
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
|
@ -0,0 +1,5 @@
|
||||||
|
[
|
||||||
|
"0100000001eccd472c53ec7827eb8952a32d001ca95072ebe0a530f09cdf7219c0ce3f47be010000006a4730440220499cf8379c82301df2295c1581e1d683fec8cc201097efef748fcf3536532882022048c35b24485ec57f387745daf9fc50414ba76e50e914b53b9070f0a4a552f662012102a82fb2ce6e2ea8abb977d9825a2360c9447003dc91da5b8ffa5fc4b3c7808f3fffffffff020001b2c4000000001976a91442f0eb6de4628a6a7ae1afc85b027ff5e0aa25de88ac00437f1f690000001976a91443a3fc9d2ec090a08775957c364073e8b69cfe0688ac00000000",
|
||||||
|
"01000000021ae3aa69180bbf3d898cd31232224cfe6a2f21ff34051b6fc14f99528e2f0aee010000006b483045022100c9e8656a407fc1fb379b1669abbed3415483bcd20929ebc7fa2f7ecf7c7a7f7b022021dca2336f14df90f201ff8caa8d7a4b8e1760d07afecef880e0cfcbd13756d70121038f4478ad50111c8d04c692fcb6ce560f617a1d01b3056436ebf906d802a422afffffffff1ae3aa69180bbf3d898cd31232224cfe6a2f21ff34051b6fc14f99528e2f0aee030000008a4730440220275f9ab3083c78b368f1e33341275c776fc4af4105ee2646004e9ffb4cba639302202739d0063726a7bcea6681172892c8ab8c1c0b09b1a4d5ed1dc0cf9bea7b18990141048dcb436c4c027e8a5826bdf3c8b6cb326abe66a2d34a18aa473442d8c535f902da45df071964fc8304658b20f9dd1ed241dc48578bf775624a9bd8c52b92c389ffffffff02402b9b00000000001976a914f4f065395c82c6f28d3c73cef113d6da0f90d82a88ac5423f984000000001976a9145af0fe772e1600100b2000f8279f78ce66b7e1d588ac00000000",
|
||||||
|
"0100000002741453f89d091381329178b3d38cc213c21caede56f5a4a6b74e16ae9bd78b20000000006b483045022100bc0fa3e50ba16589664fd368139c02e3a9da55e20cceed340645b00f6466edac022068cad98f90006534afa2c38551248c6161861e32cb1af6ee1d0f75886263f9c20121038e9dac10e76c6c48a9b791de55f3ea009ee5d10532088f2eb9991d55b03b44e8ffffffff092910ede6e477e9589f8ce00807154378fcbd482d630b2c8cdd10243e74db79010000006b4830450221009cc13ef1acfdfc4535d888b1ea495b3c543e4fabdf38ce8cde4a37171136977c02201a0571e3ab3fd70ca4d97193fcd7999b35760ea4cac404edd1e50a338e50a28d012102e397fa30f882d076e393deec070d423138bd9544aa4cb53450b609713bb327aaffffffff02d5420400000000001976a914171e633a137d5c2275174380c6ca761d7e30365f88acb01a0200000000001976a914263ca88fd638fdb0e2ee8e2a16ec21ecea7a3d7e88ac00000000"
|
||||||
|
]
|
|
@ -351,7 +351,7 @@ Bitcoin.prototype.getTx = function(txid, blockhash, callback) {
|
||||||
|
|
||||||
return bitcoindjs.getTransaction(txid, blockhash, function(err, tx) {
|
return bitcoindjs.getTransaction(txid, blockhash, function(err, tx) {
|
||||||
if (err) return callback(err);
|
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) {
|
return bitcoindjs.getBlocksByTime(options, function(err, blocks) {
|
||||||
if (err) return callback(err);
|
if (err) return callback(err);
|
||||||
return callback(null, blocks.map(function(block) {
|
return callback(null, blocks.map(function(block) {
|
||||||
return bitcoin.block(block)
|
return bitcoin.block(block);
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -878,15 +878,16 @@ async_get_tx(uv_work_t *req) {
|
||||||
async_tx_data* data = static_cast<async_tx_data*>(req->data);
|
async_tx_data* data = static_cast<async_tx_data*>(req->data);
|
||||||
|
|
||||||
uint256 hash = uint256S(data->txid);
|
uint256 hash = uint256S(data->txid);
|
||||||
uint256 blockhash = uint256S(data->blockhash);
|
uint256 blockhash;
|
||||||
CTransaction ctx;
|
CTransaction ctx;
|
||||||
|
|
||||||
if (get_tx(hash, blockhash, ctx)) {
|
if (!GetTransaction(hash, ctx, blockhash, true)) {
|
||||||
data->ctx = ctx;
|
|
||||||
data->blockhash = blockhash.GetHex().c_str();
|
|
||||||
} else {
|
|
||||||
data->err_msg = std::string("Transaction not found.");
|
data->err_msg = std::string("Transaction not found.");
|
||||||
|
} else {
|
||||||
|
data->ctx = ctx;
|
||||||
|
data->blockhash = blockhash.GetHex();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -908,12 +909,16 @@ async_get_tx_after(uv_work_t *req) {
|
||||||
node::FatalException(try_catch);
|
node::FatalException(try_catch);
|
||||||
}
|
}
|
||||||
} else {
|
} 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;
|
const unsigned argc = 2;
|
||||||
Local<Value> argv[argc] = {
|
Local<Value> argv[argc] = {
|
||||||
Local<Value>::New(isolate, NanNull()),
|
Local<Value>::New(isolate, NanNull()),
|
||||||
Local<Value>::New(isolate, jstx)
|
rawNodeBuffer
|
||||||
};
|
};
|
||||||
TryCatch try_catch;
|
TryCatch try_catch;
|
||||||
cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
|
cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
|
||||||
|
@ -957,27 +962,6 @@ NAN_METHOD(GetInfo) {
|
||||||
NanReturnValue(obj);
|
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
|
* Helpers
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue