From 690fe7163a5376efa8ea7611fa7cf096c419a631 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Wed, 9 Dec 2015 12:24:20 -0800 Subject: [PATCH] better handling of `[]` when it is OP_0. --- lib/bcoin/script.js | 8 ++++---- lib/bcoin/tx.js | 26 ++++++++++++++++---------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/lib/bcoin/script.js b/lib/bcoin/script.js index 7e6dfd6d..1eb33d58 100644 --- a/lib/bcoin/script.js +++ b/lib/bcoin/script.js @@ -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; diff --git a/lib/bcoin/tx.js b/lib/bcoin/tx.js index 108b7477..f0149c61 100644 --- a/lib/bcoin/tx.js +++ b/lib/bcoin/tx.js @@ -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.