Skip to content
Bitcoin Roots

v30.3-roots.1 · Commit 10: [PATCH 10/68] fix: harden Roots priority and wallet policy boundaries

src/wallet/spend.cpp

Before: src/wallet/spend.cpp · After: src/wallet/spend.cpp

File metadata
index 9524e7a0beceff13126431a188106fff6d948f34..f58d9f27ae022e4594642ffc9c633729e2e4800b 100644

Download original patch · Release notes

Diff rows 1–38 of 38. Line numbers refer to the original before/after files.

+ Added− RemovedUnmarked lines are context.

Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.

src/wallet/spend.cpp CHANGED
@@ -983,6 +983,20 @@ static bool IsCurrentForAntiFeeSniping(interfaces::Chain& chain, const uint256&
983
  return true;
984
  }
985
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
986
  void DiscourageFeeSniping(CMutableTransaction& tx, FastRandomContext& rng_fast,
987
  interfaces::Chain& chain, const uint256& block_hash, int block_height)
988
  {
@@ -1009,15 +1023,9 @@ void DiscourageFeeSniping(CMutableTransaction& tx, FastRandomContext& rng_fast,
1009
  // now we ensure code won't be written that makes assumptions about
1010
  // nLockTime that preclude a fix later.
1011
  if (IsCurrentForAntiFeeSniping(chain, block_hash)) {
1012
- tx.nLockTime = block_height;
1013
-
1014
- // Secondly occasionally randomly pick a nLockTime even further back, so
1015
- // that transactions that are delayed after signing for whatever reason,
1016
- // e.g. high-latency mix networks and some CoinJoin implementations, have
1017
- // better privacy.
1018
- if (rng_fast.randrange(10) == 0) {
1019
- tx.nLockTime = std::max(0, int(tx.nLockTime) - int(rng_fast.randrange(100)));
1020
- }
1021
  } else {
1022
  // If our chain is lagging behind, we can't discourage fee sniping nor help
1023
  // the privacy of high-latency transactions. To avoid leaking a potentially
 
983
  return true;
984
  }
985
 
986
+ uint32_t GetAntiFeeSnipingLockTime(int block_height, FastRandomContext& rng_fast)
987
+ {
988
+ uint32_t lock_time{static_cast<uint32_t>(block_height)};
989
+ if (rng_fast.randrange(10) == 0) {
990
+ lock_time = std::max(0, int(lock_time) - int(rng_fast.randrange(100)));
991
+ }
992
+ if (lock_time == PARASITE_CAT21_LOCKTIME) --lock_time;
993
+ return lock_time;
994
+ }
995
+
996
+ /**
997
+ * Set a height-based locktime for new transactions (uses the height of the
998
+ * current chain tip unless we are not synced with the current chain
999
+ */
1000
  void DiscourageFeeSniping(CMutableTransaction& tx, FastRandomContext& rng_fast,
1001
  interfaces::Chain& chain, const uint256& block_hash, int block_height)
1002
  {
 
1023
  // now we ensure code won't be written that makes assumptions about
1024
  // nLockTime that preclude a fix later.
1025
  if (IsCurrentForAntiFeeSniping(chain, block_hash)) {
1026
+ // Occasionally pick a nLockTime further back so delayed transactions do
1027
+ // not reveal a unique fingerprint. Avoid values reserved by local policy.
1028
+ tx.nLockTime = GetAntiFeeSnipingLockTime(block_height, rng_fast);
 
 
 
 
 
 
1029
  } else {
1030
  // If our chain is lagging behind, we can't discourage fee sniping nor help
1031
  // the privacy of high-latency transactions. To avoid leaking a potentially