wip
This commit is contained in:
parent
d0ee9c18a9
commit
314c37db49
@ -103,6 +103,102 @@ BlockService.prototype.unsubscribe = function(name, emitter) {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// --- start private prototype functions
|
||||||
|
BlockService.prototype._blockAlreadyProcessed = function(block) {
|
||||||
|
|
||||||
|
return this._blockHeaderQueue.get(block.hash) ? true : false;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
BlockService.prototype._broadcast = function(subscribers, name, entity) {
|
||||||
|
for (var i = 0; i < subscribers.length; i++) {
|
||||||
|
subscribers[i].emit(name, entity);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BlockService.prototype._cacheHeader = function(header) {
|
||||||
|
|
||||||
|
// 1. save to in-memory cache first
|
||||||
|
this._blockHeaderQueue.set(header.hash, header.toObject());
|
||||||
|
|
||||||
|
// 2. get operations
|
||||||
|
return this._getHeaderOperations(header);
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
BlockService.prototype._cacheHeaders = function(headers) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
var operations = headers.map(self._cacheHeader.bind(self));
|
||||||
|
operations = _.flatten(operations);
|
||||||
|
|
||||||
|
log.debug('Saving: ' + headers.length + ' headers to the database.');
|
||||||
|
self._db.batch(operations);
|
||||||
|
self._syncHeaders();
|
||||||
|
};
|
||||||
|
|
||||||
|
BlockService.prototype._cacheBlock = function(block) {
|
||||||
|
|
||||||
|
log.debug('Setting block: "' + block.hash + '" in the block cache.');
|
||||||
|
|
||||||
|
// 1. set the block queue, which holds full blocks in memory
|
||||||
|
this._blockQueue.set(block.hash, block);
|
||||||
|
|
||||||
|
// 2. store the block in the database
|
||||||
|
var operations = this._getBlockOperations(block);
|
||||||
|
|
||||||
|
this._db.batch(operations, function(err) {
|
||||||
|
|
||||||
|
if(err) {
|
||||||
|
log.error('There was an error attempting to save block for hash: ' + block.hash);
|
||||||
|
this._db.emit('error', err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug('Success saving block hash ' + block.hash);
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
BlockService.prototype._checkChain = function(tip) {
|
||||||
|
|
||||||
|
var _tip = tip;
|
||||||
|
|
||||||
|
for(var i = 0; i < this._maxLookback; i++) {
|
||||||
|
if (_tip === this._tip.hash) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var prevHeader = this._blockHeaderQueue.get(_tip);
|
||||||
|
if (!prevHeader) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_tip = prevHeader.prevHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
BlockService.prototype._computeChainwork = function(bits, prev) {
|
||||||
|
|
||||||
|
var target = consensus.fromCompact(bits);
|
||||||
|
|
||||||
|
if (target.isNeg() || target.cmpn(0) === 0) {
|
||||||
|
return new BN(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
var proof = BlockService.MAX_CHAINWORK.div(target.iaddn(1));
|
||||||
|
|
||||||
|
if (!prev) {
|
||||||
|
return proof;
|
||||||
|
}
|
||||||
|
|
||||||
|
return proof.iadd(prev);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
BlockService.prototype._startSyncHeaders = function() {
|
BlockService.prototype._startSyncHeaders = function() {
|
||||||
|
|
||||||
var numHeadersNeeded = this._bestHeight - this._tip.height;
|
var numHeadersNeeded = this._bestHeight - this._tip.height;
|
||||||
@ -195,12 +291,6 @@ BlockService.prototype._onHeaders = function(headers) {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockService.prototype._blockAlreadyProcessed = function(block) {
|
|
||||||
|
|
||||||
return this._blockHeaderQueue.get(block.hash) ? true : false;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._updateChainTips = function(block, state) {
|
BlockService.prototype._updateChainTips = function(block, state) {
|
||||||
|
|
||||||
var prevHash = utils.reverseBufferToString(block.header.prevHash);
|
var prevHash = utils.reverseBufferToString(block.header.prevHash);
|
||||||
@ -314,24 +404,6 @@ BlockService.prototype._getChainwork = function(tipHash) {
|
|||||||
return chainwork;
|
return chainwork;
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockService.prototype._computeChainwork = function(bits, prev) {
|
|
||||||
|
|
||||||
var target = consensus.fromCompact(bits);
|
|
||||||
|
|
||||||
if (target.isNeg() || target.cmpn(0) === 0) {
|
|
||||||
return new BN(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
var proof = BlockService.MAX_CHAINWORK.div(target.iaddn(1));
|
|
||||||
|
|
||||||
if (!prev) {
|
|
||||||
return proof;
|
|
||||||
}
|
|
||||||
|
|
||||||
return proof.iadd(prev);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._getDelta = function(tip) {
|
BlockService.prototype._getDelta = function(tip) {
|
||||||
|
|
||||||
var blocks = [];
|
var blocks = [];
|
||||||
@ -348,25 +420,6 @@ BlockService.prototype._getDelta = function(tip) {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockService.prototype._checkChain = function(tip) {
|
|
||||||
|
|
||||||
var _tip = tip;
|
|
||||||
|
|
||||||
for(var i = 0; i < this._maxLookback; i++) {
|
|
||||||
if (_tip === this._tip.hash) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
var prevHeader = this._blockHeaderQueue.get(_tip);
|
|
||||||
if (!prevHeader) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
_tip = prevHeader.prevHash;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._sendDelta = function() {
|
BlockService.prototype._sendDelta = function() {
|
||||||
|
|
||||||
// when this function is called, we know, for sure, that we have a complete chain of unsent block(s).
|
// when this function is called, we know, for sure, that we have a complete chain of unsent block(s).
|
||||||
@ -525,57 +578,6 @@ BlockService.prototype._isChainReorganizing = function(block) {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockService.prototype._broadcast = function(subscribers, name, entity) {
|
|
||||||
for (var i = 0; i < subscribers.length; i++) {
|
|
||||||
subscribers[i].emit(name, entity);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._cacheHeader = function(header) {
|
|
||||||
|
|
||||||
// 1. save to in-memory cache first
|
|
||||||
this._blockHeaderQueue.set(header.hash, header.toObject());
|
|
||||||
|
|
||||||
// 2. get operations
|
|
||||||
return this._getHeaderOperations(header);
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._cacheHeaders = function(headers) {
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
var operations = headers.map(self._cacheHeader.bind(self));
|
|
||||||
operations = _.flatten(operations);
|
|
||||||
|
|
||||||
log.debug('Saving: ' + headers.length + ' headers to the database.');
|
|
||||||
self._db.batch(operations);
|
|
||||||
self._syncHeaders();
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._cacheBlock = function(block) {
|
|
||||||
|
|
||||||
log.debug('Setting block: "' + block.hash + '" in the block cache.');
|
|
||||||
|
|
||||||
// 1. set the block queue, which holds full blocks in memory
|
|
||||||
this._blockQueue.set(block.hash, block);
|
|
||||||
|
|
||||||
// 2. store the block in the database
|
|
||||||
var operations = this._getBlockOperations(block);
|
|
||||||
|
|
||||||
this._db.batch(operations, function(err) {
|
|
||||||
|
|
||||||
if(err) {
|
|
||||||
log.error('There was an error attempting to save block for hash: ' + block.hash);
|
|
||||||
this._db.emit('error', err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug('Success saving block hash ' + block.hash);
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._getHeader = function(block) {
|
BlockService.prototype._getHeader = function(block) {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user