mempool: fix potential race conditions with coins.

This commit is contained in:
Christopher Jeffrey 2016-12-17 15:28:14 -08:00
parent 5fb16543f1
commit b36484c7aa
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
2 changed files with 33 additions and 3 deletions

View File

@ -2268,6 +2268,7 @@ Chain.prototype.getLocks = co(function* getLocks(prev, tx, view, flags) {
var disableFlag = constants.sequence.DISABLE_FLAG; var disableFlag = constants.sequence.DISABLE_FLAG;
var typeFlag = constants.sequence.TYPE_FLAG; var typeFlag = constants.sequence.TYPE_FLAG;
var hasFlag = flags & constants.flags.VERIFY_SEQUENCE; var hasFlag = flags & constants.flags.VERIFY_SEQUENCE;
var nextHeight = this.height + 1;
var minHeight = -1; var minHeight = -1;
var minTime = -1; var minTime = -1;
var coinHeight, coinTime; var coinHeight, coinTime;
@ -2285,7 +2286,7 @@ Chain.prototype.getLocks = co(function* getLocks(prev, tx, view, flags) {
coinHeight = view.getHeight(input); coinHeight = view.getHeight(input);
if (coinHeight === -1) if (coinHeight === -1)
coinHeight = this.height + 1; coinHeight = nextHeight;
if ((input.sequence & typeFlag) === 0) { if ((input.sequence & typeFlag) === 0) {
coinHeight += (input.sequence & mask) - 1; coinHeight += (input.sequence & mask) - 1;

View File

@ -1500,13 +1500,13 @@ Mempool.prototype.isDoubleSpend = function isDoubleSpend(tx) {
}; };
/** /**
* Get coin viewpoint. * Get coin viewpoint (no lock).
* @param {TX} tx * @param {TX} tx
* @param {CoinView} view * @param {CoinView} view
* @returns {Promise} - Returns {@link CoinView}. * @returns {Promise} - Returns {@link CoinView}.
*/ */
Mempool.prototype.getCoinView = co(function* getCoinView(tx) { Mempool.prototype._getCoinView = co(function* getCoinView(tx) {
var view = new CoinView(); var view = new CoinView();
var prevout = tx.getPrevout(); var prevout = tx.getPrevout();
var i, entry, hash, coins; var i, entry, hash, coins;
@ -1535,6 +1535,35 @@ Mempool.prototype.getCoinView = co(function* getCoinView(tx) {
return view; return view;
}); });
/**
* Get coin viewpoint (lock).
* @param {TX} tx
* @param {CoinView} view
* @returns {Promise} - Returns {@link CoinView}.
*/
Mempool.prototype.getCoinView = co(function* getCoinView(tx) {
var view = yield this.chain.getCoinView(tx);
var entries = view.toArray();
var i, entry, coins;
for (i = 0; i < entries.length; i++) {
coins = entries[i];
if (!coins.isEmpty())
continue;
entry = this.getEntry(coins.hash);
if (!entry)
continue;
view.addTX(entry.tx, -1);
}
return view;
});
/** /**
* Spend coins for transaction. * Spend coins for transaction.
* @param {TX} tx * @param {TX} tx