This adds the "white noise" proposed in part 2 of my CCS. This also moves monerod closer to Dandelion++ (there is some code that can be shared between the features). Unfortunately, this does not complete part 2 of the CCS, one of the proposed goals was a separate mempool (also needed for Dandelion++). That will be in a hopefully soon-to-be-released patch - hacking the mempool is worthy of its own review. Also, the timestamp in the p2p protocol hasn't been cleared up (not strictly necessary for the CCS).
Completing Dandelion++ will now require:A separate mempool (in the works for my CCS) Loop detection (basically completed with the separate mempool) Support for sending txs in a stem Moving from a "flood" to a "fluff" implementation (see whitepaper and/or Bitcoin implementation).
The last two should be vastly easier to implement after this patch. The stem portion in particular is basically implemented and unit tested - only plumbing between parts is now needed. Anyone wishing to pick this up, see tests/unit_tests/levin.cpp, the test framework should make it easy to test stem selection, etc.byte_slice
I also introduced a golang-like "slice" concept for bytes of data so that the "white noise" could be reference-count bumped instead of constantly copied for each connection. It also made it possible to remove a lock for every p2p message being sent. I haven't measured it, buts its all but certain to improve efficiency in tx relaying and eventually block relaying (each p2p message is generated once instead of copied repeatedly).Changes from CCS
This patch also differs from the proposal in the CCS and my Monerokon talk. Another markdown file may be needed but -Two outbound I2P/Tor connections are selected for white noise every 5 minutes A 3 KiB dummy message or tx fragment is sent every 10-15 seconds over these links An I2P/Tor hidden service that receives a tx immediately relays it over the public network instead ...