Bitcoin Core 28.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
script_standard_tests.cpp
Go to the documentation of this file.
1// Copyright (c) 2017-2022 The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
6
7#include <key.h>
8#include <key_io.h>
9#include <script/script.h>
11#include <script/solver.h>
13#include <util/strencodings.h>
14
15#include <boost/test/unit_test.hpp>
16
17#include <univalue.h>
18
19
20BOOST_FIXTURE_TEST_SUITE(script_standard_tests, BasicTestingSetup)
21
22BOOST_AUTO_TEST_CASE(dest_default_is_no_dest)
23{
24 CTxDestination dest;
26}
27
28BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
29{
30 CKey keys[3];
31 CPubKey pubkeys[3];
32 for (int i = 0; i < 3; i++) {
33 keys[i].MakeNewKey(true);
34 pubkeys[i] = keys[i].GetPubKey();
35 }
36
37 CScript s;
38 std::vector<std::vector<unsigned char> > solutions;
39
40 // TxoutType::PUBKEY
41 s.clear();
42 s << ToByteVector(pubkeys[0]) << OP_CHECKSIG;
44 BOOST_CHECK_EQUAL(solutions.size(), 1U);
45 BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0]));
46
47 // TxoutType::PUBKEYHASH
48 s.clear();
49 s << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
51 BOOST_CHECK_EQUAL(solutions.size(), 1U);
52 BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0].GetID()));
53
54 // TxoutType::SCRIPTHASH
55 CScript redeemScript(s); // initialize with leftover P2PKH script
56 s.clear();
57 s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
59 BOOST_CHECK_EQUAL(solutions.size(), 1U);
60 BOOST_CHECK(solutions[0] == ToByteVector(CScriptID(redeemScript)));
61
62 // TxoutType::MULTISIG
63 s.clear();
64 s << OP_1 <<
65 ToByteVector(pubkeys[0]) <<
66 ToByteVector(pubkeys[1]) <<
69 BOOST_CHECK_EQUAL(solutions.size(), 4U);
70 BOOST_CHECK(solutions[0] == std::vector<unsigned char>({1}));
71 BOOST_CHECK(solutions[1] == ToByteVector(pubkeys[0]));
72 BOOST_CHECK(solutions[2] == ToByteVector(pubkeys[1]));
73 BOOST_CHECK(solutions[3] == std::vector<unsigned char>({2}));
74
75 s.clear();
76 s << OP_2 <<
77 ToByteVector(pubkeys[0]) <<
78 ToByteVector(pubkeys[1]) <<
79 ToByteVector(pubkeys[2]) <<
82 BOOST_CHECK_EQUAL(solutions.size(), 5U);
83 BOOST_CHECK(solutions[0] == std::vector<unsigned char>({2}));
84 BOOST_CHECK(solutions[1] == ToByteVector(pubkeys[0]));
85 BOOST_CHECK(solutions[2] == ToByteVector(pubkeys[1]));
86 BOOST_CHECK(solutions[3] == ToByteVector(pubkeys[2]));
87 BOOST_CHECK(solutions[4] == std::vector<unsigned char>({3}));
88
89 // TxoutType::NULL_DATA
90 s.clear();
91 s << OP_RETURN <<
92 std::vector<unsigned char>({0}) <<
93 std::vector<unsigned char>({75}) <<
94 std::vector<unsigned char>({255});
96 BOOST_CHECK_EQUAL(solutions.size(), 0U);
97
98 // TxoutType::WITNESS_V0_KEYHASH
99 s.clear();
100 s << OP_0 << ToByteVector(pubkeys[0].GetID());
102 BOOST_CHECK_EQUAL(solutions.size(), 1U);
103 BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0].GetID()));
104
105 // TxoutType::WITNESS_V0_SCRIPTHASH
106 uint256 scriptHash;
107 CSHA256().Write(redeemScript.data(), redeemScript.size())
108 .Finalize(scriptHash.begin());
109
110 s.clear();
111 s << OP_0 << ToByteVector(scriptHash);
113 BOOST_CHECK_EQUAL(solutions.size(), 1U);
114 BOOST_CHECK(solutions[0] == ToByteVector(scriptHash));
115
116 // TxoutType::WITNESS_V1_TAPROOT
117 s.clear();
120 BOOST_CHECK_EQUAL(solutions.size(), 1U);
121 BOOST_CHECK(solutions[0] == ToByteVector(uint256::ZERO));
122
123 // TxoutType::WITNESS_UNKNOWN
124 s.clear();
127 BOOST_CHECK_EQUAL(solutions.size(), 2U);
128 BOOST_CHECK(solutions[0] == std::vector<unsigned char>{16});
129 BOOST_CHECK(solutions[1] == ToByteVector(uint256::ONE));
130
131 // TxoutType::ANCHOR
132 std::vector<unsigned char> anchor_bytes{0x4e, 0x73};
133 s.clear();
134 s << OP_1 << anchor_bytes;
136 BOOST_CHECK(solutions.empty());
137
138 // Sanity-check IsPayToAnchor
139 int version{-1};
140 std::vector<unsigned char> witness_program;
142 BOOST_CHECK(s.IsWitnessProgram(version, witness_program));
143 BOOST_CHECK(CScript::IsPayToAnchor(version, witness_program));
144
145 // TxoutType::NONSTANDARD
146 s.clear();
147 s << OP_9 << OP_ADD << OP_11 << OP_EQUAL;
149}
150
151BOOST_AUTO_TEST_CASE(script_standard_Solver_failure)
152{
153 CKey key = GenerateRandomKey();
154 CPubKey pubkey = key.GetPubKey();
155
156 CScript s;
157 std::vector<std::vector<unsigned char> > solutions;
158
159 // TxoutType::PUBKEY with incorrectly sized pubkey
160 s.clear();
161 s << std::vector<unsigned char>(30, 0x01) << OP_CHECKSIG;
163
164 // TxoutType::PUBKEYHASH with incorrectly sized key hash
165 s.clear();
168
169 // TxoutType::SCRIPTHASH with incorrectly sized script hash
170 s.clear();
171 s << OP_HASH160 << std::vector<unsigned char>(21, 0x01) << OP_EQUAL;
173
174 // TxoutType::MULTISIG 0/2
175 s.clear();
176 s << OP_0 << ToByteVector(pubkey) << OP_1 << OP_CHECKMULTISIG;
178
179 // TxoutType::MULTISIG 2/1
180 s.clear();
181 s << OP_2 << ToByteVector(pubkey) << OP_1 << OP_CHECKMULTISIG;
183
184 // TxoutType::MULTISIG n = 2 with 1 pubkey
185 s.clear();
186 s << OP_1 << ToByteVector(pubkey) << OP_2 << OP_CHECKMULTISIG;
188
189 // TxoutType::MULTISIG n = 1 with 0 pubkeys
190 s.clear();
191 s << OP_1 << OP_1 << OP_CHECKMULTISIG;
193
194 // TxoutType::NULL_DATA with other opcodes
195 s.clear();
196 s << OP_RETURN << std::vector<unsigned char>({75}) << OP_ADD;
198
199 // TxoutType::WITNESS_UNKNOWN with incorrect program size
200 s.clear();
201 s << OP_0 << std::vector<unsigned char>(19, 0x01);
203
204 // TxoutType::ANCHOR but wrong witness version
205 s.clear();
206 s << OP_2 << std::vector<unsigned char>{0x4e, 0x73};
209
210 // TxoutType::ANCHOR but wrong 2-byte data push
211 s.clear();
212 s << OP_1 << std::vector<unsigned char>{0xff, 0xff};
215}
216
217BOOST_AUTO_TEST_CASE(script_standard_ExtractDestination)
218{
219 CKey key = GenerateRandomKey();
220 CPubKey pubkey = key.GetPubKey();
221
222 CScript s;
223 CTxDestination address;
224
225 // TxoutType::PUBKEY
226 s.clear();
227 s << ToByteVector(pubkey) << OP_CHECKSIG;
228 BOOST_CHECK(!ExtractDestination(s, address));
229 BOOST_CHECK(std::get<PubKeyDestination>(address) == PubKeyDestination(pubkey));
230
231 // TxoutType::PUBKEYHASH
232 s.clear();
234 BOOST_CHECK(ExtractDestination(s, address));
235 BOOST_CHECK(std::get<PKHash>(address) == PKHash(pubkey));
236
237 // TxoutType::SCRIPTHASH
238 CScript redeemScript(s); // initialize with leftover P2PKH script
239 s.clear();
240 s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
241 BOOST_CHECK(ExtractDestination(s, address));
242 BOOST_CHECK(std::get<ScriptHash>(address) == ScriptHash(redeemScript));
243
244 // TxoutType::MULTISIG
245 s.clear();
246 s << OP_1 << ToByteVector(pubkey) << OP_1 << OP_CHECKMULTISIG;
247 BOOST_CHECK(!ExtractDestination(s, address));
248
249 // TxoutType::NULL_DATA
250 s.clear();
251 s << OP_RETURN << std::vector<unsigned char>({75});
252 BOOST_CHECK(!ExtractDestination(s, address));
253
254 // TxoutType::WITNESS_V0_KEYHASH
255 s.clear();
256 s << OP_0 << ToByteVector(pubkey.GetID());
257 BOOST_CHECK(ExtractDestination(s, address));
258 WitnessV0KeyHash keyhash;
259 CHash160().Write(pubkey).Finalize(keyhash);
260 BOOST_CHECK(std::get<WitnessV0KeyHash>(address) == keyhash);
261
262 // TxoutType::WITNESS_V0_SCRIPTHASH
263 s.clear();
264 WitnessV0ScriptHash scripthash;
265 CSHA256().Write(redeemScript.data(), redeemScript.size()).Finalize(scripthash.begin());
266 s << OP_0 << ToByteVector(scripthash);
267 BOOST_CHECK(ExtractDestination(s, address));
268 BOOST_CHECK(std::get<WitnessV0ScriptHash>(address) == scripthash);
269
270 // TxoutType::WITNESS_UNKNOWN with unknown version
271 s.clear();
272 s << OP_1 << ToByteVector(pubkey);
273 BOOST_CHECK(ExtractDestination(s, address));
274 WitnessUnknown unk{1, ToByteVector(pubkey)};
275 BOOST_CHECK(std::get<WitnessUnknown>(address) == unk);
276}
277
278BOOST_AUTO_TEST_CASE(script_standard_GetScriptFor_)
279{
280 CKey keys[3];
281 CPubKey pubkeys[3];
282 for (int i = 0; i < 3; i++) {
283 keys[i].MakeNewKey(true);
284 pubkeys[i] = keys[i].GetPubKey();
285 }
286
287 CScript expected, result;
288
289 // PKHash
290 expected.clear();
291 expected << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
292 result = GetScriptForDestination(PKHash(pubkeys[0]));
293 BOOST_CHECK(result == expected);
294
295 // CScriptID
296 CScript redeemScript(result);
297 expected.clear();
298 expected << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
299 result = GetScriptForDestination(ScriptHash(redeemScript));
300 BOOST_CHECK(result == expected);
301
302 // CNoDestination
303 expected.clear();
305 BOOST_CHECK(result == expected);
306
307 // GetScriptForRawPubKey
308 expected.clear();
309 expected << ToByteVector(pubkeys[0]) << OP_CHECKSIG;
310 result = GetScriptForRawPubKey(pubkeys[0]);
311 BOOST_CHECK(result == expected);
312
313 // GetScriptForMultisig
314 expected.clear();
315 expected << OP_2 <<
316 ToByteVector(pubkeys[0]) <<
317 ToByteVector(pubkeys[1]) <<
318 ToByteVector(pubkeys[2]) <<
320 result = GetScriptForMultisig(2, std::vector<CPubKey>(pubkeys, pubkeys + 3));
321 BOOST_CHECK(result == expected);
322
323 // WitnessV0KeyHash
324 expected.clear();
325 expected << OP_0 << ToByteVector(pubkeys[0].GetID());
327 BOOST_CHECK(result == expected);
328 result = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0].GetID()));
329 BOOST_CHECK(result == expected);
330
331 // WitnessV0ScriptHash (multisig)
332 CScript witnessScript;
333 witnessScript << OP_1 << ToByteVector(pubkeys[0]) << OP_1 << OP_CHECKMULTISIG;
334
335 uint256 scriptHash;
336 CSHA256().Write(witnessScript.data(), witnessScript.size())
337 .Finalize(scriptHash.begin());
338
339 expected.clear();
340 expected << OP_0 << ToByteVector(scriptHash);
341 result = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
342 BOOST_CHECK(result == expected);
343}
344
345BOOST_AUTO_TEST_CASE(script_standard_taproot_builder)
346{
387 BOOST_CHECK_EQUAL(TaprootBuilder::ValidDepths({2,2,2,3,4,5,6,7,8,9,10,11,12,14,14,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,31,31,31,31,31,31,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,128}), true);
388 BOOST_CHECK_EQUAL(TaprootBuilder::ValidDepths({128,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}), true);
389 BOOST_CHECK_EQUAL(TaprootBuilder::ValidDepths({129,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}), false);
390
391 XOnlyPubKey key_inner{ParseHex("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798")};
392 XOnlyPubKey key_1{ParseHex("c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5")};
393 XOnlyPubKey key_2{ParseHex("f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9")};
394 CScript script_1 = CScript() << ToByteVector(key_1) << OP_CHECKSIG;
395 CScript script_2 = CScript() << ToByteVector(key_2) << OP_CHECKSIG;
396 constexpr uint256 hash_3{"31fe7061656bea2a36aa60a2f7ef940578049273746935d296426dc0afd86b68"};
397
398 TaprootBuilder builder;
399 BOOST_CHECK(builder.IsValid() && builder.IsComplete());
400 builder.Add(2, script_2, 0xc0);
401 BOOST_CHECK(builder.IsValid() && !builder.IsComplete());
402 builder.AddOmitted(2, hash_3);
403 BOOST_CHECK(builder.IsValid() && !builder.IsComplete());
404 builder.Add(1, script_1, 0xc0);
405 BOOST_CHECK(builder.IsValid() && builder.IsComplete());
406 builder.Finalize(key_inner);
407 BOOST_CHECK(builder.IsValid() && builder.IsComplete());
408 BOOST_CHECK_EQUAL(EncodeDestination(builder.GetOutput()), "bc1pj6gaw944fy0xpmzzu45ugqde4rz7mqj5kj0tg8kmr5f0pjq8vnaqgynnge");
409}
410
411BOOST_AUTO_TEST_CASE(bip341_spk_test_vectors)
412{
413 using control_set = decltype(TaprootSpendData::scripts)::mapped_type;
414
415 UniValue tests;
417
418 const auto& vectors = tests["scriptPubKey"];
419
420 for (const auto& vec : vectors.getValues()) {
421 TaprootBuilder spktest;
422 std::map<std::pair<std::vector<unsigned char>, int>, int> scriptposes;
423 std::function<void (const UniValue&, int)> parse_tree = [&](const UniValue& node, int depth) {
424 if (node.isNull()) return;
425 if (node.isObject()) {
426 auto script = ParseHex(node["script"].get_str());
427 int idx = node["id"].getInt<int>();
428 int leaf_version = node["leafVersion"].getInt<int>();
429 scriptposes[{script, leaf_version}] = idx;
430 spktest.Add(depth, script, leaf_version);
431 } else {
432 parse_tree(node[0], depth + 1);
433 parse_tree(node[1], depth + 1);
434 }
435 };
436 parse_tree(vec["given"]["scriptTree"], 0);
437 spktest.Finalize(XOnlyPubKey(ParseHex(vec["given"]["internalPubkey"].get_str())));
438 BOOST_CHECK_EQUAL(HexStr(GetScriptForDestination(spktest.GetOutput())), vec["expected"]["scriptPubKey"].get_str());
439 BOOST_CHECK_EQUAL(EncodeDestination(spktest.GetOutput()), vec["expected"]["bip350Address"].get_str());
440 auto spend_data = spktest.GetSpendData();
441 BOOST_CHECK_EQUAL(vec["intermediary"]["merkleRoot"].isNull(), spend_data.merkle_root.IsNull());
442 if (!spend_data.merkle_root.IsNull()) {
443 BOOST_CHECK_EQUAL(vec["intermediary"]["merkleRoot"].get_str(), HexStr(spend_data.merkle_root));
444 }
445 BOOST_CHECK_EQUAL(spend_data.scripts.size(), scriptposes.size());
446 for (const auto& scriptpos : scriptposes) {
447 BOOST_CHECK(spend_data.scripts[scriptpos.first] == control_set{ParseHex(vec["expected"]["scriptPathControlBlocks"][scriptpos.second].get_str())});
448 }
449 }
450}
451
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
unsigned char * begin()
Definition hash_type.h:18
A hasher class for Bitcoin's 160-bit hash (SHA-256 + RIPEMD-160).
Definition hash.h:49
void Finalize(Span< unsigned char > output)
Definition hash.h:55
CHash160 & Write(Span< const unsigned char > input)
Definition hash.h:62
An encapsulated private key.
Definition key.h:35
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
Definition key.cpp:161
CPubKey GetPubKey() const
Compute the public key from a private key.
Definition key.cpp:182
An encapsulated public key.
Definition pubkey.h:34
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Definition pubkey.h:164
A hasher class for SHA-256.
Definition sha256.h:14
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition sha256.cpp:727
CSHA256 & Write(const unsigned char *data, size_t len)
Definition sha256.cpp:701
Serialized script, used inside transaction inputs and outputs.
Definition script.h:414
void clear()
Definition script.h:565
bool IsPayToAnchor() const
Definition script.cpp:207
bool IsWitnessProgram(int &version, std::vector< unsigned char > &program) const
Definition script.cpp:243
A reference to a CScript: the Hash160 of its serialization.
Definition script.h:591
Utility class to construct Taproot outputs from internal key and script tree.
WitnessV1Taproot GetOutput()
Compute scriptPubKey (after Finalize()).
TaprootSpendData GetSpendData() const
Compute spending data (after Finalize()).
bool IsComplete() const
Return whether there were either no leaves, or the leaves form a Huffman tree.
static bool ValidDepths(const std::vector< int > &depths)
Check if a list of depths is legal (will lead to IsComplete()).
bool IsValid() const
Return true if so far all input was valid.
TaprootBuilder & Add(int depth, Span< const unsigned char > script, int leaf_version, bool track=true)
Add a new script at a certain depth in the tree.
TaprootBuilder & AddOmitted(int depth, const uint256 &hash)
Like Add(), but for a Merkle node with a given hash to the tree.
TaprootBuilder & Finalize(const XOnlyPubKey &internal_key)
Finalize the construction.
bool read(std::string_view raw)
constexpr unsigned char * begin()
Definition uint256.h:102
size_type size() const
Definition prevector.h:296
value_type * data()
Definition prevector.h:532
256-bit opaque blob.
Definition uint256.h:178
static const uint256 ONE
Definition uint256.h:186
static const uint256 ZERO
Definition uint256.h:185
BOOST_AUTO_TEST_SUITE_END()
uint160 Hash160(const T1 &in1)
Compute the 160-bit hash an object.
Definition hash.h:92
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
Definition hex_base.cpp:29
CKey GenerateRandomKey(bool compressed) noexcept
Definition key.cpp:352
std::string EncodeDestination(const CTxDestination &dest)
Definition key_io.cpp:291
static const std::string bip341_wallet_vectors
#define BOOST_CHECK_EQUAL(v1, v2)
Definition object.cpp:18
#define BOOST_CHECK(expr)
Definition object.cpp:17
@ OP_2
Definition script.h:84
@ OP_CHECKMULTISIG
Definition script.h:191
@ OP_CHECKSIG
Definition script.h:189
@ OP_16
Definition script.h:98
@ OP_EQUAL
Definition script.h:145
@ OP_DUP
Definition script.h:124
@ OP_HASH160
Definition script.h:186
@ OP_1
Definition script.h:82
@ OP_ADD
Definition script.h:160
@ OP_9
Definition script.h:91
@ OP_3
Definition script.h:85
@ OP_11
Definition script.h:93
@ OP_0
Definition script.h:75
@ OP_RETURN
Definition script.h:110
@ OP_EQUALVERIFY
Definition script.h:146
std::vector< unsigned char > ToByteVector(const T &in)
Definition script.h:66
BOOST_AUTO_TEST_CASE(dest_default_is_no_dest)
TxoutType Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char > > &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
Definition solver.cpp:141
CScript GetScriptForMultisig(int nRequired, const std::vector< CPubKey > &keys)
Generate a multisig script.
Definition solver.cpp:218
CScript GetScriptForRawPubKey(const CPubKey &pubKey)
Generate a P2PK script for the given pubkey.
Definition solver.cpp:213
@ WITNESS_V1_TAPROOT
@ WITNESS_UNKNOWN
Only for Witness versions not already defined above.
@ ANCHOR
anyone can spend script
@ WITNESS_V0_SCRIPTHASH
@ NULL_DATA
unspendable OP_RETURN script that carries data
@ WITNESS_V0_KEYHASH
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
Basic testing setup.
std::map< std::pair< std::vector< unsigned char >, int >, std::set< std::vector< unsigned char >, ShortestVectorFirstComparator > > scripts
Map from (script, leaf_version) to (sets of) control blocks.
CTxDestination subtype to encode any future Witness version.
Definition addresstype.h:96