From 41f2f058d0bb036aafa81a939ee331fba42e22a8 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Thu, 21 Nov 2024 15:01:43 +0100 Subject: [PATCH 1/2] test: add missing segwitv1 test cases to `script_standard_tests` --- src/test/script_standard_tests.cpp | 49 ++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/test/script_standard_tests.cpp b/src/test/script_standard_tests.cpp index e9ce82ca8a6..5db66d512bd 100644 --- a/src/test/script_standard_tests.cpp +++ b/src/test/script_standard_tests.cpp @@ -197,11 +197,19 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_failure) s << OP_RETURN << std::vector({75}) << OP_ADD; BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::NONSTANDARD); - // TxoutType::WITNESS_UNKNOWN with incorrect program size + // TxoutType::WITNESS_V0_{KEY,SCRIPT}HASH with incorrect program size (-> consensus-invalid, i.e. non-standard) s.clear(); s << OP_0 << std::vector(19, 0x01); BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::NONSTANDARD); + // TxoutType::WITNESS_V1_TAPROOT with incorrect program size (-> undefined, but still policy-valid) + s.clear(); + s << OP_1 << std::vector(31, 0x01); + BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::WITNESS_UNKNOWN); + s.clear(); + s << OP_1 << std::vector(33, 0x01); + BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::WITNESS_UNKNOWN); + // TxoutType::ANCHOR but wrong witness version s.clear(); s << OP_2 << std::vector{0x4e, 0x73}; @@ -268,12 +276,33 @@ BOOST_AUTO_TEST_CASE(script_standard_ExtractDestination) BOOST_CHECK(ExtractDestination(s, address)); BOOST_CHECK(std::get(address) == scripthash); + // TxoutType::WITNESS_V1_TAPROOT + s.clear(); + auto xpk = XOnlyPubKey(pubkey); + s << OP_1 << ToByteVector(xpk); + BOOST_CHECK(ExtractDestination(s, address)); + BOOST_CHECK(std::get(address) == WitnessV1Taproot(xpk)); + + // TxoutType::ANCHOR + std::vector anchor_bytes{0x4e, 0x73}; + s.clear(); + s << OP_1 << anchor_bytes; + BOOST_CHECK(ExtractDestination(s, address)); + BOOST_CHECK(std::get(address) == PayToAnchor()); + // TxoutType::WITNESS_UNKNOWN with unknown version + // -> segwit version 1 with an undefined program size (33 bytes in this test case) s.clear(); s << OP_1 << ToByteVector(pubkey); BOOST_CHECK(ExtractDestination(s, address)); - WitnessUnknown unk{1, ToByteVector(pubkey)}; - BOOST_CHECK(std::get(address) == unk); + WitnessUnknown unk_v1{1, ToByteVector(pubkey)}; + BOOST_CHECK(std::get(address) == unk_v1); + s.clear(); + // -> segwit versions 2+ are not specified yet + s << OP_2 << ToByteVector(xpk); + BOOST_CHECK(ExtractDestination(s, address)); + WitnessUnknown unk_v2{2, ToByteVector(xpk)}; + BOOST_CHECK(std::get(address) == unk_v2); } BOOST_AUTO_TEST_CASE(script_standard_GetScriptFor_) @@ -341,6 +370,20 @@ BOOST_AUTO_TEST_CASE(script_standard_GetScriptFor_) expected << OP_0 << ToByteVector(scriptHash); result = GetScriptForDestination(WitnessV0ScriptHash(witnessScript)); BOOST_CHECK(result == expected); + + // WitnessV1Taproot + auto xpk = XOnlyPubKey(pubkeys[0]); + expected.clear(); + expected << OP_1 << ToByteVector(xpk); + result = GetScriptForDestination(WitnessV1Taproot(xpk)); + BOOST_CHECK(result == expected); + + // PayToAnchor + std::vector anchor_bytes{0x4e, 0x73}; + expected.clear(); + expected << OP_1 << anchor_bytes; + result = GetScriptForDestination(PayToAnchor()); + BOOST_CHECK(result == expected); } BOOST_AUTO_TEST_CASE(script_standard_taproot_builder) From 8284229a28c09c585356dcf7e4bddbc8f2a23755 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Thu, 21 Nov 2024 16:04:56 +0100 Subject: [PATCH 2/2] refactor: deduplicate anchor witness program bytes (`0x4e,0x73`) Co-authored-by: Gregory Sanders --- src/addresstype.h | 7 +++++-- src/test/script_standard_tests.cpp | 12 +++++------- src/test/transaction_tests.cpp | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/addresstype.h b/src/addresstype.h index 93cdf66c5b1..78d3126d853 100644 --- a/src/addresstype.h +++ b/src/addresstype.h @@ -117,10 +117,13 @@ public: } }; +/** Witness program for Pay-to-Anchor output script type */ +static const std::vector ANCHOR_BYTES{0x4e, 0x73}; + struct PayToAnchor : public WitnessUnknown { - PayToAnchor() : WitnessUnknown(1, {0x4e, 0x73}) { - Assume(CScript::IsPayToAnchor(1, {0x4e, 0x73})); + PayToAnchor() : WitnessUnknown(1, ANCHOR_BYTES) { + Assume(CScript::IsPayToAnchor(1, ANCHOR_BYTES)); }; }; diff --git a/src/test/script_standard_tests.cpp b/src/test/script_standard_tests.cpp index 5db66d512bd..9a63426e7d7 100644 --- a/src/test/script_standard_tests.cpp +++ b/src/test/script_standard_tests.cpp @@ -4,6 +4,7 @@ #include +#include #include #include #include