5 #include <test/data/bip341_wallet_vectors.json.h>
15 #include <boost/test/unit_test.hpp>
32 for (
int i = 0; i < 3; i++) {
38 std::vector<std::vector<unsigned char> > solutions;
70 BOOST_CHECK(solutions[0] == std::vector<unsigned char>({1}));
73 BOOST_CHECK(solutions[3] == std::vector<unsigned char>({2}));
83 BOOST_CHECK(solutions[0] == std::vector<unsigned char>({2}));
87 BOOST_CHECK(solutions[4] == std::vector<unsigned char>({3}));
92 std::vector<unsigned char>({0}) <<
93 std::vector<unsigned char>({75}) <<
94 std::vector<unsigned char>({255});
128 BOOST_CHECK(solutions[0] == std::vector<unsigned char>{16});
145 std::vector<std::vector<unsigned char> > solutions;
149 s << std::vector<unsigned char>(30, 0x01) <<
OP_CHECKSIG;
159 s << OP_HASH160 << std::vector<unsigned char>(21, 0x01) <<
OP_EQUAL;
184 s << OP_RETURN << std::vector<unsigned char>({75}) <<
OP_ADD;
189 s << OP_0 << std::vector<unsigned char>(19, 0x01);
229 s << OP_RETURN << std::vector<unsigned char>({75});
238 BOOST_CHECK(std::get<WitnessV0KeyHash>(address) == keyhash);
246 BOOST_CHECK(std::get<WitnessV0ScriptHash>(address) == scripthash);
256 BOOST_CHECK(std::get<WitnessUnknown>(address) == unk);
263 for (
int i = 0; i < 3; i++) {
368 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);
369 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);
370 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);
372 XOnlyPubKey key_inner{
ParseHex(
"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798")};
373 XOnlyPubKey key_1{
ParseHex(
"c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5")};
374 XOnlyPubKey key_2{
ParseHex(
"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9")};
377 uint256 hash_3 =
uint256S(
"31fe7061656bea2a36aa60a2f7ef940578049273746935d296426dc0afd86b68");
381 builder.
Add(2, script_2, 0xc0);
385 builder.
Add(1, script_1, 0xc0);
397 tests.
read((
const char*)json_tests::bip341_wallet_vectors,
sizeof(json_tests::bip341_wallet_vectors));
399 const auto& vectors = tests[
"scriptPubKey"];
401 for (
const auto& vec : vectors.getValues()) {
403 std::map<std::pair<std::vector<unsigned char>,
int>,
int> scriptposes;
405 if (
node.isNull())
return;
406 if (
node.isObject()) {
408 int idx =
node[
"id"].getInt<
int>();
409 int leaf_version =
node[
"leafVersion"].getInt<
int>();
410 scriptposes[{script, leaf_version}] = idx;
411 spktest.
Add(depth, script, leaf_version);
413 parse_tree(
node[0], depth + 1);
414 parse_tree(
node[1], depth + 1);
417 parse_tree(vec[
"given"][
"scriptTree"], 0);
422 BOOST_CHECK_EQUAL(vec[
"intermediary"][
"merkleRoot"].isNull(), spend_data.merkle_root.IsNull());
423 if (!spend_data.merkle_root.IsNull()) {
427 for (
const auto& scriptpos : scriptposes) {
428 BOOST_CHECK(spend_data.scripts[scriptpos.first] == control_set{ParseHex(vec[
"expected"][
"scriptPathControlBlocks"][scriptpos.second].get_str())});
A hasher class for Bitcoin's 160-bit hash (SHA-256 + RIPEMD-160).
void Finalize(Span< unsigned char > output)
CHash160 & Write(Span< const unsigned char > input)
An encapsulated private key.
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
CPubKey GetPubKey() const
Compute the public key from a private key.
An encapsulated public key.
const unsigned char * end() const
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
const unsigned char * begin() const
A hasher class for SHA-256.
void Finalize(unsigned char hash[OUTPUT_SIZE])
CSHA256 & Write(const unsigned char *data, size_t len)
Serialized script, used inside transaction inputs and outputs.
A reference to a CScript: the Hash160 of its serialization (see script.h)
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(const char *raw, size_t len)
static const uint256 ZERO
BOOST_AUTO_TEST_SUITE_END()
uint160 Hash160(const T1 &in1)
Compute the 160-bit hash an object.
std::string EncodeDestination(const CTxDestination &dest)
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
std::vector< unsigned char > ToByteVector(const T &in)
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.
CScript GetScriptForMultisig(int nRequired, const std::vector< CPubKey > &keys)
Generate a multisig script.
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a standard scriptPubKey for the destination address.
CScript GetScriptForRawPubKey(const CPubKey &pubKey)
Generate a P2PK script for the given pubkey.
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination is a CNoDestination.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
@ WITNESS_UNKNOWN
Only for Witness versions not already defined above.
@ NULL_DATA
unspendable OP_RETURN script that carries data
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
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.
unsigned char program[40]
uint256 uint256S(const char *str)
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
std::vector< Byte > ParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).