Paired down what information we are persisting as far as headers go.

This commit is contained in:
Chris Kleeschulte 2017-08-09 11:48:00 -04:00
parent 7809476147
commit e3b96a2d32

View File

@ -116,8 +116,8 @@ HeaderService.prototype.start = function(callback) {
self._db._store.put(self._encoding.encodeHeaderKey(0, self.GENESIS_HASH), self._db._store.put(self._encoding.encodeHeaderKey(0, self.GENESIS_HASH),
self._encoding.encodeHeaderValue(genesisHeader), next); self._encoding.encodeHeaderValue(genesisHeader), next);
return; return;
} }
next(); next();
}, },
@ -190,7 +190,7 @@ HeaderService.prototype._onBlock = function(block) {
} }
for (var i = 0; i < this.subscriptions.block.length; i++) { for (var i = 0; i < this.subscriptions.block.length; i++) {
this.subscriptions.block[i].emit('header/block', block); this.subscriptions.block[i].emit('header/block', block, header);
} }
}; };
@ -198,44 +198,57 @@ HeaderService.prototype._onHeaders = function(headers) {
var self = this; var self = this;
log.debug('Header Service: Received: ' + headers.length + ' header(s).'); log.debug('Header Service: Received: ' + headers.length + ' header(s).');
var prevHeader = self._headers.getLastIndex();
var dbOps = []; var dbOps = [];
for(var i = 0; i < headers.length; i++) { for(var i = 0; i < headers.length; i++) {
var header = headers[i]; var header = headers[i];
if (header instanceof Header) { if (header instanceof Header) {
header = header.toObject(); header = header.toObject();
} }
header.height = ++self._tip.height; header.height = ++self._tip.height;
header.chainwork = self._getChainwork(header).toString(16, 64);
self._lastChainwork = header.chainwork;
self._tip.hash = header.hash; self._tip.hash = header.hash;
header.chainwork = self._getChainwork(header, prevHeader).toString(16, 64);
dbOps.push({ dbOps.push({
type: 'put', type: 'put',
key: self._encoding.encodeHeaderKey(header.height, header.hash), key: self._encoding.encodeHeaderKey(header.height, header.hash),
value: self._encoding.encodeHeaderValue(header) value: self._encoding.encodeHeaderValue(header)
}); });
prevHeader = header;
self._headers.set(header.hash, header, header.height); var newHdr = { hash: header.hash, prevHash: header.prevHash, height: header.height };
self._headers.set(header.hash, newHdr, header.height);
} }
var tipOps = utils.encodeTip(self._tip, self.name); var tipOps = utils.encodeTip(self._tip, self.name);
dbOps.push({ dbOps.push({
type: 'put', type: 'put',
key: tipOps.key, key: tipOps.key,
value: tipOps.value value: tipOps.value
}); });
self._db.batch(dbOps, function() { self._db.batch(dbOps, function(err) {
if(err) {
log.error(err);
this.node.stop();
return;
}
if (self._tip.height < self._bestHeight) { if (self._tip.height < self._bestHeight) {
self._sync(); self._sync();
return; return;
} }
log.info('Header Service: ' + self._headers.size - 1 + ' headers downloaded and persisted.'); log.debug('Header Service: ' + self._headers.getLastIndex().hash + ' is the best block hash.');
log.info('Header Service: ' + self._headers.getLastIndex().hash + ' is the best block hash.');
// at this point, we can check our header list to see if our starting tip diverged from the tip // at this point, we can check our header list to see if our starting tip diverged from the tip
// that we have now // that we have now
@ -310,9 +323,11 @@ HeaderService.prototype._getPersistedHeaders = function(callback) {
var self = this; var self = this;
var startingHeight = self._tip.height; var startingHeight = self._tip.height;
if (self._tip.height > self._checkpoint) { if (self._tip.height > self._checkpoint) {
self._tip.height -= self._checkpoint; self._tip.height -= self._checkpoint;
} }
var removalOps = []; var removalOps = [];
var start = self._encoding.encodeHeaderKey(0); var start = self._encoding.encodeHeaderKey(0);
@ -335,6 +350,7 @@ HeaderService.prototype._getPersistedHeaders = function(callback) {
stream.on('data', function(data) { stream.on('data', function(data) {
var header = self._encoding.decodeHeaderValue(data.value); var header = self._encoding.decodeHeaderValue(data.value);
// any records with a height greater than our current tip height can be scheduled for removal // any records with a height greater than our current tip height can be scheduled for removal
// because they will be replaced shortly
if (header.height > self._tip.height) { if (header.height > self._tip.height) {
removalOps.push({ removalOps.push({
type: 'del', type: 'del',
@ -350,6 +366,10 @@ HeaderService.prototype._getPersistedHeaders = function(callback) {
return streamErr; return streamErr;
} }
self._tip.hash = self._headers.getIndex(self._tip.height).hash; self._tip.hash = self._headers.getIndex(self._tip.height).hash;
var lastHeader = self._headers.getLastIndex();
if (lastHeader && lastHeader.chainwork) {
self._lastChainwork = lastHeader.chainwork;
}
self._db.batch(removalOps, callback); self._db.batch(removalOps, callback);
}); });
@ -357,8 +377,7 @@ HeaderService.prototype._getPersistedHeaders = function(callback) {
HeaderService.prototype._getChainwork = function(header, prevHeader) { HeaderService.prototype._getChainwork = function(header, prevHeader) {
var lastChainwork = prevHeader ? prevHeader.chainwork : HeaderService.STARTING_CHAINWORK; var prevChainwork = new BN(new Buffer(this._lastChainwork || HeaderService.STARTING_CHAINWORK, 'hex'));
var prevChainwork = new BN(new Buffer(lastChainwork, 'hex'));
return this._computeChainwork(header.bits, prevChainwork); return this._computeChainwork(header.bits, prevChainwork);
}; };