Running a tally
audience: operators
Tally is the refund accounting organism. It watches the chain
for inclusion of the lattice’s winning blocks, attributes the
captured MEV back to the order-flow providers and searchers that
contributed, and signs an Attestation that integrators can
present to an on-chain settlement contract.
Role in the lattice
Tally is the last organism in the pipeline. It subscribes to
relay::AcceptedHeaders, watches the chain RPC for inclusion,
joins with zipnet::Broadcasts / unseal::UnsealedPool /
offer::AuctionOutcome / atelier::Candidates to compute
attribution evidence, and commits one Refunds entry per
included block.
Committee sizing
- 3 members minimum; 5 members recommended.
Majority-honest trust model. A majority can misattribute, but
the on-chain settlement contract is the ultimate arbiter — an
Attestation whose evidence does not verify is simply not paid
out.
Hardware
- Modest cloud. 2 vCPU / 4 GiB RAM suffices.
- No TDX required in v1. The settlement contract, not the committee’s hardware, is the ground truth.
- Chain RPC access from every committee member, for the inclusion watcher. Pick a provider with good historical block coverage — missed blocks mean missed attributions.
systemd unit example
# /etc/builder/tally-member.env
LATTICE_INSTANCE=acme.ethereum.mainnet
LATTICE_CHAIN_ID=1
LATTICE_CONFIG_HEX=7f3a9b1c...
TALLY_COMMITTEE_SECRET_FILE=/etc/builder/secrets/acme.ethereum.mainnet.tally.secret
TALLY_ECDSA_SECRET_FILE=/etc/builder/secrets/acme.ethereum.mainnet.tally.member-03.ecdsa
TALLY_SECRET_FILE=/etc/builder/secrets/acme.ethereum.mainnet.tally.member-03.peer
TALLY_CHAIN_RPC=https://eth-mainnet.g.alchemy.com/v2/...
TALLY_SETTLEMENT_ADDR=0x1234...
The settlement contract
Tally’s attestations are only useful if a settlement contract on-chain accepts them. The contract:
- Verifies
t-of-nECDSA signatures from the tally committee’s published public keys. - Checks that the
block_hashin the attestation matches a real on-chain block at the given slot. - Pays out the claimed amount to the recipient.
The contract address is pinned in tally::Config.settlement_addr
and ships in the lattice’s LatticeConfig. The contract’s code
is the operator’s responsibility to deploy and audit; the tally
organism does not deploy it for you.
What this organism does not do
- It does not change the winning block. Atelier committed it; the chain included it or not.
- It does not collect funds. On-chain balances belong to the block builder / proposer; the settlement contract is the mechanism by which some of those funds route to order-flow providers.
- It does not judge whether a refund is “fair”. The attribution is a deterministic function of the upstream commits; the policy lives in the committee’s state machine, the same policy is applied to every block.
Observing
tally_blocks_attributed_total— rate of successful attributions.tally_attestation_latency_seconds— time from on-chain inclusion toAttestationscommit.tally_evidence_failures_total— attribution attempts where the upstream evidence did not line up. Any sustained rate is a cross-organism integration bug and an incident.tally_chain_rpc_lag_seconds— how far behind the head the committee’s RPC feed is.
Related
- Running a relay — immediate upstream.
- tally organism spec
- integrators/refunds.md
- threat-model — tally