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

View File

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