From 283157dd71de9441fa5b96c9a91d515a6341bdfb Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 18 Dec 2015 17:50:51 -0800 Subject: [PATCH] add `allowEval` option. --- lib/bcoin/script.js | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/lib/bcoin/script.js b/lib/bcoin/script.js index 0a4b0114..5a6fa6b0 100644 --- a/lib/bcoin/script.js +++ b/lib/bcoin/script.js @@ -198,7 +198,7 @@ script._next = function(to, s, pc) { return -1; }; -script.execute = function execute(s, stack, tx, index) { +script.execute = function execute(s, stack, tx, index, recurse) { s = s.slice(); if (s.length > constants.script.maxOps) @@ -713,9 +713,6 @@ script.execute = function execute(s, stack, tx, index) { } case 'checklocktimeverify': { // OP_CHECKLOCKTIMEVERIFY = OP_NOP2 - // input: [[], sig1, sig2, 1] - // prev_out: [[lock], 'checklocktimeverify', 'drop', - // 'dup', 'hash160', pubkey, 'equalverify', 'checksig'] if (!tx || stack.length === 0) return false; @@ -742,12 +739,30 @@ script.execute = function execute(s, stack, tx, index) { } case 'eval_': { // OP_EVAL = OP_NOP1 - // var evalScript = script.decode(stack.pop()); - // if (!Array.isArray(evalScript)) - // return false; - // var res = script.execute(evalScript, stack, tx, index); - // if (!res) - // return false; + if (!script.allowEval) + break; + + recurse = recurse || 0; + + if (recurse++ > 2) + return false; + + var evalScript = stack.pop(); + if (!Array.isArray(evalScript)) + return false; + + evalScript = script.decode(evalScript); + + var res = evalScript.some(function(op) { + return op === 'codesep'; + }); + if (res) + return false; + + res = script.execute(evalScript, stack, tx, index, recurse); + if (!res) + return false; + break; } default: { @@ -763,10 +778,10 @@ script.execute = function execute(s, stack, tx, index) { return true; }; -script.exec = function(input, output, tx, i) { +script.exec = function(input, output, tx, i, recurse) { var stack = []; - script.execute(input, stack, tx, i); - var res = script.execute(output, stack, tx, i); + script.execute(input, stack, tx, i, recurse); + var res = script.execute(output, stack, tx, i, recurse); // if (!res || stack.length === 0 || new bn(stack.pop()).cmp(0) !== 0) if (!res || stack.length === 0 || utils.isEqual(stack.pop(), [ 0 ])) return false;