11#include <test/data/bip341_wallet_vectors.json.h>
18#include <boost/test/unit_test.hpp>
34 for (
int i = 0; i < 3; i++) {
35 keys[i].MakeNewKey(
true);
36 pubkeys[i] =
keys[i].GetPubKey();
40 std::vector<std::vector<unsigned char> > solutions;
72 BOOST_CHECK(solutions[0] == std::vector<unsigned char>({1}));
75 BOOST_CHECK(solutions[3] == std::vector<unsigned char>({2}));
85 BOOST_CHECK(solutions[0] == std::vector<unsigned char>({2}));
89 BOOST_CHECK(solutions[4] == std::vector<unsigned char>({3}));
94 std::vector<unsigned char>({0}) <<
95 std::vector<unsigned char>({75}) <<
96 std::vector<unsigned char>({255});
130 BOOST_CHECK(solutions[0] == std::vector<unsigned char>{16});
141 std::vector<unsigned char> witness_program;
143 BOOST_CHECK(
s.IsWitnessProgram(version, witness_program));
158 std::vector<std::vector<unsigned char> > solutions;
162 s << std::vector<unsigned char>(30, 0x01) <<
OP_CHECKSIG;
172 s << OP_HASH160 << std::vector<unsigned char>(21, 0x01) <<
OP_EQUAL;
197 s << OP_RETURN << std::vector<unsigned char>({75}) <<
OP_ADD;
202 s << OP_0 << std::vector<unsigned char>(19, 0x01);
207 s << OP_1 << std::vector<unsigned char>(31, 0x01);
210 s << OP_1 << std::vector<unsigned char>(33, 0x01);
221 s << OP_1 << std::vector<unsigned char>{0xff, 0xff};
260 s << OP_RETURN << std::vector<unsigned char>({75});
269 BOOST_CHECK(std::get<WitnessV0KeyHash>(address) == keyhash);
277 BOOST_CHECK(std::get<WitnessV0ScriptHash>(address) == scripthash);
298 BOOST_CHECK(std::get<WitnessUnknown>(address) == unk_v1);
304 BOOST_CHECK(std::get<WitnessUnknown>(address) == unk_v2);
311 for (
int i = 0; i < 3; i++) {
312 keys[i].MakeNewKey(
true);
313 pubkeys[i] =
keys[i].GetPubKey();
429 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);
430 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);
431 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);
433 XOnlyPubKey key_inner{
"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"_hex_u8};
434 XOnlyPubKey key_1{
"c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5"_hex_u8};
435 XOnlyPubKey key_2{
"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9"_hex_u8};
438 constexpr uint256 hash_3{
"31fe7061656bea2a36aa60a2f7ef940578049273746935d296426dc0afd86b68"};
443 builder.
Add(2, script_2, 0xc0);
449 builder.
Add(1, script_1, 0xc0);
463 Assert(
tests.read(json_tests::bip341_wallet_vectors));
465 const auto& vectors =
tests[
"scriptPubKey"];
467 for (
const auto& vec : vectors.getValues()) {
469 std::map<std::pair<std::vector<unsigned char>,
int>,
int> scriptposes;
471 if (
node.isNull())
return;
472 if (
node.isObject()) {
474 int idx =
node[
"id"].getInt<
int>();
475 int leaf_version =
node[
"leafVersion"].getInt<
int>();
476 scriptposes[{
script, leaf_version}] = idx;
477 spktest.
Add(depth,
script, leaf_version);
479 parse_tree(
node[0], depth + 1);
480 parse_tree(
node[1], depth + 1);
483 parse_tree(vec[
"given"][
"scriptTree"], 0);
488 BOOST_CHECK_EQUAL(vec[
"intermediary"][
"merkleRoot"].isNull(), spend_data.merkle_root.IsNull());
489 if (!spend_data.merkle_root.IsNull()) {
493 for (
const auto& scriptpos : scriptposes) {
494 BOOST_CHECK(spend_data.scripts[scriptpos.first] == control_set{ParseHex(vec[
"expected"][
"scriptPathControlBlocks"][scriptpos.second].get_str())});
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.
const std::vector< unsigned char > ANCHOR_BYTES
Witness program for Pay-to-Anchor output script type.
#define Assert(val)
Identity function.
A hasher class for Bitcoin's 160-bit hash (SHA-256 + RIPEMD-160).
CHash160 & Write(std::span< const unsigned char > input)
void Finalize(std::span< unsigned char > output)
An encapsulated private key.
CPubKey GetPubKey() const
Compute the public key from a private key.
An encapsulated public key.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
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.
bool IsPayToAnchor() const
A reference to a CScript: the Hash160 of its serialization.
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.
TaprootBuilder & Add(int depth, std::span< const unsigned char > script, int leaf_version, bool track=true)
Add a new script at a certain depth in the 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 & 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.
constexpr unsigned char * begin()
static const uint256 ZERO
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
uint160 Hash160(const T1 &in1)
Compute the 160-bit hash an object.
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
BOOST_CHECK_EQUAL(headers.FindFirst("key"), "value")
CKey GenerateRandomKey(bool compressed) noexcept
std::string EncodeDestination(const CTxDestination &dest)
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
#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.
CScript GetScriptForRawPubKey(const CPubKey &pubKey)
Generate a P2PK script for the given pubkey.
@ WITNESS_UNKNOWN
Only for Witness versions not already defined above.
@ ANCHOR
anyone can spend script
@ NULL_DATA
unspendable OP_RETURN script that carries data
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
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.
std::vector< uint16_t > keys
constexpr std::array tests