tx: fix witness item check.

This commit is contained in:
Christopher Jeffrey 2017-02-22 12:40:05 -08:00
parent ac70656e71
commit a535d7d414
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -1559,7 +1559,7 @@ TX.prototype.hasStandardInputs = function hasStandardInputs(view) {
*/
TX.prototype.hasStandardWitness = function hasStandardWitness(view) {
var i, j, input, witness, coin, prev, redeem, m, n;
var i, j, input, witness, coin, prev, redeem, m;
if (this.isCoinbase())
return true;
@ -1599,65 +1599,70 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) {
continue;
}
if (!prev.isWitnessScripthash()) {
// Unknown program type,
// let it through for now.
if (prev.isWitnessScripthash()) {
if (witness.items.length - 1 > policy.MAX_P2WSH_STACK)
return false;
for (j = 0; j < witness.items.length - 1; j++) {
if (witness.items[j].length > policy.MAX_P2WSH_PUSH)
return false;
}
redeem = witness.items[witness.items.length - 1];
if (redeem.length > policy.MAX_P2WSH_SIZE)
return false;
prev = new Script(redeem);
if (prev.isPubkey()) {
if (witness.items.length - 1 !== 1)
return false;
if (witness.items[0].length > 73)
return false;
continue;
}
if (prev.isPubkeyhash()) {
if (input.witness.length - 1 !== 2)
return false;
if (witness.items[0].length > 73)
return false;
if (witness.items[1].length > 65)
return false;
continue;
}
if (prev.isMultisig()) {
m = prev.getSmall(0);
if (witness.items.length - 1 !== m + 1)
return false;
if (witness.items[0].length !== 0)
return false;
for (j = 1; j < witness.items.length - 1; j++) {
if (witness.items[j].length > 73)
return false;
}
}
continue;
}
redeem = witness.items[witness.items.length - 1];
if (redeem.length > policy.MAX_P2WSH_SIZE)
return false;
if (witness.items.length - 1 > policy.MAX_P2WSH_STACK)
if (witness.items.length > policy.MAX_P2WSH_STACK)
return false;
for (j = 0; j < witness.items.length; j++) {
if (witness.items[j].length > policy.MAX_P2WSH_PUSH)
return false;
}
prev = new Script(redeem);
if (prev.isPubkey()) {
if (witness.items.length - 1 !== 1)
return false;
if (witness.items[0].length > 73)
return false;
continue;
}
if (prev.isPubkeyhash()) {
if (input.witness.length - 1 !== 2)
return false;
if (witness.items[0].length > 73)
return false;
if (witness.items[1].length > 65)
return false;
continue;
}
if (prev.isMultisig()) {
m = prev.getSmall(0);
n = prev.getSmall(prev.length - 2);
if (witness.items.length - 1 !== m + 1)
return false;
if (witness.items[0].length !== 0)
return false;
for (j = 1; j < witness.items.length - 1; j++) {
if (witness.items[j].length > 73)
return false;
}
}
}
return true;