mempool: refactor.
This commit is contained in:
parent
82ca244669
commit
0b2023d62c
@ -1563,7 +1563,6 @@ RPC.prototype.getnetworkhashps = function getnetworkhashps(args, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
RPC.prototype.prioritisetransaction = function prioritisetransaction(args, callback) {
|
RPC.prototype.prioritisetransaction = function prioritisetransaction(args, callback) {
|
||||||
var self = this;
|
|
||||||
var hash, pri, fee, entry;
|
var hash, pri, fee, entry;
|
||||||
|
|
||||||
if (args.help || args.length !== 3) {
|
if (args.help || args.length !== 3) {
|
||||||
|
|||||||
@ -102,6 +102,7 @@ function Mempool(options) {
|
|||||||
this.prematureWitness = !!this.options.prematureWitness;
|
this.prematureWitness = !!this.options.prematureWitness;
|
||||||
|
|
||||||
this.maxSize = options.maxSize || constants.mempool.MAX_MEMPOOL_SIZE;
|
this.maxSize = options.maxSize || constants.mempool.MAX_MEMPOOL_SIZE;
|
||||||
|
this.expiryTime = options.expiryTime || constants.mempool.MEMPOOL_EXPIRY;
|
||||||
this.blockSinceBump = false;
|
this.blockSinceBump = false;
|
||||||
this.lastFeeUpdate = utils.now();
|
this.lastFeeUpdate = utils.now();
|
||||||
this.minFeeRate = 0;
|
this.minFeeRate = 0;
|
||||||
@ -236,7 +237,7 @@ Mempool.prototype.limitMempoolSize = function limitMempoolSize(entryHash) {
|
|||||||
return trimmed;
|
return trimmed;
|
||||||
|
|
||||||
hashes = this.getSnapshot();
|
hashes = this.getSnapshot();
|
||||||
end = utils.now() - constants.mempool.MEMPOOL_EXPIRY;
|
end = utils.now() - this.expiryTime;
|
||||||
|
|
||||||
for (i = 0; i < hashes.length; i++) {
|
for (i = 0; i < hashes.length; i++) {
|
||||||
hash = hashes[i];
|
hash = hashes[i];
|
||||||
@ -661,11 +662,8 @@ Mempool.prototype.addUnchecked = function addUnchecked(entry, callback, force) {
|
|||||||
|
|
||||||
callback = utils.wrap(callback, unlock);
|
callback = utils.wrap(callback, unlock);
|
||||||
|
|
||||||
this._addUnchecked(entry);
|
this.trackEntry(entry);
|
||||||
|
|
||||||
this.totalSpent += entry.tx.inputs.length;
|
|
||||||
this.size += this.memUsage(entry.tx);
|
|
||||||
this.totalTX++;
|
|
||||||
this.emit('tx', entry.tx);
|
this.emit('tx', entry.tx);
|
||||||
this.emit('add tx', entry.tx);
|
this.emit('add tx', entry.tx);
|
||||||
|
|
||||||
@ -714,11 +712,14 @@ Mempool.prototype.removeUnchecked = function removeUnchecked(entry, limit) {
|
|||||||
|
|
||||||
this.removeOrphan(entry.tx);
|
this.removeOrphan(entry.tx);
|
||||||
|
|
||||||
this._removeUnchecked(entry, limit);
|
// We do not remove spenders if this is
|
||||||
|
// being removed for a block. The spenders
|
||||||
|
// are still spending valid coins (which
|
||||||
|
// now exist on the blockchain).
|
||||||
|
if (limit)
|
||||||
|
this._removeSpenders(entry);
|
||||||
|
|
||||||
this.totalSpent -= entry.tx.inputs.length;
|
this.untrackEntry(entry);
|
||||||
this.size -= this.memUsage(entry.tx);
|
|
||||||
this.totalTX--;
|
|
||||||
|
|
||||||
if (this.fees) {
|
if (this.fees) {
|
||||||
hash = entry.tx.hash('hex');
|
hash = entry.tx.hash('hex');
|
||||||
@ -1353,12 +1354,12 @@ Mempool.prototype.getConfidence = function getConfidence(hash, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a transaction to the mempool database.
|
* Map a transaction to the mempool.
|
||||||
* @private
|
* @private
|
||||||
* @param {MempoolEntry} entry
|
* @param {MempoolEntry} entry
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Mempool.prototype._addUnchecked = function _addUnchecked(entry) {
|
Mempool.prototype.trackEntry = function trackEntry(entry) {
|
||||||
var tx = entry.tx;
|
var tx = entry.tx;
|
||||||
var hash = tx.hash('hex');
|
var hash = tx.hash('hex');
|
||||||
var i, input, output, key, coin;
|
var i, input, output, key, coin;
|
||||||
@ -1368,13 +1369,12 @@ Mempool.prototype._addUnchecked = function _addUnchecked(entry) {
|
|||||||
if (this.options.indexAddress)
|
if (this.options.indexAddress)
|
||||||
this.indexTX.addTX(tx);
|
this.indexTX.addTX(tx);
|
||||||
|
|
||||||
|
assert(!tx.isCoinbase());
|
||||||
|
|
||||||
for (i = 0; i < tx.inputs.length; i++) {
|
for (i = 0; i < tx.inputs.length; i++) {
|
||||||
input = tx.inputs[i];
|
input = tx.inputs[i];
|
||||||
key = input.prevout.hash + input.prevout.index;
|
key = input.prevout.hash + input.prevout.index;
|
||||||
|
|
||||||
if (tx.isCoinbase())
|
|
||||||
break;
|
|
||||||
|
|
||||||
assert(input.coin);
|
assert(input.coin);
|
||||||
|
|
||||||
if (this.options.indexAddress)
|
if (this.options.indexAddress)
|
||||||
@ -1394,55 +1394,34 @@ Mempool.prototype._addUnchecked = function _addUnchecked(entry) {
|
|||||||
this.coinIndex.addCoin(coin);
|
this.coinIndex.addCoin(coin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.totalSpent += tx.inputs.length;
|
||||||
|
this.size += this.memUsage(tx);
|
||||||
|
this.totalTX++;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a transaction from the database. Note
|
* Unmap a transaction from the mempool.
|
||||||
* that this _may_ not disconnect the inputs.
|
|
||||||
* Transactions get removed for 2 reasons:
|
|
||||||
* Either they are included in a block,
|
|
||||||
* or they are limited.
|
|
||||||
*
|
|
||||||
* - If they are limited, we want to disconnect
|
|
||||||
* the inputs and also remove all spender
|
|
||||||
* transactions along with their outputs/coins.
|
|
||||||
*
|
|
||||||
* - If they are included in a block, we do not
|
|
||||||
* disconnect the inputs (the coins have already
|
|
||||||
* been used on the blockchain-layer). We also
|
|
||||||
* do not remove spenders, since they are still
|
|
||||||
* spending valid coins that exist on the blockchain.
|
|
||||||
*
|
|
||||||
* @private
|
* @private
|
||||||
* @param {MempoolEntry} entry
|
* @param {MempoolEntry} entry
|
||||||
* @param {Boolean} limit
|
|
||||||
* @param {Function} callback
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Mempool.prototype._removeUnchecked = function _removeUnchecked(entry, limit) {
|
Mempool.prototype.untrackEntry = function untrackEntry(entry) {
|
||||||
var tx = entry.tx;
|
var tx = entry.tx;
|
||||||
var hash = tx.hash('hex');
|
var hash = tx.hash('hex');
|
||||||
var i, input, output, key, coin;
|
var i, input, output, key, coin;
|
||||||
|
|
||||||
// We do not remove spenders if this is
|
|
||||||
// being removed for a block. The spenders
|
|
||||||
// are still spending valid coins (which
|
|
||||||
// now exist on the blockchain).
|
|
||||||
if (limit)
|
|
||||||
this._removeSpenders(entry);
|
|
||||||
|
|
||||||
delete this.tx[hash];
|
delete this.tx[hash];
|
||||||
|
|
||||||
if (this.options.indexAddress)
|
if (this.options.indexAddress)
|
||||||
this.txIndex.removeTX(tx);
|
this.txIndex.removeTX(tx);
|
||||||
|
|
||||||
|
assert(!tx.isCoinbase());
|
||||||
|
|
||||||
for (i = 0; i < tx.inputs.length; i++) {
|
for (i = 0; i < tx.inputs.length; i++) {
|
||||||
input = tx.inputs[i];
|
input = tx.inputs[i];
|
||||||
key = input.prevout.hash + input.prevout.index;
|
key = input.prevout.hash + input.prevout.index;
|
||||||
|
|
||||||
if (tx.isCoinbase())
|
|
||||||
break;
|
|
||||||
|
|
||||||
delete this.spents[key];
|
delete this.spents[key];
|
||||||
|
|
||||||
assert(input.coin);
|
assert(input.coin);
|
||||||
@ -1462,6 +1441,10 @@ Mempool.prototype._removeUnchecked = function _removeUnchecked(entry, limit) {
|
|||||||
this.coinIndex.removeCoin(coin);
|
this.coinIndex.removeCoin(coin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.totalSpent -= tx.inputs.length;
|
||||||
|
this.size -= this.memUsage(tx);
|
||||||
|
this.totalTX--;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1497,6 +1480,8 @@ Mempool.prototype.memUsage = function memUsage(tx) {
|
|||||||
var mem = 0;
|
var mem = 0;
|
||||||
var i, j, input, output;
|
var i, j, input, output;
|
||||||
|
|
||||||
|
mem += 8;
|
||||||
|
mem += 8;
|
||||||
mem += 8;
|
mem += 8;
|
||||||
|
|
||||||
for (i = 0; i < tx.inputs.length; i++) {
|
for (i = 0; i < tx.inputs.length; i++) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user