Commit graph

143 commits

Author SHA1 Message Date
Byron Hambly
f7b03ad72e
Merge 1abbae65eb into merged_master (Bitcoin PR bitcoin/bitcoin#24584)
This should be reviewed carefully. The new availablecoins_test was
showing an intermittent error [1]. The test variants were split out into
their own test cases to work around the issue, but requires further
investigation.

[1]: https://github.com/ElementsProject/elements/issues/1370
2024-10-24 12:08:44 +02:00
James Dorfman
e22bfb3011 Merge 316afb1eca into merged_master (Bitcoin PR bitcoin/bitcoin#25218) 2024-10-16 04:56:53 +00:00
James Dorfman
a20940b37c Merge 194710d8ff into merged_master (Bitcoin PR bitcoin/bitcoin#25481)
Please reviewthis commit *extremely thoroughly*.

This commit changed how certain transaction size calculations are done.
This altered fee estiimation for certain elements transactions, and caused a lot
of things to break in the `wallet_bumpfee` functional test.

After *extensive* work (~10 hours), I managed to figure all this out and properly
reconcile the functional test to work with the new fee calculations.

However, the original bitcoin commit didn't have any changes to this functional test.
So, it's also simply possible that I may have made an actual bug and these fee issues
I was seeing in the functional test were pointing at this bug.

I'm not sure if there is a bug. I don't think so... I think the transaction estimations just got
bigger in certain cases.

But... please verify this. Look into the diff of this commit, and compare how use_max_sig used
to be calculated in a bunch of different ways for different use cases, but is now being calculated
only once (inside of DummySignInput), in the same way for all use cases. Did I accidentally introduce
a bug there?

In other words... I'm not certain about the wallet changes here. Please double and triple check them.
Thanks!
2024-10-15 06:42:26 +00:00
James Dorfman
57eeedb7f8 Merge aeab1b42e6 into merged_master (Bitcoin PR bitcoin/bitcoin#25507) 2024-10-10 04:19:35 +00:00
James Dorfman
68fa880581 Merge 749b80b29e into merged_master (Bitcoin PR bitcoin/bitcoin#25497) 2024-09-19 19:16:40 +00:00
James Dorfman
034a29075f Merge bc28ca3afb into merged_master (Bitcoin PR bitcoin/bitcoin#25118)
Please review this commit carefully. It touched wallet code.
2024-09-16 03:30:10 +00:00
James Dorfman
12817e2b14 Merge 8e7eeb5971 into merged_master (Bitcoin PR bitcoin/bitcoin#25410) 2024-09-15 22:03:13 +00:00
James Dorfman
8ebf20fe8e Merge 8be652e439 into merged_master (Bitcoin PR bitcoin/bitcoin#25005)
These changes affect the wallet. Please double check them, since I'm not
confident that I merged them correctly.
2024-09-15 22:01:42 +00:00
James Dorfman
45829a8913 Merge b0c8306349 into merged_master (Bitcoin PR bitcoin/bitcoin#24649)
I commented out a new assertion on transaction size in test/functional/rpc_fundrawtransaction.py.
That calculation needs to be updated to work properly for elements.
2024-09-10 23:49:39 +00:00
James Dorfman
f252fd965a Merge a0e8aff605 into merged_master (Bitcoin PR bitcoin/bitcoin#25003) 2024-09-06 16:05:55 +00:00
James Dorfman
0be947179f Fix failing unit + functional tests for merge of bitcoin/bitcoin#25083 (the previous commit) 2024-09-06 05:18:08 +00:00
James Dorfman
57830cb012 Merge 3368f84c43 into merged_master (Bitcoin PR bitcoin/bitcoin#25083)
I'm not certain about the elements-specific changes to the `COutput`
constructor in src/wallet/coinselection.cpp. Please double check those.
2024-08-20 03:56:11 +00:00
James Dorfman
16f007177a Merge 1ab389b1ba into merged_master (Bitcoin PR bitcoin/bitcoin#20640)
This was a tricky merge (wallet refactor). Please double check my
changes to CreateTransactionInternal(...) in src/wallet/spend.cpp, and to
SendGenerationTransaction(...) in src/wallet/rpc/elements.cpp.

Lastly, I got all the tests passing, but I'm not certain that the changes
with fixed_change_pos in CreateTransactionInternal were correct.
2024-08-13 03:26:28 +00:00
James Dorfman
249473e319 Merge 260ede1d99 into merged_master (Bitcoin PR bitcoin/bitcoin#24644) 2024-08-02 20:43:21 +00:00
James Dorfman
b3a377c2d0 Merge 0da559e02e into merged_master (Bitcoin PR bitcoin/bitcoin#24661) 2024-07-08 15:17:32 +00:00
James Dorfman
9c1d4cc8ff Merge a4d7ac7bbe into merged_master (Elements PR #1317) 2024-05-24 16:13:46 +00:00
James Dorfman
77b849f4c6 Merge 20c5630f8c into merged_master (Elements PR #1277) 2024-05-24 06:39:06 +00:00
Byron Hambly
52962c16c9
discount: allow wallet to create discount txs 2024-05-14 19:03:37 +02:00
James Dorfman
641df02a8d Merge 6d5771ba07 into merged_master (Bitcoin PR bitcoin/bitcoin#24494)
Please review carefully: this touches the wallet code, and I'm not sure
I adapted the new change metrics to work correctly for multi-asset.
2024-04-10 05:12:50 +00:00
James Dorfman
17d45cdb7d Merge 3740cdd125 into merged_master (Bitcoin PR bitcoin/bitcoin#24091) 2024-03-19 06:35:30 +00:00
James Dorfman
cc32b91393 Merge 3ab96f2945 into merged_master (Bitcoin PR bitcoin/bitcoin#24560) 2024-01-11 16:36:11 +00:00
goatpig
2e7125c3c8
fix: assert failure on non-policy asset consolidation in CreateTransactionInternal
Squash of 2 commits from https://github.com/ElementsProject/elements/pull/1258

- correct application of non_policy_effective_value to policy output in KnapsackSolver
- replace bad fee amount assert with error log and graceful failure in CWallet::CreateTransactionInternal

(cherry picked from commit 0f92a38254)

Update src/wallet/coinselection.cpp

Co-authored-by: Byron Hambly <byron@hambly.dev>
(cherry picked from commit cf0f56107b)
2023-10-18 16:30:41 +02:00
James Dorfman
3f110a3fe4 Merge 28bdaa3f76 into merged_master (Bitcoin PR bitcoin/bitcoin#24080) 2023-10-15 22:22:18 +00:00
Byron Hambly
40e776c576 Merge c109e7d51c into merged_master (Bitcoin PR bitcoin/bitcoin#24530) 2023-10-14 17:11:39 +00:00
James Dorfman
8783a30631
build: fix further ASAN issues in CI 2023-09-06 15:03:51 +02:00
James Dorfman
6a42ca5f74 Remove unused mapValueFromPresetInputs variable from src/wallet/spend.cpp.
This variable was rendered unused in the merge of bitcoin/bitcoin#22019 in e3ab195851.
2023-07-24 17:50:33 +00:00
Byron Hambly
0e89b30f95 Merge 8add59d77d into merged_master (Bitcoin PR bitcoin/bitcoin#24367) 2023-07-02 07:33:56 +00:00
Byron Hambly
4e5e47d2d5 Merge 5f4c07b799 into merged_master (Bitcoin PR bitcoin/bitcoin#24136) 2023-06-29 13:43:18 +00:00
Byron Hambly
ccd7b72d79 Merge e30b6ea194 into merged_master (Bitcoin PR bitcoin/bitcoin#24067) 2023-06-28 14:48:32 +00:00
Byron Hambly
7d759da52a Merge b94d0c7af1 into merged_master (Bitcoin PR bitcoin/bitcoin#23201)
This merge was a bit tricky, since in Elements the witnesses are not
part of the transaction inputs themselves. This merge should be reviewed
carefully.
2023-06-28 14:15:53 +00:00
Byron Hambly
7878ba47b9 Merge c561f2f06e into merged_master (Bitcoin PR bitcoin/bitcoin#23497) 2023-06-19 09:28:31 +00:00
James Dorfman
b016786156 Merge 80ceede7a0 into merged_master (Bitcoin PR bitcoin/bitcoin#23884) 2023-06-15 20:23:35 +00:00
Byron Hambly
e3ab195851 Merge c840ab0231 into merged_master (Bitcoin PR bitcoin/bitcoin#22019)
This was a complicated merge that had to be modified from upstream to work with multi-assets,
so it should be reviewed carefully
2023-06-12 12:36:04 +00:00
Byron Hambly
45b24f58ab Merge 99e53967c8 into merged_master (Bitcoin PR bitcoin/bitcoin#23188) 2023-05-10 11:54:27 +00:00
Byron Hambly
498907a233 Merge 816e15ee81 into merged_master (Bitcoin PR bitcoin/bitcoin#22951) 2023-05-09 11:50:39 +00:00
James Dorfman
987fab2c05 Merge 573b4621cc into merged_master (Bitcoin PR bitcoin/bitcoin#17211) 2023-05-09 05:36:15 +00:00
James Dorfman
a28e1a34b5 Merge d5d0a5c604 into merged_master (Bitcoin PR bitcoin/bitcoin#17526) 2023-04-26 04:23:36 +00:00
James Dorfman
103069c46c fixes for Bitcoin PR bitcoin/bitcoin#22100
comments out one failing assertion in wallet_tests unit test
and one failing assertion in rpc_fundrawtransaction.py
2023-04-20 12:27:33 +00:00
James Dorfman
3e939cca81 Merge 629c4ab2e3 into merged_master (Bitcoin PR bitcoin/bitcoin#22100) 2023-04-14 06:13:01 +00:00
Byron Hambly
0ead54fdc7 Merge 70676e40d8 into merged_master (Bitcoin PR bitcoin/bitcoin#22009) 2023-04-12 20:36:48 +00:00
Byron Hambly
a20c67310c Merge b1a672d158 into merged_master (Bitcoin PR bitcoin/bitcoin#22337) 2023-04-07 11:57:51 +00:00
Andrew Poelstra
e5e3ec2700
wallet: account for issuances during coin selection
Prior to coin selection we need to indicate that the issuances will take
extra space, otherwise we may fail to select enough coins to cover our
fees, triggering the new "fee needed exceeds fees available" assertion.
2022-09-22 13:20:29 +00:00
Andrew Poelstra
79fd90f064
wallet: extend fix to "dropped change is the last blinded output" case 2022-09-20 21:17:47 +00:00
Andrew Poelstra
fac694be4c
wallet: don't clear out all the blinding data when dropping change
The Elements 22 blinding logic has an edge case where when we drop change,
leaving only a single blinded output, we recompute a bunch of blinding
data to handle the potential for us to have 0 inputs and 1 output to blind.
(BlindTransaction will fail in this case because it cannot make the
transaction balance with only one output to mess with.)

In this recomputation, we dropped more data than we meant to, causing us
to incorrectly blind an output.
2022-09-20 17:40:47 +00:00
Andrew Poelstra
23e91d0ef8
wallet: fix some fee calculation bugs
First, this reverts commit ca2d72ae8b to reinstate
an assertion that was added in Bitcoin #22686. It did not compile because our
`change_and_fee` variable is a map rather than number; I changed it to use
`map_change_and_fee.at(policyAsset)` to match the equivalent change 2 lines down
from a5d97b363b (merge of Bitcoin #22008).

Then fix the following bugs:

1. Change the new test in rpc_fundrawtransaction.py to bump the -maxtxfee value,
   which we'd otherwise exceed, failing the test and masking actual failures.
   (This was just caused by the extreme fee settings of the test combined with
   Elements' large transactions.)
2. Change the fee-output size estimation for `tx_noinputs_size` to be 46 rather
   than 44 bytes; we forgot that even null surjection/rangeproofs need a 0 byte
   when output witnesses are present. This mistake triggered the new assertion.
3. Correct the logic in which change outputs are sometimes dropped even when
   they are the only blinded output in a transaction with blinded inputs. This
   would cause the new test to fail with `bad-txn-inputs-ne-outputs`; I'm very
   surprised that no existing tests hit this.

   (I have an existing comment block in this code where I "promise" that I had
   a good reason for doing something mysterious related to blinding. I was not
   able to reverse-engineer my intention here, though I think it is related to
   this, but since I couldn't understand it I just left this block intact and
   worked around it.)
4. This then triggered the assertion again since the coin selection code
   assumes that sufficiently-small change will always be dropped. If we prevent
   this drop we will have under-funded the transaction.

   To fix this we add Yet Another Flag `may_need_blinded_dummy` in which we add
   extra weight to `tx_noinputs_size` in the case that we're doing a blinded tx
   but have no blind destinations. We turn this off after coin selection if it
   turns out that we don't have any blinded inputs, though ofc at that point
   much of the damage/inefficiency has already been done..
5. Fix some constants in other functional tests which assumed precise fee
   calculations; these precise values changed because of fixes (2) and (4).

There is one new FIXME, which is that the "dummy change" value will now be a
zero-valued OP_RETURN but we still put a full-size rangeproof and surjection
proof on it. There is some plausible privacy benefit to this but not much,
and wasting 5000+ bytes rather than the ~65 needed for an exact-value proof
is not worth it. We will fix this in the future when we overhaul the wallet
blinding logic.
2022-09-20 17:39:24 +00:00
Glenn Willen
2273079c45
elements: Fix build by removing newly-added assertion from upstream that doesn't make sense with assets 2022-09-20 17:38:44 +00:00
Andrew Chow
dfc3e891d7
wallet: Assert that enough was selected to cover the fees
When the fee is not subtracted from the outputs, the amount that has
been reserved for the fee (change_and_fee - change_amount) must be
enough to cover the fee that is needed. It would be a bug to not do so,
so use an assert to make this obvious if such a situation were to occur.

Github-Pull: bitcoin/bitcoin#22686
Rebased-From: d9262324e8
2022-09-20 17:38:44 +00:00
josibake
438e04845b
wallet: run coin selection by OutputType
Run coin selection on each OutputType separately, choosing the best
solution according to the waste metric.

This is to avoid mixing UTXOs that are of different OutputTypes,
which can hurt privacy.

If no single OutputType can fund the transaction, then coin selection
considers the entire wallet, potentially mixing (current behavior).

This is done inside AttemptSelection so that all OutputTypes are
considered at each back-off in coin selection.
2022-07-19 18:42:15 +02:00
josibake
77b0707206
refactor: use CoinsResult struct in SelectCoins
Pass the whole CoinsResult struct to SelectCoins instead of only a
vector. This means we now have to remove preselected coins from each
OutputType vector and shuffle each vector individually.

Pass the whole CoinsResult struct to AttemptSelection. This involves
moving the logic in AttemptSelection to a newly named function,
ChooseSelectionResult. This will allow us to run ChooseSelectionResult
over each OutputType in a later commit. This ensures the backoffs work
properly.

Update unit and bench tests to use CoinResult.
2022-07-19 15:30:57 +02:00
josibake
2e67291ca3
refactor: store by OutputType in CoinsResult
Store COutputs by OutputType in CoinsResult.

The struct stores vectors of `COutput`s by `OutputType`
for more convenient access
2022-07-19 15:30:57 +02:00