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});
132 std::vector<unsigned char> anchor_bytes{0x4e, 0x73};
134 s <<
OP_1 << anchor_bytes;
140 std::vector<unsigned char> witness_program;
157 std::vector<std::vector<unsigned char> > solutions;
161 s << std::vector<unsigned char>(30, 0x01) <<
OP_CHECKSIG;
171 s << OP_HASH160 << std::vector<unsigned char>(21, 0x01) <<
OP_EQUAL;
196 s << OP_RETURN << std::vector<unsigned char>({75}) <<
OP_ADD;
201 s << OP_0 << std::vector<unsigned char>(19, 0x01);
206 s << OP_2 << std::vector<unsigned char>{0x4e, 0x73};
212 s << OP_1 << std::vector<unsigned char>{0xff, 0xff};
251 s << OP_RETURN << std::vector<unsigned char>({75});
260 BOOST_CHECK(std::get<WitnessV0KeyHash>(address) == keyhash);
268 BOOST_CHECK(std::get<WitnessV0ScriptHash>(address) == scripthash);
275 BOOST_CHECK(std::get<WitnessUnknown>(address) == unk);
282 for (
int i = 0; i < 3; i++) {
337 .Finalize(scriptHash.
begin());
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);
391 XOnlyPubKey key_inner{
ParseHex(
"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798")};
392 XOnlyPubKey key_1{
ParseHex(
"c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5")};
393 XOnlyPubKey key_2{
ParseHex(
"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9")};
396 constexpr
uint256 hash_3{
"31fe7061656bea2a36aa60a2f7ef940578049273746935d296426dc0afd86b68"};
400 builder.
Add(2, script_2, 0xc0);
404 builder.
Add(1, script_1, 0xc0);
418 const auto& vectors = tests[
"scriptPubKey"];
420 for (
const auto& vec : vectors.getValues()) {
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()) {
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);
432 parse_tree(
node[0], depth + 1);
433 parse_tree(
node[1], depth + 1);
436 parse_tree(vec[
"given"][
"scriptTree"], 0);
441 BOOST_CHECK_EQUAL(vec[
"intermediary"][
"merkleRoot"].isNull(), spend_data.merkle_root.IsNull());
442 if (!spend_data.merkle_root.IsNull()) {
446 for (
const auto& scriptpos : scriptposes) {
447 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.
bool IsWitnessProgram(int &version, std::vector< unsigned char > &program) const
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
constexpr unsigned char * begin()
CKey GenerateRandomKey(bool compressed) noexcept
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.
CTxDestination subtype to encode any future Witness version.
BOOST_AUTO_TEST_SUITE_END()
TaprootBuilder & Finalize(const XOnlyPubKey &internal_key)
Finalize the construction.
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.
bool IsPayToAnchor() const
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::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.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
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.
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
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