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});
108 .Finalize(scriptHash.
begin());
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);
253 BOOST_CHECK(std::get<WitnessUnknown>(address) == unk);
260 for (
int i = 0; i < 3; i++) {
315 .Finalize(scriptHash.
begin());
365 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);
366 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);
367 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);
369 XOnlyPubKey key_inner{
ParseHex(
"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798")};
370 XOnlyPubKey key_1{
ParseHex(
"c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5")};
371 XOnlyPubKey key_2{
ParseHex(
"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9")};
374 uint256 hash_3 =
uint256S(
"31fe7061656bea2a36aa60a2f7ef940578049273746935d296426dc0afd86b68");
378 builder.
Add(2, script_2, 0xc0);
382 builder.
Add(1, script_1, 0xc0);
396 const auto& vectors = tests[
"scriptPubKey"];
398 for (
const auto& vec : vectors.getValues()) {
400 std::map<std::pair<std::vector<unsigned char>,
int>,
int> scriptposes;
401 std::function<void (const UniValue&, int)> parse_tree = [&](
const UniValue&
node,
int depth) {
402 if (
node.isNull())
return;
403 if (
node.isObject()) {
405 int idx =
node[
"id"].getInt<
int>();
406 int leaf_version =
node[
"leafVersion"].getInt<
int>();
407 scriptposes[{script, leaf_version}] = idx;
408 spktest.
Add(depth, script, leaf_version);
410 parse_tree(
node[0], depth + 1);
411 parse_tree(
node[1], depth + 1);
414 parse_tree(vec[
"given"][
"scriptTree"], 0);
419 BOOST_CHECK_EQUAL(vec[
"intermediary"][
"merkleRoot"].isNull(), spend_data.merkle_root.IsNull());
420 if (!spend_data.merkle_root.IsNull()) {
424 for (
const auto& scriptpos : scriptposes) {
425 BOOST_CHECK(spend_data.scripts[scriptpos.first] == control_set{ParseHex(vec[
"expected"][
"scriptPathControlBlocks"][scriptpos.second].get_str())});
CSHA256 & Write(const unsigned char *data, size_t len)
CScript GetScriptForMultisig(int nRequired, const std::vector< CPubKey > &keys)
Generate a multisig script.
static const std::string bip341_wallet_vectors
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
void Finalize(Span< unsigned char > output)
CPubKey GetPubKey() const
Compute the public key from a private key.
TxoutType Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char >> &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
bool read(std::string_view raw)
TaprootBuilder & AddOmitted(int depth, const uint256 &hash)
Like Add(), but for a Merkle node with a given hash to the tree.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
constexpr unsigned char * begin()
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.
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
CTxDestination subtype to encode any future Witness version.
BOOST_AUTO_TEST_SUITE_END()
TaprootBuilder & Finalize(const XOnlyPubKey &internal_key)
Finalize the construction.
uint256 uint256S(const char *str)
An encapsulated public key.
static const uint256 ZERO
WitnessV1Taproot GetOutput()
Compute scriptPubKey (after Finalize()).
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
TaprootSpendData GetSpendData() const
Compute spending data (after Finalize()).
Utility class to construct Taproot outputs from internal key and script tree.
uint160 Hash160(const T1 &in1)
Compute the 160-bit hash an object.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
std::vector< unsigned char > ToByteVector(const T &in)
static bool ValidDepths(const std::vector< int > &depths)
Check if a list of depths is legal (will lead to IsComplete()).
#define BOOST_CHECK_EQUAL(v1, v2)
Serialized script, used inside transaction inputs and outputs.
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.
A reference to a CScript: the Hash160 of its serialization.
std::string EncodeDestination(const CTxDestination &dest)
CScript GetScriptForRawPubKey(const CPubKey &pubKey)
Generate a P2PK script for the given pubkey.
bool IsComplete() const
Return whether there were either no leaves, or the leaves form a Huffman tree.
An encapsulated private key.
A hasher class for Bitcoin's 160-bit hash (SHA-256 + RIPEMD-160).
bool IsValid() const
Return true if so far all input was valid.
A hasher class for SHA-256.
Only for Witness versions not already defined above.
CHash160 & Write(Span< const unsigned char > input)
BOOST_AUTO_TEST_CASE(dest_default_is_no_dest)
#define BOOST_CHECK(expr)
unspendable OP_RETURN script that carries data