tx: fix witness item check.
This commit is contained in:
parent
ac70656e71
commit
a535d7d414
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user