Running a relay
audience: operators
Relay is the PBS-style fanout organism. It ships
atelier::Candidates to the chain’s proposer or sequencer and
records the proposer’s acknowledgement in AcceptedHeaders.
Role in the lattice
Relay members subscribe to atelier::Candidates, each forwards
the header + bid pair to the proposers they are configured to
talk to, and commits an AcceptedHeaders entry when a majority
agrees the proposer acknowledged.
Committee sizing
- 3 members minimum; 5 members for production.
Relay is any-trust on liveness: one honest member suffices to
ship a header. Integrity of AcceptedHeaders is majority-honest;
a majority-malicious relay can forge a proposer-ack record, but
tally’s on-chain inclusion watcher is the ground truth.
Hardware
- Well-connected cloud. Relay members are the organism with the most external connectivity — one socket per proposer in the proposer set, kept warm.
- Modest CPU / RAM. 2 vCPU / 4 GiB is enough.
- Chain-type-appropriate TLS setup. L1 MEV-Boost requires specific TLS ciphers; L2 sequencer endpoints vary.
Policy selection
Relay’s Config carries a Policy enum:
| Policy | Target |
|---|---|
L1MevBoost | Ethereum mainnet MEV-Boost relay endpoints |
L2Sequencer | A single L2 sequencer endpoint (centralized) |
L2LeaderRotation | The L2’s elected leader set per slot |
The policy folds into the relay fingerprint. Switching policy is a lattice retirement; you do not switch in place.
systemd unit example
# /etc/builder/relay-member.env
LATTICE_INSTANCE=acme.ethereum.mainnet
LATTICE_CHAIN_ID=1
LATTICE_CONFIG_HEX=7f3a9b1c...
RELAY_COMMITTEE_SECRET_FILE=/etc/builder/secrets/acme.ethereum.mainnet.relay.secret
RELAY_SECRET_FILE=/etc/builder/secrets/acme.ethereum.mainnet.relay.member-01.peer
# Proposer-side endpoints. Comma-separated; each relay member
# can target a different subset.
RELAY_PROPOSER_ENDPOINTS=https://mev-boost.relay-a.example,https://mev-boost.relay-b.example
What this organism does not do
- It does not choose which candidate wins. Atelier commits one candidate per slot; relay ships that one.
- It does not sign the block. Atelier’s BLS aggregate signature is what the proposer verifies.
- It does not pay out MEV. Tally does.
Observing
relay_headers_sent_total{member=...,proposer=...}.relay_proposer_ack_latency_seconds— round-trip to the proposer endpoint.relay_committee_agreement_rate— fraction of slots where committee members agreed on the ack. Investigate dips.relay_on_chain_mismatches_total— incremented whentallyreports anAcceptedHeaders[S]that does not match on-chain. Any non-zero value is an incident; see Incident response.