diff options
author | furszy <matiasfurszyfer@protonmail.com> | 2022-06-03 10:46:14 -0300 |
---|---|---|
committer | furszy <matiasfurszyfer@protonmail.com> | 2022-07-18 11:29:27 -0300 |
commit | 77de5c693ffe8dc0afa5e40126e9b0e9cc547e04 (patch) | |
tree | 1388b466e79633945232cd60c8571e8aa53e2ea6 /src/wallet/wallet.h | |
parent | c395c8d6bbd0afc836eac4e58c00a816fb967104 (diff) | |
download | bitcoin-77de5c693ffe8dc0afa5e40126e9b0e9cc547e04.tar.xz |
wallet: guard and alert about a wallet invalid state during chain sync
-Context:
If `AddToWallet` db write fails, the method returns a wtx nullptr without
removing the recently added transaction from the wallet's map.
-Problem:
When a db write error occurs, `AddToWalletIfInvolvingMe` return false even
when the tx is on the wallet's map already --> which makes `SyncTransaction`
skip the `MarkInputsDirty` call --> which leads to a wallet invalid state
where the inputs of this new transaction are not marked dirty, while the
transaction that spends them still exist on the in-memory wallet tx map.
Plus, as we only store arriving transaction inside `AddToWalletIfInvolvingMe`
when we synchronize/scan blocks from the chain and nowhere else, it makes sense
to treat the tx db write error as a runtime error to notify the user about the
problem. Otherwise, the user will lose all the not stored transactions after a
wallet shutdown (without be able to recover them automatically on the next
startup because the chain sync would be above the block where the txs arrived).
Diffstat (limited to 'src/wallet/wallet.h')
-rw-r--r-- | src/wallet/wallet.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index e2c3d76438..3ebd26987b 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -505,6 +505,10 @@ public: //! @return true if wtx is changed and needs to be saved to disk, otherwise false using UpdateWalletTxFn = std::function<bool(CWalletTx& wtx, bool new_tx)>; + /** + * Add the transaction to the wallet, wrapping it up inside a CWalletTx + * @return the recently added wtx pointer or nullptr if there was a db write error. + */ CWalletTx* AddToWallet(CTransactionRef tx, const TxState& state, const UpdateWalletTxFn& update_wtx=nullptr, bool fFlushOnClose=true, bool rescanning_old_block = false); bool LoadToWallet(const uint256& hash, const UpdateWalletTxFn& fill_wtx) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); void transactionAddedToMempool(const CTransactionRef& tx, uint64_t mempool_sequence) override; |