Merge #10762: [wallet] Remove Wallet dependencies from init.cpp

c7ec524 [wallet] Add dummy wallet init class (John Newbery)
49baa4a [wallet] Use global g_wallet_init_interface to init/destroy the wallet. (John Newbery)
caaf972 [wallet] Create wallet init interface. (John Newbery)
5fb5421 [wallet] Move wallet init functions into WalletInit class. (John Newbery)

Pull request description:

  This continues the work of #7965. This PR, along with several others, would remove the remaining dependencies from libbitcoin_server.a on libbitcoin_wallet.a.

  To create the interface, I've just translated all the old init.cpp wallet function calls into an interface class. I've not done any thinking about whether it makes sense to change that interface by combining/splitting those calls. This is a purely internal interface, so there's no problem in changing it later.

Tree-SHA512: 32ea57615229c33fd1a7f2f29ebc11bf30337685f7211baffa899823ef74b65dcbf068289c557a161c5afffb51fdc38a2ee8180720371f64d433b12b0615cf3f
This commit is contained in:
Wladimir J. van der Laan 2018-03-29 16:39:50 +02:00
commit 6d53663a43
No known key found for this signature in database
GPG key ID: 1E4AED62986CD25D
8 changed files with 124 additions and 64 deletions

View file

@ -162,6 +162,7 @@ BITCOIN_CORE_H = \
validation.h \
validationinterface.h \
versionbits.h \
walletinitinterface.h \
wallet/coincontrol.h \
wallet/crypter.h \
wallet/db.h \

View file

