remove old _verify method.
This commit is contained in:
parent
dd54dcad11
commit
081924b7d4
@ -600,231 +600,6 @@ Chain.prototype._verify = function _verify(block, prev, callback) {
|
||||
});
|
||||
};
|
||||
|
||||
Chain.prototype._verify2 = function _verify(block, prev, callback) {
|
||||
var self = this;
|
||||
var flags = constants.flags.MANDATORY_VERIFY_FLAGS;
|
||||
var height, ts, i, tx, cb, coinbaseHeight;
|
||||
var locktimeMedian, segwit, check;
|
||||
|
||||
if (!block.verify())
|
||||
return callback(null, false);
|
||||
|
||||
// Skip the genesis block
|
||||
if (block.isGenesis())
|
||||
return callback(null, flags);
|
||||
|
||||
// Ensure it's not an orphan
|
||||
if (!prev) {
|
||||
utils.debug('Block has no previous entry: %s', block.rhash);
|
||||
return callback(null, false);
|
||||
}
|
||||
|
||||
height = prev.height + 1;
|
||||
|
||||
prev.getMedianTime(function(err, medianTime) {
|
||||
if (err)
|
||||
return callback(err);
|
||||
|
||||
// Ensure the timestamp is correct
|
||||
if (block.ts <= medianTime) {
|
||||
utils.debug('Block time is lower than median: %s', block.rhash);
|
||||
return callback(null, false);
|
||||
}
|
||||
|
||||
// Ensure the miner's target is equal to what we expect
|
||||
self.getTarget(prev, block, function(err, target) {
|
||||
if (err)
|
||||
return callback(err);
|
||||
|
||||
if (block.bits !== target) {
|
||||
utils.debug('Block is using wrong target: %s', block.rhash);
|
||||
return callback(null, false);
|
||||
}
|
||||
|
||||
// For some reason bitcoind has p2sh in the
|
||||
// mandatory flags by default, when in reality
|
||||
// it wasn't activated until march 30th 2012.
|
||||
// The first p2sh output and redeem script
|
||||
// appeared on march 7th 2012, only it did
|
||||
// not have a signature. See:
|
||||
// https://blockchain.info/tx/6a26d2ecb67f27d1fa5524763b49029d7106e91e3cc05743073461a719776192
|
||||
// https://blockchain.info/tx/9c08a4d78931342b37fd5f72900fb9983087e6f46c4a097d8a1f52c74e28eaf6
|
||||
if (block.ts < constants.block.bip16time)
|
||||
flags &= ~constants.flags.VERIFY_P2SH;
|
||||
|
||||
check = [];
|
||||
|
||||
// Only allow version 2 blocks (coinbase height)
|
||||
// once the majority of blocks are using it.
|
||||
if (block.version < 2) {
|
||||
check.push([2, function(result) {
|
||||
if (result)
|
||||
utils.debug('Block is outdated (v2): %s', block.rhash);
|
||||
}]);
|
||||
}
|
||||
|
||||
// Only allow version 3 blocks (sig validation)
|
||||
// once the majority of blocks are using it.
|
||||
if (block.version < 3) {
|
||||
check.push([3, function(result) {
|
||||
if (result)
|
||||
utils.debug('Block is outdated (v3): %s', block.rhash);
|
||||
}]);
|
||||
}
|
||||
|
||||
// Only allow version 4 blocks (checklocktimeverify)
|
||||
// once the majority of blocks are using it.
|
||||
if (block.version < 4) {
|
||||
check.push([4, function(result) {
|
||||
if (result)
|
||||
utils.debug('Block is outdated (v4): %s', block.rhash);
|
||||
}]);
|
||||
}
|
||||
|
||||
// Only allow version 5 blocks (segwit)
|
||||
// once the majority of blocks are using it.
|
||||
if (network.segwitHeight !== -1 && height >= network.segwitHeight) {
|
||||
if (block.version < 5) {
|
||||
check.push([5, function(result) {
|
||||
if (result)
|
||||
utils.debug('Block is outdated (v5): %s', block.rhash);
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
// Only allow version 8 blocks (locktime median past)
|
||||
// once the majority of blocks are using it.
|
||||
// if (block.version < 8 && prev.isOutdated(8)) {
|
||||
// utils.debug('Block is outdated (v8): %s', block.rhash);
|
||||
// return false;
|
||||
// }
|
||||
|
||||
check = [];
|
||||
utils.forEachSerial(check, function(item, next) {
|
||||
var version = item[0];
|
||||
var cb = item[1];
|
||||
prev.isOutdated(version, function(err, result) {
|
||||
if (err)
|
||||
return next(err);
|
||||
|
||||
cb(result);
|
||||
|
||||
if (!result)
|
||||
return callback(null, false);
|
||||
|
||||
next();
|
||||
});
|
||||
}, function(err) {
|
||||
if (err)
|
||||
return callback(err);
|
||||
|
||||
check = [];
|
||||
|
||||
// Make sure the height contained in the coinbase is correct.
|
||||
if (network.block.bip34height !== -1 && height >= network.block.bip34height) {
|
||||
check.push([2, function(result) {
|
||||
if (result)
|
||||
coinbaseHeight = true;
|
||||
}]);
|
||||
}
|
||||
|
||||
// Signature validation is now enforced (bip66)
|
||||
if (block.version >= 3) {
|
||||
check.push([3, function(result) {
|
||||
if (result)
|
||||
flags |= constants.flags.VERIFY_DERSIG;
|
||||
}]);
|
||||
}
|
||||
|
||||
// CHECKLOCKTIMEVERIFY is now usable (bip65)
|
||||
if (block.version >= 4) {
|
||||
check.push([4, function(result) {
|
||||
if (result)
|
||||
flags |= constants.flags.VERIFY_CHECKLOCKTIMEVERIFY;
|
||||
}]);
|
||||
}
|
||||
|
||||
// Segregrated witness is now usable (the-bip-that-really-needs-to-be-rewritten)
|
||||
if (network.segwitHeight !== -1 && height >= network.segwitHeight) {
|
||||
if (block.version >= 5) {
|
||||
check.push([5, function(result) {
|
||||
if (result) {
|
||||
flags |= constants.flags.VERIFY_WITNESS;
|
||||
segwit = true;
|
||||
}
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
segwit = true;
|
||||
check = [];
|
||||
// Use nLockTime median past (bip113)
|
||||
// https://github.com/btcdrak/bips/blob/d4c9a236ecb947866c61aefb868b284498489c2b/bip-0113.mediawiki
|
||||
// Support version bits:
|
||||
// https://gist.github.com/sipa/bf69659f43e763540550
|
||||
// http://lists.linuxfoundation.org/pipermail/bitcoin-dev/2015-August/010396.html
|
||||
// if (block.version >= 8 && prev.isUpgraded(8))
|
||||
// locktimeMedian = true;
|
||||
|
||||
utils.forEachSerial(check, function(item, next) {
|
||||
var version = item[0];
|
||||
var cb = item[1];
|
||||
prev.isUpgraded(version, function(err, result) {
|
||||
if (err)
|
||||
return next(err);
|
||||
cb(result);
|
||||
next();
|
||||
});
|
||||
}, function(err) {
|
||||
if (err)
|
||||
return callback(err);
|
||||
|
||||
// Can't verify any further when merkleblock or headers.
|
||||
if (block.type !== 'block')
|
||||
return callback(null, flags);
|
||||
|
||||
// Make sure the height contained in the coinbase is correct.
|
||||
if (coinbaseHeight) {
|
||||
if (block.getCoinbaseHeight() !== height) {
|
||||
utils.debug('Block has bad coinbase height: %s', block.rhash);
|
||||
return callback(null, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (block.version >= 5 && segwit) {
|
||||
if (block.commitmentHash !== block.getCommitmentHash()) {
|
||||
utils.debug('Block failed witnessroot test: %s', block.rhash);
|
||||
return callback(null, false);
|
||||
}
|
||||
} else {
|
||||
if (block.hasWitness()) {
|
||||
utils.debug('Unexpected witness data found: %s', block.rhash);
|
||||
return callback(null, false);
|
||||
}
|
||||
}
|
||||
|
||||
// Get timestamp for tx.isFinal().
|
||||
ts = locktimeMedian ? medianTime : block.ts;
|
||||
|
||||
// Check all transactions
|
||||
for (i = 0; i < block.txs.length; i++) {
|
||||
tx = block.txs[i];
|
||||
|
||||
// Transactions must be finalized with
|
||||
// regards to nSequence and nLockTime.
|
||||
if (!tx.isFinal(height, ts)) {
|
||||
utils.debug('TX is not final: %s (%s)', block.rhash, i);
|
||||
return callback(null, false);
|
||||
}
|
||||
}
|
||||
|
||||
return callback(null, flags);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
Chain.prototype._checkDuplicates = function _checkDuplicates(block, prev, callback) {
|
||||
var self = this;
|
||||
var height = prev.height + 1;
|
||||
@ -1148,7 +923,7 @@ Chain.prototype._reorganize = function _reorganize(entry, callback) {
|
||||
self.emit('fork', block, {
|
||||
height: fork.height,
|
||||
expected: self.tip.hash,
|
||||
received: fork.hash,
|
||||
received: entry.hash,
|
||||
checkpoint: false
|
||||
});
|
||||
|
||||
|
||||
@ -191,9 +191,6 @@ Pool.prototype._init = function _init() {
|
||||
self.setMisbehavior(peer, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
// Only destroy peer here. Wait for higher chain.
|
||||
peer.destroy();
|
||||
});
|
||||
|
||||
this.chain.on('invalid', function(block, data, peer) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user