bitcoin/src
W. J. van der Laan 5c4f0c4d46
Merge bitcoin/bitcoin#21261: p2p: update inbound eviction protection for multiple networks, add I2P peers
1b1088d52f test: add combined I2P/onion/localhost eviction protection tests (Jon Atack)
7c2284eda2 test: add tests for inbound eviction protection of I2P peers (Jon Atack)
ce02dd1ef1 p2p: extend inbound eviction protection by network to I2P peers (Jon Atack)
70bbc62711 test: add combined onion/localhost eviction protection coverage (Jon Atack)
045cb40192 p2p: remove unused m_is_onion member from NodeEvictionCandidate struct (Jon Atack)
310fab4928 p2p: remove unused CompareLocalHostTimeConnected() (Jon Atack)
9e889e8a5c p2p: remove unused CompareOnionTimeConnected() (Jon Atack)
787d46bb2a p2p: update ProtectEvictionCandidatesByRatio() doxygen docs (Jon Atack)
1e15acf478 p2p: make ProtectEvictionCandidatesByRatio() fully ratio-based (Jon Atack)
3f8105c4d2 test: remove combined onion/localhost eviction protection tests (Jon Atack)
38a81a8e20 p2p: add CompareNodeNetworkTime() comparator struct (Jon Atack)
4ee7aec47e p2p: add m_network to NodeEvictionCandidate struct (Jon Atack)
7321e6f2fe p2p, refactor: rename vEvictionCandidates to eviction_candidates (Jon Atack)
ec590f1d91 p2p, refactor: improve constness in ProtectEvictionCandidatesByRatio() (Jon Atack)
4a19f501ab test: add ALL_NETWORKS to test utilities (Jon Atack)
519e76bb64 test: speed up and simplify peer_eviction_test (Jon Atack)
1cde800523 p2p, refactor: rm redundant erase_size calculation in SelectNodeToEvict() (Jon Atack)

Pull request description:

  Continuing the work in #20197 and #20685, this pull updates and abstracts our inbound eviction protection to make it fully ratio-based and easily extensible to peers connected via high-latency privacy networks that we newly support, like I2P and perhaps others soon, as these peers are disadvantaged by the latency criteria of our eviction logic.

  It then adds eviction protection for peers connected over I2P.  As described in https://github.com/bitcoin/bitcoin/pull/20685#issuecomment-767486499, we've observed over the past few months that I2P peers have a min ping latency similar to or greater than that of onion peers.

  The algorithm is a basically a multi-pass knapsack:

  - Count the number of eviction candidates in each of the disadvantaged
    privacy networks.

  - Sort the networks from lower to higher candidate counts, so that
    a network with fewer candidates will have the first opportunity
    for any unused slots remaining from the previous iteration.  In
    the case of a tie in candidate counts, priority is given by array
    member order from first to last, guesstimated to favor more unusual
    networks.

  - Iterate through the networks in this order.  On each iteration,
    allocate each network an equal number of protected slots targeting
    a total number of candidates to protect, provided any slots remain
    in the knapsack.

  - Protect the candidates in that network having the longest uptime,
    if any in that network are present.

  - Continue iterating as long as we have non-allocated slots
    remaining and candidates available to protect.

  The goal of this logic is to favorise the diversity of our peer connections.

  The individual commit messages describe each change in more detail.

  Special thank you to Vasil Dimov for the excellent review feedback and the algorithm improvement that made this change much better than it would have been otherwise. Thanks also to Antoine Riard, whose review feedback nudged this change to protect disadvantaged networks having fewer, rather than more, eviction candidates.

ACKs for top commit:
  laanwj:
    Code review re-ACK 1b1088d52f
  vasild:
    ACK 1b1088d52f