@ -18,6 +18,10 @@
#include <httpserver.h>
#include <httprpc.h>
#include <utilstrencodings.h>
#if ENABLE_WALLET
#include <wallet/init.h>
#endif
#include <walletinitinterface.h>
#include <boost/thread.hpp>
@ -59,6 +63,12 @@ bool AppInit(int argc, char* argv[])
{
bool fRet = false;
#if ENABLE_WALLET
g_wallet_init_interface.reset(new WalletInit);
#else
g_wallet_init_interface.reset(new DummyWalletInit);
#endif
//
// Parameters
//

View file

@ -43,10 +43,8 @@
#include <util.h>
#include <utilmoneystr.h>
#include <validationinterface.h>
#ifdef ENABLE_WALLET
#include <wallet/init.h>
#endif
#include <warnings.h>
#include <walletinitinterface.h>
#include <stdint.h>
#include <stdio.h>
#include <memory>
@ -74,6 +72,7 @@ static const bool DEFAULT_STOPAFTERBLOCKIMPORT = false;
std::unique_ptr<CConnman> g_connman;
std::unique_ptr<PeerLogicValidation> peerLogic;
std::unique_ptr<WalletInitInterface> g_wallet_init_interface;
#if ENABLE_ZMQ
static CZMQNotificationInterface* pzmqNotificationInterface = nullptr;
@ -189,9 +188,7 @@ void Shutdown()
StopREST();
StopRPC();
StopHTTPServer();
#ifdef ENABLE_WALLET
FlushWallets();
#endif
g_wallet_init_interface->Flush();
StopMapPort();
// Because these depend on each-other, we make sure that neither can be
@ -249,9 +246,7 @@ void Shutdown()
pcoinsdbview.reset();
pblocktree.reset();
}
#ifdef ENABLE_WALLET
StopWallets();
#endif
g_wallet_init_interface->Stop();
#if ENABLE_ZMQ
if (pzmqNotificationInterface) {
@ -271,9 +266,8 @@ void Shutdown()
UnregisterAllValidationInterfaces();
GetMainSignals().UnregisterBackgroundSignalScheduler();
GetMainSignals().UnregisterWithMempoolSignals(mempool);
#ifdef ENABLE_WALLET
CloseWallets();
#endif
g_wallet_init_interface->Close();
g_wallet_init_interface.reset();
globalVerifyHandle.reset();
ECC_Stop();
LogPrintf("%s: done\n", __func__);
@ -416,9 +410,7 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-whitelist=<IP address or network>", _("Whitelist peers connecting from the given IP address (e.g. 1.2.3.4) or CIDR notated network (e.g. 1.2.3.0/24). Can be specified multiple times.") +
" " + _("Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway"));
#ifdef ENABLE_WALLET
strUsage += GetWalletHelpString(showDebug);
#endif
strUsage += g_wallet_init_interface->GetHelpString(showDebug);
#if ENABLE_ZMQ
strUsage += HelpMessageGroup(_("ZeroMQ notification options:"));
@ -1087,10 +1079,7 @@ bool AppInitParameterInteraction()
return InitError(strprintf("acceptnonstdtxn is not currently supported for %s chain", chainparams.NetworkIDString()));
nBytesPerSigOp = gArgs.GetArg("-bytespersigop", nBytesPerSigOp);
#ifdef ENABLE_WALLET
if (!WalletParameterInteraction())
return false;
#endif
if (!g_wallet_init_interface->ParameterInteraction()) return false;
fIsBareMultisigStd = gArgs.GetBoolArg("-permitbaremultisig", DEFAULT_PERMIT_BAREMULTISIG);
fAcceptDatacarrier = gArgs.GetBoolArg("-datacarrier", DEFAULT_ACCEPT_DATACARRIER);
@ -1256,9 +1245,7 @@ bool AppInitMain()
* available in the GUI RPC console even if external calls are disabled.
*/
RegisterAllCoreRPCCommands(tableRPC);
#ifdef ENABLE_WALLET
RegisterWalletRPC(tableRPC);
#endif
g_wallet_init_interface->RegisterRPC(tableRPC);
/* Start the RPC server already. It will be started in "warmup" mode
* and not really process calls already (but it will signify connections
@ -1275,10 +1262,8 @@ bool AppInitMain()
int64_t nStart;
// ********************************************************* Step 5: verify wallet database integrity
#ifdef ENABLE_WALLET
if (!VerifyWallets())
return false;
#endif
if (!g_wallet_init_interface->Verify()) return false;
// ********************************************************* Step 6: network initialization
// Note that we absolutely cannot open any actual connections
// until the very end ("start node") as the UTXO/block state
@ -1596,12 +1581,7 @@ bool AppInitMain()
fFeeEstimatesInitialized = true;
// ********************************************************* Step 8: load wallet
#ifdef ENABLE_WALLET
if (!OpenWallets())
return false;
#else
LogPrintf("No wallet support compiled in!\n");
#endif
if (!g_wallet_init_interface->Open()) return false;
// ********************************************************* Step 9: data directory maintenance
@ -1747,9 +1727,7 @@ bool AppInitMain()
SetRPCWarmupFinished();
uiInterface.InitMessage(_("Done loading"));
#ifdef ENABLE_WALLET
StartWallets(scheduler);
#endif
g_wallet_init_interface->Start(scheduler);
return true;
}

View file

@ -6,11 +6,15 @@
#ifndef BITCOIN_INIT_H
#define BITCOIN_INIT_H
#include <memory>
#include <string>
class CScheduler;
class CWallet;
class WalletInitInterface;
extern std::unique_ptr<WalletInitInterface> g_wallet_init_interface;
namespace boost
{
class thread_group;

View file

@ -34,8 +34,10 @@
#include <warnings.h>
#ifdef ENABLE_WALLET
#include <wallet/init.h>
#include <wallet/wallet.h>
#endif
#include <walletinitinterface.h>
#include <stdint.h>
@ -677,6 +679,11 @@ int main(int argc, char *argv[])
// Start up the payment server early, too, so impatient users that click on
// bitcoin: links repeatedly have their payment requests routed to this process:
app.createPaymentServer();
// Hook up the wallet init interface
g_wallet_init_interface.reset(new WalletInit);
#else
g_wallet_init_interface.reset(new DummyWalletInit);
#endif
/// 9. Main GUI initialization

View file

@ -14,7 +14,7 @@
#include <wallet/wallet.h>
#include <wallet/walletutil.h>
std::string GetWalletHelpString(bool showDebug)
std::string WalletInit::GetHelpString(bool showDebug)
{
std::string strUsage = HelpMessageGroup(_("Wallet options:"));
strUsage += HelpMessageOpt("-addresstype", strprintf("What type of addresses to use (\"legacy\", \"p2sh-segwit\", or \"bech32\", default: \"%s\")", FormatOutputType(DEFAULT_ADDRESS_TYPE)));
@ -56,7 +56,7 @@ std::string GetWalletHelpString(bool showDebug)
return strUsage;
}
bool WalletParameterInteraction()
bool WalletInit::ParameterInteraction()
{
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
for (const std::string& wallet : gArgs.GetArgs("-wallet")) {
@ -184,7 +184,7 @@ bool WalletParameterInteraction()
return true;
}
void RegisterWalletRPC(CRPCTable &t)
void WalletInit::RegisterRPC(CRPCTable &t)
{
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
return;
@ -193,7 +193,7 @@ void RegisterWalletRPC(CRPCTable &t)
RegisterWalletRPCCommands(t);
}
bool VerifyWallets()
bool WalletInit::Verify()
{
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
return true;
@ -268,7 +268,7 @@ bool VerifyWallets()
return true;
}
bool OpenWallets()
bool WalletInit::Open()
{
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
LogPrintf("Wallet disabled!\n");
@ -286,25 +286,29 @@ bool OpenWallets()
return true;
}
void StartWallets(CScheduler& scheduler) {
void WalletInit::Start(CScheduler& scheduler)
{
for (CWalletRef pwallet : vpwallets) {
pwallet->postInitProcess(scheduler);
}
}
void FlushWallets() {
void WalletInit::Flush()
{
for (CWalletRef pwallet : vpwallets) {
pwallet->Flush(false);
}
}
void StopWallets() {
void WalletInit::Stop()
{
for (CWalletRef pwallet : vpwallets) {
pwallet->Flush(true);
}
}
void CloseWallets() {
void WalletInit::Close()
{
for (CWalletRef pwallet : vpwallets) {
delete pwallet;
}

View file

@ -6,38 +6,43 @@
#ifndef BITCOIN_WALLET_INIT_H
#define BITCOIN_WALLET_INIT_H
#include <walletinitinterface.h>
#include <string>
class CRPCTable;
class CScheduler;
//! Return the wallets help message.
std::string GetWalletHelpString(bool showDebug);
class WalletInit : public WalletInitInterface {
public:
//! Wallets parameter interaction
bool WalletParameterInteraction();
//! Return the wallets help message.
std::string GetHelpString(bool showDebug) override;
//! Register wallet RPCs.
void RegisterWalletRPC(CRPCTable &tableRPC);
//! Wallets parameter interaction
bool ParameterInteraction() override;
//! Responsible for reading and validating the -wallet arguments and verifying the wallet database.
// This function will perform salvage on the wallet if requested, as long as only one wallet is
// being loaded (WalletParameterInteraction forbids -salvagewallet, -zapwallettxes or -upgradewallet with multiwallet).
bool VerifyWallets();
//! Register wallet RPCs.
void RegisterRPC(CRPCTable &tableRPC) override;
//! Load wallet databases.
bool OpenWallets();
//! Responsible for reading and validating the -wallet arguments and verifying the wallet database.
// This function will perform salvage on the wallet if requested, as long as only one wallet is
// being loaded (WalletParameterInteraction forbids -salvagewallet, -zapwallettxes or -upgradewallet with multiwallet).
bool Verify() override;
//! Complete startup of wallets.
void StartWallets(CScheduler& scheduler);
//! Load wallet databases.
bool Open() override;
//! Flush all wallets in preparation for shutdown.
void FlushWallets();
//! Complete startup of wallets.
void Start(CScheduler& scheduler) override;
//! Stop all wallets. Wallets will be flushed first.
void StopWallets();
//! Flush all wallets in preparation for shutdown.
void Flush() override;
//! Close all wallets.
void CloseWallets();
//! Stop all wallets. Wallets will be flushed first.
void Stop() override;
//! Close all wallets.
void Close() override;
};
#endif // BITCOIN_WALLET_INIT_H

51
src/walletinitinterface.h Normal file
View file

@ -0,0 +1,51 @@
// Copyright (c) 2017 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef WALLETINITINTERFACE_H
#define WALLETINITINTERFACE_H
#include <string>
class CScheduler;
class CRPCTable;
class WalletInitInterface {
public:
/** Get wallet help string */
virtual std::string GetHelpString(bool showDebug) = 0;
/** Check wallet parameter interaction */
virtual bool ParameterInteraction() = 0;
/** Register wallet RPC*/
virtual void RegisterRPC(CRPCTable &) = 0;
/** Verify wallets */
virtual bool Verify() = 0;
/** Open wallets*/
virtual bool Open() = 0;
/** Start wallets*/
virtual void Start(CScheduler& scheduler) = 0;
/** Flush Wallets*/
virtual void Flush() = 0;
/** Stop Wallets*/
virtual void Stop() = 0;
/** Close wallets */
virtual void Close() = 0;
virtual ~WalletInitInterface() {}
};
class DummyWalletInit : public WalletInitInterface {
public:
std::string GetHelpString(bool showDebug) override {return std::string{};}
bool ParameterInteraction() override {return true;}
void RegisterRPC(CRPCTable &) override {}
bool Verify() override {return true;}
bool Open() override {return true;}
void Start(CScheduler& scheduler) override {}
void Flush() override {}
void Stop() override {}
void Close() override {}
};
#endif // WALLETINITINTERFACE_H