rpc: warn that nodes ignore requests for old stale blocks

This is an anti-fingerprinting measure. See BlockRequestAllowed in net_processing.

It has been around since 2014, but alternative clients might still serve these blocks.

See also: d8b4b49667, 85da07a5a0, a2be3b66b5, 3788a8479b
This commit is contained in:
Sjors Provoost 2022-02-01 14:41:36 +01:00
parent 5291933fed
commit f39d9269eb
No known key found for this signature in database
GPG key ID: 57FF9BDBCC301009
2 changed files with 5 additions and 1 deletions

View file

@ -1738,6 +1738,8 @@ std::optional<std::string> PeerManagerImpl::FetchBlock(NodeId peer_id, const CBl
LOCK(cs_main); LOCK(cs_main);
// Mark block as in-flight unless it already is (for this peer). // Mark block as in-flight unless it already is (for this peer).
// If the peer does not send us a block, vBlocksInFlight remains non-empty,
// causing us to timeout and disconnect.
// If a block was already in-flight for a different peer, its BLOCKTXN // If a block was already in-flight for a different peer, its BLOCKTXN
// response will be dropped. // response will be dropped.
if (!BlockRequested(peer_id, block_index)) return "Already requested from this peer"; if (!BlockRequested(peer_id, block_index)) return "Already requested from this peer";

View file

@ -428,7 +428,9 @@ static RPCHelpMan getblockfrompeer()
"getblockfrompeer", "getblockfrompeer",
"Attempt to fetch block from a given peer.\n\n" "Attempt to fetch block from a given peer.\n\n"
"We must have the header for this block, e.g. using submitheader.\n" "We must have the header for this block, e.g. using submitheader.\n"
"Subsequent calls for the same block and a new peer will cause the response from the previous peer to be ignored.\n\n" "Subsequent calls for the same block and a new peer will cause the response from the previous peer to be ignored.\n"
"Peers generally ignore requests for a stale block that they never fully verified, or one that is more than a month old.\n"
"When a peer does not respond with a block, we will disconnect.\n\n"
"Returns an empty JSON object if the request was successfully scheduled.", "Returns an empty JSON object if the request was successfully scheduled.",
{ {
{"blockhash", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The block hash to try to fetch"}, {"blockhash", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The block hash to try to fetch"},