diff --git a/lib/script/interpreter.js b/lib/script/interpreter.js index 2639206ed..c528b9210 100644 --- a/lib/script/interpreter.js +++ b/lib/script/interpreter.js @@ -399,6 +399,13 @@ Interpreter.SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS = (1 << 11); // See BIP112 for details Interpreter.SCRIPT_VERIFY_CHECKSEQUENCEVERIFY = (1 << 10); +// +// Segwit script only: Require the argument of OP_IF/NOTIF to be exactly +// 0x01 or empty vector +// +Interpreter.SCRIPT_VERIFY_MINIMALIF = (1 << 13); + + // Signature(s) must be empty vector if an CHECK(MULTI)SIG operation failed // Interpreter.SCRIPT_VERIFY_NULLFAIL = (1 << 14); @@ -874,11 +881,25 @@ Interpreter.prototype.step = function() { this.errstr = 'SCRIPT_ERR_UNBALANCED_CONDITIONAL'; return false; } - buf = this.stack.pop(); + + buf = this.stack[this.stack.length - 1]; + + if (this.flags & Interpreter.SCRIPT_VERIFY_MINIMALIF) { + buf = this.stack[this.stack.length - 1]; + if (buf.length > 1) { + this.errstr = 'SCRIPT_ERR_MINIMALIF'; + return false; + } + if (buf.length == 1 && buf[0]!=1) { + this.errstr = 'SCRIPT_ERR_MINIMALIF'; + return false; + } + } fValue = Interpreter.castToBool(buf); if (opcodenum === Opcode.OP_NOTIF) { fValue = !fValue; } + this.stack.pop(); } this.vfExec.push(fValue); } diff --git a/test/script/interpreter.js b/test/script/interpreter.js index ba98adccc..59729bc4f 100644 --- a/test/script/interpreter.js +++ b/test/script/interpreter.js @@ -309,15 +309,13 @@ describe('Interpreter', function() { flags = flags | Interpreter.SCRIPT_VERIFY_CLEANSTACK; } -console.log('[interpreter.js.311]', flagstr); //TODO if (flagstr.indexOf('WITNESS_PUBKEYTYPE') !== -1) { - -console.log('[interpreter.js.314] IN!'); //TODO flags = flags | Interpreter.SCRIPT_VERIFY_WITNESS_PUBKEYTYPE; } + if (flagstr.indexOf('MINIMALIF') !== -1) { + flags = flags | Interpreter.SCRIPT_VERIFY_MINIMALIF; + } -console.log('ANTES XXX ', flags & Interpreter.SCRIPT_VERIFY_WITNESS_PUBKEYTYPE); //TODO -console.log('[interpreter.js.320:flags:]',flags); //TODO return flags; };