mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-15 12:51:00 +02:00
Merge b52d547361 into merged_master (Bitcoin PR bitcoin/bitcoin#30377)
This commit is contained in:
commit
b72efc9f34
31 changed files with 480 additions and 360 deletions
|
|
@ -38,6 +38,8 @@ using namespace std;
|
|||
// Uncomment if you want to output updated JSON tests.
|
||||
// #define UPDATE_JSON_TESTS
|
||||
|
||||
using namespace util::hex_literals;
|
||||
|
||||
static const unsigned int gFlags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC;
|
||||
|
||||
unsigned int ParseScriptFlags(std::string strFlags);
|
||||
|
|
@ -1305,7 +1307,7 @@ BOOST_AUTO_TEST_CASE(sign_invalid_miniscript)
|
|||
|
||||
// Create a Taproot output which contains a leaf in which a non-32 bytes push is used where a public key is expected
|
||||
// by the Miniscript parser. This offending Script was found by the RPC fuzzer.
|
||||
const auto invalid_pubkey{ParseHex("173d36c8c9c9c9ffffffffffff0200000000021e1e37373721361818181818181e1e1e1e19000000000000000000b19292929292926b006c9b9b9292")};
|
||||
const auto invalid_pubkey{"173d36c8c9c9c9ffffffffffff0200000000021e1e37373721361818181818181e1e1e1e19000000000000000000b19292929292926b006c9b9b9292"_hex_u8};
|
||||
TaprootBuilder builder;
|
||||
builder.Add(0, {invalid_pubkey}, 0xc0);
|
||||
builder.Finalize(XOnlyPubKey::NUMS_H);
|
||||
|
|
@ -1392,10 +1394,16 @@ BOOST_AUTO_TEST_CASE(script_GetScriptAsm)
|
|||
BOOST_CHECK_EQUAL(derSig + "83 " + pubKey, ScriptToAsmStr(CScript() << ToByteVector(ParseHex(derSig + "83")) << vchPubKey));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
CScript ToScript(const T& byte_container)
|
||||
{
|
||||
auto span{MakeUCharSpan(byte_container)};
|
||||
return {span.begin(), span.end()};
|
||||
}
|
||||
|
||||
static CScript ScriptFromHex(const std::string& str)
|
||||
{
|
||||
std::vector<unsigned char> data = ParseHex(str);
|
||||
return CScript(data.begin(), data.end());
|
||||
return ToScript(*Assert(TryParseHex(str)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(script_FindAndDelete)
|
||||
|
|
@ -1423,60 +1431,60 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
|
|||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 4);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
s = ScriptFromHex("0302ff03"); // PUSH 0x02ff03 onto stack
|
||||
d = ScriptFromHex("0302ff03");
|
||||
s = ToScript("0302ff03"_hex); // PUSH 0x02ff03 onto stack
|
||||
d = ToScript("0302ff03"_hex);
|
||||
expect = CScript();
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
s = ScriptFromHex("0302ff030302ff03"); // PUSH 0x2ff03 PUSH 0x2ff03
|
||||
d = ScriptFromHex("0302ff03");
|
||||
s = ToScript("0302ff030302ff03"_hex); // PUSH 0x02ff03 PUSH 0x02ff03
|
||||
d = ToScript("0302ff03"_hex);
|
||||
expect = CScript();
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
s = ScriptFromHex("0302ff030302ff03");
|
||||
d = ScriptFromHex("02");
|
||||
s = ToScript("0302ff030302ff03"_hex);
|
||||
d = ToScript("02"_hex);
|
||||
expect = s; // FindAndDelete matches entire opcodes
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
s = ScriptFromHex("0302ff030302ff03");
|
||||
d = ScriptFromHex("ff");
|
||||
s = ToScript("0302ff030302ff03"_hex);
|
||||
d = ToScript("ff"_hex);
|
||||
expect = s;
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, 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");
|
||||
s = ToScript("0302ff030302ff03"_hex);
|
||||
d = ToScript("03"_hex);
|
||||
expect = CScript() << "ff03"_hex_v_u8 << "ff03"_hex_v_u8;
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
// Byte sequence that spans multiple opcodes:
|
||||
s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
|
||||
d = ScriptFromHex("feed51");
|
||||
s = ToScript("02feed5169"_hex); // PUSH(0xfeed) OP_1 OP_VERIFY
|
||||
d = ToScript("feed51"_hex);
|
||||
expect = s;
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, 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");
|
||||
s = ToScript("02feed5169"_hex); // PUSH(0xfeed) OP_1 OP_VERIFY
|
||||
d = ToScript("02feed51"_hex);
|
||||
expect = ToScript("69"_hex);
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
s = ScriptFromHex("516902feed5169");
|
||||
d = ScriptFromHex("feed51");
|
||||
s = ToScript("516902feed5169"_hex);
|
||||
d = ToScript("feed51"_hex);
|
||||
expect = s;
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
s = ScriptFromHex("516902feed5169");
|
||||
d = ScriptFromHex("02feed51");
|
||||
expect = ScriptFromHex("516969");
|
||||
s = ToScript("516902feed5169"_hex);
|
||||
d = ToScript("02feed51"_hex);
|
||||
expect = ToScript("516969"_hex);
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
|
|
@ -1494,15 +1502,15 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
|
|||
|
||||
// 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");
|
||||
s = ToScript("0003feed"_hex);
|
||||
d = ToScript("03feed"_hex); // ... can remove the invalid push
|
||||
expect = ToScript("00"_hex);
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
||||
BOOST_CHECK(s == expect);
|
||||
|
||||
s = ScriptFromHex("0003feed");
|
||||
d = ScriptFromHex("00");
|
||||
expect = ScriptFromHex("03feed");
|
||||
s = ToScript("0003feed"_hex);
|
||||
d = ToScript("00"_hex);
|
||||
expect = ToScript("03feed"_hex);
|
||||
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
||||
BOOST_CHECK(s == expect);
|
||||
}
|
||||
|
|
@ -1511,13 +1519,13 @@ BOOST_AUTO_TEST_CASE(script_HasValidOps)
|
|||
{
|
||||
// Exercise the HasValidOps functionality
|
||||
CScript script;
|
||||
script = ScriptFromHex("76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"); // Normal script
|
||||
script = ToScript("76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"_hex); // Normal script
|
||||
BOOST_CHECK(script.HasValidOps());
|
||||
script = ScriptFromHex("76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac");
|
||||
script = ToScript("76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"_hex);
|
||||
BOOST_CHECK(script.HasValidOps());
|
||||
script = ScriptFromHex("ff88ac"); // Script with OP_INVALIDOPCODE explicit
|
||||
script = ToScript("ff88ac"_hex); // Script with OP_INVALIDOPCODE explicit
|
||||
BOOST_CHECK(!script.HasValidOps());
|
||||
script = ScriptFromHex("88ace5"); // Script with undefined opcode: one higher then MAX_OPCODE
|
||||
script = ToScript("88ace5"_hex); // Script with undefined opcode: one higher then MAX_OPCODE
|
||||
BOOST_CHECK(!script.HasValidOps());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue