mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-05 14:06:27 -05:00
refactor: Add CWallet:::AttachChain method
This commit does not change behavior, it just moves code from CWallet::CreateWalletFromFile to CWallet:::AttachChain so it can be updated in the next commit. This commit is most easily reviewed with "git diff -w --color-moved=dimmed_zebra" or by diffing CWallet:::AttachChain against the previous code with an external diff tool.
This commit is contained in:
parent
e2a47ce085
commit
44c430ffac
2 changed files with 45 additions and 24 deletions
|
@ -4089,6 +4089,35 @@ std::shared_ptr<CWallet> CWallet::Create(interfaces::Chain& chain, const std::st
|
||||||
|
|
||||||
LOCK(walletInstance->cs_wallet);
|
LOCK(walletInstance->cs_wallet);
|
||||||
|
|
||||||
|
if (!AttachChain(walletInstance, chain, error, warnings)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
LOCK(cs_wallets);
|
||||||
|
for (auto& load_wallet : g_load_wallet_fns) {
|
||||||
|
load_wallet(interfaces::MakeWallet(walletInstance));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
walletInstance->SetBroadcastTransactions(gArgs.GetBoolArg("-walletbroadcast", DEFAULT_WALLETBROADCAST));
|
||||||
|
|
||||||
|
{
|
||||||
|
walletInstance->WalletLogPrintf("setKeyPool.size() = %u\n", walletInstance->GetKeyPoolSize());
|
||||||
|
walletInstance->WalletLogPrintf("mapWallet.size() = %u\n", walletInstance->mapWallet.size());
|
||||||
|
walletInstance->WalletLogPrintf("m_address_book.size() = %u\n", walletInstance->m_address_book.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
return walletInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWallet::AttachChain(const std::shared_ptr<CWallet>& walletInstance, interfaces::Chain& chain, bilingual_str& error, std::vector<bilingual_str>& warnings)
|
||||||
|
{
|
||||||
|
LOCK(walletInstance->cs_wallet);
|
||||||
|
// allow setting the chain if it hasn't been set already but prevent changing it
|
||||||
|
assert(!walletInstance->m_chain || walletInstance->m_chain == &chain);
|
||||||
|
walletInstance->m_chain = &chain;
|
||||||
|
|
||||||
// Register wallet with validationinterface. It's done before rescan to avoid
|
// Register wallet with validationinterface. It's done before rescan to avoid
|
||||||
// missing block connections between end of rescan and validation subscribing.
|
// missing block connections between end of rescan and validation subscribing.
|
||||||
// Because of wallet lock being hold, block connection notifications are going to
|
// Because of wallet lock being hold, block connection notifications are going to
|
||||||
|
@ -4122,21 +4151,21 @@ std::shared_ptr<CWallet> CWallet::Create(interfaces::Chain& chain, const std::st
|
||||||
|
|
||||||
if (tip_height && *tip_height != rescan_height)
|
if (tip_height && *tip_height != rescan_height)
|
||||||
{
|
{
|
||||||
// We can't rescan beyond non-pruned blocks, stop and throw an error.
|
|
||||||
// This might happen if a user uses an old wallet within a pruned node
|
|
||||||
// or if they ran -disablewallet for a longer time, then decided to re-enable
|
|
||||||
if (chain.havePruned()) {
|
if (chain.havePruned()) {
|
||||||
// Exit early and print an error.
|
|
||||||
// If a block is pruned after this check, we will load the wallet,
|
|
||||||
// but fail the rescan with a generic error.
|
|
||||||
int block_height = *tip_height;
|
int block_height = *tip_height;
|
||||||
while (block_height > 0 && chain.haveBlockOnDisk(block_height - 1) && rescan_height != block_height) {
|
while (block_height > 0 && chain.haveBlockOnDisk(block_height - 1) && rescan_height != block_height) {
|
||||||
--block_height;
|
--block_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rescan_height != block_height) {
|
if (rescan_height != block_height) {
|
||||||
|
// We can't rescan beyond non-pruned blocks, stop and throw an error.
|
||||||
|
// This might happen if a user uses an old wallet within a pruned node
|
||||||
|
// or if they ran -disablewallet for a longer time, then decided to re-enable
|
||||||
|
// Exit early and print an error.
|
||||||
|
// If a block is pruned after this check, we will load the wallet,
|
||||||
|
// but fail the rescan with a generic error.
|
||||||
error = _("Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)");
|
error = _("Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)");
|
||||||
return nullptr;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4158,29 +4187,14 @@ std::shared_ptr<CWallet> CWallet::Create(interfaces::Chain& chain, const std::st
|
||||||
WalletRescanReserver reserver(*walletInstance);
|
WalletRescanReserver reserver(*walletInstance);
|
||||||
if (!reserver.reserve() || (ScanResult::SUCCESS != walletInstance->ScanForWalletTransactions(chain.getBlockHash(rescan_height), rescan_height, {} /* max height */, reserver, true /* update */).status)) {
|
if (!reserver.reserve() || (ScanResult::SUCCESS != walletInstance->ScanForWalletTransactions(chain.getBlockHash(rescan_height), rescan_height, {} /* max height */, reserver, true /* update */).status)) {
|
||||||
error = _("Failed to rescan the wallet during initialization");
|
error = _("Failed to rescan the wallet during initialization");
|
||||||
return nullptr;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
walletInstance->chainStateFlushed(chain.getTipLocator());
|
walletInstance->chainStateFlushed(chain.getTipLocator());
|
||||||
walletInstance->GetDatabase().IncrementUpdateCounter();
|
walletInstance->GetDatabase().IncrementUpdateCounter();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
return true;
|
||||||
LOCK(cs_wallets);
|
|
||||||
for (auto& load_wallet : g_load_wallet_fns) {
|
|
||||||
load_wallet(interfaces::MakeWallet(walletInstance));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
walletInstance->SetBroadcastTransactions(gArgs.GetBoolArg("-walletbroadcast", DEFAULT_WALLETBROADCAST));
|
|
||||||
|
|
||||||
{
|
|
||||||
walletInstance->WalletLogPrintf("setKeyPool.size() = %u\n", walletInstance->GetKeyPoolSize());
|
|
||||||
walletInstance->WalletLogPrintf("mapWallet.size() = %u\n", walletInstance->mapWallet.size());
|
|
||||||
walletInstance->WalletLogPrintf("m_address_book.size() = %u\n", walletInstance->m_address_book.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
return walletInstance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const CAddressBookData* CWallet::FindAddressBookEntry(const CTxDestination& dest, bool allow_change) const
|
const CAddressBookData* CWallet::FindAddressBookEntry(const CTxDestination& dest, bool allow_change) const
|
||||||
|
|
|
@ -763,6 +763,13 @@ private:
|
||||||
|
|
||||||
bool CreateTransactionInternal(const std::vector<CRecipient>& vecSend, CTransactionRef& tx, CAmount& nFeeRet, int& nChangePosInOut, bilingual_str& error, const CCoinControl& coin_control, FeeCalculation& fee_calc_out, bool sign);
|
bool CreateTransactionInternal(const std::vector<CRecipient>& vecSend, CTransactionRef& tx, CAmount& nFeeRet, int& nChangePosInOut, bilingual_str& error, const CCoinControl& coin_control, FeeCalculation& fee_calc_out, bool sign);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Catch wallet up to current chain, scanning new blocks, updating the best
|
||||||
|
* block locator and m_last_block_processed, and registering for
|
||||||
|
* notifications about new blocks and transactions.
|
||||||
|
*/
|
||||||
|
static bool AttachChain(const std::shared_ptr<CWallet>& wallet, interfaces::Chain& chain, bilingual_str& error, std::vector<bilingual_str>& warnings);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Main wallet lock.
|
* Main wallet lock.
|
||||||
|
|
Loading…
Add table
Reference in a new issue