Overview
BULKBFT is a leaderless Byzantine fault-tolerant consensus protocol optimized for low-latency agreement on transaction sets. It achieves consensus in a single vote-commit round under partial synchrony, with no block proposer and no leader election.System Model
We consider a set of validators , of which at most may be Byzantine, where: Each validator has a stake weight inherited from Solana. A set forms a supermajority if: We assume partial synchrony: there exists an unknown Global Stabilization Time (GST) after which all messages between honest validators are delivered within a known bound .Transaction Ingress
When a signed transaction arrives at validator , the ingress pipeline:- Computes a compact hash for deduplication
- Stores the full transaction body in a local cache
- Broadcasts to all validators in via authenticated channels
Authenticated Transport
Validator-to-validator communication uses the Noise Protocol Framework (IK handshake, AEGIS-128L encryption). Each validator’s Noise keypair is derived from their Solana Ed25519 identity key (converted to X25519 for Diffie-Hellman). This binds transport authentication to Solana stake - impersonation requires the validator’s private key.Minisketch Set Reconciliation
Rather than exchanging full hash lists, validators use minisketch for efficient set reconciliation. Each validator maintains a sketch - a compact probabilistic data structure representing their pending transaction set . Given sketches from two validators, the symmetric difference can be computed in where is the number of differing elements. This is a significant reduction from the naive approach.Protocol
Round Structure
Each consensus round proceeds in two phases. Phase 1 - Vote. Each validator computes a digest of its proposed transaction set for round : where is a collision-resistant hash function and is the set of pending transactions at after minisketch reconciliation. Validator broadcasts a signed vote to all validators. Phase 2 - Commit. Upon receiving votes from a supermajority, each validator computes the intersection digest - the set of transactions present in the proposed sets of all supermajority voters: Validator broadcasts a signed commit . Commitment. When a validator collects a supermajority of matching commit messages for round , the batch is committed: where is the deterministic timestamp for round (see Deterministic Clock) and is the set of supermajority signatures.Fast Path
Under partial synchrony (after GST), the protocol completes in one vote exchange plus one commit - two message delays total: This is the theoretical minimum for BFT agreement and the common case during normal operation.Slow Path
When synchrony breaks (network partitions, delayed messages, Byzantine validators), the protocol falls back to additional rounds for recovery. Safety is never compromised; only liveness may be temporarily affected until synchrony is restored.Safety and Liveness
Safety. For any round , if two honest validators commit batches and , then . This holds under asynchrony (no timing assumptions required). Proof sketch. Commitment requires a supermajority of matching commit messages. Two distinct supermajorities must overlap in at least one honest validator (since ). An honest validator sends at most one commit message per round, so both supermajorities must have committed the same digest. Liveness. After GST, every round eventually produces a committed batch, provided at most validators are Byzantine.Fault Tolerance
The protocol tolerates up to Byzantine validators. With the current validator set of 20+ independent operators, safety holds even if multiple validators are compromised or offline. This is the same fault tolerance bound as PBFT, Tendermint, and HotStuff - the fundamental limit for Byzantine agreement.CommittedBatch Output
The output of each consensus round is aCommittedBatch containing:
- - the agreed transaction set (hashes, with bodies fetched from local cache)
- - the round number
- - the batch timestamp
- - supermajority signatures attesting to the commitment
CommittedBatch. From this point, execution is fully deterministic - no further communication is needed for validators to independently produce the same output state.