Private broadcast tracking #34476

issue vasild opened this issue on February 2, 2026
  1. vasild commented at 10:49 AM on February 2, 2026: contributor

    A meta issue to track the pull requests related to private broadcast

    Initial

    • 🪓 🔥 ⛔ First attempt that tried to put the transaction in the mempool (#27509)
    • 🟢 ✔️ 🥳 Implement the ability to broadcast a transaction via a short lived privacy connection and use that for the sendrawtransaction RPC (#29415)

    Followups and extensions

    Wallet

    Other

    Fixes and improvements

  2. fanquake added the label Tracking Issue on Feb 2, 2026
  3. Crypt-iQ commented at 6:32 PM on February 4, 2026: contributor

    Looks like the private broadcast changes introduced non-determinism in the process_message(s) fuzz harnesses. They re-use the same Connman across iterations, and the m_outbound_tor_ok_at_least_once may have already been flipped true by a previous iteration. The non-determinism shows up here: https://github.com/bitcoin/bitcoin/blob/d4bc620ad8cf6b7975be55d5ae27dc943cceef3f/src/net.cpp#L4066-L4071

    Ideally, this check would not be hit if private broadcast is disabled?

  4. vasild referenced this in commit 41c94739ca on Feb 5, 2026
  5. vasild commented at 8:53 AM on February 5, 2026: contributor

    non-determinism in the process_message(s) fuzz harnesses

    Addressed in https://github.com/bitcoin/bitcoin/pull/34511

  6. vasild referenced this in commit 2cb7e99dee on Feb 5, 2026
  7. vasild commented at 5:40 AM on February 7, 2026: contributor

    Added #34533 wallet: resubmit transactions with private broadcast if enabled

  8. fanquake referenced this in commit 84e826ddc1 on Feb 13, 2026
  9. instagibbs commented at 7:16 PM on April 9, 2026: member

    should CConnman::PrivateBroadcast::PickNetwork not be picking uniformly? If a user has both Tor and I2P configured, seems like it would bias you to pick from a much smaller bucket of nodes, about half the time (and you'd be announcing that you're from a much smaller anonymity set?)

  10. vasild commented at 10:01 AM on April 10, 2026: contributor

    much smaller anonymity set

    Do you mean that the number of I2P nodes on the network is less than the number of Tor nodes?

    Lets see, if both Tor and I2P are accessible, then CConnman::PrivateBroadcast::PickNetwork() will select: IPv4 peer (will connect via the Tor network), 25% of the time IPv6 peer (will connect via the Tor network), 25% of the time Tor peer, 25% of the time I2P peer, 25% of the time

    In the first 3 cases, the recipient will get an information that "Somebody with access to the Tor network is sending this transaction", that is 75% of the time. In the 4th case - "Somebody with access to the I2P network is sending this transaction", 25% of the time.

    Now, would it be better if the selection is not 25% uniform, but based on the number of entries in addrman? Wanting to do that somehow implies that the number of entries for a given network in addrman is proportional to the number of nodes from that network. E.g. if there are 100 Tor and 50 I2P entries in addrman, then the Bitcoin network has two times more Tor nodes than I2P nodes. Is that the case though? The way addrman bucketing works - it uses the first 4 bits from the address for both Tor and I2P to select a bucket to place a new address to...

    Anyway, if that is to be done, the change would be relatively small - return the set of networks from CConnman::PrivateBroadcast::PickNetwork() instead of just one network, then pass this set to AddrMan::Select() which picks a random entry and checks if it belongs to one of the given networks. That would favor networks with more entries in addrman.

    In my addrman the number of I2P entries is about 5% of the number of IPv4+IPv6+Tor+I2P entries:

    bitcoin-cli getaddrmaninfo |jq '.i2p.total / (.ipv4.total + .ipv6.total + .onion.total + .i2p.total) * 100'
    
  11. instagibbs commented at 12:29 PM on April 10, 2026: member

    but based on the number of entries in addrman?

    maybe? but that could be influenced by flooding the network with sybils, so if there's a mismatch between measured counts and known actual user counts, you'd still be exposing yourself.

  12. fanquake added the label Private Broadcast on Apr 21, 2026
  13. vasild commented at 12:27 PM on May 12, 2026: contributor
  14. vasild commented at 1:50 PM on May 18, 2026: contributor
  15. fanquake commented at 7:45 AM on May 19, 2026: member
  16. vasild commented at 11:35 AM on May 19, 2026: contributor

    #35319

    Added.

  17. fanquake commented at 3:08 PM on May 19, 2026: member
  18. vasild commented at 10:15 AM on May 20, 2026: contributor

    #35323

    Added this one as well, thanks :)

Linked (view graph)
#27509 Relay own transactions only via short-lived Tor or I2P connections#29415 Broadcast own transactions only via short-lived Tor or I2P connections#33671 wallet: Add separate balance info for non-mempool wallet txs#34267 net: avoid unconditional `privatebroadcast` logging (+ warn for debug logs)#34271 net_processing: make m_tx_for_private_broadcast optional#34300 test: use ephemeral ports in p2p_private_broadcast.py#34322 node: Persist private broadcast transactions over node restarts#34329 rpc,net: Add private broadcast RPCs#34359 test: add test for rebroadcast of transaction received via p2p#34410 test: let connections happen in any order in p2p_private_broadcast.py#34457 wallet: add private broadcast support for wallet transactions#34511 test: fully reset the state of CConnman in tests#34533 wallet: resubmit transactions with private broadcast if enabled#34646 Fix two issues in p2p_private_broadcast.py#34707 net: keep finished private broadcast txs in memory#34873 net: fix premature stale flagging of unpicked private broadcast txs#35016 net: deduplicate private broadcast state and snapshot types#35032 net_processing: don't modify addrman for private broadcast connections#35090 fuzz: add p2p_private_broadcast harness#35129 test: add fuzz test for private broadcast#35252 net: send decoy transactions via private broadcast#35267 rpc: inform if privatebroadcast is enabled in getnetworkinfo#35319 net: use the proxy if overriden when doing v2->v1 reconnections#35323 private broadcast: disallow tor connection through exit node

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-05-22 20:51 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me