A block is not written all at once. The leader executes transactions and stamps each batch into a running clock.
For its turn, one validator becomes the leader and gets to write the block. It does not process transactions one by one. The banking stage hands non-conflicting transactions to parallel worker threads, so transfers that touch different accounts run at the same time.
Every executed batch is then recorded into Proof of History. This is what makes Solana time-ordered before consensus even looks at the block: the order is already baked into the hash chain as the leader produces it.
Recorded in PoH
0 / 4
1The scheduler splits by account
2Execute in parallel, then record
3The conflicting one runs after
Figure 1. Transactions are scheduled across banking workers; conflicting accounts serialize, and each executed batch becomes an entry in the PoH chain.
In the code, `process_and_record_transactions` first runs age and fee checks, then executes the batch and hands the result to the recorder. The recorder calls `record_batches`, which mixes each batch's hash into the PoH chain and appends an entry. Ticks keep the clock moving even when there is nothing to execute, so the slot always advances at a steady rate.
recordrecord_batches mixes each batch hash into the PoH chain and appends the entry — this is the moment a transaction is fixed in time.
Key Concept
The leader interleaves execution and timekeeping. By the time a batch is recorded, its position in time is already fixed — ordering is a byproduct of production, not a separate consensus step.
02
How a Block Spreads
One leader cannot send a full block to thousands of validators. So it does not try.
The block must reach the whole cluster fast, but a single leader does not have the bandwidth to send it to everyone. Turbine solves this the way a content-delivery network does.
First the block is broken into shreds. Then, instead of broadcasting to all, the leader sends shreds to a small anchor set, and each of those nodes forwards to the next layer. No node ever forwards to more than a fixed number of peers.
1Split the block into shreds
2The leader sends only to layer 1
3Layer 1 forwards to layer 2
Figure 2. The block is split into data and coding shreds, then fanned out through a tree — the leader sends to an anchor set, which retransmits onward.
Shreds come in fixed-size erasure batches: `DATA_SHREDS_PER_FEC_BLOCK = 32` data shreds plus 32 coding shreds, so up to a third can be lost and still recovered. The tree width is set by `DATA_PLANE_FANOUT = 200`: each node retransmits to up to 200 peers. `get_retransmit_peers` computes exactly which peers a node owns from its position in a deterministic, stake-weighted shuffle — so every validator agrees on the tree without coordinating.
DATA_PLANE_FANOUT / get_retransmit_peersEach node forwards to up to 200 peers; its exact peers fall out of its index in a deterministic shuffle, so the tree needs no coordination.
Key Concept
Turbine trades a little redundancy (coding shreds) and a couple of hops of latency for bandwidth that scales with the network. No single node is a bottleneck.
03
How the Network Agrees
Validators do not stop to hold a vote. They vote as the blocks stream past, and each vote costs more to take back.
Once a validator receives and replays a block, it checks the result and votes. Solana's consensus, Tower BFT, does not stop the chain to run voting rounds.
Each vote commits the validator more deeply to that fork through lockout. The deeper the lockout, the more a validator would lose by switching forks — so agreement becomes self-reinforcing. There is no slashing that burns stake; irreversibility comes from the growing cost of contradicting your own votes.
Voted stake
0%
1Votes pile up as stake
2Past two-thirds it is confirmed
3Each vote doubles the lockout
Figure 3. Validators vote until a supermajority of stake agrees; lockout doubles with depth, and the block passes from processed to confirmed to finalized.
A slot becomes confirmed once voted stake passes two-thirds of total stake — that is exactly what `is_slot_confirmed` tests. Before voting, `is_locked_out` simulates adding the vote and refuses it if any surviving vote sits on a different fork. Tower checks stake at two depths, `VOTE_THRESHOLD_DEPTH_SHALLOW = 4` and `VOTE_THRESHOLD_DEPTH = 8`; once enough lockout piles onto one fork, reversing it becomes practically impossible, which is what users see as finalized at roughly 12–13 seconds.
agave v4.2.0core/src/consensus.rs:585
585fnis_slot_confirmed(
586 &self,
587 slot: Slot,
588 voted_stakes: &VotedStakes,
589 total_stake: Stake,
590) -> bool {
591 voted_stakes
592 .get(&slot)
593 .map(|stake| (*stake as f64 / total_stake as f64) > self.threshold_size)
594 .unwrap_or(false)
595}
is_slot_confirmedA slot is confirmed when voted stake exceeds threshold_size (two-thirds) of total stake.
is_locked_outSimulate the vote; if any surviving vote is on a different fork, this slot is still locked out. This is what makes reversal costly.
Key Concept
Confirmation is a stake threshold; finality is accumulated lockout. Solana buys fast agreement by making reversal expensive over time rather than by pausing for explicit checkpoints.
04
How Your Transaction Gets In
Before any of that, your transaction has to reach the leader — and prove it is really yours.
A signed transaction arrives at the leader as a network packet, and enters the TPU. There is no public mempool to sit in — the packet goes straight into the pipeline.
Three stages run in order. FetchStage collects packet batches from the sockets. SigVerifyStage verifies signatures and throws out forgeries. Only what survives reaches BankingStage.
Passed signature check
0 / 6
1FetchStage gathers packets
2Signatures are checked as a batch
3Only survivors reach banking
Figure 4. Packets flow FetchStage → SigVerifyStage → BankingStage; transactions with bad signatures are dropped before they reach execution.
The stages are wired together with channels: FetchStage's sender feeds SigVerifyStage, whose verified output feeds BankingStage. The real signature check is `ed25519_verify_serial`, run over a whole batch at once rather than per transaction — batching is how the leader keeps up at network speed. Only after this gate do transactions reach the scheduler from the first section, closing the loop back to block production.
ed25519_verify_serialThe real crypto gate: a whole packet batch is signature-checked at once, and invalid packets never reach banking.
Key Concept
No mempool means no public waiting room: a transaction is routed straight to the leader, verified in a batch, and either executed or dropped. The pipeline is the whole life of the transaction, compressed into one node.
Every snippet above is quoted verbatim from anza-xyz/agave at tag v4.2.0.