Quickstarts
How the Composer Attests a Batch
STEP 1 OF 3
NEXT WALKTHROUGH: How the deriver rebuilds L2 from L1 →
COMPOSER OPENS THE STREAM
composer
→
rpc Prove(stream ProveChunk)
→
eez-proof-signer
header
block
block
⋯
block
chunk 1 of N — header, then one BlockWitness per window block
ProveHeader
MUST BE FIRST
rollup_id
7
from_block
812,401
posted + 1
to_block
812,450
sync_height
post_batch.abi_calldata
1,412 bytes
post_batch.blobs
2 blobs
prover derives the KZG hashes itself
post_batch.posting_context
chain_id · target_timestamp · L1 parent
expected_validation_identity
0x51d0…a7e3
32B, agreed via Capabilities
parent_provenance
parent header RLP + accepted L1 height
re-checked on L1
One stream, one job: header first, then every block in the window, in order. There is no claimed hash in the request — that field is gone.
PROTOCOL RESEARCHERS

How the composer attests a batch

"Attests", not "proves", and the distinction is the page. Three mechanisms sit behind that word, and only the first is what the name "prover" suggests.

Stateless re-execution. The prover is handed a BlockWitness per block, replays each one, validates the batch's settlement effects, and recomputes the hash itself, rather than reading a state database — the request carries no claimed hash at all. That part is real, and step 2 is it.

ECDSA standing in for succinctness. What comes back is not a succinct proof. ECDSAProofSystem is described upstream as a "temporary proof system that uses ECDSA signature recovery instead of a ZK proof", and its verify is two lines: recover the signer from (publicInputsHash, proof), then compare it to signer. So the guarantee today is that a named signer re-executed and agreed — an attestation bound to that batch's hash, not an unbound mock signature. It is not yet a proof anyone can check without trusting that signer.

A per-rollup prover swap. Which contract does the checking is a per-rollup choice, not a network-wide one. IProofSystem is any contract that can check (proof, publicInputsHash) — ZK, ECDSA, or otherwise — referenced from that rollup's own vkey map. There is no central registry, and upstream is explicit that each rollup owner vets which proof-system addresses their rollup allows. Swapping ECDSA for a real verifier is therefore a per-rollup upgrade, and until a rollup makes it, "attests" is the honest verb for that rollup.

The mechanics below are the first mechanism. The composer opens one gRPC stream to the proof-signer and sends a ProveHeader first — blocks always follow in order.

That one stream carries the header, the blocks and a signature back.

WHAT YOU'LL LEARN
  • 01 · ONE STREAM, ONE JOBOne gRPC stream to the proof-signer: ProveHeader first, blocks in order.
  • 02 · THE PROVER RE-EXECUTESThe prover decodes PostBatch’s calldata, derives KZG hashes from its blobs, replays every BlockWitness and runs its settlement gates to recompute the hash.
  • 03 · SIGN & RETURNThe prover signs the recomputed hash; the composer only trusts it once the signature recovers to the registered attester and the hash matches its own — an attestation, not a succinct proof.

Verified against eez-rollupX Git commit 2c19e36; interfaces may move.

UP NEXTHow the deriver rebuilds L2 from L1