Merge pull request #101 from braydonf/blkbench
Optimizations for address module blockhandler
This commit is contained in:
commit
c0d28386ae
69
benchmarks/blockhandler.js
Normal file
69
benchmarks/blockhandler.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var benchmark = require('benchmark');
|
||||||
|
var async = require('async');
|
||||||
|
var memdown = require('memdown');
|
||||||
|
var Block = require('../lib/block');
|
||||||
|
var AddressModule = require('../lib/modules/address');
|
||||||
|
var DB = require('../lib/db');
|
||||||
|
var maxTime = 20;
|
||||||
|
|
||||||
|
var blockData1 = require('./data/block-367238.json');
|
||||||
|
var blockData2 = require('./data/block-367239.json');
|
||||||
|
var blockData3 = require('./data/block-367240.json');
|
||||||
|
|
||||||
|
console.log('Benchmarking Address Block Handler');
|
||||||
|
console.log('----------------------------------');
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
function(next) {
|
||||||
|
|
||||||
|
var c = 0;
|
||||||
|
var blocks = [
|
||||||
|
Block.fromBuffer(new Buffer(blockData1, 'hex')),
|
||||||
|
Block.fromBuffer(new Buffer(blockData2, 'hex')),
|
||||||
|
Block.fromBuffer(new Buffer(blockData3, 'hex'))
|
||||||
|
];
|
||||||
|
var blocksLength = 3;
|
||||||
|
var db = new DB({store: memdown});
|
||||||
|
var addressModule = new AddressModule({db: db});
|
||||||
|
|
||||||
|
function blockHandler(deffered) {
|
||||||
|
if (c >= blocksLength) {
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
var block = blocks[c];
|
||||||
|
addressModule.blockHandler(block, true, function(err, operations) {
|
||||||
|
if (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
deffered.resolve();
|
||||||
|
});
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
|
||||||
|
var suite = new benchmark.Suite();
|
||||||
|
|
||||||
|
suite.add('blockHandler', blockHandler, {
|
||||||
|
defer: true,
|
||||||
|
maxTime: maxTime
|
||||||
|
});
|
||||||
|
|
||||||
|
suite
|
||||||
|
.on('cycle', function(event) {
|
||||||
|
console.log(String(event.target));
|
||||||
|
})
|
||||||
|
.on('complete', function() {
|
||||||
|
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
|
||||||
|
console.log('----------------------------------------------------------------------');
|
||||||
|
next();
|
||||||
|
})
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
], function(err) {
|
||||||
|
if (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
console.log('Finished');
|
||||||
|
process.exit();
|
||||||
|
});
|
||||||
1
benchmarks/data/block-367238.json
Normal file
1
benchmarks/data/block-367238.json
Normal file
File diff suppressed because one or more lines are too long
1
benchmarks/data/block-367239.json
Normal file
1
benchmarks/data/block-367239.json
Normal file
File diff suppressed because one or more lines are too long
1
benchmarks/data/block-367240.json
Normal file
1
benchmarks/data/block-367240.json
Normal file
File diff suppressed because one or more lines are too long
@ -58,8 +58,6 @@ AddressModule.prototype.getPublishEvents = function() {
|
|||||||
AddressModule.prototype.blockHandler = function(block, addOutput, callback) {
|
AddressModule.prototype.blockHandler = function(block, addOutput, callback) {
|
||||||
var txs = this.db.getTransactionsFromBlock(block);
|
var txs = this.db.getTransactionsFromBlock(block);
|
||||||
|
|
||||||
log.debug('Updating output index');
|
|
||||||
|
|
||||||
var action = 'put';
|
var action = 'put';
|
||||||
if (!addOutput) {
|
if (!addOutput) {
|
||||||
action = 'del';
|
action = 'del';
|
||||||
@ -67,46 +65,47 @@ AddressModule.prototype.blockHandler = function(block, addOutput, callback) {
|
|||||||
|
|
||||||
var operations = [];
|
var operations = [];
|
||||||
|
|
||||||
for (var i = 0; i < txs.length; i++) {
|
var transactionLength = txs.length;
|
||||||
|
for (var i = 0; i < transactionLength; i++) {
|
||||||
|
|
||||||
var tx = txs[i];
|
var tx = txs[i];
|
||||||
var txid = tx.id;
|
var txid = tx.id;
|
||||||
var inputs = tx.inputs;
|
var inputs = tx.inputs;
|
||||||
var outputs = tx.outputs;
|
var outputs = tx.outputs;
|
||||||
|
|
||||||
for (var j = 0; j < outputs.length; j++) {
|
var outputLength = outputs.length;
|
||||||
|
for (var j = 0; j < outputLength; j++) {
|
||||||
var output = outputs[j];
|
var output = outputs[j];
|
||||||
|
|
||||||
var script = output.script;
|
var script = output.script;
|
||||||
|
|
||||||
if(!script) {
|
if(!script) {
|
||||||
log.debug('Invalid script');
|
log.debug('Invalid script');
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!script.isPublicKeyHashOut() && !script.isScriptHashOut() && !script.isPublicKeyOut()) {
|
var address = script.toAddress(this.db.network);
|
||||||
// ignore for now
|
if (!address && script.isPublicKeyOut()) {
|
||||||
log.debug('script was not pubkeyhashout, scripthashout, or pubkeyout');
|
var pubkey = script.chunks[0].buf;
|
||||||
|
address = Address.fromPublicKey(new PublicKey(pubkey), this.db.network);
|
||||||
|
} else if (!address){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var address;
|
|
||||||
|
|
||||||
if(script.isPublicKeyOut()) {
|
|
||||||
var pubkey = script.chunks[0].buf;
|
|
||||||
address = Address.fromPublicKey(new PublicKey(pubkey), this.db.network);
|
|
||||||
} else {
|
|
||||||
address = output.script.toAddress(this.db.network);
|
|
||||||
}
|
|
||||||
|
|
||||||
var outputIndex = j;
|
var outputIndex = j;
|
||||||
|
|
||||||
var timestamp = block.timestamp.getTime();
|
var timestamp = block.timestamp.getTime();
|
||||||
var height = block.__height;
|
var height = block.__height;
|
||||||
|
|
||||||
|
var addressStr = address.toString();
|
||||||
|
var scriptHex = output._scriptBuffer.toString('hex');
|
||||||
|
|
||||||
|
var key = [AddressModule.PREFIXES.OUTPUTS, addressStr, timestamp, txid, outputIndex].join('-');
|
||||||
|
var value = [output.satoshis, scriptHex, height].join(':');
|
||||||
|
|
||||||
operations.push({
|
operations.push({
|
||||||
type: action,
|
type: action,
|
||||||
key: [AddressModule.PREFIXES.OUTPUTS, address, timestamp, txid, outputIndex].join('-'),
|
key: key,
|
||||||
value: [output.satoshis, script, height].join(':')
|
value: value
|
||||||
});
|
});
|
||||||
|
|
||||||
// publish events to any subscribers
|
// publish events to any subscribers
|
||||||
@ -203,11 +202,11 @@ AddressModule.prototype.getBalance = function(address, queryMempool, callback) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
AddressModule.prototype.getOutputs = function(address, queryMempool, callback) {
|
AddressModule.prototype.getOutputs = function(addressStr, queryMempool, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var outputs = [];
|
var outputs = [];
|
||||||
var key = [AddressModule.PREFIXES.OUTPUTS, address].join('-');
|
var key = [AddressModule.PREFIXES.OUTPUTS, addressStr].join('-');
|
||||||
|
|
||||||
var stream = this.db.store.createReadStream({
|
var stream = this.db.store.createReadStream({
|
||||||
start: key,
|
start: key,
|
||||||
@ -220,7 +219,7 @@ AddressModule.prototype.getOutputs = function(address, queryMempool, callback) {
|
|||||||
var value = data.value.split(':');
|
var value = data.value.split(':');
|
||||||
|
|
||||||
var output = {
|
var output = {
|
||||||
address: key[1],
|
address: addressStr,
|
||||||
txid: key[3],
|
txid: key[3],
|
||||||
outputIndex: Number(key[4]),
|
outputIndex: Number(key[4]),
|
||||||
satoshis: Number(value[0]),
|
satoshis: Number(value[0]),
|
||||||
@ -246,7 +245,7 @@ AddressModule.prototype.getOutputs = function(address, queryMempool, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(queryMempool) {
|
if(queryMempool) {
|
||||||
outputs = outputs.concat(self.db.bitcoind.getMempoolOutputs(address));
|
outputs = outputs.concat(self.db.bitcoind.getMempoolOutputs(addressStr));
|
||||||
}
|
}
|
||||||
|
|
||||||
callback(null, outputs);
|
callback(null, outputs);
|
||||||
|
|||||||
@ -74,7 +74,7 @@ describe('AddressModule', function() {
|
|||||||
},
|
},
|
||||||
value: {
|
value: {
|
||||||
satoshis: 2502227470,
|
satoshis: 2502227470,
|
||||||
script: 'OP_DUP OP_HASH160 20 0x02a61d2066d19e9e2fd348a8320b7ebd4dd3ca2b OP_EQUALVERIFY OP_CHECKSIG',
|
script: '76a91402a61d2066d19e9e2fd348a8320b7ebd4dd3ca2b88ac',
|
||||||
blockHeight: 345003
|
blockHeight: 345003
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -98,7 +98,7 @@ describe('AddressModule', function() {
|
|||||||
},
|
},
|
||||||
value: {
|
value: {
|
||||||
satoshis: 3100000,
|
satoshis: 3100000,
|
||||||
script: 'OP_DUP OP_HASH160 20 0x9780ccd5356e2acc0ee439ee04e0fe69426c7528 OP_EQUALVERIFY OP_CHECKSIG',
|
script: '76a9149780ccd5356e2acc0ee439ee04e0fe69426c752888ac',
|
||||||
blockHeight: 345003
|
blockHeight: 345003
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user