A Solana transaction travels from your client through the network to a block-producing leader, executes atomically on-chain, and earns votes until it reaches your chosen commitment level. Understanding this path explains latency, failures, and retry strategy.
Treating processed as final - forks can reorder at this level. Fix: wait for confirmed or finalized before irreversible UX.
Not refreshing blockhash on retry - expired transactions are silently dropped. Fix: fetch new blockhash and re-sign on each retry.
Ignoring preflight errors - skipPreflight: true hides simulation failures. Fix: simulate first in development; decode errors before retrying.
Polling in a tight loop - hammers RPC and still misses fast confirmations. Fix: use WebSocket signature subscriptions.
Same signature resubmission - valid and idempotent, but useless if blockhash expired. Fix: only resubmit the same signature within the blockhash window.
Leader skip during congestion - transactions queue longer. Fix: add priority fees via Compute Budget Program.
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.
Reviewed by Chris St. John·Last updated Jul 19, 2026