0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-11 11:16:09 -05:00
Commit graph

3800 commits

Author SHA1 Message Date
MacroFake
7ba0850c49
Merge bitcoin/bitcoin#25036: wallet: Save wallet scan progress
230a2f4cc3 wallet test: Add unit test for wallet scan save_progress option (Ryan Ofsky)
a89ddfbe22 wallet: Save wallet scan progress (w0xlt)

Pull request description:

  Currently, the wallet scan progress is not saved.
  If it is interrupted,  it will be necessary to start from scratch on the next load.
  This PR changes this and the progress is saved right after checking a block.

  Close https://github.com/bitcoin/bitcoin/issues/25010

ACKs for top commit:
  furszy:
    re-ACK 230a2f4
  achow101:
    ACK 230a2f4cc3
  ryanofsky:
    Code review ACK 230a2f4cc3. Only change since last review is tweaking whitespace and adding log print

Tree-SHA512: 1a9dec207ed22b3443fb06a4daf967637bc02bcaf71c070b7dc33605d0cab959551e4014c9e92293a63f54c5cbcc98bb9f8844a8c60bc32a1482b1c4130fab32
2022-07-12 08:02:22 +02:00
Andrew Chow
d2ed97656b wallet: Precompute Txdata after setting PSBT inputs' UTXOs
If we are given a PSBT that is missing one or more input UTXOs, our
PrecomputedTransactionData will be incorrect and missing information
that it should otherwise have, and therefore we may not produce a
signature when we should. To avoid this problem, we can do the
precomputation after we have set the UTXOs the wallet is able to set for
the PSBT.

Also adds a test for this behavior.
2022-07-11 18:08:32 -04:00
Andrew Chow
c92eb6cda0
Merge bitcoin/bitcoin#25562: test: add tests for negative waste during coin selection
98ea43d5e9 test: add tests for negative waste during coin selection (ishaanam)

Pull request description:

  #25495 mentions that waste can be negative when the current feerate is less than the long term feerate. There are currently no waste tests for negative waste, so this PR adds two of them.

ACKs for top commit:
  achow101:
    ACK 98ea43d5e9
  glozow:
    light code review ACK 98ea43d5e9, good to have tests for negative waste

Tree-SHA512: d194d370f1257975959d3c601fea9f82c30c1aabc3e8bedc997c62659283fe681cc527e59df1a0187b3c91e8067c60374dd5ce0237561bd882edafe6a575a9b9
2022-07-11 13:11:25 -04:00
Andrew Chow
194710d8ff
Merge bitcoin/bitcoin#25481: wallet: unify max signature logic
d54c5c8b1b wallet: use CCoinControl to estimate signature size (S3RK)
a94659c84e wallet: replace GetTxSpendSize with CalculateMaximumSignedInputSize (S3RK)

Pull request description:

  Currently `DummySignTx` and `DummySignInput` use different ways to determine signature size.
  This PR unifies the way wallet estimates signature size for various inputs.
  Instead of passing boolean flags from calling code the `use_max_sig` is now calculated at the place of signature creation using information available in `CCoinControl`

ACKs for top commit:
  achow101:
    ACK d54c5c8b1b
  theStack:
    Code-review ACK d54c5c8b1b

Tree-SHA512: e790903ad4683067070aa7dbf7434a1bd142282a5bc425112e64d88d27559f1a2cd60c68d6022feaf6b845237035cb18ece10f6243d719ba28173b69bd99110a
2022-07-08 10:27:06 -04:00
furszy
111ea3ab71
wallet: refactor GetNewDestination, use BResult 2022-07-08 11:18:35 -03:00
furszy
22351725bc
send: refactor CreateTransaction flow to return a BResult<CTransactionRef> 2022-07-08 11:18:35 -03:00
furszy
198fcca162
wallet: refactor, include 'FeeCalculation' inside 'CreatedTransactionResult' 2022-07-08 11:18:35 -03:00
Andrew Chow
b9f9ed4640
Merge bitcoin/bitcoin#25337: refactor: encapsulate wallet's address book access
d69045e291 test: add coverage for 'listreceivedbyaddress' no change addrs return (furszy)
324f00a642 refactor: 'ListReceived' use optional for filtered address (furszy)
b459fc122f refactor: RPC 'ListReceived', encapsulate m_address_book access (furszy)
fa9f2ab8fd refactor: RPC 'listlabels', encapsulate 'CWallet::ListAddrBookLabels' functionality (furszy)
83e42c4b94 refactor: use 'ForEachAddrBookEntry' in RPC 'getaddressesbylabel' (furszy)
2b48642499 refactor: use ForEachAddrBookEntry in interfaces::getAddresses (furszy)
032842ae41 wallet: implement ForEachAddrBookEntry method (furszy)
09649bc95d refactor: implement general 'ListAddrBookAddresses' for addressbook destinations lookup (furszy)
192eb1e61c refactor: getAddress don't access m_address_book, use FindAddressEntry function (furszy)

