mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-29 14:59:39 -04:00
wallet: provide WalletBatch to 'SetupDescriptorScriptPubKeyMans'
So it can be used within an external db txn context.
This commit is contained in:
parent
34bf0795fc
commit
9ef20e86d7
2 changed files with 12 additions and 16 deletions
|
@ -3747,25 +3747,17 @@ DescriptorScriptPubKeyMan& CWallet::SetupDescriptorScriptPubKeyMan(WalletBatch&
|
||||||
return *out;
|
return *out;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::SetupDescriptorScriptPubKeyMans(const CExtKey& master_key)
|
void CWallet::SetupDescriptorScriptPubKeyMans(WalletBatch& batch, const CExtKey& master_key)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
|
|
||||||
// Create single batch txn
|
|
||||||
WalletBatch batch(GetDatabase());
|
|
||||||
if (!batch.TxnBegin()) throw std::runtime_error("Error: cannot create db transaction for descriptors setup");
|
|
||||||
|
|
||||||
for (bool internal : {false, true}) {
|
for (bool internal : {false, true}) {
|
||||||
for (OutputType t : OUTPUT_TYPES) {
|
for (OutputType t : OUTPUT_TYPES) {
|
||||||
SetupDescriptorScriptPubKeyMan(batch, master_key, t, internal);
|
SetupDescriptorScriptPubKeyMan(batch, master_key, t, internal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure information is committed to disk
|
|
||||||
if (!batch.TxnCommit()) throw std::runtime_error("Error: cannot commit db transaction for descriptors setup");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::SetupOwnDescriptorScriptPubKeyMans()
|
void CWallet::SetupOwnDescriptorScriptPubKeyMans(WalletBatch& batch)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
assert(!IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER));
|
assert(!IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER));
|
||||||
|
@ -3778,7 +3770,7 @@ void CWallet::SetupOwnDescriptorScriptPubKeyMans()
|
||||||
CExtKey master_key;
|
CExtKey master_key;
|
||||||
master_key.SetSeed(seed_key);
|
master_key.SetSeed(seed_key);
|
||||||
|
|
||||||
SetupDescriptorScriptPubKeyMans(master_key);
|
SetupDescriptorScriptPubKeyMans(batch, master_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::SetupDescriptorScriptPubKeyMans()
|
void CWallet::SetupDescriptorScriptPubKeyMans()
|
||||||
|
@ -3786,7 +3778,10 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
|
|
||||||
if (!IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER)) {
|
if (!IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER)) {
|
||||||
SetupOwnDescriptorScriptPubKeyMans();
|
if (!RunWithinTxn(GetDatabase(), /*process_desc=*/"setup descriptors", [&](WalletBatch& batch) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet){
|
||||||
|
SetupOwnDescriptorScriptPubKeyMans(batch);
|
||||||
|
return true;
|
||||||
|
})) throw std::runtime_error("Error: cannot process db transaction for descriptors setup");
|
||||||
} else {
|
} else {
|
||||||
ExternalSigner signer = ExternalSignerScriptPubKeyMan::GetExternalSigner();
|
ExternalSigner signer = ExternalSignerScriptPubKeyMan::GetExternalSigner();
|
||||||
|
|
||||||
|
@ -4113,12 +4108,13 @@ util::Result<void> CWallet::ApplyMigrationData(MigrationData& data)
|
||||||
// Setup new descriptors
|
// Setup new descriptors
|
||||||
SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
|
SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
|
||||||
if (!IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
if (!IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
||||||
|
WalletBatch local_wallet_batch(GetDatabase());
|
||||||
// Use the existing master key if we have it
|
// Use the existing master key if we have it
|
||||||
if (data.master_key.key.IsValid()) {
|
if (data.master_key.key.IsValid()) {
|
||||||
SetupDescriptorScriptPubKeyMans(data.master_key);
|
SetupDescriptorScriptPubKeyMans(local_wallet_batch, data.master_key);
|
||||||
} else {
|
} else {
|
||||||
// Setup with a new seed if we don't.
|
// Setup with a new seed if we don't.
|
||||||
SetupOwnDescriptorScriptPubKeyMans();
|
SetupOwnDescriptorScriptPubKeyMans(local_wallet_batch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1022,11 +1022,11 @@ public:
|
||||||
//! Create new DescriptorScriptPubKeyMan and add it to the wallet
|
//! Create new DescriptorScriptPubKeyMan and add it to the wallet
|
||||||
DescriptorScriptPubKeyMan& SetupDescriptorScriptPubKeyMan(WalletBatch& batch, const CExtKey& master_key, const OutputType& output_type, bool internal) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
DescriptorScriptPubKeyMan& SetupDescriptorScriptPubKeyMan(WalletBatch& batch, const CExtKey& master_key, const OutputType& output_type, bool internal) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
//! Create new DescriptorScriptPubKeyMans and add them to the wallet
|
//! Create new DescriptorScriptPubKeyMans and add them to the wallet
|
||||||
void SetupDescriptorScriptPubKeyMans(const CExtKey& master_key) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void SetupDescriptorScriptPubKeyMans(WalletBatch& batch, const CExtKey& master_key) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
void SetupDescriptorScriptPubKeyMans() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void SetupDescriptorScriptPubKeyMans() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|
||||||
//! Create new seed and default DescriptorScriptPubKeyMans for this wallet
|
//! Create new seed and default DescriptorScriptPubKeyMans for this wallet
|
||||||
void SetupOwnDescriptorScriptPubKeyMans() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void SetupOwnDescriptorScriptPubKeyMans(WalletBatch& batch) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|
||||||
//! Return the DescriptorScriptPubKeyMan for a WalletDescriptor if it is already in the wallet
|
//! Return the DescriptorScriptPubKeyMan for a WalletDescriptor if it is already in the wallet
|
||||||
DescriptorScriptPubKeyMan* GetDescriptorScriptPubKeyMan(const WalletDescriptor& desc) const;
|
DescriptorScriptPubKeyMan* GetDescriptorScriptPubKeyMan(const WalletDescriptor& desc) const;
|
||||||
|
|
Loading…
Add table
Reference in a new issue