diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -54,37 +54,6 @@ } } -static bool CheckMinimalPush(const valtype &data, opcodetype opcode) { - // Excludes OP_1NEGATE, OP_1-16 since they are by definition minimal - assert(0 <= opcode && opcode <= OP_PUSHDATA4); - if (data.size() == 0) { - // Should have used OP_0. - return opcode == OP_0; - } - if (data.size() == 1 && data[0] >= 1 && data[0] <= 16) { - // Should have used OP_1 .. OP_16. - return false; - } - if (data.size() == 1 && data[0] == 0x81) { - // Should have used OP_1NEGATE. - return false; - } - if (data.size() <= 75) { - // Must have used a direct push (opcode indicating number of bytes - // pushed + those bytes). - return opcode == data.size(); - } - if (data.size() <= 255) { - // Must have used OP_PUSHDATA. - return opcode == OP_PUSHDATA1; - } - if (data.size() <= 65535) { - // Must have used OP_PUSHDATA2. - return opcode == OP_PUSHDATA2; - } - return true; -} - static bool IsOpcodeDisabled(opcodetype opcode, uint32_t flags) { switch (opcode) { case OP_INVERT: diff --git a/src/script/script.h b/src/script/script.h --- a/src/script/script.h +++ b/src/script/script.h @@ -194,6 +194,12 @@ const char *GetOpName(opcodetype opcode); +/** + * Check whether the given stack element data would be minimally pushed using + * the given opcode. + */ +bool CheckMinimalPush(const std::vector &data, opcodetype opcode); + class scriptnum_error : public std::runtime_error { public: explicit scriptnum_error(const std::string &str) diff --git a/src/script/script.cpp b/src/script/script.cpp --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -263,6 +263,37 @@ } } +bool CheckMinimalPush(const std::vector &data, opcodetype opcode) { + // Excludes OP_1NEGATE, OP_1-16 since they are by definition minimal + assert(0 <= opcode && opcode <= OP_PUSHDATA4); + if (data.size() == 0) { + // Should have used OP_0. + return opcode == OP_0; + } + if (data.size() == 1 && data[0] >= 1 && data[0] <= 16) { + // Should have used OP_1 .. OP_16. + return false; + } + if (data.size() == 1 && data[0] == 0x81) { + // Should have used OP_1NEGATE. + return false; + } + if (data.size() <= 75) { + // Must have used a direct push (opcode indicating number of bytes + // pushed + those bytes). + return opcode == data.size(); + } + if (data.size() <= 255) { + // Must have used OP_PUSHDATA. + return opcode == OP_PUSHDATA1; + } + if (data.size() <= 65535) { + // Must have used OP_PUSHDATA2. + return opcode == OP_PUSHDATA2; + } + return true; +} + bool CScriptNum::IsMinimallyEncoded(const std::vector &vch, const size_t nMaxNumSize) { if (vch.size() > nMaxNumSize) {