mempool: preliminary work for persistent fees.

This commit is contained in:
Christopher Jeffrey 2017-02-28 17:03:06 -08:00
parent e7f850b4ba
commit 73210b3ed4
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
5 changed files with 38 additions and 4 deletions

View File

@ -439,8 +439,6 @@ function PolicyEstimator(network, logger) {
this.map = {};
this.mapSize = 0;
this.bestHeight = 0;
this.init();
}
/**

View File

@ -10,6 +10,7 @@ var layout = {
binary: false,
R: 'R',
V: 'V',
F: 'F',
e: function e(hash) {
return 'e' + hex(hash);
},

View File

@ -17,6 +17,7 @@ var layout = {
binary: true,
R: new Buffer([0x52]),
V: new Buffer([0x76]),
F: new Buffer([0x46]),
e: function e(hash) {
var key = new Buffer(33);
key[0] = 0x65;

View File

@ -27,6 +27,7 @@ var Network = require('../protocol/network');
var encoding = require('../utils/encoding');
var layout = require('./layout');
var LDB = require('../db/ldb');
var Fees = require('./fees');
var VerifyError = errors.VerifyError;
var VerifyResult = errors.VerifyResult;
@ -106,7 +107,7 @@ util.inherits(Mempool, AsyncObject);
Mempool.prototype._open = co(function* open() {
var size = (this.options.maxSize / 1024).toFixed(2);
var i, entries, entry;
var i, entries, entry, fees;
yield this.chain.open();
yield this.cache.open();
@ -123,6 +124,17 @@ Mempool.prototype._open = co(function* open() {
entry = entries[i];
this.updateAncestors(entry);
}
if (this.fees) {
fees = yield this.cache.getFees();
if (fees) {
this.fees.inject(fees);
this.logger.info(
'Loaded mempool fee data (rate=%d).',
this.fees.estimateFee());
}
}
}
this.logger.info('Mempool loaded (maxsize=%dkb).', size);
@ -189,8 +201,11 @@ Mempool.prototype._addBlock = co(function* addBlock(block, txs) {
entries.push(entry);
}
if (this.fees)
if (this.fees) {
this.fees.processBlock(block.height, entries, this.chain.synced);
// Note: disable for now.
// this.cache.writeFees(this.fees);
}
// We need to reset the rejects filter periodically.
// There may be a locktime in a TX that is now valid.
@ -2299,6 +2314,7 @@ function MempoolCache(options) {
this.logger = options.logger;
this.chain = options.chain;
this.network = options.network;
this.db = null;
this.batch = null;
@ -2326,6 +2342,15 @@ MempoolCache.prototype.getTip = co(function* getTip() {
return hash.toString('hex');
});
MempoolCache.prototype.getFees = co(function* getFees() {
var data = yield this.db.get(layout.F);
if (!data)
return;
return Fees.fromRaw(data, this.network);
});
MempoolCache.prototype.getEntries = function getEntries() {
return this.db.values({
gte: layout.e(encoding.ZERO_HASH),
@ -2380,6 +2405,13 @@ MempoolCache.prototype.sync = function sync(hash) {
this.batch.put(layout.R, new Buffer(hash, 'hex'));
};
MempoolCache.prototype.writeFees = function writeFees(fees) {
if (!this.db)
return;
this.batch.put(layout.F, fees.toRaw());
};
MempoolCache.prototype.clear = function clear() {
this.batch.clear();
this.batch = this.db.batch();
@ -2459,6 +2491,7 @@ MempoolCache.prototype.wipe = co(function* wipe() {
batch.put(layout.V, encoding.U32(MempoolCache.VERSION));
batch.put(layout.R, new Buffer(this.chain.tip.hash, 'hex'));
batch.del(layout.F);
yield batch.write();

View File

@ -65,6 +65,7 @@ function FullNode(options) {
// Fee estimation.
this.fees = new Fees(this.network, this.logger);
this.fees.init();
// Mempool needs access to the chain.
this.mempool = new Mempool({