Merge pull request #25 from braydonf/tx
Add tests and benchmarks for getTransaction
This commit is contained in:
commit
a37631222c
|
@ -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));
|
||||
|
|
|
@ -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
|
@ -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) {
|
||||
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);
|
||||
}));
|
||||
});
|
||||
};
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue