upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorbitflash-maintainer <noreply@bitflash.invalid>2026-09-02 16:10:24 +0000
committerbitflash-maintainer <noreply@bitflash.invalid>2026-09-02 16:10:24 +0000
commitcd6edfc2c234db71d9b68f96702ad08a56cc3127 (patch)
tree99e816a74560d9d59b13c7c1ff3ac86dd24e0b43 /src/main.cpp
parenta215505c9e6b63883fa6058a29cc5dc7b22acd94 (diff)
net: only use the 15s block retry spacing at the tip
nRequestTime lives in mapAlreadyAskedFor, which is global to the inv, so the spacing AskFor applies is not per-peer pacing: it is what strings the getdatas for one block across its announcers. Shortening it to 15s was right at the tip and wrong everywhere else, and the eight-entry cap that made the failover table safe for catch-up does not cover this at all -- it is a different mechanism. At two minutes a second announcer's queued request almost always fired after the block had arrived, so AlreadyHave dropped it. At fifteen seconds, with a peer working through a 500-deep queue and block N legitimately minutes away, the second announcer is asked at +15s, the third at +30s, and the bulk download arrives once per announcer -- up to eight times over, with nothing bounding it. So the fast spacing is now conditional on tracking the tip, measured off the age of our own best block. Not off a peer-reported height: nStartingHeight is optional in the version message and every node released so far sends the short form, so it is -1 for essentially every peer, and where it does get filled in later it comes from the height of a block that peer served us, which during catch-up tracks our own height and would answer "at the tip" for the entire download. Block timestamps are the one clock a peer cannot move, being bounded above by CheckBlock and below by AcceptBlock's median-time rule. Thirty block intervals is the threshold: far longer than any stall worth failing over from, far shorter than catching up. Failover at the tip does not rest on this in any case -- mapBlockFetch re-issues a stalled getdata to the next peer on its own 15s timer, and that is what actually answers #33.
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 9ab1f44..be89416 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -101,6 +101,29 @@ static const int BLOCK_FETCH_TRACK_MAX = 8;
101// forever; a re-announcement recreates it. 101// forever; a re-announcement recreates it.
102static const int BLOCK_FETCH_GIVEUP_SECS = 10 * 60; 102static const int BLOCK_FETCH_GIVEUP_SECS = 10 * 60;
103 103
104// How stale our own best block may be before we stop calling this the tip.
105// Blocks target two minutes, so this is thirty intervals: far longer than any
106// stall worth failing over from -- the one in #33 ran sixteen minutes -- and
107// far shorter than catching up, which starts hours or days back.
108static const int BLOCK_FETCH_TIP_AGE_SECS = 60 * 60;
109
110// Whether this node is tracking the tip rather than still catching up.
111//
112// Measured off the age of our own best block, not off any height a peer told
113// us. nStartingHeight is optional in the version message and every node
114// released so far sends the short form, so it is -1 for essentially every
115// peer; and where it is filled in later it is filled in from the height of a
116// block that peer served us, which during catch-up tracks our own height and
117// would report "at the tip" for the whole download. Block timestamps are the
118// one clock here that peers cannot move: CheckBlock refuses anything more than
119// two hours ahead and AcceptBlock refuses anything at or before the previous
120// median, so the only way to make this read "at the tip" falsely is to mine,
121// and all that buys is the 15s spacing this code had unconditionally anyway.
122bool IsBlockFetchNearTip()
123{
124 return pindexBest && (int64)pindexBest->nTime > GetTime() - BLOCK_FETCH_TIP_AGE_SECS;
125}
126
104// Drop one entry so a hash announced by addrNew can be tracked. 127// Drop one entry so a hash announced by addrNew can be tracked.
105// 128//
106// Refusing the insertion instead was a remote off-switch for the whole 129// Refusing the insertion instead was a remote off-switch for the whole