var img = document.createElement('img'); img.src = "https://nethermind.matomo.cloud//piwik.php?idsite=6&rec=1&url=https://www.surge.wtf" + location.pathname; img.style = "border:0"; img.alt = "tracker"; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(img,s);
Skip to main content

Real-Time Proving

What Is Real-Time Proving?

In Surge, ZK proofs are generated within seconds of block production and included with the block proposal in a single transaction. Instead of proposing a block and proving it later (within a proving window), the proof goes out together with the proposal:

propose(block_data, l2_state_checkpoint, proof)  →  verified + finalized in one call

This means:

  • No proving windows -- proofs are not deferred
  • No bonds -- no economic security against late proofs needed
  • Instant finality -- the block is proven the moment it is proposed on L1
  • One proof per proposal -- each block is individually proven

Why Real-Time Proving?

The Previous Model (Two-Phase Proving)

Earlier rollup designs, including Surge's previous fork, used a two-phase approach:

  1. Propose -- submit the block data to L1
  2. Prove -- submit a proof within a window (e.g., 24 hours)

This needed a lot of on-chain machinery to manage:

ComponentPurpose
Ring bufferStore pending proposals awaiting proof
BondsEconomic stake against proof liveness (e.g., 10,000 ETH)
Proving windowsTime limits for proof submission
ContestationMechanism to challenge incorrect proofs
Prover whitelistAccess control for who can prove
Multi-prover model2-of-3 agreement across SGX, SP1, RISC0
Batch provingProve multiple proposals in one proof

The Real-Time Model

Real-time proving gets rid of all of this. Proof generation is now fast enough (~10-17 seconds) to just include the proof with the proposal:

AspectTwo-Phase (Pacaya)Real-Time
ProposalPropose first, prove laterPropose + prove atomically
Proving windowUp to 24 hoursNone (immediate)
BondsRequiredRemoved
On-chain config17 fields3 fields
On-chain stateMultiple slots (ring buffer)Single slot (lastProposalHash)
Prover model2-of-3 multi-proverZK validity proof (Zisk primary, multi-proof capable)
Batch provingSupportedRemoved (one proof per block)
FinalityDelayed until proof submittedInstant on proposal

Protocol Simplification

The RealTimeInbox contract replaces the old multi-contract setup with a single contract and very little on-chain state:

Configuration -- reduced from 17 to 3 fields:

  • proofVerifier -- address of the ZK verifier contract
  • signalService -- address for cross-chain signal relay
  • basefeeSharingPctg -- base fee sharing percentage

State -- single storage slot:

  • bytes32 lastProposalHash -- hash of the last accepted proposal (chain head)

Events -- single event:

  • ProposedAndProved(proposalHash, parentProposalHash, maxAnchorBlockNumber, basefeeSharingPctg, sources, signalSlotsHash, checkpoint)

Proof Performance

Proof generation time depends on GPU hardware:

GPUProof TimeNotes
1x L40~40sSingle GPU
2x L40~25s
3x L40~22s
4x L40~20s
L40s cluster~13-14sProduction cluster
RTX 5090~10-11sCurrent fastest

These are end-to-end times including both STARK and SNARK phases. There's no aggregation step since each proof covers exactly one block.

Further Reading