From 39a231053a94afaaca140d3ec8ad795f37accfc1 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Thu, 3 Jun 2021 12:15:24 +0100 Subject: [PATCH 1/3] Add node context to wallet RPC request object Add node context to wallet RPC request object, as getauxblock needs access to the node to determine if it is in initial block download, and requires access to the wallet to get an address to pay to. --- src/interfaces/wallet.cpp | 8 +++++--- src/interfaces/wallet.h | 2 +- src/wallet/context.h | 5 +++++ src/wallet/init.cpp | 2 +- src/wallet/test/init_test_fixture.cpp | 2 +- src/wallet/test/wallet_test_fixture.h | 2 +- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index f68016b55..599b265ba 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -489,8 +490,9 @@ public: class WalletClientImpl : public WalletClient { public: - WalletClientImpl(Chain& chain, ArgsManager& args) + WalletClientImpl(NodeContext& node, Chain& chain, ArgsManager& args) { + m_context.nodeContext = &node; m_context.chain = &chain; m_context.args = &args; } @@ -566,9 +568,9 @@ public: std::unique_ptr MakeWallet(const std::shared_ptr& wallet) { return wallet ? MakeUnique(wallet) : nullptr; } -std::unique_ptr MakeWalletClient(Chain& chain, ArgsManager& args) +std::unique_ptr MakeWalletClient(NodeContext& node, Chain& chain, ArgsManager& args) { - return MakeUnique(chain, args); + return MakeUnique(node, chain, args); } } // namespace interfaces diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h index 6ccfd7fc2..be1a3572c 100644 --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -411,7 +411,7 @@ std::unique_ptr MakeWallet(const std::shared_ptr& wallet); //! Return implementation of ChainClient interface for a wallet client. This //! function will be undefined in builds where ENABLE_WALLET is false. -std::unique_ptr MakeWalletClient(Chain& chain, ArgsManager& args); +std::unique_ptr MakeWalletClient(NodeContext& node, Chain& chain, ArgsManager& args); } // namespace interfaces diff --git a/src/wallet/context.h b/src/wallet/context.h index a83591154..24f862294 100644 --- a/src/wallet/context.h +++ b/src/wallet/context.h @@ -10,6 +10,8 @@ namespace interfaces { class Chain; } // namespace interfaces +struct NodeContext; + //! WalletContext struct containing references to state shared between CWallet //! instances, like the reference to the chain interface, and the list of opened //! wallets. @@ -24,6 +26,9 @@ struct WalletContext { interfaces::Chain* chain{nullptr}; ArgsManager* args{nullptr}; + //! Dogecoin: getauxwork is a wallet RPC but actually needs the NodeContext. + NodeContext* nodeContext{nullptr}; + //! Declare default constructor and destructor that are not inline, so code //! instantiating the WalletContext struct doesn't need to #include class //! definitions for smart pointer and container members. diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp index 8b2ef191f..7602335a2 100644 --- a/src/wallet/init.cpp +++ b/src/wallet/init.cpp @@ -107,7 +107,7 @@ void WalletInit::Construct(NodeContext& node) const LogPrintf("Wallet disabled!\n"); return; } - auto wallet_client = interfaces::MakeWalletClient(*node.chain, args); + auto wallet_client = interfaces::MakeWalletClient(node, *node.chain, args); node.wallet_client = wallet_client.get(); node.chain_clients.emplace_back(std::move(wallet_client)); } diff --git a/src/wallet/test/init_test_fixture.cpp b/src/wallet/test/init_test_fixture.cpp index c80310045..bf0380d2d 100644 --- a/src/wallet/test/init_test_fixture.cpp +++ b/src/wallet/test/init_test_fixture.cpp @@ -10,7 +10,7 @@ InitWalletDirTestingSetup::InitWalletDirTestingSetup(const std::string& chainName) : BasicTestingSetup(chainName) { - m_wallet_client = MakeWalletClient(*m_chain, *Assert(m_node.args)); + m_wallet_client = MakeWalletClient(m_node, *m_chain, *Assert(m_node.args)); std::string sep; sep += fs::path::preferred_separator; diff --git a/src/wallet/test/wallet_test_fixture.h b/src/wallet/test/wallet_test_fixture.h index ba8a5ff1f..9156e489e 100644 --- a/src/wallet/test/wallet_test_fixture.h +++ b/src/wallet/test/wallet_test_fixture.h @@ -21,7 +21,7 @@ struct WalletTestingSetup : public TestingSetup { explicit WalletTestingSetup(const std::string& chainName = CBaseChainParams::MAIN); std::unique_ptr m_chain = interfaces::MakeChain(m_node); - std::unique_ptr m_wallet_client = interfaces::MakeWalletClient(*m_chain, *Assert(m_node.args)); + std::unique_ptr m_wallet_client = interfaces::MakeWalletClient(m_node, *m_chain, *Assert(m_node.args)); CWallet m_wallet; std::unique_ptr m_chain_notifications_handler; }; From 1de71358f7f195e8be67885a83a47870b0c262c3 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Mon, 7 Jun 2021 20:49:06 +0100 Subject: [PATCH 2/3] Directly include NodeContext instead of defining it Rather than defining that NodeContext is defined fully elsewhere, actually include node/context.h into src/wallet/context.h for details. --- src/wallet/context.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/context.h b/src/wallet/context.h index 24f862294..8e96c8933 100644 --- a/src/wallet/context.h +++ b/src/wallet/context.h @@ -5,13 +5,13 @@ #ifndef BITCOIN_WALLET_CONTEXT_H #define BITCOIN_WALLET_CONTEXT_H +#include + class ArgsManager; namespace interfaces { class Chain; } // namespace interfaces -struct NodeContext; - //! WalletContext struct containing references to state shared between CWallet //! instances, like the reference to the chain interface, and the list of opened //! wallets. From 803923ca58c67ad9cd2335ee501d27c21ec71f66 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Wed, 9 Jun 2021 08:38:00 +0100 Subject: [PATCH 3/3] Remove separate node and wallet contexts --- src/interfaces/wallet.cpp | 4 ++-- src/interfaces/wallet.h | 2 +- src/wallet/init.cpp | 2 +- src/wallet/test/init_test_fixture.cpp | 2 +- src/wallet/test/wallet_test_fixture.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 599b265ba..4124bc786 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -568,9 +568,9 @@ public: std::unique_ptr MakeWallet(const std::shared_ptr& wallet) { return wallet ? MakeUnique(wallet) : nullptr; } -std::unique_ptr MakeWalletClient(NodeContext& node, Chain& chain, ArgsManager& args) +std::unique_ptr MakeWalletClient(NodeContext& node, ArgsManager& args) { - return MakeUnique(node, chain, args); + return MakeUnique(node, *node.chain, args); } } // namespace interfaces diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h index be1a3572c..5f93b8264 100644 --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -411,7 +411,7 @@ std::unique_ptr MakeWallet(const std::shared_ptr& wallet); //! Return implementation of ChainClient interface for a wallet client. This //! function will be undefined in builds where ENABLE_WALLET is false. -std::unique_ptr MakeWalletClient(NodeContext& node, Chain& chain, ArgsManager& args); +std::unique_ptr MakeWalletClient(NodeContext& node, ArgsManager& args); } // namespace interfaces diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp index 7602335a2..8078b8b43 100644 --- a/src/wallet/init.cpp +++ b/src/wallet/init.cpp @@ -107,7 +107,7 @@ void WalletInit::Construct(NodeContext& node) const LogPrintf("Wallet disabled!\n"); return; } - auto wallet_client = interfaces::MakeWalletClient(node, *node.chain, args); + auto wallet_client = interfaces::MakeWalletClient(node, args); node.wallet_client = wallet_client.get(); node.chain_clients.emplace_back(std::move(wallet_client)); } diff --git a/src/wallet/test/init_test_fixture.cpp b/src/wallet/test/init_test_fixture.cpp index bf0380d2d..155cd9ce6 100644 --- a/src/wallet/test/init_test_fixture.cpp +++ b/src/wallet/test/init_test_fixture.cpp @@ -10,7 +10,7 @@ InitWalletDirTestingSetup::InitWalletDirTestingSetup(const std::string& chainName) : BasicTestingSetup(chainName) { - m_wallet_client = MakeWalletClient(m_node, *m_chain, *Assert(m_node.args)); + m_wallet_client = interfaces::MakeWalletClient(m_node, *Assert(m_node.args)); std::string sep; sep += fs::path::preferred_separator; diff --git a/src/wallet/test/wallet_test_fixture.h b/src/wallet/test/wallet_test_fixture.h index 9156e489e..2ce616be0 100644 --- a/src/wallet/test/wallet_test_fixture.h +++ b/src/wallet/test/wallet_test_fixture.h @@ -21,7 +21,7 @@ struct WalletTestingSetup : public TestingSetup { explicit WalletTestingSetup(const std::string& chainName = CBaseChainParams::MAIN); std::unique_ptr m_chain = interfaces::MakeChain(m_node); - std::unique_ptr m_wallet_client = interfaces::MakeWalletClient(m_node, *m_chain, *Assert(m_node.args)); + std::unique_ptr m_wallet_client = interfaces::MakeWalletClient(m_node, *Assert(m_node.args)); CWallet m_wallet; std::unique_ptr m_chain_notifications_handler; };