Add a valid opcode sanity check to CScript

Added a function in CScript that checks if the script contains valid opcodes.

Add a test for that function
This commit is contained in:
Andrew Chow 2017-05-30 15:42:10 -07:00
parent 9fec4da0be
commit 5b75c47784
3 changed files with 29 additions and 0 deletions

View file

@ -267,3 +267,15 @@ std::string CScriptWitness::ToString() const
} }
return ret + ")"; return ret + ")";
} }
bool CScript::HasValidOps() const
{
CScript::const_iterator it = begin();
while (it < end()) {
opcodetype opcode;
if (!GetOp(it, opcode) || opcode > 0xb9) {
return false;
}
}
return true;
}

View file

@ -630,6 +630,9 @@ public:
bool IsPushOnly(const_iterator pc) const; bool IsPushOnly(const_iterator pc) const;
bool IsPushOnly() const; bool IsPushOnly() const;
/** Check if the script contains valid OP_CODES */
bool HasValidOps() const;
/** /**
* Returns whether the script is guaranteed to fail at execution, * Returns whether the script is guaranteed to fail at execution,
* regardless of the initial stack. This allows outputs to be pruned * regardless of the initial stack. This allows outputs to be pruned

View file

@ -1438,4 +1438,18 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
BOOST_CHECK(s == expect); BOOST_CHECK(s == expect);
} }
BOOST_AUTO_TEST_CASE(script_HasValidOps)
{
// Exercise the HasValidOps functionality
CScript script;
script = ScriptFromHex("76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"); // Normal script
BOOST_CHECK(script.HasValidOps());
script = ScriptFromHex("76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac");
BOOST_CHECK(script.HasValidOps());
script = ScriptFromHex("ff88ac"); // Script with OP_INVALIDOPCODE explicit
BOOST_CHECK(!script.HasValidOps());
script = ScriptFromHex("88acc0"); // Script with undefined opcode
BOOST_CHECK(!script.HasValidOps());
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()