wip
This commit is contained in:
parent
fb0dd680ac
commit
1cf3d6ccd2
@ -1,12 +1,10 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var BaseService = require('../../service');
|
var BaseService = require('../../service');
|
||||||
var bitcore = require('bitcore-lib');
|
|
||||||
var inherits = require('util').inherits;
|
var inherits = require('util').inherits;
|
||||||
var Encoding = require('./encoding');
|
var Encoding = require('./encoding');
|
||||||
var index = require('../../');
|
var index = require('../../');
|
||||||
var log = index.log;
|
var log = index.log;
|
||||||
var BufferUtil = bitcore.util.buffer;
|
|
||||||
var LRU = require('lru-cache');
|
var LRU = require('lru-cache');
|
||||||
var utils = require('../../utils');
|
var utils = require('../../utils');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
@ -137,84 +135,6 @@ BlockService.prototype.processBlockOperations = function(opts, callback) {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockService.prototype.getTipOperation = function(block, add, tipType) {
|
|
||||||
|
|
||||||
var heightBuffer = new Buffer(4);
|
|
||||||
var tipData;
|
|
||||||
|
|
||||||
if (add) {
|
|
||||||
heightBuffer.writeUInt32BE(block.__height);
|
|
||||||
tipData = Buffer.concat([new Buffer(block.hash, 'hex'), heightBuffer]);
|
|
||||||
} else {
|
|
||||||
heightBuffer.writeUInt32BE(block.__height - 1);
|
|
||||||
tipData = Buffer.concat([BufferUtil.reverse(block.header.prevHash), heightBuffer]);
|
|
||||||
}
|
|
||||||
|
|
||||||
var type = tipType || 'tip';
|
|
||||||
|
|
||||||
return {
|
|
||||||
type: 'put',
|
|
||||||
key: this.dbPrefix + type,
|
|
||||||
value: tipData
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BlockService.prototype.getBlocks = function(startHash, endHash) {
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
assert(startHash && startHash.length === 64, 'startHash is required to getBlocks');
|
|
||||||
|
|
||||||
// if start and end hash are the same, the caller is getting, at most, one block
|
|
||||||
// otherwise, the caller gets all blocks from startHash to endHash, inclusive.
|
|
||||||
|
|
||||||
// check our memory cache first, then db, then go out to p2p network
|
|
||||||
|
|
||||||
// LRU in-memory
|
|
||||||
var results = self._getCachedBlocks(startHash, endHash);
|
|
||||||
|
|
||||||
// in db
|
|
||||||
if (!results) {
|
|
||||||
results = self._getBlocksInDb(startHash, endHash);
|
|
||||||
}
|
|
||||||
|
|
||||||
var lockedOut = self._getBlocksLockedOut();
|
|
||||||
if (!results && !lockedOut) {
|
|
||||||
self._p2p.getBlocks({ startHash: startHash });
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lockedOut) {
|
|
||||||
log.debug('Block Service: getBlocks called, but service is still in a lock out period.');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._checkCache = function(key, cache) {
|
|
||||||
return cache.get(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype.getBlockHeader = function(hash, callback) {
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
var header = self._checkCache(hash, self._blockHeaderQueue);
|
|
||||||
|
|
||||||
if (header) {
|
|
||||||
return callback(null, header);
|
|
||||||
}
|
|
||||||
|
|
||||||
self._p2p.getBlockHeaders(hash);
|
|
||||||
var timer = setInterval(function() {
|
|
||||||
var header = self._checkCache(hash, self._blockHeaderQueue);
|
|
||||||
if (header) {
|
|
||||||
clearInterval(timer);
|
|
||||||
callback(null, header);
|
|
||||||
}
|
|
||||||
}, 250);
|
|
||||||
timer.unref();
|
|
||||||
};
|
|
||||||
|
|
||||||
BlockService.prototype._startSubscriptions = function() {
|
BlockService.prototype._startSubscriptions = function() {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
@ -240,8 +160,6 @@ BlockService.prototype._onHeaders = function(headers) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
BlockService.prototype._blockAlreadyProcessed = function(block) {
|
BlockService.prototype._blockAlreadyProcessed = function(block) {
|
||||||
// if the block is not in our block header queue, we probably have not seen it, or
|
|
||||||
// it is older than about 1000 blocks
|
|
||||||
return this._blockHeaderQueue.get(block.hash);
|
return this._blockHeaderQueue.get(block.hash);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -336,15 +254,17 @@ BlockService.prototype._onBlock = function(block) {
|
|||||||
this.emit('reorg', block);
|
this.emit('reorg', block);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this._sendAllUnsentBlocksFromMainChain(block);
|
var activeChainTip = this._selectActiveChain(block);
|
||||||
|
this._sendAllUnsentBlocksFromAcitveChain(activeChainTip);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockService.prototype._sendAllUnsentBlocksFromMainChain = function(block) {
|
BlockService.prototype._selectActiveChain = function(block) {
|
||||||
|
};
|
||||||
|
|
||||||
var blocksToSend = [block];
|
BlockService.prototype._getAllUnsentBlocksFromActiveChain = function(tip) {
|
||||||
|
|
||||||
if (!this._chainTips.get(block.hash)) {
|
if (!this._chainTips.get(block.hash)) {
|
||||||
|
|
||||||
@ -365,13 +285,17 @@ BlockService.prototype._sendAllUnsentBlocksFromMainChain = function(block) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
for(var j = 0; j < blocksToSend.length; j++) {
|
BlockService.prototype._sendAllUnsentBlocksFromActiveChain = function(tip) {
|
||||||
var block = blocksToSend[j];
|
|
||||||
self._broadcast(self._subscriptions.block, 'block/block', block);
|
var blocks = this._getAllUnsentBlocksFromActiveChain(tip);
|
||||||
|
|
||||||
|
for(var j = 0; j < blocks.length; j++) {
|
||||||
|
this._broadcast(this._subscriptions.block, 'block/block', blocks[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
self._setTip(blocksToSend[j-1]);
|
this._setTip(blocks[j-1]);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user