Pull request description:

  ### Context

  The wallet's `m_address_book` field is being accessed directly from several places across the sources.

  ### Problem

  Code structure wise, we shouldn't be accessing it directly. It could end up being modified by mistake (from a place that has nothing to do with the wallet like an RPC command or the GUI) and cause a bigger issue: like an address book entry 'purpose' string change, which if done badly (from 'send' to 'receive'), could end up in a user sharing a "receive" address that he/she doesn't own.

  ### Solution

  Encapsulate `m_address_book` access inside the wallet.

  -------------------------------------------------------

  Extra Note:

  This is the initial step towards decoupling the address book functionality from the wallet's sources. In other words, the creation of the `AddressBookManager` (which will be coming in a follow-up PR).

ACKs for top commit:
  achow101:
    ACK d69045e291
  theStack:
    ACK d69045e291 
  w0xlt:
    ACK d69045e291

Tree-SHA512: dba17acd86f171b4e9af0223bbbcad380048570f6a2f6a92732a51f01abe8806debaf65c9e9e5569fa76a541903cbb50adcb5f56ef77858151c698ae6b218e2a
2022-07-08 10:16:08 -04:00
ishaanam
98ea43d5e9 test: add tests for negative waste during coin selection 2022-07-07 13:05:13 +05:30
furszy
47ea70fbb8
wallet: clean AllInputsMine code, use InputIsMine internally
Instead of duplicate the exact same code twice.
2022-07-06 18:04:19 -03:00
Andrew Chow
aeab1b42e6
Merge bitcoin/bitcoin#25507: wallet: don't add change fee to target if subtracting fees from output
140d942634 wallet: don't add change fee to target if subtracting fees from output (S3RK)

Pull request description:

  Change fee is payed by the recipient, so we don't need to add it to our target for coin selection.

ACKs for top commit:
  achow101:
    ACK 140d942634
  ishaanam:
    ACK 140d942634
  furszy:
    Code review ACK 140d9426

