diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -913,11 +913,6 @@ case OP_CHECKDATASIG: case OP_CHECKDATASIGVERIFY: { - // Make sure this remains an error before activation. - if ((flags & SCRIPT_ENABLE_CHECKDATASIG) == 0) { - return set_error(serror, SCRIPT_ERR_BAD_OPCODE); - } - // (sig message pubkey -- bool) if (stack.size() < 3) { return set_error( diff --git a/src/script/script_flags.h b/src/script/script_flags.h --- a/src/script/script_flags.h +++ b/src/script/script_flags.h @@ -95,8 +95,9 @@ // SCRIPT_ENABLE_REPLAY_PROTECTION = (1U << 17), - // Is OP_CHECKDATASIG and variant are enabled, and must be counted towards - // Sigops limits. + // Count sigops for OP_CHECKDATASIG and variant. The interpreter treats + // OP_CHECKDATASIG(VERIFY) as always valid, this flag only affects sigops + // counting. // SCRIPT_ENABLE_CHECKDATASIG = (1U << 18), diff --git a/src/test/checkdatasig_tests.cpp b/src/test/checkdatasig_tests.cpp --- a/src/test/checkdatasig_tests.cpp +++ b/src/test/checkdatasig_tests.cpp @@ -66,12 +66,11 @@ const CScript &script, const stacktype &expected) { for (uint32_t flags : flagset) { - // Make sure that we get a bad opcode when the activation flag is not - // passed. - CheckError(flags & ~SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, - SCRIPT_ERR_BAD_OPCODE); + // The script executes as expected if the opcodes are not activated. + CheckPass(flags & ~SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, + expected); - // The script execute as expected if the opcodes are activated. + // The script executes as expected if the opcodes are activated. CheckPass(flags | SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, expected); } @@ -80,10 +79,10 @@ static void CheckErrorForAllFlags(const stacktype &original_stack, const CScript &script, ScriptError expected) { for (uint32_t flags : flagset) { - // Make sure that we get a bad opcode when the activation flag is not - // passed. + // The script generates the proper error if the opcodes are not + // activated. CheckError(flags & ~SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, - SCRIPT_ERR_BAD_OPCODE); + expected); // The script generates the proper error if the opcodes are activated. CheckError(flags | SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, diff --git a/src/test/data/script_tests.json b/src/test/data/script_tests.json --- a/src/test/data/script_tests.json +++ b/src/test/data/script_tests.json @@ -1233,8 +1233,6 @@ "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"], ["0x50","1", "P2SH,STRICTENC", "BAD_OPCODE", "opcode 0x50 is reserved"], -["1", "IF CHECKDATASIG ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"], -["1", "IF CHECKDATASIGVERIFY ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"], ["1", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE", "opcodes >= FIRST_UNDEFINED_OP_VALUE invalid if executed"], ["1", "IF 0xbd ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"], ["1", "IF 0xbe ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"], @@ -2314,6 +2312,13 @@ "Standard CHECKDATASIG" ], [ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "NULLFAIL,STRICTENC", + "OK", + "Standard CHECKDATASIG without CHECKDATASIG flag" +], +[ "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", "CHECKDATASIG,NULLFAIL,STRICTENC",