fix sigops counting.

This commit is contained in:
Christopher Jeffrey 2016-02-18 01:44:46 -08:00
parent ff467afaff
commit 4b672d6337
3 changed files with 46 additions and 45 deletions

View File

@ -412,8 +412,10 @@ Chain.prototype._removeBlock = function _removeBlock(tip, callback) {
if (self.mempool) if (self.mempool)
self.mempool.removeBlock(block); self.mempool.removeBlock(block);
self.emit('remove block', block.hash('hex'));
block.txs.forEach(function(tx) { block.txs.forEach(function(tx) {
self.emit('remove', tx.hash('hex'), block.hash('hex')); self.emit('remove tx', tx.hash('hex'));
}); });
return callback(); return callback();
@ -473,7 +475,7 @@ Chain.prototype._verify = function _verify(block, prev) {
} }
// Ensure the miner's target is equal to what we expect // Ensure the miner's target is equal to what we expect
if (block.bits !== block.chain.getTarget(prev, block)) { if (block.bits !== this.getTarget(prev, block)) {
utils.debug('Block is using wrong target: %s', block.rhash); utils.debug('Block is using wrong target: %s', block.rhash);
return false; return false;
} }
@ -561,17 +563,6 @@ Chain.prototype._verify = function _verify(block, prev) {
return false; return false;
} }
// Check for tx sigops limits
// Bitcoind does not check for this when accepting
// a block even though it probably should.
// if (tx.getSigops(true) > constants.script.maxTxSigops) {
// // Block 71036 abused checksig to
// // include a huge number of sigops.
// utils.debug('Block TX has too many sigops: %s', block.rhash);
// if (!(network.type === 'main' && height === 71036))
// return false;
// }
// Check for block sigops limits // Check for block sigops limits
// Start counting P2SH sigops once block // Start counting P2SH sigops once block
// timestamps reach March 31st, 2012. // timestamps reach March 31st, 2012.

View File