Tree-SHA512: b5efd0264c47ecee9204a3fd039bad24c69f9e614c6e1d9bb240ee5be6356b175aa074f3be123e6cfb8becd4d7bd1028eebe18801662cc69d19413d8d5a9dd5c
2022-07-06 11:01:07 -04:00
Antoine Poinsot
757216e31c
wallet: don't iter twice when getting the cached debit/credit amount
Instead of calling GetCachableAmount twice, which will result in
iterating through all the transaction txins/txouts and calling
GetDebit/GetCredit (which lock cs_wallet), just merge the filters and do
it once.
2022-07-05 15:43:09 +02:00
furszy
bf310b0e8c
wallet: clean InputIsMine code, use GetWalletTx 2022-07-05 10:10:33 -03:00
furszy
0cb177263c
wallet: unify CachedTxGetImmatureCredit and CachedTxGetImmatureWatchOnlyCredit 2022-07-05 10:10:27 -03:00
furszy
04c6423f7b
wallet: remove always true 'fUseCache' arg from CachedTxGetAvailableCredit 2022-07-05 10:10:27 -03:00
furszy
4f0ca9bff6
wallet: remove always false 'recalculate' arg from GetCachableAmount 2022-07-05 10:10:27 -03:00
furszy
47b1012677
wallet: remove always true 'fUseCache' from CachedTxGetImmatureWatchOnlyCredit 2022-07-05 10:10:27 -03:00
furszy
da8f62de2c
wallet: remove always true 'fUseCache' from CachedTxGetImmatureCredit 2022-07-05 10:10:26 -03:00
Fabian Jahr
833ce76df7
rpc, wallet: Document mempool rescan after importdescriptor, importwallet 2022-07-03 21:06:49 +02:00
Fabian Jahr
0e396d1ba7
rpc, wallet: Document mempool scan after importmulti 2022-07-03 21:06:49 +02:00
Fabian Jahr
e6d3ef8586
rpc, wallet: Document mempool scan after importpubkey 2022-07-03 21:06:49 +02:00
João Barbosa
6d3db52e66
rpc, wallet: Document and test mempool scan after importprivkey
co-authored-by: Fabian Jahr <fjahr@protonmail.com>
2022-07-03 21:06:49 +02:00
João Barbosa
3abdbbb90a
rpc, wallet: Document and test mempool scan after importaddress
co-authored-by: Fabian Jahr <fjahr@protonmail.com>
2022-07-03 21:06:49 +02:00
Fabian Jahr
236239bd40
wallet: Rescan mempool for transactions as well 2022-07-03 21:06:47 +02:00
MacroFake
c892cb7d8d
Merge bitcoin/bitcoin#25383: wallet: don't read db every time that a new 'WalletBatch' is created
c318211ddd walletdb: fix last client version update (furszy)
bda8ebe608 wallet: don't read db every time that a new WalletBatch is created (furszy)

Pull request description:

  Found it while was working on #25297.

  We are performing a db read operation every time that a new `WalletBatch` is created, inside the constructor, just to check if the client version field is inside the db or not.

  As the client version field does not change in the entire db lifecycle, this operation can be done only once: The first time that the db is accessed/opened and the client version value can be cached.

ACKs for top commit:
  achow101:
    ACK c318211ddd
  w0xlt:
    reACK c318211ddd

Tree-SHA512: 7fb780c656e169e8eb21e7212242494a647f6506d6da2cca828703713d440d29c82bec9e7d2c410f37b49361226ccd80846d3eeb8168383d0c2a11d85d73bee2
2022-06-30 18:38:20 +02:00
S3RK
140d942634 wallet: don't add change fee to target if subtracting fees from output 2022-06-30 08:55:48 +02:00
Andrew Chow
749b80b29e
Merge bitcoin/bitcoin#25497: wallet: more accurate target for large transactions
25e4762ae7 wallet: more accurate tx_noinputs_size (S3RK)

Pull request description:

  Rationale: more accurate non-input fee estimation for txs with >=253 inputs

ACKs for top commit:
  laanwj:
    Concept and code review ACK 25e4762ae7
  achow101:
    ACK 25e4762ae7
  furszy:
    Code review ACK 25e4762a. left a small nit.

Tree-SHA512: bda8fad725d32ad3e13c007fa56ddb6679ac1a32098ddb08d9a114054acfa681cb66cd703ac675297f731cb381b09067a99a4efa31320140bbdd03f0cfdc81af
2022-06-29 11:48:19 -04:00
S3RK
25e4762ae7 wallet: more accurate tx_noinputs_size 2022-06-29 09:02:20 +02:00
Murch
af56d63eca Revert "bnb: exit selection when best_waste is 0"
This reverts commit 9b5950db86.

Waste can be negative. At feerates lower than long_term_feerate this
means that a waste of 0 may be a suboptimal solution and this causes the
search to exit prematurely.
Only when the feerate is equal to the long_term_feerate would achieving
a waste of 0 indicate that we have achieved an optimal solution,
because it would mean that the excess is 0. It seems unlikely
that this would ever occur outside of test cases, and even then we
should prefer solutions with more inputs over solutions with fewer
according to previous decisions—but solutions with more inputs are found
later in the branch exploration.

