Browse Source

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
tags/v0.15.1
Andrew Chow 4 years ago
parent
commit
5b75c47784
3 changed files with 29 additions and 0 deletions
  1. 12
    0
      src/script/script.cpp
  2. 3
    0
      src/script/script.h
  3. 14
    0
      src/test/script_tests.cpp

+ 12
- 0
src/script/script.cpp View File

@@ -267,3 +267,15 @@ std::string CScriptWitness::ToString() const
}
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;
}

+ 3
- 0
src/script/script.h View File

@@ -630,6 +630,9 @@ public:
bool IsPushOnly(const_iterator pc) 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,
* regardless of the initial stack. This allows outputs to be pruned

+ 14
- 0
src/test/script_tests.cpp View File

@@ -1438,4 +1438,18 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
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()

Loading…
Cancel
Save