mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 07:09:15 +01:00
[wallet] randomly generate change targets
If the wallet always chooses 1 million sats as its change target, it is easier to fingerprint transactions created by the Core wallet.
This commit is contained in:
@@ -19,6 +19,8 @@
|
||||
#include <wallet/transaction.h>
|
||||
#include <wallet/wallet.h>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
using interfaces::FoundBlock;
|
||||
|
||||
namespace wallet {
|
||||
@@ -395,9 +397,11 @@ std::optional<SelectionResult> AttemptSelection(const CWallet& wallet, const CAm
|
||||
results.push_back(*knapsack_result);
|
||||
}
|
||||
|
||||
// We include the minimum final change for SRD as we do want to avoid making really small change.
|
||||
// KnapsackSolver does not need this because it includes MIN_CHANGE internally.
|
||||
const CAmount srd_target = nTargetValue + coin_selection_params.m_change_fee + MIN_FINAL_CHANGE;
|
||||
// Include change for SRD as we want to avoid making really small change if the selection just
|
||||
// barely meets the target. Just use the lower bound change target instead of the randomly
|
||||
// generated one, since SRD will result in a random change amount anyway; avoid making the
|
||||
// target needlessly large.
|
||||
const CAmount srd_target = nTargetValue + coin_selection_params.m_change_fee + CHANGE_LOWER;
|
||||
if (auto srd_result{SelectCoinsSRD(positive_groups, srd_target, coin_selection_params.rng_fast)}) {
|
||||
srd_result->ComputeAndSetWaste(coin_selection_params.m_cost_of_change);
|
||||
results.push_back(*srd_result);
|
||||
@@ -681,6 +685,7 @@ static bool CreateTransactionInternal(
|
||||
coin_selection_params.m_subtract_fee_outputs = true;
|
||||
}
|
||||
}
|
||||
coin_selection_params.m_change_target = GenerateChangeTarget(std::floor(recipients_sum / vecSend.size()), rng_fast);
|
||||
|
||||
// Create change script that will be used if we need change
|
||||
CScript scriptChange;
|
||||
|
||||
Reference in New Issue
Block a user