The "optimization" described in #18257 and implemented in #18262 is
therefore a premature exit on a suboptimal solution and should be reverted.
2022-06-28 17:27:06 -04:00
fanquake
480d8069d7
Merge bitcoin/bitcoin#24924: bench: Make WalletLoading benchmark run faster
e673d8b475 bench: Enable loading benchmarks depending on what's compiled (Andrew Chow)
4af3547eba bench: Use mock wallet database for wallet loading benchmark (Andrew Chow)
49910f255f sqlite: Use in-memory db instead of temp for mockdb (Andrew Chow)
a1080802f8 walletdb: Create a mock database of specific type (Andrew Chow)
7c0d34476d bench: reduce the number of txs in wallet for wallet loading bench (Andrew Chow)
f85b54ed27 bench: Add transactions directly instead of mining blocks (Andrew Chow)
d94244c4bf bench: reduce number of epochs for wallet loading benchmark (Andrew Chow)
817c051364 bench: use unsafesqlitesync in wallet loading benchmark (Andrew Chow)
9e404a9831 bench: Remove minEpochIterations from wallet loading benchmark (Andrew Chow)

Pull request description:

  `minEpochIterations` is probably unnecessary to set, so removing it makes the runtime much faster.

ACKs for top commit:
  Rspigler:
    tACK e673d8b475
  furszy:
    Code review ACK e673d8b4, nice PR.
  glozow:
    Concept ACK e673d8b475. For each commit, verified that there was a performance improvement without negating the purpose of the bench, and made some effort to verify that the code is correct.

Tree-SHA512: 9337352ef846cf18642d5c14546c5abc1674b4975adb5dc961a1a276ca91f046b83b7a5e27ea6cd26264b96ae71151e14055579baf36afae7692ef4029800877
2022-06-28 18:34:10 +01:00
S3RK
d54c5c8b1b wallet: use CCoinControl to estimate signature size 2022-06-28 08:54:39 +02:00
S3RK
a94659c84e wallet: replace GetTxSpendSize with CalculateMaximumSignedInputSize 2022-06-28 08:33:40 +02:00
Andrew Chow
a73b56888a wallet: also search taproot pubkeys in FillPSBT
When filling a PSBT, we search the listed pubkeys in order to determine
whether the current DescriptorScriptPubKeyMan could sign the transaction
even if it is not watching the scripts. With Taproot, the taproot
pubkeys need to be searched as well.
2022-06-27 16:47:48 -04:00
Andrew Chow
103c6fd279 psbt: Remove non_witness_utxo for segwit v1+
If all inputs are segwit v1+, the non_witness_utxos can be removed.
2022-06-27 16:47:48 -04:00
MacroFake
fa8a1c0696
rpc: Fix Univalue push_backV OOM in listtransactions 2022-06-24 08:45:44 +02:00
Ryan Ofsky
230a2f4cc3 wallet test: Add unit test for wallet scan save_progress option 2022-06-23 17:13:40 -03:00
w0xlt
a89ddfbe22 wallet: Save wallet scan progress
Currently, the wallet scan progress is not saved.
If it is interrupted,  it will be necessary to start from
scratch on the next load.
With this change, progress is saved every 60 seconds.

Co-authored-by: furszy <matiasfurszyfer@protonmail.com>
Co-authored-by: Jon Atack <jon@atack.com>
Co-authored-by: Ryan Ofsky <ryan@ofsky.org>
2022-06-23 17:13:40 -03:00
furszy
324f00a642
refactor: 'ListReceived' use optional for filtered address
Plus remove open bracket jump line
2022-06-22 12:51:30 -03:00
furszy
b459fc122f
refactor: RPC 'ListReceived', encapsulate m_address_book access 2022-06-22 12:51:30 -03:00
furszy
fa9f2ab8fd
refactor: RPC 'listlabels', encapsulate 'CWallet::ListAddrBookLabels' functionality
Mainly to not access 'm_address_book' externally.
2022-06-22 12:51:30 -03:00
Andrew Chow
174b821e64
Merge bitcoin/bitcoin#25427: wallet: remove extra wtx lookup in AddToSpends
32e5edc0f4 wallet: avoid extra wtx lookup in AddToSpends (furszy)

Pull request description:

  As `AddToSpends` is only called from `AddToWallet` and `LoadToWallet`, places where we insert the wtx into the wallet map, we can directly feed `AddToSpends` with the `wtx` and remove another extra lookup.

