You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Genesis block creator now stamps reg_height for all block-0 NodeRegistration TXs (on CREATE and boot LOAD), matching synced peers. Fixes the minter computing count=1 eligible super vs count=5 on peers — the sole content divergence, observed live as proposal_content_rejected on reward_root at emission boundaries.
- QUIC handshake: suppress the duplicate unsampled log for ip_identity_gate_reject (already sampled + metered at the gate); narrow the private-IP heuristic to RFC1918 172.16/12 so public 172.32+ addresses are not mislabeled private_.
- BFT2 consensus driver: watchdog self-heals by adopting the latest stored checkpoint QC, plus eager driver.sync on startup so a restarted/synced node starts at the live window instead of lagging at index=1.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
// LIVENESS WATCHDOG: the applied chain tip advances via macroblock sync even when the
556
-
// driver is frozen — so a large, sustained gap between the chain's window and the
557
-
// window the driver still wants to commit means the driver fell behind the live quorum
558
-
// and the §4.5 sync catch-up did NOT recover it. Surface it LOUDLY (this failure was
559
-
// previously invisible: the container stayed "healthy"). Re-armed once recovered.
581
+
// LIVENESS WATCHDOG + SELF-HEAL: the applied chain tip advances via macroblock sync even
582
+
// when the driver is frozen — so a large, sustained gap between the chain's window and the
583
+
// window the driver still wants to commit means the driver fell behind the live quorum.
584
+
// Live §4.5 catch-up only fires on a freshly RECEIVED macroblock, so a node that caught its
585
+
// chain up by other means (or lagged at cold start) can stay stuck. Instead of only logging,
586
+
// re-feed the latest stored (already-verified) macroblock QC to the driver: driver.sync is
587
+
// monotonic + content-checked ⇒ a safe no-op once caught up, and it jumps the driver to the
588
+
// committed window deterministically. Recovery is logged once the gap closes.
560
589
constSTUCK_WINDOWS:u64 = 3;// beyond normal 2-chain finality lag
561
-
constSTUCK_TICKS:u32 = 5;// sustained (~20s at the 4s view timer) before alarming
590
+
constSTUCK_TICKS:u32 = 5;// sustained (~20s at the 4s view timer) before acting
562
591
let chain_window = crate::unified_p2p::LOCAL_BLOCKCHAIN_HEIGHT.load(Ordering::Relaxed) / 90;
563
592
if chain_window > driver.next_window().saturating_add(STUCK_WINDOWS){
564
593
stuck_ticks = stuck_ticks.saturating_add(1);
565
-
if stuck_ticks >= STUCK_TICKS && !stuck_alarmed {
566
-
stuck_alarmed = true;
567
-
println!("[ERROR][BFT2] consensus_driver_behind round={} next_window={} chain_window={} — driver lagging the quorum; §4.5 sync did not recover it (previously a SILENT dropout)",
0 commit comments