Changeset View
Changeset View
Standalone View
Standalone View
src/test/descriptor_tests.cpp
Show All 31 Lines | |||||
constexpr int RANGE = 1; | constexpr int RANGE = 1; | ||||
// Derivation needs access to private keys | // Derivation needs access to private keys | ||||
constexpr int HARDENED = 2; | constexpr int HARDENED = 2; | ||||
// This descriptor is not expected to be solvable | // This descriptor is not expected to be solvable | ||||
constexpr int UNSOLVABLE = 4; | constexpr int UNSOLVABLE = 4; | ||||
// We can sign with this descriptor (this is not true when actual BIP32 | // We can sign with this descriptor (this is not true when actual BIP32 | ||||
// derivation is used, as that's not integrated in our signing code) | // derivation is used, as that's not integrated in our signing code) | ||||
constexpr int SIGNABLE = 8; | constexpr int SIGNABLE = 8; | ||||
// The final derivation is hardened, i.e. ends with *' or *h | |||||
constexpr int DERIVE_HARDENED = 16; | |||||
/** | /** | ||||
* Compare two descriptors. If only one of them has a checksum, the checksum is | * Compare two descriptors. If only one of them has a checksum, the checksum is | ||||
* ignored. | * ignored. | ||||
*/ | */ | ||||
bool EqualDescriptor(std::string a, std::string b) { | bool EqualDescriptor(std::string a, std::string b) { | ||||
bool a_check = (a.size() > 9 && a[a.size() - 9] == '#'); | bool a_check = (a.size() > 9 && a[a.size() - 9] == '#'); | ||||
bool b_check = (b.size() > 9 && b[b.size() - 9] == '#'); | bool b_check = (b.size() > 9 && b[b.size() - 9] == '#'); | ||||
▲ Show 20 Lines • Show All 126 Lines • ▼ Show 20 Lines | for (size_t i = 0; i < max; ++i) { | ||||
BOOST_CHECK(spks == spks_cached); | BOOST_CHECK(spks == spks_cached); | ||||
BOOST_CHECK(script_provider.pubkeys == | BOOST_CHECK(script_provider.pubkeys == | ||||
script_provider_cached.pubkeys); | script_provider_cached.pubkeys); | ||||
BOOST_CHECK(script_provider.scripts == | BOOST_CHECK(script_provider.scripts == | ||||
script_provider_cached.scripts); | script_provider_cached.scripts); | ||||
BOOST_CHECK(script_provider.origins == | BOOST_CHECK(script_provider.origins == | ||||
script_provider_cached.origins); | script_provider_cached.origins); | ||||
// Make sure we can expand using cached xpubs for unhardened | |||||
// derivation | |||||
if (!(flags & DERIVE_HARDENED)) { | |||||
// Evaluate the descriptor at i + 1 | |||||
FlatSigningProvider script_provider1, script_provider_cached1; | |||||
std::vector<CScript> spks1, spk1_from_cache; | |||||
BOOST_CHECK((t ? parse_priv : parse_pub) | |||||
->Expand(i + 1, key_provider, spks1, | |||||
script_provider1, nullptr)); | |||||
// Try again but use the cache from expanding i. That cache | |||||
// won't have the pubkeys for i + 1, but will have the parent | |||||
// xpub for derivation. | |||||
BOOST_CHECK(parse_pub->ExpandFromCache( | |||||
i + 1, desc_cache, spk1_from_cache, | |||||
script_provider_cached1)); | |||||
BOOST_CHECK(spks1 == spk1_from_cache); | |||||
BOOST_CHECK(script_provider1.pubkeys == | |||||
script_provider_cached1.pubkeys); | |||||
BOOST_CHECK(script_provider1.scripts == | |||||
script_provider_cached1.scripts); | |||||
BOOST_CHECK(script_provider1.origins == | |||||
script_provider_cached1.origins); | |||||
} | |||||
// For each of the produced scripts, verify solvability, and when | // For each of the produced scripts, verify solvability, and when | ||||
// possible, try to sign a transaction spending it. | // possible, try to sign a transaction spending it. | ||||
for (size_t n = 0; n < spks.size(); ++n) { | for (size_t n = 0; n < spks.size(); ++n) { | ||||
BOOST_CHECK_EQUAL(ref[n], | BOOST_CHECK_EQUAL(ref[n], | ||||
HexStr(spks[n].begin(), spks[n].end())); | HexStr(spks[n].begin(), spks[n].end())); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
IsSolvable(Merge(key_provider, script_provider), spks[n]), | IsSolvable(Merge(key_provider, script_provider), spks[n]), | ||||
(flags & UNSOLVABLE) == 0); | (flags & UNSOLVABLE) == 0); | ||||
▲ Show 20 Lines • Show All 201 Lines • ▼ Show 20 Lines | Check("pkh([ffffffff/13']" | ||||
{0x8000000DUL, 1, 2, 1}, | {0x8000000DUL, 1, 2, 1}, | ||||
{0x8000000DUL, 1, 2, 2}}); | {0x8000000DUL, 1, 2, 2}}); | ||||
Check("sh(pkh(" | Check("sh(pkh(" | ||||
"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKm" | "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKm" | ||||
"PGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*'))", | "PGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*'))", | ||||
"sh(pkh(" | "sh(pkh(" | ||||
"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjq" | "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjq" | ||||
"JoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*'))", | "JoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*'))", | ||||
RANGE | HARDENED, | RANGE | HARDENED | DERIVE_HARDENED, | ||||
{{"a9149976cc014a7c012bbc43954a38cdee554865bd1987"}, | {{"a9149976cc014a7c012bbc43954a38cdee554865bd1987"}, | ||||
{"a914ad29a49cb0420b53d9d6bb8944bcd819c5ff716e87"}, | {"a914ad29a49cb0420b53d9d6bb8944bcd819c5ff716e87"}, | ||||
{"a914b2d9d290b193fd23b720e738184e3eedadc7d87d87"}}, | {"a914b2d9d290b193fd23b720e738184e3eedadc7d87d87"}}, | ||||
{{10, 20, 30, 40, 0x80000000UL}, | {{10, 20, 30, 40, 0x80000000UL}, | ||||
{10, 20, 30, 40, 0x80000001UL}, | {10, 20, 30, 40, 0x80000001UL}, | ||||
{10, 20, 30, 40, 0x80000002UL}}); | {10, 20, 30, 40, 0x80000002UL}}); | ||||
Check("combo(" | Check("combo(" | ||||
"xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh" | "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh" | ||||
▲ Show 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | Check("sh(multi(2," | ||||
"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6o" | "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6o" | ||||
"DMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647'/" | "DMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647'/" | ||||
"0," | "0," | ||||
"xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7E" | "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7E" | ||||
"RfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/" | "RfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/" | ||||
"*," | "*," | ||||
"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjq" | "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjq" | ||||
"JoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*'))", | "JoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*'))", | ||||
HARDENED | RANGE, | HARDENED | RANGE | DERIVE_HARDENED, | ||||
{{"a914261bbb58cd9714f92e91668d3eed7c4c860f4cdc87"}, | {{"a914261bbb58cd9714f92e91668d3eed7c4c860f4cdc87"}, | ||||
{"a914ff07ad97dc4458ed5236c52bb94ccb7339dedff887"}, | {"a914ff07ad97dc4458ed5236c52bb94ccb7339dedff887"}, | ||||
{"a91451f96613fdd66e75a026811ba4fdb9efec2c83a987"}}, | {"a91451f96613fdd66e75a026811ba4fdb9efec2c83a987"}}, | ||||
{{0xFFFFFFFFUL, 0}, | {{0xFFFFFFFFUL, 0}, | ||||
{1, 2, 0}, | {1, 2, 0}, | ||||
{1, 2, 1}, | {1, 2, 1}, | ||||
{1, 2, 2}, | {1, 2, 2}, | ||||
{10, 20, 30, 40, 0x80000000UL}, | {10, 20, 30, 40, 0x80000000UL}, | ||||
▲ Show 20 Lines • Show All 274 Lines • Show Last 20 Lines |