|
|
|
@ -1051,4 +1051,121 @@ BOOST_AUTO_TEST_CASE(script_GetScriptAsm)
@@ -1051,4 +1051,121 @@ BOOST_AUTO_TEST_CASE(script_GetScriptAsm)
|
|
|
|
|
BOOST_CHECK_EQUAL(derSig + "83 " + pubKey, ScriptToAsmStr(CScript() << ToByteVector(ParseHex(derSig + "83")) << vchPubKey)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static CScript |
|
|
|
|
ScriptFromHex(const char* hex) |
|
|
|
|
{ |
|
|
|
|
std::vector<unsigned char> data = ParseHex(hex); |
|
|
|
|
return CScript(data.begin(), data.end()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(script_FindAndDelete) |
|
|
|
|
{ |
|
|
|
|
// Exercise the FindAndDelete functionality
|
|
|
|
|
CScript s; |
|
|
|
|
CScript d; |
|
|
|
|
CScript expect; |
|
|
|
|
|
|
|
|
|
s = CScript() << OP_1 << OP_2; |
|
|
|
|
d = CScript(); // delete nothing should be a no-op
|
|
|
|
|
expect = s; |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = CScript() << OP_1 << OP_2 << OP_3; |
|
|
|
|
d = CScript() << OP_2; |
|
|
|
|
expect = CScript() << OP_1 << OP_3; |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = CScript() << OP_3 << OP_1 << OP_3 << OP_3 << OP_4 << OP_3; |
|
|
|
|
d = CScript() << OP_3; |
|
|
|
|
expect = CScript() << OP_1 << OP_4; |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 4); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0302ff03"); // PUSH 0x02ff03 onto stack
|
|
|
|
|
d = ScriptFromHex("0302ff03"); |
|
|
|
|
expect = CScript(); |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0302ff030302ff03"); // PUSH 0x2ff03 PUSH 0x2ff03
|
|
|
|
|
d = ScriptFromHex("0302ff03"); |
|
|
|
|
expect = CScript(); |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0302ff030302ff03"); |
|
|
|
|
d = ScriptFromHex("02"); |
|
|
|
|
expect = s; // FindAndDelete matches entire opcodes
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0302ff030302ff03"); |
|
|
|
|
d = ScriptFromHex("ff"); |
|
|
|
|
expect = s; |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
// This is an odd edge case: strip of the push-three-bytes
|
|
|
|
|
// prefix, leaving 02ff03 which is push-two-bytes:
|
|
|
|
|
s = ScriptFromHex("0302ff030302ff03"); |
|
|
|
|
d = ScriptFromHex("03"); |
|
|
|
|
expect = CScript() << ParseHex("ff03") << ParseHex("ff03"); |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
// Byte sequence that spans multiple opcodes:
|
|
|
|
|
s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
|
|
|
|
|
d = ScriptFromHex("feed51"); |
|
|
|
|
expect = s; |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); // doesn't match 'inside' opcodes
|
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
|
|
|
|
|
d = ScriptFromHex("02feed51"); |
|
|
|
|
expect = ScriptFromHex("69"); |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("516902feed5169"); |
|
|
|
|
d = ScriptFromHex("feed51"); |
|
|
|
|
expect = s; |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("516902feed5169"); |
|
|
|
|
d = ScriptFromHex("02feed51"); |
|
|
|
|
expect = ScriptFromHex("516969"); |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = CScript() << OP_0 << OP_0 << OP_1 << OP_1; |
|
|
|
|
d = CScript() << OP_0 << OP_1; |
|
|
|
|
expect = CScript() << OP_0 << OP_1; // FindAndDelete is single-pass
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = CScript() << OP_0 << OP_0 << OP_1 << OP_0 << OP_1 << OP_1; |
|
|
|
|
d = CScript() << OP_0 << OP_1; |
|
|
|
|
expect = CScript() << OP_0 << OP_1; // FindAndDelete is single-pass
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
// Another weird edge case:
|
|
|
|
|
// End with invalid push (not enough data)...
|
|
|
|
|
s = ScriptFromHex("0003feed"); |
|
|
|
|
d = ScriptFromHex("03feed"); // ... can remove the invalid push
|
|
|
|
|
expect = ScriptFromHex("00"); |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0003feed"); |
|
|
|
|
d = ScriptFromHex("00"); |
|
|
|
|
expect = ScriptFromHex("03feed"); |
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); |
|
|
|
|
BOOST_CHECK(s == expect); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|
|
|