Tree-SHA512: 722f790ff11f2969c79e45a5e0e938d94df78df8687e77002f32e3ef5c72a9ac10ebf8c7a9eb7f71882c97ab0e67b2778191effdb747d9ca54d7c23c2ed19a90
2021-06-14 15:04:32 +02:00
..
bench scripted-diff: tree-wide: Remove all review-only assertions 2021-06-10 15:05:24 -04:00
compat Remove support for double serialization 2021-05-24 16:15:05 -07:00
config
consensus Mark CheckTxInputs [[nodiscard]] (out-param txfee only set if call is successful). Avoid UUM in fuzzing harness coins_view. 2021-05-25 21:09:05 +00:00
crc32c build: Update crc32c subtree 2020-12-08 19:26:30 +01:00
crypto crypto: Make MuHash Remove method efficient 2021-04-19 20:28:46 +02:00
index scripted-diff: tree-wide: Remove all review-only assertions 2021-06-10 15:05:24 -04:00
init Make SetupServerArgs callable without NodeContext 2021-06-10 09:58:45 -05:00
interfaces Merge bitcoin/bitcoin#22156: Allow tr() import only when Taproot is active 2021-06-12 17:22:41 +02:00
ipc multiprocess: Add echoipc RPC method and test 2021-04-23 03:02:50 -05:00
leveldb Update to leveldb upstream using subtree merge 2020-01-28 16:59:07 +01:00
logging Remove use of non-standard zero variadic macros 2020-04-30 18:02:04 +08:00
node Merge bitcoin/bitcoin#22156: Allow tr() import only when Taproot is active 2021-06-12 17:22:41 +02:00
policy MOVEONLY: context-free package policies 2021-06-02 17:26:44 +01:00
primitives scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
qt Merge bitcoin-core/gui#333: refactor: Signal-slot connections cleanup 2021-06-12 14:04:18 +03:00
rpc scripted-diff: tree-wide: Remove all review-only assertions 2021-06-10 15:05:24 -04:00
script Add tr() descriptor (derivation only, no signing) 2021-05-24 12:14:16 -07:00
secp256k1 Update libsecp256k1 subtree to latest upstream master 2021-04-23 11:35:15 -07:00
support Merge #20464: refactor: Treat CDataStream bytes as uint8_t 2021-02-01 15:17:28 +01:00
test Merge bitcoin/bitcoin#21261: p2p: update inbound eviction protection for multiple networks, add I2P peers 2021-06-14 15:04:32 +02:00
univalue Update univalue subtree 2020-11-19 15:48:24 +01:00
util Merge bitcoin/bitcoin#22137: util: Properly handle -noincludeconf on command line (take 2) 2021-06-07 13:20:57 +08:00
wallet Merge bitcoin/bitcoin#22156: Allow tr() import only when Taproot is active 2021-06-12 17:22:41 +02:00
zmq zmq: use msg: prefix over errno= in zmqError 2021-06-09 19:25:13 +08:00
.clang-format [tools] Allow argument/parameter bin packing in clang-format 2021-02-18 10:07:37 +00:00
addrdb.cpp scripted-diff: Replace GetDataDir() calls with gArgs.GetDataDirNet() calls 2021-05-24 10:29:58 +02:00
addrdb.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
addrman.cpp Merge bitcoin/bitcoin#18722: addrman: improve performance by using more suitable containers 2021-06-12 11:41:27 +08:00
addrman.h addrman: use unordered_map instead of map 2021-05-28 16:40:15 +02:00
amount.h
arith_uint256.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
arith_uint256.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
attributes.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
banman.cpp scripted-diff: Replace three dots with ellipsis in the UI strings 2021-05-02 22:17:16 +03:00
banman.h Clean up separated ban/discourage interface 2020-07-03 20:43:55 -07:00
base58.cpp refactor: replace sizeof(a)/sizeof(a[0]) by std::size (C++17) 2021-01-31 17:35:16 +01:00
base58.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
bech32.cpp naming nits 2021-03-17 17:59:22 -07:00
bech32.h naming nits 2021-03-17 17:59:22 -07:00
bitcoin-cli-res.rc Drop the leading 0 from the version number 2020-11-18 12:00:57 -05:00
bitcoin-cli.cpp scripted-diff: rename GetSystemTimeInSeconds to GetTimeSeconds 2021-05-31 15:11:18 +08:00
bitcoin-tx-res.rc Drop the leading 0 from the version number 2020-11-18 12:00:57 -05:00
bitcoin-tx.cpp rpc: deprecate addresses and reqSigs from rpc outputs 2021-03-23 10:51:43 -04:00
bitcoin-util-res.rc Add bitcoin-util command line utility 2021-01-12 18:34:25 +10:00
bitcoin-util.cpp Merge #20938: build: fix linking against -latomic when building for riscv 2021-01-18 18:33:24 +01:00
bitcoin-wallet-res.rc Drop the leading 0 from the version number 2020-11-18 12:00:57 -05:00
bitcoin-wallet.cpp util: Add ArgsManager::GetCommand() and use it in bitcoin-wallet 2021-01-21 19:31:28 +01:00
bitcoind-res.rc Drop the leading 0 from the version number 2020-11-18 12:00:57 -05:00
bitcoind.cpp Make SetupServerArgs callable without NodeContext 2021-06-10 09:58:45 -05:00
blockencodings.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
blockencodings.h Get rid of -Wthread-safety-precise warnings 2020-05-28 09:55:39 +03:00
blockfilter.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
blockfilter.h [indexes] Fix default [de]serialization of BlockFilter. 2020-05-26 17:27:15 -04:00
bloom.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
bloom.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
chain.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
chain.h doc: Various validation doc fixups 2021-06-03 13:53:31 +02:00
chainparams.cpp CRegTestParams: Use args instead of gArgs. 2021-06-02 22:36:48 +02:00
chainparams.h refactor: Use type-safe assumeutxo hash 2021-05-11 10:40:40 +02:00
chainparamsbase.cpp versionbits: Add support for delayed activation 2021-04-12 11:14:49 +10:00
chainparamsbase.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
chainparamsseeds.h contrib: remove torv2 seed nodes 2021-06-03 14:04:06 +02:00
checkqueue.h refactor: Drop boost::thread stuff in CCheckQueue 2020-09-24 06:55:34 +03:00
clientversion.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
clientversion.h refactor: Move STRINGIZE macro to macros.h 2021-02-01 22:30:05 +02:00
coins.cpp simplify ChainstateManager::SnapshotBlockhash() return semantics 2021-02-12 07:53:29 -06:00
coins.h refactor: Remove unused code 2021-05-11 10:39:44 +02:00
compat.h net: extend Sock with methods for robust send & read until terminator 2021-03-01 17:36:16 +01:00
compressor.cpp refactor: Use CPubKey vector constructor where possible 2021-05-04 06:53:32 +02:00
compressor.h compressor: use a prevector in compressed script serialization 2020-05-15 15:26:54 -07:00
core_io.h rpc: deprecate addresses and reqSigs from rpc outputs 2021-03-23 10:51:43 -04:00
core_memusage.h
core_read.cpp doc: fix various typos 2021-01-04 12:31:31 +08:00
core_write.cpp rpc: deprecate addresses and reqSigs from rpc outputs 2021-03-23 10:51:43 -04:00
cuckoocache.h doc: Use https URLs where possible 2021-01-04 12:23:16 +08:00
dbwrapper.cpp refactor: Use only one temporary buffer in CreateObfuscateKey 2021-05-04 06:53:37 +02:00
dbwrapper.h Merge #20464: refactor: Treat CDataStream bytes as uint8_t 2021-02-01 15:17:28 +01:00
dummywallet.cpp tests: Skip SQLite fsyncs while testing 2021-04-12 19:29:03 -04:00
external_signer.cpp external_signer: remove ExternalSignerException 2021-04-13 20:09:34 +08:00
external_signer.h external_signer: remove ExternalSignerException 2021-04-13 20:09:34 +08:00
flatfile.cpp log: Move "Pre-allocating up to position 0x[...] in [...].dat" log message to debug category 2021-02-10 20:46:25 +00:00
flatfile.h Merge #18317: Serialization improvements step 6 (all except wallet/gui) 2020-05-20 07:30:29 -04:00
fs.cpp Replace fs::absolute calls with AbsPathJoin calls 2021-01-15 22:48:15 +01:00
fs.h Replace fs::absolute calls with AbsPathJoin calls 2021-01-15 22:48:15 +01:00
hash.cpp doc: Use https URLs where possible 2021-01-04 12:23:16 +08:00
hash.h Squashed 'src/secp256k1/' changes from 3967d96bf1..efad3506a8 2021-04-23 11:35:15 -07:00
httprpc.cpp Drop JSONRPCRequest constructors after #21366 2021-04-07 04:53:26 -04:00
httprpc.h refactor: replace util::Ref by std::any (C++17) 2021-03-29 23:29:42 +02:00
httpserver.cpp refactor: Add TSA annotations to the WorkQueue class members 2021-05-09 13:48:07 +03:00
httpserver.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
i2p.cpp i2p: cancel the Accept() method if waiting on the socket errors 2021-04-08 16:31:55 +02:00
i2p.h i2p: use pointers to Sock to accommodate mocking 2021-03-16 13:59:18 +01:00
indirectmap.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
init.cpp Merge bitcoin/bitcoin#21866: [Bundle 7/7] validation: Farewell, global Chainstate! 2021-06-12 11:29:31 +08:00
init.h Make SetupServerArgs callable without NodeContext 2021-06-10 09:58:45 -05:00
key.cpp refactor: Avoid &foo[0] on C-Style arrays 2021-05-04 06:55:30 +02:00
key.h refactor: Avoid &foo[0] on C-Style arrays 2021-05-04 06:55:30 +02:00
key_io.cpp Separate WitnessV1Taproot variant in CTxDestination 2021-05-24 12:14:16 -07:00
key_io.h Better error messages for invalid addresses 2021-01-24 02:44:53 +01:00
logging.cpp multiprocess: Add Ipc interface implementation 2021-04-23 03:02:50 -05:00
logging.h multiprocess: Add Ipc interface implementation 2021-04-23 03:02:50 -05:00
Makefile.am Merge bitcoin/bitcoin#22084: package testmempoolaccept followups 2021-06-10 19:09:54 +08:00
Makefile.bench.include net: Add libnatpmp support 2021-01-07 18:07:09 +02:00
Makefile.crc32c.include build: Update crc32c subtree 2020-12-08 19:26:30 +01:00
Makefile.leveldb.include build: Enable -Wsuggest-override 2020-05-12 18:03:39 +03:00
Makefile.qt.include Merge bitcoin/bitcoin#21654: build, qt: Make Qt rcc output always deterministic 2021-06-03 21:25:30 +08:00
Makefile.qt_locale.include qt: Pre-splitoff translations update 2020-10-27 19:40:44 +01:00
Makefile.qttest.include test: remove qt byteswap compattests 2021-03-29 11:12:26 +08:00
Makefile.test.include Merge bitcoin/bitcoin#22029: [fuzz] Improve transport deserialization fuzz test coverage 2021-05-27 15:02:57 +02:00
Makefile.test_fuzz.include build: compile libnatpmp with -DNATPMP_STATICLIB on Windows 2021-03-04 12:34:46 +08:00
Makefile.test_util.include fuzz: [refactor] Use IsValidFlagCombination in signature_checker fuzz target 2021-03-30 10:42:45 +02:00
mapport.cpp refactor: Use appropriate thread constructor 2021-04-29 18:39:01 +03:00
mapport.h net: Add -natpmp command line option 2021-01-07 18:07:09 +02:00
memusage.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
merkleblock.cpp doc: fix various typos 2021-01-04 12:31:31 +08:00
merkleblock.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
miner.cpp scripted-diff: tree-wide: Remove all review-only assertions 2021-06-10 15:05:24 -04:00
miner.h miner: Pass in chainman to RegenerateCommitments 2021-05-27 13:50:11 -04:00
net.cpp p2p: extend inbound eviction protection by network to I2P peers 2021-06-14 14:01:35 +02:00
net.h p2p: extend inbound eviction protection by network to I2P peers 2021-06-14 14:01:35 +02:00
net_permissions.cpp p2p: pass strings to NetPermissions::TryParse functions by const ref 2021-05-19 19:41:05 +02:00
net_permissions.h p2p: pass strings to NetPermissions::TryParse functions by const ref 2021-05-19 19:41:05 +02:00
net_processing.cpp Merge bitcoin/bitcoin#22221: refactor: Pass block reference instead of pointer to PeerManagerImpl::BlockRequested 2021-06-12 15:54:38 +08:00
net_processing.h [net processing] Add internal _RelayTransactions() 2021-05-04 09:31:03 +01:00
net_types.h refactor: Remove addrdb.h dependency from node.h 2019-10-29 11:30:12 +02:00
netaddress.cpp p2p, rpc, fuzz: various tiny follow-ups 2021-06-06 15:49:22 +02:00
netaddress.h Merge bitcoin/bitcoin#18722: addrman: improve performance by using more suitable containers 2021-06-12 11:41:27 +08:00
netbase.cpp Merge #21387: p2p: Refactor sock to add I2P fuzz and unit tests 2021-03-30 17:41:13 +02:00
netbase.h doc: fixup -Wdocumentation issues 2021-04-06 14:50:17 +08:00
netmessagemaker.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
noui.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
noui.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
outputtype.cpp refactor: Use C++17 std::array deduction for OUTPUT_TYPES 2021-01-03 18:37:59 +01:00
outputtype.h refactor: Use C++17 std::array deduction for OUTPUT_TYPES 2021-01-03 18:37:59 +01:00
pow.cpp
pow.h
prevector.h prevector: Avoid unnamed struct, which is a GNU extension 2020-04-30 18:02:03 +08:00
protocol.cpp refactor: Replace memset calls with array initialization 2021-05-13 12:42:21 +01:00
protocol.h refactor: Replace memset calls with array initialization 2021-05-13 12:42:21 +01:00
psbt.cpp Merge #20464: refactor: Treat CDataStream bytes as uint8_t 2021-02-01 15:17:28 +01:00
psbt.h refactor: post Optional<> removal cleanups 2021-03-17 14:56:20 +08:00
pubkey.cpp Add TaprootBuilder class 2021-05-24 12:14:16 -07:00
pubkey.h Add tr() descriptor (derivation only, no signing) 2021-05-24 12:14:16 -07:00
random.cpp refactor: Replace &foo[0] with foo.data() 2021-05-04 06:55:31 +02:00
random.h Add templated GetRandomDuration<> 2020-04-30 09:19:14 -04:00
randomenv.cpp rand: only try and use freeifaddrs if available 2021-03-29 11:08:29 +08:00
randomenv.h [MOVEONLY] Move perfmon data gathering to new randomenv module 2019-11-12 14:50:44 -08:00
rest.cpp validation: Farewell, global Chainstate! 2021-06-10 15:05:25 -04:00
reverse_iterator.h
scheduler.cpp test: Fix off-by-one in mockscheduler test RPC 2021-05-14 12:49:16 +02:00
scheduler.h refactor: remove boost::thread_group usage 2021-01-29 15:39:44 +08:00
serialize.h refactor: Switch serialize to uint8_t (1/n) 2021-05-31 14:56:17 +02:00
shutdown.cpp move-only: Move AbortNode to shutdown 2021-04-04 18:08:36 +02:00
shutdown.h move-only: Move AbortNode to shutdown 2021-04-04 18:08:36 +02:00
signet.cpp Merge #21330: Deal with missing data in signature hashes more consistently 2021-04-13 10:24:31 +08:00
signet.h scripted-diff: remove Optional & nullopt 2021-03-15 10:41:30 +08:00
span.h Merge #19387: span: update constructors to match c++20 draft spec and add lifetimebound attribute 2020-11-25 15:18:33 +01:00
streams.h streams: Accept URef obj for VectorReader unserialize 2021-05-05 20:19:03 +02:00
sync.cpp refactor: remove straggling boost::mutex usage 2021-01-26 15:57:28 +08:00
sync.h refactor: Remove negative lock annotations from globals 2021-04-05 08:42:15 +02:00
threadinterrupt.cpp
threadinterrupt.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
threadsafety.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
timedata.cpp Avoid the use of abs64 in timedata 2020-10-12 19:50:16 -07:00
timedata.h
tinyformat.h refactor: Improve use of explicit keyword 2020-12-01 18:36:39 +01:00
torcontrol.cpp scripted-diff: Replace GetDataDir() calls with gArgs.GetDataDirNet() calls 2021-05-24 10:29:58 +02:00
torcontrol.h tests: Add fuzzing harness for TorController 2021-03-02 12:21:32 +00:00
txdb.cpp refactor: Switch serialize to uint8_t (1/n) 2021-05-31 14:56:17 +02:00
txdb.h txdb: add CCoinsViewDB::ChangeCacheSize 2020-07-01 14:44:24 -04:00
txmempool.cpp scripted-diff: tree-wide: Remove all review-only assertions 2021-06-10 15:05:24 -04:00
txmempool.h [refactor] comment/naming improvements 2021-06-02 09:40:40 +01:00
txorphanage.cpp scripted-diff: Update txorphanage naming convention 2021-02-27 01:08:09 +10:00
txorphanage.h doc: Fix typos from codespell lint 2021-04-07 19:26:25 +01:00
txrequest.cpp doc: Fix typos from codespell lint 2021-04-07 19:26:25 +01:00
txrequest.h Report and verify expirations 2020-10-12 12:14:53 -07:00
uint256.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
uint256.h Make XOnlyPubKey act like byte container 2021-05-24 12:14:16 -07:00
undo.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
validation.cpp Merge bitcoin/bitcoin#22102: Remove Warning: from warning message printed for unknown new rules 2021-06-13 09:21:46 +02:00
validation.h validation: Farewell, global Chainstate! 2021-06-10 15:05:25 -04:00
validationinterface.cpp Add 'sequence' zmq publisher to track all block (dis)connects, mempool deltas 2020-09-22 11:34:30 -04:00
validationinterface.h Add 'sequence' zmq publisher to track all block (dis)connects, mempool deltas 2020-09-22 11:34:30 -04:00
version.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
versionbits.cpp versionbits: simplify state transitions 2021-04-12 11:14:49 +10:00
versionbits.h versionbits: Add support for delayed activation 2021-04-12 11:14:49 +10:00
versionbitsinfo.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
versionbitsinfo.h
walletinitinterface.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
warnings.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
warnings.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00