better events.
This commit is contained in:
parent
f7ac99d24d
commit
6ef09f39ec
@ -1050,7 +1050,9 @@ BlockData.prototype.closeAsync = function closeAsync(callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
BlockData.prototype._malloc = function _malloc(size) {
|
BlockData.prototype._malloc = function _malloc(size) {
|
||||||
return new Buffer(size);
|
if (!this.options.usePool)
|
||||||
|
return new Buffer(size);
|
||||||
|
|
||||||
if (size > 500)
|
if (size > 500)
|
||||||
return new Buffer(size);
|
return new Buffer(size);
|
||||||
|
|
||||||
@ -1066,7 +1068,9 @@ BlockData.prototype._malloc = function _malloc(size) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
BlockData.prototype._free = function _free(buf) {
|
BlockData.prototype._free = function _free(buf) {
|
||||||
return;
|
if (!this.options.usePool)
|
||||||
|
return;
|
||||||
|
|
||||||
if (this._bufferPool.used[buf.length] === buf) {
|
if (this._bufferPool.used[buf.length] === buf) {
|
||||||
assert(this._bufferPool[buf.length] === buf);
|
assert(this._bufferPool[buf.length] === buf);
|
||||||
delete this._bufferPool.used[buf.length];
|
delete this._bufferPool.used[buf.length];
|
||||||
|
|||||||
@ -69,7 +69,25 @@ Chain.prototype._init = function _init() {
|
|||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
// Hook into events for debugging
|
// Hook into events for debugging
|
||||||
this.on('fork', function(data, peer) {
|
this.on('block', function(block, entry, peer) {
|
||||||
|
var host = peer ? peer.host : 'unknown';
|
||||||
|
// utils.debug('Block %s (%d) added to chain (%s)',
|
||||||
|
// utils.revHex(entry.hash), entry.height, host);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('resolved', function(block, entry, peer) {
|
||||||
|
var host = peer ? peer.host : 'unknown';
|
||||||
|
utils.debug('Orphan %s (%d) was resolved (%s)',
|
||||||
|
utils.revHex(entry.hash), entry.height, host);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('checkpoint', function(block, data, peer) {
|
||||||
|
var host = peer ? peer.host : 'unknown';
|
||||||
|
utils.debug('Hit checkpoint block %s (%d) (%s)',
|
||||||
|
utils.revHex(data.checkpoint), data.height, host);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('fork', function(block, data, peer) {
|
||||||
var host = peer ? peer.host : 'unknown';
|
var host = peer ? peer.host : 'unknown';
|
||||||
utils.debug(
|
utils.debug(
|
||||||
'Fork at height %d: expected=%s received=%s checkpoint=%s peer=%s',
|
'Fork at height %d: expected=%s received=%s checkpoint=%s peer=%s',
|
||||||
@ -79,9 +97,11 @@ Chain.prototype._init = function _init() {
|
|||||||
data.checkpoint,
|
data.checkpoint,
|
||||||
host
|
host
|
||||||
);
|
);
|
||||||
|
if (data.checkpoint)
|
||||||
|
utils.debug('WARNING: Block failed a checkpoint.');
|
||||||
});
|
});
|
||||||
|
|
||||||
this.on('invalid', function(data, peer) {
|
this.on('invalid', function(block, data, peer) {
|
||||||
var host = peer ? peer.host : 'unknown';
|
var host = peer ? peer.host : 'unknown';
|
||||||
utils.debug(
|
utils.debug(
|
||||||
'Invalid block at height %d: hash=%s peer=%s',
|
'Invalid block at height %d: hash=%s peer=%s',
|
||||||
@ -98,19 +118,19 @@ Chain.prototype._init = function _init() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.on('exists', function(data, peer) {
|
this.on('exists', function(block, data, peer) {
|
||||||
var host = peer ? peer.host : 'unknown';
|
var host = peer ? peer.host : 'unknown';
|
||||||
utils.debug('Already have block %s (%s)',
|
utils.debug('Already have block %s (%s)',
|
||||||
data.height, host);
|
data.height, host);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.on('orphan', function(data, peer) {
|
this.on('orphan', function(block, data, peer) {
|
||||||
var host = peer ? peer.host : 'unknown';
|
var host = peer ? peer.host : 'unknown';
|
||||||
utils.debug('Handled orphan %s (%s)', utils.revHex(data.hash), host);
|
utils.debug('Handled orphan %s (%s)', utils.revHex(data.hash), host);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.on('purge', function(count, size) {
|
this.on('purge', function(count, size, peer) {
|
||||||
utils.debug('Warning: %dmb of orphans cleared!', utils.mb(size));
|
utils.debug('Warning: %d (%dmb) orphans cleared!', coin, utils.mb(size));
|
||||||
});
|
});
|
||||||
|
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
@ -392,10 +412,8 @@ Chain.prototype._removeBlock = function _removeBlock(tip, callback) {
|
|||||||
if (self.mempool)
|
if (self.mempool)
|
||||||
self.mempool.removeBlock(block);
|
self.mempool.removeBlock(block);
|
||||||
|
|
||||||
self.emit('reorg block', block.hash('hex'));
|
|
||||||
|
|
||||||
block.txs.forEach(function(tx) {
|
block.txs.forEach(function(tx) {
|
||||||
self.emit('reorg tx', tx.hash('hex'));
|
self.emit('remove', tx.hash('hex'), block.hash('hex'));
|
||||||
});
|
});
|
||||||
|
|
||||||
return callback();
|
return callback();
|
||||||
@ -841,7 +859,7 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
|
|
||||||
// Do not revalidate known invalid blocks.
|
// Do not revalidate known invalid blocks.
|
||||||
if (self.invalid[hash] || self.invalid[prevHash]) {
|
if (self.invalid[hash] || self.invalid[prevHash]) {
|
||||||
self.emit('invalid', {
|
self.emit('invalid', block, {
|
||||||
height: -1,
|
height: -1,
|
||||||
hash: hash,
|
hash: hash,
|
||||||
seen: true,
|
seen: true,
|
||||||
@ -859,7 +877,7 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
// orphans.
|
// orphans.
|
||||||
if (block === initial && !block.verify()) {
|
if (block === initial && !block.verify()) {
|
||||||
self.invalid[hash] = true;
|
self.invalid[hash] = true;
|
||||||
self.emit('invalid', {
|
self.emit('invalid', block, {
|
||||||
height: prevHeight + 1,
|
height: prevHeight + 1,
|
||||||
hash: hash,
|
hash: hash,
|
||||||
seen: false,
|
seen: false,
|
||||||
@ -875,12 +893,12 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
// If the orphan chain forked, simply
|
// If the orphan chain forked, simply
|
||||||
// reset the orphans and find a new peer.
|
// reset the orphans and find a new peer.
|
||||||
if (orphan.hash('hex') !== hash) {
|
if (orphan.hash('hex') !== hash) {
|
||||||
self.emit('purge', self.orphan.count, self.orphan.size);
|
self.emit('purge', self.orphan.count, self.orphan.size, peer);
|
||||||
self.orphan.map = {};
|
self.orphan.map = {};
|
||||||
self.orphan.bmap = {};
|
self.orphan.bmap = {};
|
||||||
self.orphan.count = 0;
|
self.orphan.count = 0;
|
||||||
self.orphan.size = 0;
|
self.orphan.size = 0;
|
||||||
self.emit('fork', {
|
self.emit('fork', block, {
|
||||||
height: -1,
|
height: -1,
|
||||||
expected: orphan.hash('hex'),
|
expected: orphan.hash('hex'),
|
||||||
received: hash,
|
received: hash,
|
||||||
@ -888,7 +906,7 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
}, peer);
|
}, peer);
|
||||||
return done();
|
return done();
|
||||||
}
|
}
|
||||||
self.emit('orphan', {
|
self.emit('orphan', block, {
|
||||||
height: -1,
|
height: -1,
|
||||||
hash: hash,
|
hash: hash,
|
||||||
seen: true
|
seen: true
|
||||||
@ -903,7 +921,7 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
self.orphan.size += block.getSize();
|
self.orphan.size += block.getSize();
|
||||||
self.orphan.map[prevHash] = block;
|
self.orphan.map[prevHash] = block;
|
||||||
self.orphan.bmap[hash] = block;
|
self.orphan.bmap[hash] = block;
|
||||||
self.emit('orphan', {
|
self.emit('orphan', block, {
|
||||||
height: -1,
|
height: -1,
|
||||||
hash: hash,
|
hash: hash,
|
||||||
seen: false
|
seen: false
|
||||||
@ -932,18 +950,18 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
// who isn't trying to fool us.
|
// who isn't trying to fool us.
|
||||||
checkpoint = network.checkpoints[entry.height];
|
checkpoint = network.checkpoints[entry.height];
|
||||||
if (checkpoint) {
|
if (checkpoint) {
|
||||||
self.emit('checkpoint', {
|
self.emit('checkpoint', block, {
|
||||||
height: entry.height,
|
height: entry.height,
|
||||||
hash: entry.hash,
|
hash: entry.hash,
|
||||||
checkpoint: checkpoint
|
checkpoint: checkpoint
|
||||||
});
|
}, peer);
|
||||||
if (hash !== checkpoint) {
|
if (hash !== checkpoint) {
|
||||||
// Resetting to the last checkpoint _really_ isn't
|
// Resetting to the last checkpoint _really_ isn't
|
||||||
// necessary (even bitcoind doesn't do it), but it
|
// necessary (even bitcoind doesn't do it), but it
|
||||||
// could be used if you want to be on the overly
|
// could be used if you want to be on the overly
|
||||||
// safe (see: paranoid) side.
|
// safe (see: paranoid) side.
|
||||||
// this.resetLastCheckpoint(entry.height);
|
// this.resetLastCheckpoint(entry.height);
|
||||||
self.emit('fork', {
|
self.emit('fork', block, {
|
||||||
height: entry.height,
|
height: entry.height,
|
||||||
expected: network.checkpoints[entry.height],
|
expected: network.checkpoints[entry.height],
|
||||||
received: entry.hash,
|
received: entry.hash,
|
||||||
@ -964,7 +982,7 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
// a stack overflow if there are a lot of
|
// a stack overflow if there are a lot of
|
||||||
// existing blocks.
|
// existing blocks.
|
||||||
if (existing.hash === hash) {
|
if (existing.hash === hash) {
|
||||||
self.emit('exists', {
|
self.emit('exists', block, {
|
||||||
height: entry.height,
|
height: entry.height,
|
||||||
hash: entry.hash
|
hash: entry.hash
|
||||||
}, peer);
|
}, peer);
|
||||||
@ -993,7 +1011,7 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
|
|
||||||
self.resetHeight(existing.height - 1);
|
self.resetHeight(existing.height - 1);
|
||||||
|
|
||||||
self.emit('fork', {
|
self.emit('fork', block, {
|
||||||
height: existing.height,
|
height: existing.height,
|
||||||
expected: existing.hash,
|
expected: existing.hash,
|
||||||
received: entry.hash,
|
received: entry.hash,
|
||||||
@ -1020,7 +1038,7 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
|
|
||||||
if (!verified) {
|
if (!verified) {
|
||||||
self.invalid[entry.hash] = true;
|
self.invalid[entry.hash] = true;
|
||||||
self.emit('invalid', {
|
self.emit('invalid', block, {
|
||||||
height: entry.height,
|
height: entry.height,
|
||||||
hash: entry.hash,
|
hash: entry.hash,
|
||||||
seen: false,
|
seen: false,
|
||||||
@ -1051,10 +1069,9 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
|
|
||||||
// Emit our block (and potentially resolved
|
// Emit our block (and potentially resolved
|
||||||
// orphan) so the programmer can save it.
|
// orphan) so the programmer can save it.
|
||||||
self.emit('block', block, peer);
|
self.emit('block', block, entry, peer);
|
||||||
self.emit('entry', entry);
|
|
||||||
if (block !== initial)
|
if (block !== initial)
|
||||||
self.emit('resolved', block, peer);
|
self.emit('resolved', block, entry, peer);
|
||||||
|
|
||||||
// Fullfill request
|
// Fullfill request
|
||||||
self.request.fullfill(hash, block);
|
self.request.fullfill(hash, block);
|
||||||
@ -1084,7 +1101,7 @@ Chain.prototype.add = function add(initial, peer, callback) {
|
|||||||
// Failsafe for large orphan chains. Do not
|
// Failsafe for large orphan chains. Do not
|
||||||
// allow more than 20mb stored in memory.
|
// allow more than 20mb stored in memory.
|
||||||
if (self.orphan.size > self.orphanLimit) {
|
if (self.orphan.size > self.orphanLimit) {
|
||||||
self.emit('purge', self.orphan.count, self.orphan.size);
|
self.emit('purge', self.orphan.count, self.orphan.size, peer);
|
||||||
Object.keys(self.orphan.bmap).forEach(function(hash) {
|
Object.keys(self.orphan.bmap).forEach(function(hash) {
|
||||||
self.emit('unresolved', self.orphan.bmap[hash], peer);
|
self.emit('unresolved', self.orphan.bmap[hash], peer);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -113,7 +113,9 @@ ChainDB.prototype.closeAsync = function closeAsync(callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
ChainDB.prototype._malloc = function _malloc(size) {
|
ChainDB.prototype._malloc = function _malloc(size) {
|
||||||
return new Buffer(size);
|
if (!this.options.usePool)
|
||||||
|
return new Buffer(size);
|
||||||
|
|
||||||
if (!this._bufferPool[size])
|
if (!this._bufferPool[size])
|
||||||
this._bufferPool[size] = new Buffer(size);
|
this._bufferPool[size] = new Buffer(size);
|
||||||
|
|
||||||
@ -126,7 +128,9 @@ ChainDB.prototype._malloc = function _malloc(size) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
ChainDB.prototype._free = function _free(buf) {
|
ChainDB.prototype._free = function _free(buf) {
|
||||||
return;
|
if (!this.options.usePool)
|
||||||
|
return;
|
||||||
|
|
||||||
if (this._bufferPool.used[buf.length] === buf) {
|
if (this._bufferPool.used[buf.length] === buf) {
|
||||||
assert(this._bufferPool[buf.length] === buf);
|
assert(this._bufferPool[buf.length] === buf);
|
||||||
delete this._bufferPool.used[buf.length];
|
delete this._bufferPool.used[buf.length];
|
||||||
|
|||||||
@ -176,7 +176,7 @@ Pool.prototype._init = function _init() {
|
|||||||
this._addPeer();
|
this._addPeer();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.chain.on('block', function(block, peer) {
|
this.chain.on('block', function(block, entry, peer) {
|
||||||
self.emit('block', block, peer);
|
self.emit('block', block, peer);
|
||||||
// Emit merkle txs after the fact
|
// Emit merkle txs after the fact
|
||||||
if (block.subtype === 'merkleblock') {
|
if (block.subtype === 'merkleblock') {
|
||||||
@ -186,7 +186,7 @@ Pool.prototype._init = function _init() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.chain.on('fork', function(data, peer) {
|
this.chain.on('fork', function(block, data, peer) {
|
||||||
self.emit('fork', data, peer);
|
self.emit('fork', data, peer);
|
||||||
|
|
||||||
if (!peer)
|
if (!peer)
|
||||||
@ -202,21 +202,21 @@ Pool.prototype._init = function _init() {
|
|||||||
peer.destroy();
|
peer.destroy();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.chain.on('invalid', function(data, peer) {
|
this.chain.on('invalid', function(block, data, peer) {
|
||||||
if (!peer)
|
if (!peer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
self.setMisbehavior(peer, 100);
|
self.setMisbehavior(peer, 100);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.chain.on('exists', function(data, peer) {
|
this.chain.on('exists', function(block, data, peer) {
|
||||||
if (!peer)
|
if (!peer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
self.setMisbehavior(peer, 1);
|
self.setMisbehavior(peer, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.chain.on('orphan', function(data, peer) {
|
this.chain.on('orphan', function(block, data, peer) {
|
||||||
var host = peer ? peer.host : 'unknown';
|
var host = peer ? peer.host : 'unknown';
|
||||||
|
|
||||||
if (!peer)
|
if (!peer)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user