refactor. test for segwitActive.

This commit is contained in:
Christopher Jeffrey 2016-03-26 05:01:23 -07:00
parent 63421ec411
commit 55957c2271
2 changed files with 67 additions and 18 deletions

View File

@ -42,6 +42,7 @@ function Chain(node, options) {
this.lastUpdate = utils.now();
this.tip = null;
this.height = -1;
this.segwitActive = null;
this.orphan = {
map: {},
@ -153,20 +154,25 @@ Chain.prototype._init = function _init() {
if (err)
return self.emit('error', err);
self.db.getTip(function(err, tip) {
self.isSegwitActive(function(err) {
if (err)
return self.emit('error', err);
assert(tip);
self.db.getTip(function(err, tip) {
if (err)
return self.emit('error', err);
self.tip = tip;
self.height = tip.height;
assert(tip);
self.loaded = true;
self.emit('open');
self.tip = tip;
self.height = tip.height;
if (self.isFull())
self.emit('full');
self.loaded = true;
self.emit('open');
if (self.isFull())
self.emit('full');
});
});
});
});
@ -489,6 +495,9 @@ Chain.prototype._verify = function _verify(block, prev, peer, callback) {
if (block.version >= 5 && prev.isUpgraded(5)) {
flags |= constants.flags.VERIFY_WITNESS;
segwit = true;
self.segwitActive = true;
} else if (block.version >= 5) {
self.segwitActive = false;
}
}
@ -1878,6 +1887,41 @@ Chain.prototype.computeBlockVersion = function computeBlockVersion(prev, callbac
});
};
Chain.prototype.isSegwitActive = function isSegwitActive(callback) {
var tip = this.tip;
var unlock;
if (this.segwitActive != null)
return utils.asyncify(callback)(null, this.segwitActive);
if (!tip)
return utils.asyncify(callback)(null, false);
if (!(network.segwitHeight !== -1 && height >= network.segwitHeight))
return utils.asyncify(callback)(null, false);
unlock = this._lock(isSegwitActive, [callback]);
if (!unlock)
return;
callback = utils.wrap(callback, unlock);
tip.ensureAncestors(function(err) {
if (err)
return callback(err);
if (!tip.isUpgraded(5)) {
tip.free();
self.segwitActive = false;
return callback(null, false);
}
tip.free();
self.segwitActive = true;
return callback(null, true);
});
};
/**
* Expose
*/

View File

@ -339,8 +339,8 @@ Mempool.prototype.addTX = function addTX(tx, peer, callback, force) {
if (!tx.hasPrevout()) {
if (self.size > Mempool.MAX_MEMPOOL_SIZE) {
return callback(
new VerifyError('insufficientfee',
return callback(new VerifyError(
'insufficientfee',
'mempool full',
0));
}
@ -359,8 +359,8 @@ Mempool.prototype.addTX = function addTX(tx, peer, callback, force) {
return callback(err);
if (!result) {
return callback(
new VerifyError('insufficientfee',
return callback(new VerifyError(
'insufficientfee',
'mempool full',
0));
}
@ -415,13 +415,18 @@ Mempool.prototype.verify = function verify(tx, callback) {
var self = this;
var height = this.chain.height + 1;
var total, input, coin, i, fee, now, free, minFee;
var flags = Mempool.flags;
var mandatory = Mempool.mandatory;
if (network.type !== 'segwit') {
if (this.chain.segwitActive) {
flags |= constants.flags.VERIFY_WITNESS;
mandatory |= constants.flags.VERIFY_WITNESS;
} else {
if (tx.hasWitness())
return callback(new VerifyError('nonstandard', 'no-witness-yet', 0));
}
if (this.requireStandard && !tx.isStandardInputs(Mempool.flags)) {
if (this.requireStandard && !tx.isStandardInputs(flags)) {
return callback(new VerifyError(
'nonstandard',
'bad-txns-nonstandard-inputs',
@ -529,12 +534,12 @@ Mempool.prototype.verify = function verify(tx, callback) {
}
// Do this in the worker pool.
tx.verifyAsync(null, true, Mempool.flags, function(err, result) {
tx.verifyAsync(null, true, flags, function(err, result) {
if (err)
return callback(err);
if (!result) {
return tx.verifyAsync(null, true, Mempool.mandatory, function(err, result) {
return tx.verifyAsync(null, true, mandatory, function(err, result) {
if (err)
return callback(err);
@ -545,8 +550,8 @@ Mempool.prototype.verify = function verify(tx, callback) {
0));
}
return callback(
new VerifyError('nonstandard',
return callback(new VerifyError(
'nonstandard',
'non-mandatory-script-verify-flag',
0));
});