Optimize block list page to not parse all transactions from a block when
the only data that is interesting is number of transactions. Fixes 100% CPU while building block list.
This commit is contained in:
parent
133c2321f9
commit
c42b8d9d91
@ -135,16 +135,34 @@ BlockController.prototype.list = function(req, res) {
|
|||||||
async.mapSeries(
|
async.mapSeries(
|
||||||
hashes,
|
hashes,
|
||||||
function(hash, next) {
|
function(hash, next) {
|
||||||
self.node.getBlock(hash, function(err, block) {
|
self.node.services.bitcoind.getBlock(hash, function(err, blockBuffer) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
var br = new bitcore.encoding.BufferReader(blockBuffer);
|
||||||
|
// take a shortcut to get number of transactions and the blocksize.
|
||||||
|
// Also reads the coinbase transaction and only that.
|
||||||
|
// Old code parsed all transactions in every block _and_ then encoded
|
||||||
|
// them all back together to get the binary size of the block.
|
||||||
|
// FIXME: This code might still read the whole block. Fixing that
|
||||||
|
// would require changes in bitcore-node.
|
||||||
|
var header = bitcore.BlockHeader.fromBufferReader(br);
|
||||||
|
var info = {};
|
||||||
|
var txlength = br.readVarintNum();
|
||||||
|
info.transactions = [bitcore.Transaction().fromBufferReader(br)];
|
||||||
|
|
||||||
var info = self.node.services.bitcoind.getBlockIndex(hash);
|
var index = self.node.services.bitcoind.getBlockIndex(hash);
|
||||||
block.__height = info.height;
|
var block = {
|
||||||
|
height: index.height,
|
||||||
|
size: blockBuffer.length,
|
||||||
|
hash: hash,
|
||||||
|
time: header.time,
|
||||||
|
txlength: txlength,
|
||||||
|
poolInfo: self.getPoolInfo(info)
|
||||||
|
};
|
||||||
|
|
||||||
if(moreTs > block.header.timestamp) {
|
if(moreTs > header.timestamp) {
|
||||||
moreTs = block.header.timestamp;
|
moreTs = header.timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
return next(null, block);
|
return next(null, block);
|
||||||
@ -156,20 +174,11 @@ BlockController.prototype.list = function(req, res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
blocks.sort(function(a, b) {
|
blocks.sort(function(a, b) {
|
||||||
return b.__height - a.__height;
|
return b.height - a.height;
|
||||||
});
|
});
|
||||||
|
|
||||||
var data = {
|
var data = {
|
||||||
blocks: blocks.map(function(block) {
|
blocks: blocks,
|
||||||
return {
|
|
||||||
height: block.__height,
|
|
||||||
size: block.toBuffer().length,
|
|
||||||
hash: block.hash,
|
|
||||||
time: block.header.time,
|
|
||||||
txlength: block.transactions.length,
|
|
||||||
poolInfo: self.getPoolInfo(block)
|
|
||||||
};
|
|
||||||
}),
|
|
||||||
length: blocks.length,
|
length: blocks.length,
|
||||||
pagination: {
|
pagination: {
|
||||||
next: next,
|
next: next,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user