better handling of [] when it is OP_0.

This commit is contained in:
Christopher Jeffrey 2015-12-09 12:24:20 -08:00
parent 2fd1d171f2
commit 690fe7163a
2 changed files with 20 additions and 14 deletions

View File

@ -605,7 +605,7 @@ script.execute = function execute(s, stack, tx, index) {
var n = stack.pop();
if (n.length !== 1 || !(1 <= n[0] && n[0] <= 3))
return false;
n = n[0];
n = n[0] || 0;
if (stack.length < n + 1)
return false;
@ -622,7 +622,7 @@ script.execute = function execute(s, stack, tx, index) {
var m = stack.pop();
if (m.length !== 1 || !(1 <= m[0] && m[0] <= n))
return false;
m = m[0];
m = m[0] || 0;
if (stack.length < m + 1)
return false;
@ -782,7 +782,7 @@ script.isMultisig = function isMultisig(s, key) {
m = [m];
if (!Array.isArray(m) || m.length !== 1)
return false;
m = m[0];
m = m[0] || 0;
if (s[s.length - 1] !== 'checkmultisig')
return false;
@ -792,7 +792,7 @@ script.isMultisig = function isMultisig(s, key) {
n = [n];
if (!Array.isArray(n) || n.length !== 1)
return false;
n = n[0];
n = n[0] || 0;
if (n + 3 !== s.length)
return false;

View File

@ -168,7 +168,7 @@ TX.prototype.scriptInput = function(input, pub) {
var n = s[s.length - 2];
// If using pushdata instead of OP_1-16:
if (Array.isArray(n))
n = n[0];
n = n[0] || 0;
for (var i = 0; i < n; i++)
input.script[i + 1] = [];
return;
@ -178,7 +178,11 @@ TX.prototype.scriptInput = function(input, pub) {
// p2sh format: OP_FALSE [sig-1] [sig-2] ... [redeem-script]
if (bcoin.script.isScripthash(s)) {
input.script = [ [] ];
var n = pub[pub.length - 2] - constants.opcodes['1'] + 1;
var redeem = bcoin.script.decode(pub);
var n = redeem[redeem.length - 2];
// If using pushdata instead of OP_1-16:
if (Array.isArray(n))
n = n[0] || 0;
for (var i = 0; i < n; i++)
input.script[i + 1] = [];
// P2SH requires the redeem script after signatures
@ -230,12 +234,9 @@ TX.prototype.signInput = function(input, key, type) {
}
var m = redeem[0];
var n = redeem[s.length - 2];
// If using pushdata instead of OP_1-16:
if (Array.isArray(m))
m = m[0];
if (Array.isArray(n))
n = n[0];
m = m[0] || 0;
var keys = redeem.slice(1, -2);
var pub = key.getPublic(true, 'array');
@ -258,7 +259,7 @@ TX.prototype.signInput = function(input, key, type) {
// and count the total number of signatures.
var totalSigs = 0;
for (var i = 1; i < len; i++) {
if (input.script[i].length) {
if (Array.isArray(input.script[i]) && input.script[i].length) {
totalSigs++;
continue;
}
@ -274,7 +275,7 @@ TX.prototype.signInput = function(input, key, type) {
// All signatures added. Finalize by removing empty slots.
if (totalSigs >= m) {
for (var i = len - 1; i >= 1; i--) {
if (!input.script[i].length)
if (Array.isArray(input.script[i]) && !input.script[i].length)
input.script.splice(i, 1);
}
}
@ -494,7 +495,7 @@ TX.prototype.maxSize = function maxSize() {
var m = s[0];
// If using pushdata instead of OP_1-16:
if (Array.isArray(m))
m = m[0];
m = m[0] || 0;
assert(m >= 1 && m <= 3);
size += 74 * m;
return;
@ -504,9 +505,14 @@ TX.prototype.maxSize = function maxSize() {
var script = this.inputs[i].script;
var redeem, m, n;
if (script.length) {
redeem = script[script.length - 1];
redeem = bcoin.script.decode(script[script.length - 1]);
m = redeem[0];
n = redeem[redeem.length - 2];
// If using pushdata instead of OP_1-16:
if (Array.isArray(m))
m = m[0] || 0;
if (Array.isArray(n))
n = n[0] || 0;
} else {
// May end up in a higher fee if we
// do not have the redeem script available.