vortex blog

Alpenglow rips off the consensus duct tape

How validator incentives change in the migration from TowerBFT (+ TVC) to Alpenglow.

I’m no longer affiliated with Anza; I’m writing this as an independent blockchain researcher.

At long last, Alpenglow is ready for launch on Solana’s mainnet cluster, and you can watch the migration live on Vortex! Alpenglow replaces TowerBFT, a battle-tested but overly complex protocol with a number of broken incentives. Here are the key takeaways for validators and delegators.

Voting speed requirement is more fair

TowerBFT had a lagging problem. Every rooted vote paid the same single credit however late it was, and voting early could lock you onto a fork that lost, so waiting was free and safe. TVC (timely vote credits) duct taped a fix on top: full credits only for a vote that landed within two slots, now 200 ms each (credits_for_vote_at_index). It arguably made consensus faster by pushing validators to optimize their voting, but it also pushed them to cluster close together geographically.

Alpenglow tears the duct tape off. Your first Notarize or Skip vote on a slot earns full rewards as long as it’s received in time for the leader of slot s+8 to put it in its reward certificate. First or last doesn’t matter, so geographically distant validators aren’t penalized anymore, and with no lockouts there’s nothing to gain by waiting either.

Fast finality

A block can finalize after a single round of votes once 80% of stake notarizes it, or two rounds at 60% otherwise. SIMD-0326 gives TowerBFT’s finality as 12.8 seconds. On testnet the fast path wins nearly every time: in epoch 1060, 97.93% of slots had 80% or more of stake notarize them. Until now, apps leaned on optimistic confirmation (two thirds of stake voting for a block) as a stand-in for finality. Now they get the real thing.

Lagging leaders get skipped

TowerBFT had a broken incentive around late blocks. The next leader waits up to two slots for a late block (reached_leader_tick), then builds without it. If the late block lands anyway and the cluster votes for it, the punctual leader’s block is the one that gets skipped, so a lagging leader costs someone else, not itself. Alpenglow puts a clock on every leader window (TimerState): miss it and validators vote to skip you, not the leader after you.

Votes move out of transactions

Alpenglow votes are BLS signatures sent straight to every staked peer instead of transactions with a 5,000-lamport fee (about 2.16 SOL an epoch on mainnet today). In their place, each vote account pays a flat admission ticket of about 0.8 SOL a day (slot_params.rs), burned and paid one epoch up front whether you vote or not. It’s cheaper overall, but it doesn’t scale with stake, so it weighs most on small validators.

Recommendation for operators: keep your vote account funded above the ticket plus rent, and check and share your Alpenglow readiness on Vortex.

Leaders are rewarded for including votes

The inflation reward for every landed vote is split exactly 50/50 between the voter and the leader that includes it (calculate_reward), so about half of your inflation rewards now come from your leader slots. Under TowerBFT, leaving votes out cost a leader little more than its reputation; now it costs the leader real rewards. Your skips and thin blocks now cost your stakers.

No more Proof of History hashing

Once a validator migrates, it stops running the Proof of History service (poh_service.rs). Short local timeouts replace it, and no CPU core is burned on nonstop hashing.

My hot take: PoH was always a flawed timeout mechanism. Some nodes hash faster than others, so every node’s clock ran at a slightly different speed. Having every node agree on the same timeouts is much more fair.

A skipped leader slot costs everyone

Votes on slot s can only be paid by the leader of slot s+8 (validated_reward_certificate.rs). If that leader skips, nobody who voted on s is paid, there’s no retry, and those rewards are never minted. On testnet in epoch 1060 that made 1.80% of voting rewards unpayable, matching the skip rate.

flowchart LR
  s["slot s<br/>every validator votes"] --> l["leader of s+8<br/>holds the votes"]
  l -- "produces its block" --> ok["reward cert in footer:<br/>voters and leader paid"]
  l -- "skips its slot" --> lost["no cert:<br/>every voter on s unpaid,<br/>leader loses its half"]

Ranking performance is harder

After the cutover, epoch_credits holds lamports, and dividing by stake gives what delegators earn per SOL. That sounds like the perfect ranking, but two things make it hard to read on its own.

One epoch’s rewards are partly luck

Half your inflation rewards now come from your leader slots, and the leader schedule is a stake-weighted draw whose results vary a lot from epoch to epoch (there’s a proposal to fix that). The draw averages out over many epochs, but any single epoch can land well above or below what your stake predicts. Small validators feel it the most: at 1,000 SOL of stake, 78% of epochs have no leader slots at all, so they miss out on half of their inflation rewards that epoch. Rank by epoch credits per SOL and validators shuffle around on luck alone.

Leader windows drawn per epoch, by stake

90% range of four-slot leader windows drawn, as a share of what the stake predicts, in a single epoch and averaged over 20 epochs; bar labels give the windows themselves. Model: each of the 108,000 windows in an epoch is an independent stake-weighted draw out of 437.8M SOL of active stake.

Data: model on mainnet getVoteAccounts stakes, 2026-10-17
Table
One epochAveraged over 20 epochs
10k SOL (2.5 expected)0–51.9–3.1
50k SOL (12 expected)7–1811–13.7
181k SOL, median (45 expected)34–5642–47
1M SOL (247 expected)221–273241–252
10M SOL (2,467 expected)2,386–2,5482,449–2,485

Recommendation for delegators: judge a validator’s APY over many epochs, not the last one.

Understanding missed vote rewards

When your vote doesn’t land in a reward certificate, you lose that vote’s reward, but working out why is tricky, and the chain doesn’t tell you. Vortex sorts every missed vote by cause: offline (32+ missed slots in a row), a thin s+8 block that left out at least 2% of online stake besides you, or late. Your own block production gets the same treatment, so you can see where both halves of your rewards went. On testnet, we found that a good share of missed votes were down to leaders that didn’t fill up their reward certificates.

Recommendation for operators: check missCauses before debugging your own node. If it’s mostly thin blocks, the fix isn’t on your side.

How the Vortex leaderboard ranks

The Vortex leaderboard ranks validators by Reward Efficiency: how much you earned out of what was actually available to you. For voting, slots whose s+8 leader skipped are left out, since nobody could earn them. For block production, only the leader slots you actually drew count, scored by the share of online stake your blocks carried, so voters that were offline don’t count against you. How many leader slots you drew doesn’t move the score, only how well you used them, which makes validators easier to compare objectively.

Recommendation for delegators: use Reward Efficiency to compare how well validators run, and earnings per SOL over many epochs to see what you’ll actually earn.

Wrapping up

I’m really excited to finally see this migration happen. Solana has always been a work in progress (cough mainnet-beta cough), and Alpenglow will be too. But it’s a solid v1, and I’m looking forward to the improvements that get built on top of it.

If you spot a mistake or want something measured, let me know and I’ll fix it here. Big thanks to the Alpenglow authors and the Anza team for SIMD-0326, and the SIMD-0033 authors for TVC.

Anyways, thanks for reading and happy validating!

As with anything these days, this post and the Vortex API were written with Claude, but they’re based on, and checked against, my own blockchain experience.