@ -1615,12 +1615,15 @@ script.getUnknownData = function getUnknownData(s) {
}; };
script.getInputKeys = function getInputKeys(s, prev) { script.getInputKeys = function getInputKeys(s, prev) {
if (prev) {
if (script.isScripthash(prev))
return script.getOutputKeys(script.getRedeem(s));
return script.getOutputKeys(prev);
}
if (script.isScripthashInput(s)) if (script.isScripthashInput(s))
return script.getOutputKeys(script.getRedeem(s)); return script.getOutputKeys(script.getRedeem(s));
if (prev)
return script.getOutputKeys(prev);
if (script.isPubkeyhashInput(s)) if (script.isPubkeyhashInput(s))
return [s[1]]; return [s[1]];
@ -1638,12 +1641,15 @@ script.getOutputKeys = function getOutputKeys(s) {
}; };
script.getInputKeyHashes = function getInputKeyHashes(s, prev) { script.getInputKeyHashes = function getInputKeyHashes(s, prev) {
if (prev) {
if (script.isScripthash(prev))
return script.getOutputKeyHashes(script.getRedeem(s));
return script.getOuputKeyHashes(prev);
}
if (script.isScripthashInput(s)) if (script.isScripthashInput(s))
return script.getOutputKeyHashes(script.getRedeem(s)); return script.getOutputKeyHashes(script.getRedeem(s));
if (prev)
return script.getOuputKeyHashes(prev);
if (script.isPubkeyhashInput(s)) if (script.isPubkeyhashInput(s))
return [bcoin.address.hash160(s[1])]; return [bcoin.address.hash160(s[1])];
@ -1715,12 +1721,15 @@ script.getOutputAddress = function getOutputAddress(s) {
}; };
script.getInputMN = function getInputMN(s, prev) { script.getInputMN = function getInputMN(s, prev) {
if (prev) {
if (script.isScripthash(prev))
return script.getOutputMN(script.getRedeem(s));
return script.getOuputMN(prev);
}
if (script.isScripthashInput(s)) if (script.isScripthashInput(s))
return script.getOutputMN(script.getRedeem(s)); return script.getOutputMN(script.getRedeem(s));
if (prev)
return script.getOuputMN(prev);
return { m: 1, n: 1 }; return { m: 1, n: 1 };
}; };
@ -1747,7 +1756,7 @@ script.isPubkey = function isPubkey(s, key) {
return false; return false;
} }
return s[0]; return true;
}; };
script.isPubkeyhash = function isPubkeyhash(s, hash) { script.isPubkeyhash = function isPubkeyhash(s, hash) {
@ -1770,7 +1779,7 @@ script.isPubkeyhash = function isPubkeyhash(s, hash) {
return false; return false;
} }
return s[2]; return true;
}; };
script.isMultisig = function isMultisig(s, keys) { script.isMultisig = function isMultisig(s, keys) {
@ -1836,11 +1845,7 @@ script.isMultisig = function isMultisig(s, keys) {
return false; return false;
} }
return { return true;
keys: s.slice(1, n + 1),
m: m,
n: n
};
}; };
script.isScripthash = function isScripthash(s, hash) { script.isScripthash = function isScripthash(s, hash) {
@ -1861,7 +1866,7 @@ script.isScripthash = function isScripthash(s, hash) {
return false; return false;
} }
return s[1]; return true;
}; };
script.isNulldata = function isNulldata(s) { script.isNulldata = function isNulldata(s) {
@ -1875,7 +1880,7 @@ script.isNulldata = function isNulldata(s) {
if (!res) if (!res)
return false; return false;
return s[1]; return true;
}; };
script.getInputType = function getInputType(s, prev) { script.getInputType = function getInputType(s, prev) {
@ -1906,7 +1911,7 @@ script.isPubkeyInput = function isPubkeyInput(s, key, tx, i) {
return false; return false;
} }
return s[0]; return true;
}; };
script.isPubkeyhashInput = function isPubkeyhashInput(s, key) { script.isPubkeyhashInput = function isPubkeyhashInput(s, key) {
@ -1924,7 +1929,7 @@ script.isPubkeyhashInput = function isPubkeyhashInput(s, key) {
return false; return false;
} }
return s[1]; return true;
}; };
script.isMultisigInput = function isMultisigInput(s, keys, tx, i) { script.isMultisigInput = function isMultisigInput(s, keys, tx, i) {
@ -1970,10 +1975,7 @@ script.isMultisigInput = function isMultisigInput(s, keys, tx, i) {
// recovered.push(key); // recovered.push(key);
// } // }
return { return true;
signatures: s.slice(1),
m: s.length - 1
};
}; };
script.isScripthashInput = function isScripthashInput(s, data, strict) { script.isScripthashInput = function isScripthashInput(s, data, strict) {
@ -2011,12 +2013,12 @@ script.isScripthashInput = function isScripthashInput(s, data, strict) {
// Check data against last array in case // Check data against last array in case
// a raw redeem script was passed in. // a raw redeem script was passed in.
if (data && utils.isEqual(data, raw)) if (data && utils.isEqual(data, raw))
return raw; return true;
// Return here if we do not want to check // Return here if we do not want to check
// against standard transaction types. // against standard transaction types.
if (!strict) if (!strict)
return raw; return true;
// P2SH redeem scripts can be nonstandard: make // P2SH redeem scripts can be nonstandard: make
// it easier for other functions to parse this. // it easier for other functions to parse this.
@ -2039,7 +2041,7 @@ script.isScripthashInput = function isScripthashInput(s, data, strict) {
return false; return false;
} }
return raw; return true;
}; };
script.getCoinbaseData = function getCoinbaseData(s) { script.getCoinbaseData = function getCoinbaseData(s) {
@ -2391,9 +2393,14 @@ script.getSigops = function getSigops(s, accurate) {
return n; return n;
}; };
script.getScripthashSigops = function getScripthashSigops(s) { script.getScripthashSigops = function getScripthashSigops(s, prev) {
if (!script.isScripthashInput(s)) if (prev) {
return 0; if (!script.isScripthash(prev))
return 0;
} else {
if (!script.isScripthashInput(s))
return 0;
}
if (!script.isPushOnly(s)) if (!script.isPushOnly(s))
return 0; return 0;

View File

@ -1523,9 +1523,12 @@ TX.prototype.isFinal = function isFinal(height, ts) {
TX.prototype.getSigops = function getSigops(scriptHash, accurate) { TX.prototype.getSigops = function getSigops(scriptHash, accurate) {
var n = 0; var n = 0;
this.inputs.forEach(function(input) { this.inputs.forEach(function(input) {
var prev;
n += bcoin.script.getSigops(input.script, accurate); n += bcoin.script.getSigops(input.script, accurate);
if (scriptHash && !this.isCoinbase()) if (scriptHash && !this.isCoinbase()) {
n += bcoin.script.getScripthashSigops(input.script); prev = input.output ? input.output.script : null;
n += bcoin.script.getScripthashSigops(input.script, prev);
}
}, this); }, this);
this.outputs.forEach(function(output) { this.outputs.forEach(function(output) {
n += bcoin.script.getSigops(output.script, accurate); n += bcoin.script.getSigops(output.script, accurate);