ACKs for top commit:
  laanwj:
    Code review ACK 32e5edc0f4
  achow101:
    ACK 32e5edc0f4
  theStack:
    Code-review ACK 32e5edc0f4
  w0xlt:
    Code Review ACK 32e5edc0f4
  brunoerg:
    crACK 32e5edc0f4

Tree-SHA512: e9fb8df44c3e3fa26c107d261bf78e45014b4755890a64817f2be62ee6b7751f5dd2813a18dcb103a21ddba1422f9d2d59c4bf186f08314e634365d36b01be8f
2022-06-21 20:56:24 -04:00
furszy
83e42c4b94
refactor: use 'ForEachAddrBookEntry' in RPC 'getaddressesbylabel' 2022-06-21 10:23:20 -03:00
furszy
2b48642499
refactor: use ForEachAddrBookEntry in interfaces::getAddresses 2022-06-21 10:23:20 -03:00
furszy
032842ae41
wallet: implement ForEachAddrBookEntry method 2022-06-21 10:23:20 -03:00
furszy
09649bc95d
refactor: implement general 'ListAddrBookAddresses' for addressbook destinations lookup 2022-06-21 10:23:20 -03:00
furszy
32e5edc0f4
wallet: avoid extra wtx lookup in AddToSpends
This method is only called from AddToWallet and LoadToWallet,
places where we already have the wtx.
2022-06-20 14:21:57 -03:00
furszy
d338712886
scripted-diff: rename fAllowOtherInputs -> m_allow_other_inputs
-BEGIN VERIFY SCRIPT-
sed -i 's/fAllowOtherInputs/m_allow_other_inputs/g' -- $(git grep --files-with-matches 'fAllowOtherInputs')
-END VERIFY SCRIPT-
2022-06-19 20:32:51 -03:00
furszy
8dea74a8ff
refactor: use GetWalletTx in SelectCoins instead of access mapWallet 2022-06-19 20:32:51 -03:00
furszy
b4e2d4d4ee
wallet: move "use-only coinControl inputs" below the selected inputs lookup
Otherwise, RPC commands such as `walletcreatefundedpsbt` will not support the manual selection of locked, spent and externally added coins.

Full explanation is inside #25118 comments but brief summary is:

`vCoins` at `SelectCoins` time could not be containing the manually selected input because, even when they were selected by the user, the current `AvailableCoins` flow skips locked and spent coins.

Extra note: this is an intermediate step to unify the `fAllowOtherInputs`/`m_add_inputs` concepts. It will not be a problem anymore in the future when we finally decouple the wtx-outputs lookup process from `SelectCoins` and don't skip the user's manually selected coins in `AvailableCoins`.
2022-06-19 20:32:51 -03:00
furszy
25749f1df7
wallet: unify “allow/block other inputs“ concept
Seeking to make the `CoinControl` option less confusing/redundant.

In #16377 the `CoinControl` flag ‘m_add_inputs’ was added to tell the coin filtering and selection process two things:
	- Coin Filtering: Only use the provided inputs. Skip the Rest.
	- Coin Selection: Search the wtxs-outputs and append all the `CoinControl` selected outpoints to the selection result (skipping all the available output checks). Nothing else.

Meanwhile, in `CoinControl` we already have a flag ‘fAllowOtherInputs’ which is already saying:
	- Coin Filtering: Only use the provided inputs. Skip the Rest.
	- Coin Selection: If false, no selection process -> append all the `CoinControl` selected outpoints to the selection result (while they passed all the `AvailableCoins` checks and are available in the 'vCoins' vector).

As can notice, the first point in the coin filtering process is duplicated in the two option flags. And the second one, is slightly different merely because it takes into account whether the coin is on the `AvailableCoins` vector or not.
So it makes sense to merge ‘m_add_inputs’ and ‘fAllowOtherInputs’ into a single field for the coin filtering process while introduce other changes to add the missing/skipped coins into 'vCoins' vector if they were manually selected by the user (follow-up commits).
2022-06-19 20:02:35 -03:00