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:
parent
9fec4da0be
commit
5b75c47784
3 changed files with 29 additions and 0 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue