Skip to content

Commit 020628e

Browse files
committed
Tests for PSBT
Added functional tests for PSBT that test the RPCs. Also added all of the BIP 174 test vectors (except for the updater tests) in the functional tests. Added a Unit test for the BIP 174 updater test vector.
1 parent a4b06fb commit 020628e

File tree

5 files changed

+344
-0
lines changed

5 files changed

+344
-0
lines changed

src/Makefile.test.include

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ BITCOIN_TESTS =\
9494
if ENABLE_WALLET
9595
BITCOIN_TESTS += \
9696
wallet/test/accounting_tests.cpp \
97+
wallet/test/psbt_wallet_tests.cpp \
9798
wallet/test/wallet_tests.cpp \
9899
wallet/test/wallet_crypto_tests.cpp \
99100
wallet/test/coinselector_tests.cpp

src/wallet/test/psbt_wallet_tests.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// Copyright (c) 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.
4+
5+
#include <key_io.h>
6+
#include <script/sign.h>
7+
#include <utilstrencodings.h>
8+
#include <wallet/rpcwallet.h>
9+
#include <wallet/wallet.h>
10+
#include <univalue.h>
11+
12+
#include <boost/test/unit_test.hpp>
13+
#include <test/test_bitcoin.h>
14+
#include <wallet/test/wallet_test_fixture.h>
15+
16+
BOOST_FIXTURE_TEST_SUITE(psbt_wallet_tests, WalletTestingSetup)
17+
18+
BOOST_AUTO_TEST_CASE(psbt_updater_test)
19+
{
20+
// Create prevtxs and add to wallet
21+
CDataStream s_prev_tx1(ParseHex("0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"), SER_NETWORK, PROTOCOL_VERSION);
22+
CTransactionRef prev_tx1;
23+
s_prev_tx1 >> prev_tx1;
24+
CWalletTx prev_wtx1(&m_wallet, prev_tx1);
25+
m_wallet.mapWallet.emplace(prev_wtx1.GetHash(), std::move(prev_wtx1));
26+
27+
CDataStream s_prev_tx2(ParseHex("0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000"), SER_NETWORK, PROTOCOL_VERSION);
28+
CTransactionRef prev_tx2;
29+
s_prev_tx2 >> prev_tx2;
30+
CWalletTx prev_wtx2(&m_wallet, prev_tx2);
31+
m_wallet.mapWallet.emplace(prev_wtx2.GetHash(), std::move(prev_wtx2));
32+
33+
// Add scripts
34+
CScript rs1;
35+
CDataStream s_rs1(ParseHex("475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae"), SER_NETWORK, PROTOCOL_VERSION);
36+
s_rs1 >> rs1;
37+
m_wallet.AddCScript(rs1);
38+
39+
CScript rs2;
40+
CDataStream s_rs2(ParseHex("2200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903"), SER_NETWORK, PROTOCOL_VERSION);
41+
s_rs2 >> rs2;
42+
m_wallet.AddCScript(rs2);
43+
44+
CScript ws1;
45+
CDataStream s_ws1(ParseHex("47522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae"), SER_NETWORK, PROTOCOL_VERSION);
46+
s_ws1 >> ws1;
47+
m_wallet.AddCScript(ws1);
48+
49+
// Add hd seed
50+
CKey key = DecodeSecret("5KSSJQ7UNfFGwVgpCZDSHm5rVNhMFcFtvWM3zQ8mW4qNDEN7LFd"); // Mainnet and uncompressed form of cUkG8i1RFfWGWy5ziR11zJ5V4U4W3viSFCfyJmZnvQaUsd1xuF3T
51+
CPubKey master_pub_key = m_wallet.DeriveNewSeed(key);
52+
m_wallet.SetHDSeed(master_pub_key);
53+
m_wallet.NewKeyPool();
54+
55+
// Call FillPSBT
56+
PartiallySignedTransaction psbtx;
57+
CDataStream ssData(ParseHex("70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000"), SER_NETWORK, PROTOCOL_VERSION);
58+
ssData >> psbtx;
59+
60+
// Use CTransaction for the constant parts of the
61+
// transaction to avoid rehashing.
62+
const CTransaction txConst(*psbtx.tx);
63+
64+
// Fill transaction with our data
65+
FillPSBT(&m_wallet, psbtx, &txConst, 1, false, true);
66+
67+
// Get the final tx
68+
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
69+
ssTx << psbtx;
70+
std::string final_hex = HexStr(ssTx.begin(), ssTx.end());
71+
BOOST_CHECK_EQUAL(final_hex, "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000");
72+
}
73+
74+
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)