Merge #12001: [RPC] Adding ::minRelayTxFee amount to getmempoolinfo and updating...
[bitcoinplatinum.git] / src / test / bip32_tests.cpp
blob438ddc177d2ded3c8150af1e2d2ef457b44b7141
1 // Copyright (c) 2013-2017 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #include <boost/test/unit_test.hpp>
7 #include <base58.h>
8 #include <key.h>
9 #include <uint256.h>
10 #include <util.h>
11 #include <utilstrencodings.h>
12 #include <test/test_bitcoin.h>
14 #include <string>
15 #include <vector>
17 struct TestDerivation {
18 std::string pub;
19 std::string prv;
20 unsigned int nChild;
23 struct TestVector {
24 std::string strHexMaster;
25 std::vector<TestDerivation> vDerive;
27 explicit TestVector(std::string strHexMasterIn) : strHexMaster(strHexMasterIn) {}
29 TestVector& operator()(std::string pub, std::string prv, unsigned int nChild) {
30 vDerive.push_back(TestDerivation());
31 TestDerivation &der = vDerive.back();
32 der.pub = pub;
33 der.prv = prv;
34 der.nChild = nChild;
35 return *this;
39 TestVector test1 =
40 TestVector("000102030405060708090a0b0c0d0e0f")
41 ("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8",
42 "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
43 0x80000000)
44 ("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw",
45 "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7",
47 ("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ",
48 "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs",
49 0x80000002)
50 ("xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
51 "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM",
53 ("xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV",
54 "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334",
55 1000000000)
56 ("xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy",
57 "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76",
58 0);
60 TestVector test2 =
61 TestVector("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")
62 ("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
63 "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U",
65 ("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH",
66 "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt",
67 0xFFFFFFFF)
68 ("xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a",
69 "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9",
71 ("xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon",
72 "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef",
73 0xFFFFFFFE)
74 ("xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL",
75 "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc",
77 ("xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt",
78 "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j",
79 0);
81 TestVector test3 =
82 TestVector("4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be")
83 ("xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13",
84 "xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6",
85 0x80000000)
86 ("xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y",
87 "xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L",
88 0);
90 void RunTest(const TestVector &test) {
91 std::vector<unsigned char> seed = ParseHex(test.strHexMaster);
92 CExtKey key;
93 CExtPubKey pubkey;
94 key.SetMaster(seed.data(), seed.size());
95 pubkey = key.Neuter();
96 for (const TestDerivation &derive : test.vDerive) {
97 unsigned char data[74];
98 key.Encode(data);
99 pubkey.Encode(data);
101 // Test private key
102 CBitcoinExtKey b58key; b58key.SetKey(key);
103 BOOST_CHECK(b58key.ToString() == derive.prv);
105 CBitcoinExtKey b58keyDecodeCheck(derive.prv);
106 CExtKey checkKey = b58keyDecodeCheck.GetKey();
107 assert(checkKey == key); //ensure a base58 decoded key also matches
109 // Test public key
110 CBitcoinExtPubKey b58pubkey; b58pubkey.SetKey(pubkey);
111 BOOST_CHECK(b58pubkey.ToString() == derive.pub);
113 CBitcoinExtPubKey b58PubkeyDecodeCheck(derive.pub);
114 CExtPubKey checkPubKey = b58PubkeyDecodeCheck.GetKey();
115 assert(checkPubKey == pubkey); //ensure a base58 decoded pubkey also matches
117 // Derive new keys
118 CExtKey keyNew;
119 BOOST_CHECK(key.Derive(keyNew, derive.nChild));
120 CExtPubKey pubkeyNew = keyNew.Neuter();
121 if (!(derive.nChild & 0x80000000)) {
122 // Compare with public derivation
123 CExtPubKey pubkeyNew2;
124 BOOST_CHECK(pubkey.Derive(pubkeyNew2, derive.nChild));
125 BOOST_CHECK(pubkeyNew == pubkeyNew2);
127 key = keyNew;
128 pubkey = pubkeyNew;
130 CDataStream ssPub(SER_DISK, CLIENT_VERSION);
131 ssPub << pubkeyNew;
132 BOOST_CHECK(ssPub.size() == 75);
134 CDataStream ssPriv(SER_DISK, CLIENT_VERSION);
135 ssPriv << keyNew;
136 BOOST_CHECK(ssPriv.size() == 75);
138 CExtPubKey pubCheck;
139 CExtKey privCheck;
140 ssPub >> pubCheck;
141 ssPriv >> privCheck;
143 BOOST_CHECK(pubCheck == pubkeyNew);
144 BOOST_CHECK(privCheck == keyNew);
148 BOOST_FIXTURE_TEST_SUITE(bip32_tests, BasicTestingSetup)
150 BOOST_AUTO_TEST_CASE(bip32_test1) {
151 RunTest(test1);
154 BOOST_AUTO_TEST_CASE(bip32_test2) {
155 RunTest(test2);
158 BOOST_AUTO_TEST_CASE(bip32_test3) {
159 RunTest(test3);
162 BOOST_AUTO_TEST_SUITE_END()