mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 02:33:24 -03:00
[build] Move wallet load functions to wallet/load unit
Moves the following wallet load functions to a new wallet/load unit in the libbitcoin_wallet library. All other functions in wallet/init remain in libbitcoin_server: - `VerifyWallets` - `LoadWallets` - `StartWallets` - `FlushWallets` - `StopWallets` - `UnloadWallets`
This commit is contained in:
parent
91a25d1e71
commit
9eaeb7fb8d
7 changed files with 159 additions and 122 deletions
|
@ -151,6 +151,9 @@
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@SOURCE_FILES@
|
@SOURCE_FILES@
|
||||||
|
<ClCompile Include="..\..\src\wallet\init.cpp">
|
||||||
|
<ObjectFileName>$(IntDir)wallet_init.obj</ObjectFileName>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
|
|
|
@ -222,6 +222,7 @@ BITCOIN_CORE_H = \
|
||||||
wallet/db.h \
|
wallet/db.h \
|
||||||
wallet/feebumper.h \
|
wallet/feebumper.h \
|
||||||
wallet/fees.h \
|
wallet/fees.h \
|
||||||
|
wallet/load.h \
|
||||||
wallet/psbtwallet.h \
|
wallet/psbtwallet.h \
|
||||||
wallet/rpcwallet.h \
|
wallet/rpcwallet.h \
|
||||||
wallet/wallet.h \
|
wallet/wallet.h \
|
||||||
|
@ -293,6 +294,9 @@ libbitcoin_server_a_SOURCES = \
|
||||||
versionbits.cpp \
|
versionbits.cpp \
|
||||||
$(BITCOIN_CORE_H)
|
$(BITCOIN_CORE_H)
|
||||||
|
|
||||||
|
if ENABLE_WALLET
|
||||||
|
libbitcoin_server_a_SOURCES += wallet/init.cpp
|
||||||
|
endif
|
||||||
if !ENABLE_WALLET
|
if !ENABLE_WALLET
|
||||||
libbitcoin_server_a_SOURCES += dummywallet.cpp
|
libbitcoin_server_a_SOURCES += dummywallet.cpp
|
||||||
endif
|
endif
|
||||||
|
@ -319,7 +323,7 @@ libbitcoin_wallet_a_SOURCES = \
|
||||||
wallet/db.cpp \
|
wallet/db.cpp \
|
||||||
wallet/feebumper.cpp \
|
wallet/feebumper.cpp \
|
||||||
wallet/fees.cpp \
|
wallet/fees.cpp \
|
||||||
wallet/init.cpp \
|
wallet/load.cpp \
|
||||||
wallet/psbtwallet.cpp \
|
wallet/psbtwallet.cpp \
|
||||||
wallet/rpcdump.cpp \
|
wallet/rpcdump.cpp \
|
||||||
wallet/rpcwallet.cpp \
|
wallet/rpcwallet.cpp \
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <wallet/feebumper.h>
|
#include <wallet/feebumper.h>
|
||||||
#include <wallet/fees.h>
|
#include <wallet/fees.h>
|
||||||
#include <wallet/rpcwallet.h>
|
#include <wallet/rpcwallet.h>
|
||||||
|
#include <wallet/load.h>
|
||||||
#include <wallet/wallet.h>
|
#include <wallet/wallet.h>
|
||||||
#include <wallet/walletutil.h>
|
#include <wallet/walletutil.h>
|
||||||
|
|
||||||
|
|
|
@ -131,58 +131,6 @@ bool WalletInit::ParameterInteraction() const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VerifyWallets(interfaces::Chain& chain, const std::vector<std::string>& wallet_files)
|
|
||||||
{
|
|
||||||
if (gArgs.IsArgSet("-walletdir")) {
|
|
||||||
fs::path wallet_dir = gArgs.GetArg("-walletdir", "");
|
|
||||||
boost::system::error_code error;
|
|
||||||
// The canonical path cleans the path, preventing >1 Berkeley environment instances for the same directory
|
|
||||||
fs::path canonical_wallet_dir = fs::canonical(wallet_dir, error);
|
|
||||||
if (error || !fs::exists(wallet_dir)) {
|
|
||||||
chain.initError(strprintf(_("Specified -walletdir \"%s\" does not exist"), wallet_dir.string()));
|
|
||||||
return false;
|
|
||||||
} else if (!fs::is_directory(wallet_dir)) {
|
|
||||||
chain.initError(strprintf(_("Specified -walletdir \"%s\" is not a directory"), wallet_dir.string()));
|
|
||||||
return false;
|
|
||||||
// The canonical path transforms relative paths into absolute ones, so we check the non-canonical version
|
|
||||||
} else if (!wallet_dir.is_absolute()) {
|
|
||||||
chain.initError(strprintf(_("Specified -walletdir \"%s\" is a relative path"), wallet_dir.string()));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
gArgs.ForceSetArg("-walletdir", canonical_wallet_dir.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
LogPrintf("Using wallet directory %s\n", GetWalletDir().string());
|
|
||||||
|
|
||||||
chain.initMessage(_("Verifying wallet(s)..."));
|
|
||||||
|
|
||||||
// Parameter interaction code should have thrown an error if -salvagewallet
|
|
||||||
// was enabled with more than wallet file, so the wallet_files size check
|
|
||||||
// here should have no effect.
|
|
||||||
bool salvage_wallet = gArgs.GetBoolArg("-salvagewallet", false) && wallet_files.size() <= 1;
|
|
||||||
|
|
||||||
// Keep track of each wallet absolute path to detect duplicates.
|
|
||||||
std::set<fs::path> wallet_paths;
|
|
||||||
|
|
||||||
for (const auto& wallet_file : wallet_files) {
|
|
||||||
WalletLocation location(wallet_file);
|
|
||||||
|
|
||||||
if (!wallet_paths.insert(location.GetPath()).second) {
|
|
||||||
chain.initError(strprintf(_("Error loading wallet %s. Duplicate -wallet filename specified."), wallet_file));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string error_string;
|
|
||||||
std::string warning_string;
|
|
||||||
bool verify_success = CWallet::Verify(chain, location, salvage_wallet, error_string, warning_string);
|
|
||||||
if (!error_string.empty()) chain.initError(error_string);
|
|
||||||
if (!warning_string.empty()) chain.initWarning(warning_string);
|
|
||||||
if (!verify_success) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WalletInit::Construct(InitInterfaces& interfaces) const
|
void WalletInit::Construct(InitInterfaces& interfaces) const
|
||||||
{
|
{
|
||||||
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
|
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
|
||||||
|
@ -192,52 +140,3 @@ void WalletInit::Construct(InitInterfaces& interfaces) const
|
||||||
gArgs.SoftSetArg("-wallet", "");
|
gArgs.SoftSetArg("-wallet", "");
|
||||||
interfaces.chain_clients.emplace_back(interfaces::MakeWalletClient(*interfaces.chain, gArgs.GetArgs("-wallet")));
|
interfaces.chain_clients.emplace_back(interfaces::MakeWalletClient(*interfaces.chain, gArgs.GetArgs("-wallet")));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LoadWallets(interfaces::Chain& chain, const std::vector<std::string>& wallet_files)
|
|
||||||
{
|
|
||||||
for (const std::string& walletFile : wallet_files) {
|
|
||||||
std::shared_ptr<CWallet> pwallet = CWallet::CreateWalletFromFile(chain, WalletLocation(walletFile));
|
|
||||||
if (!pwallet) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
AddWallet(pwallet);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StartWallets(CScheduler& scheduler)
|
|
||||||
{
|
|
||||||
for (const std::shared_ptr<CWallet>& pwallet : GetWallets()) {
|
|
||||||
pwallet->postInitProcess();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schedule periodic wallet flushes and tx rebroadcasts
|
|
||||||
scheduler.scheduleEvery(MaybeCompactWalletDB, 500);
|
|
||||||
scheduler.scheduleEvery(MaybeResendWalletTxs, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FlushWallets()
|
|
||||||
{
|
|
||||||
for (const std::shared_ptr<CWallet>& pwallet : GetWallets()) {
|
|
||||||
pwallet->Flush(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void StopWallets()
|
|
||||||
{
|
|
||||||
for (const std::shared_ptr<CWallet>& pwallet : GetWallets()) {
|
|
||||||
pwallet->Flush(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UnloadWallets()
|
|
||||||
{
|
|
||||||
auto wallets = GetWallets();
|
|
||||||
while (!wallets.empty()) {
|
|
||||||
auto wallet = wallets.back();
|
|
||||||
wallets.pop_back();
|
|
||||||
RemoveWallet(wallet);
|
|
||||||
UnloadWallet(std::move(wallet));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
112
src/wallet/load.cpp
Normal file
112
src/wallet/load.cpp
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
|
// Copyright (c) 2009-2018 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include <wallet/load.h>
|
||||||
|
|
||||||
|
#include <interfaces/chain.h>
|
||||||
|
#include <scheduler.h>
|
||||||
|
#include <util/system.h>
|
||||||
|
#include <wallet/wallet.h>
|
||||||
|
|
||||||
|
bool VerifyWallets(interfaces::Chain& chain, const std::vector<std::string>& wallet_files)
|
||||||
|
{
|
||||||
|
if (gArgs.IsArgSet("-walletdir")) {
|
||||||
|
fs::path wallet_dir = gArgs.GetArg("-walletdir", "");
|
||||||
|
boost::system::error_code error;
|
||||||
|
// The canonical path cleans the path, preventing >1 Berkeley environment instances for the same directory
|
||||||
|
fs::path canonical_wallet_dir = fs::canonical(wallet_dir, error);
|
||||||
|
if (error || !fs::exists(wallet_dir)) {
|
||||||
|
chain.initError(strprintf(_("Specified -walletdir \"%s\" does not exist"), wallet_dir.string()));
|
||||||
|
return false;
|
||||||
|
} else if (!fs::is_directory(wallet_dir)) {
|
||||||
|
chain.initError(strprintf(_("Specified -walletdir \"%s\" is not a directory"), wallet_dir.string()));
|
||||||
|
return false;
|
||||||
|
// The canonical path transforms relative paths into absolute ones, so we check the non-canonical version
|
||||||
|
} else if (!wallet_dir.is_absolute()) {
|
||||||
|
chain.initError(strprintf(_("Specified -walletdir \"%s\" is a relative path"), wallet_dir.string()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
gArgs.ForceSetArg("-walletdir", canonical_wallet_dir.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
LogPrintf("Using wallet directory %s\n", GetWalletDir().string());
|
||||||
|
|
||||||
|
chain.initMessage(_("Verifying wallet(s)..."));
|
||||||
|
|
||||||
|
// Parameter interaction code should have thrown an error if -salvagewallet
|
||||||
|
// was enabled with more than wallet file, so the wallet_files size check
|
||||||
|
// here should have no effect.
|
||||||
|
bool salvage_wallet = gArgs.GetBoolArg("-salvagewallet", false) && wallet_files.size() <= 1;
|
||||||
|
|
||||||
|
// Keep track of each wallet absolute path to detect duplicates.
|
||||||
|
std::set<fs::path> wallet_paths;
|
||||||
|
|
||||||
|
for (const auto& wallet_file : wallet_files) {
|
||||||
|
WalletLocation location(wallet_file);
|
||||||
|
|
||||||
|
if (!wallet_paths.insert(location.GetPath()).second) {
|
||||||
|
chain.initError(strprintf(_("Error loading wallet %s. Duplicate -wallet filename specified."), wallet_file));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string error_string;
|
||||||
|
std::string warning_string;
|
||||||
|
bool verify_success = CWallet::Verify(chain, location, salvage_wallet, error_string, warning_string);
|
||||||
|
if (!error_string.empty()) chain.initError(error_string);
|
||||||
|
if (!warning_string.empty()) chain.initWarning(warning_string);
|
||||||
|
if (!verify_success) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LoadWallets(interfaces::Chain& chain, const std::vector<std::string>& wallet_files)
|
||||||
|
{
|
||||||
|
for (const std::string& walletFile : wallet_files) {
|
||||||
|
std::shared_ptr<CWallet> pwallet = CWallet::CreateWalletFromFile(chain, WalletLocation(walletFile));
|
||||||
|
if (!pwallet) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
AddWallet(pwallet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartWallets(CScheduler& scheduler)
|
||||||
|
{
|
||||||
|
for (const std::shared_ptr<CWallet>& pwallet : GetWallets()) {
|
||||||
|
pwallet->postInitProcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Schedule periodic wallet flushes and tx rebroadcasts
|
||||||
|
scheduler.scheduleEvery(MaybeCompactWalletDB, 500);
|
||||||
|
scheduler.scheduleEvery(MaybeResendWalletTxs, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlushWallets()
|
||||||
|
{
|
||||||
|
for (const std::shared_ptr<CWallet>& pwallet : GetWallets()) {
|
||||||
|
pwallet->Flush(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StopWallets()
|
||||||
|
{
|
||||||
|
for (const std::shared_ptr<CWallet>& pwallet : GetWallets()) {
|
||||||
|
pwallet->Flush(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnloadWallets()
|
||||||
|
{
|
||||||
|
auto wallets = GetWallets();
|
||||||
|
while (!wallets.empty()) {
|
||||||
|
auto wallet = wallets.back();
|
||||||
|
wallets.pop_back();
|
||||||
|
RemoveWallet(wallet);
|
||||||
|
UnloadWallet(std::move(wallet));
|
||||||
|
}
|
||||||
|
}
|
38
src/wallet/load.h
Normal file
38
src/wallet/load.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
|
// Copyright (c) 2009-2018 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 BITCOIN_WALLET_LOAD_H
|
||||||
|
#define BITCOIN_WALLET_LOAD_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class CScheduler;
|
||||||
|
|
||||||
|
namespace interfaces {
|
||||||
|
class Chain;
|
||||||
|
} // namespace interfaces
|
||||||
|
|
||||||
|
//! 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(interfaces::Chain& chain, const std::vector<std::string>& wallet_files);
|
||||||
|
|
||||||
|
//! Load wallet databases.
|
||||||
|
bool LoadWallets(interfaces::Chain& chain, const std::vector<std::string>& wallet_files);
|
||||||
|
|
||||||
|
//! Complete startup of wallets.
|
||||||
|
void StartWallets(CScheduler& scheduler);
|
||||||
|
|
||||||
|
//! Flush all wallets in preparation for shutdown.
|
||||||
|
void FlushWallets();
|
||||||
|
|
||||||
|
//! Stop all wallets. Wallets will be flushed first.
|
||||||
|
void StopWallets();
|
||||||
|
|
||||||
|
//! Close all wallets.
|
||||||
|
void UnloadWallets();
|
||||||
|
|
||||||
|
#endif // BITCOIN_WALLET_LOAD_H
|
|
@ -35,26 +35,6 @@
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
//! 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(interfaces::Chain& chain, const std::vector<std::string>& wallet_files);
|
|
||||||
|
|
||||||
//! Load wallet databases.
|
|
||||||
bool LoadWallets(interfaces::Chain& chain, const std::vector<std::string>& wallet_files);
|
|
||||||
|
|
||||||
//! Complete startup of wallets.
|
|
||||||
void StartWallets(CScheduler& scheduler);
|
|
||||||
|
|
||||||
//! Flush all wallets in preparation for shutdown.
|
|
||||||
void FlushWallets();
|
|
||||||
|
|
||||||
//! Stop all wallets. Wallets will be flushed first.
|
|
||||||
void StopWallets();
|
|
||||||
|
|
||||||
//! Close all wallets.
|
|
||||||
void UnloadWallets();
|
|
||||||
|
|
||||||
//! Explicitly unload and delete the wallet.
|
//! Explicitly unload and delete the wallet.
|
||||||
//! Blocks the current thread after signaling the unload intent so that all
|
//! Blocks the current thread after signaling the unload intent so that all
|
||||||
//! wallet clients release the wallet.
|
//! wallet clients release the wallet.
|
||||||
|
|
Loading…
Add table
Reference in a new issue