mempool: fix address index.
This commit is contained in:
parent
a14da39384
commit
9fbd2710ab
@ -724,7 +724,7 @@ Mempool.prototype.removeUnchecked = function removeUnchecked(entry, limit) {
|
|||||||
// are still spending valid coins (which
|
// are still spending valid coins (which
|
||||||
// now exist on the blockchain).
|
// now exist on the blockchain).
|
||||||
if (limit) {
|
if (limit) {
|
||||||
this._removeSpenders(entry);
|
this.removeSpenders(entry);
|
||||||
this.logger.debug('Evicting %s from the mempool.', entry.tx.rhash);
|
this.logger.debug('Evicting %s from the mempool.', entry.tx.rhash);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -976,6 +976,58 @@ Mempool.prototype.countDescendants = function countDescendants(tx) {
|
|||||||
return max;
|
return max;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all transaction ancestors.
|
||||||
|
* @param {TX} tx
|
||||||
|
* @returns {MempoolEntry[]}
|
||||||
|
*/
|
||||||
|
|
||||||
|
Mempool.prototype.getAncestors = function getAncestors(tx) {
|
||||||
|
var self = this;
|
||||||
|
var entries = [];
|
||||||
|
|
||||||
|
(function traverse(tx) {
|
||||||
|
var i, input, prev;
|
||||||
|
|
||||||
|
for (i = 0; i < tx.inputs.length; i++) {
|
||||||
|
input = tx.inputs[i];
|
||||||
|
prev = self.getTX(input.prevout.hash);
|
||||||
|
if (!prev)
|
||||||
|
continue;
|
||||||
|
entries.push(prev);
|
||||||
|
traverse(prev);
|
||||||
|
}
|
||||||
|
})(tx);
|
||||||
|
|
||||||
|
return entries;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all a transaction descendants.
|
||||||
|
* @param {TX} tx
|
||||||
|
* @returns {MempoolEntry[]}
|
||||||
|
*/
|
||||||
|
|
||||||
|
Mempool.prototype.getDescendants = function getDescendants(tx) {
|
||||||
|
var self = this;
|
||||||
|
var entries = [];
|
||||||
|
|
||||||
|
(function traverse(tx) {
|
||||||
|
var hash = tx.hash('hex');
|
||||||
|
var i, next;
|
||||||
|
|
||||||
|
for (i = 0; i < tx.outputs.length; i++) {
|
||||||
|
next = self.isSpent(hash, i);
|
||||||
|
if (!next)
|
||||||
|
continue;
|
||||||
|
entries.push(next);
|
||||||
|
traverse(next.tx);
|
||||||
|
}
|
||||||
|
})(tx);
|
||||||
|
|
||||||
|
return entries;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a unconfirmed transactions that
|
* Find a unconfirmed transactions that
|
||||||
* this transaction depends on.
|
* this transaction depends on.
|
||||||
@ -1387,7 +1439,7 @@ Mempool.prototype.trackEntry = function trackEntry(entry) {
|
|||||||
assert(input.coin);
|
assert(input.coin);
|
||||||
|
|
||||||
if (this.options.indexAddress)
|
if (this.options.indexAddress)
|
||||||
this.coinIndex.removeCoin(input.coin);
|
this.coinIndex.removeCoin(input.prevout);
|
||||||
|
|
||||||
this.spents[key] = entry;
|
this.spents[key] = entry;
|
||||||
}
|
}
|
||||||
@ -1430,12 +1482,10 @@ Mempool.prototype.untrackEntry = function untrackEntry(entry) {
|
|||||||
input = tx.inputs[i];
|
input = tx.inputs[i];
|
||||||
key = input.prevout.hash + input.prevout.index;
|
key = input.prevout.hash + input.prevout.index;
|
||||||
|
|
||||||
delete this.spents[key];
|
|
||||||
|
|
||||||
assert(input.coin);
|
|
||||||
|
|
||||||
if (this.options.indexAddress)
|
if (this.options.indexAddress)
|
||||||
this.coinIndex.removeCoin(input.coin);
|
this.coinIndex.removeCoin(input.prevout);
|
||||||
|
|
||||||
|
delete this.spents[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.options.indexAddress) {
|
if (this.options.indexAddress) {
|
||||||
@ -1462,7 +1512,7 @@ Mempool.prototype.untrackEntry = function untrackEntry(entry) {
|
|||||||
* @param {Function} callback
|
* @param {Function} callback
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Mempool.prototype._removeSpenders = function _removeSpenders(entry) {
|
Mempool.prototype.removeSpenders = function removeSpenders(entry) {
|
||||||
var tx = entry.tx;
|
var tx = entry.tx;
|
||||||
var hash = tx.hash('hex');
|
var hash = tx.hash('hex');
|
||||||
var i, spender;
|
var i, spender;
|
||||||
@ -1855,6 +1905,7 @@ AddressIndex.prototype.getTX = function getTX(address) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
AddressIndex.prototype.addTX = function addTX(tx) {
|
AddressIndex.prototype.addTX = function addTX(tx) {
|
||||||
|
var key = tx.hash('hex');
|
||||||
var hashes = tx.getHashes('hex');
|
var hashes = tx.getHashes('hex');
|
||||||
var i, hash, items;
|
var i, hash, items;
|
||||||
|
|
||||||
@ -1869,12 +1920,18 @@ AddressIndex.prototype.addTX = function addTX(tx) {
|
|||||||
|
|
||||||
utils.binaryInsert(items, tx.hash(), utils.cmp);
|
utils.binaryInsert(items, tx.hash(), utils.cmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.map[key] = hashes;
|
||||||
};
|
};
|
||||||
|
|
||||||
AddressIndex.prototype.removeTX = function removeTX(tx) {
|
AddressIndex.prototype.removeTX = function removeTX(tx) {
|
||||||
var hashes = tx.getHashes('hex');
|
var key = tx.hash('hex');
|
||||||
|
var hashes = this.map[key];
|
||||||
var i, hash, items;
|
var i, hash, items;
|
||||||
|
|
||||||
|
if (!hashes)
|
||||||
|
return;
|
||||||
|
|
||||||
for (i = 0; i < hashes.length; i++) {
|
for (i = 0; i < hashes.length; i++) {
|
||||||
hash = hashes[i];
|
hash = hashes[i];
|
||||||
items = this.map[hash];
|
items = this.map[hash];
|
||||||
@ -1887,9 +1944,12 @@ AddressIndex.prototype.removeTX = function removeTX(tx) {
|
|||||||
if (items.length === 0)
|
if (items.length === 0)
|
||||||
delete this.map[hash];
|
delete this.map[hash];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete this.map[key];
|
||||||
};
|
};
|
||||||
|
|
||||||
AddressIndex.prototype.addCoin = function addCoin(coin) {
|
AddressIndex.prototype.addCoin = function addCoin(coin) {
|
||||||
|
var key = coin.hash + coin.index;
|
||||||
var hash = coin.getHash('hex');
|
var hash = coin.getHash('hex');
|
||||||
var outpoint, items;
|
var outpoint, items;
|
||||||
|
|
||||||
@ -1905,10 +1965,13 @@ AddressIndex.prototype.addCoin = function addCoin(coin) {
|
|||||||
|
|
||||||
outpoint = bcoin.outpoint(coin.hash, coin.index).toRaw();
|
outpoint = bcoin.outpoint(coin.hash, coin.index).toRaw();
|
||||||
utils.binaryInsert(items, outpoint, utils.cmp);
|
utils.binaryInsert(items, outpoint, utils.cmp);
|
||||||
|
|
||||||
|
this.map[key] = hash;
|
||||||
};
|
};
|
||||||
|
|
||||||
AddressIndex.prototype.removeCoin = function removeCoin(coin) {
|
AddressIndex.prototype.removeCoin = function removeCoin(coin) {
|
||||||
var hash = coin.getHash('hex');
|
var key = coin.hash + coin.index;
|
||||||
|
var hash = this.map[key];
|
||||||
var outpoint, items;
|
var outpoint, items;
|
||||||
|
|
||||||
if (!hash)
|
if (!hash)
|
||||||
@ -1924,6 +1987,8 @@ AddressIndex.prototype.removeCoin = function removeCoin(coin) {
|
|||||||
|
|
||||||
if (items.length === 0)
|
if (items.length === 0)
|
||||||
delete this.map[hash];
|
delete this.map[hash];
|
||||||
|
|
||||||
|
delete this.map[key];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user