Skip to content

feat(tdx-init): deliver summit's advertised consensus address - #256

Merged
samlaf merged 1 commit into
seismicfrom
sl/summit-advertised-addr
Aug 18, 2026
Merged

feat(tdx-init): deliver summit's advertised consensus address#256
samlaf merged 1 commit into
seismicfrom
sl/summit-advertised-addr

Conversation

@samlaf

@samlaf samlaf commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Write summit.env with SUMMIT_ADVERTISED_ADDR, this node's external_ip at the consensus port, for summit's unit to splice into --ip.

An address is not part of validator identity in summit: its genesis carries the founding cohort's addresses outside the config digest, and a validator's consensus-state record holds none at all. Each node instead signs its own address and gossips that record, so the address a node declares is what the whole cohort dials it on. Nothing was delivering that declaration, which leaves it to summit's fallbacks: a founding node reads its own genesis entry, but a node joining an existing network has no entry there and resolves its address by asking public IP-echo services, then signs and gossips whatever they return.

Sourcing it from [node].external_ip is what keeps the two planes agreeing on where the machine is — the same field reth advertises via --nat extip, so no second delivered address can skew from it. It also keeps a founding node truthful across an address change, which its founding-era genesis entry cannot follow (those entries are deliberately outside the config digest, so IP churn never re-founds a network).

The value is a SocketAddr rather than a textually composed string: its Display brackets IPv6, which is the form summit parses. Composing "<external_ip>:" would emit 2001:db8::7:18551 for an IPv6 node, which summit rejects at startup.

The consensus port is named here until summit takes --ip as a bare address and pairs it with its own --port
(SeismicSystems/summit#455); the constant carries a TODO to drop it and the bracketing along with it.

Write summit.env with SUMMIT_ADVERTISED_ADDR, this node's external_ip at
the consensus port, for summit's unit to splice into --ip.

An address is not part of validator identity in summit: its genesis
carries the founding cohort's addresses outside the config digest, and a
validator's consensus-state record holds none at all. Each node instead
signs its own address and gossips that record, so the address a node
declares is what the whole cohort dials it on. Nothing was delivering
that declaration, which leaves it to summit's fallbacks: a founding node
reads its own genesis entry, but a node joining an existing network has
no entry there and resolves its address by asking public IP-echo
services, then signs and gossips whatever they return.

Sourcing it from [node].external_ip is what keeps the two planes
agreeing on where the machine is — the same field reth advertises via
--nat extip, so no second delivered address can skew from it. It also
keeps a founding node truthful across an address change, which its
founding-era genesis entry cannot follow (those entries are deliberately
outside the config digest, so IP churn never re-founds a network).

The value is a SocketAddr rather than a textually composed string: its
Display brackets IPv6, which is the form summit parses. Composing
"<external_ip>:<port>" would emit 2001:db8::7:18551 for an IPv6 node,
which summit rejects at startup.

The consensus port is named here until summit takes --ip as a bare
address and pairs it with its own --port
(SeismicSystems/summit#455); the constant carries
a TODO to drop it and the bracketing along with it.
@samlaf
samlaf requested a review from cdrappi as a code owner August 18, 2026 20:51
@samlaf
samlaf merged commit e8cf479 into seismic Aug 18, 2026
5 checks passed
@samlaf
samlaf deleted the sl/summit-advertised-addr branch August 18, 2026 20:57
samlaf added a commit to SeismicSystems/seismic-images that referenced this pull request Aug 18, 2026
Fixes SEI-219
Related to SeismicSystems/enclave#256

Load summit.env and pass --ip ${SUMMIT_ADVERTISED_ADDR}, the address
tdx-init composes from the operator's POSTed external_ip. summit signs
that address and gossips it as this node's peer record, so it is what
the rest of the cohort dials; without it summit falls back to its own
genesis entry, which only a founding node has, and a joining node
resolves its address from public IP-echo services instead.

It is the same address reth advertises via --nat extip, so both planes
agree on where this machine is.

The EnvironmentFile is required (no `-`): the Requires= chain
(attestation -> tdx-init) guarantees the file exists, so a missing one
is a real boot failure rather than something to tolerate. Unlike the
reth-p2p.env flags, the var is spliced as a quoted expansion — it is
always populated, so it needs no empty-var disappearing act.

Bump the enclave pin to the tdx-init that writes summit.env. The
EnvironmentFile is required, so the two have to move together: an older
pin leaves the file absent and summit refuses to start.

Correct the --rpc-ip TODO while here. It read as waiting on an upstream
merge that has already happened; what it actually waits on is the summit
pin, which predates the flag and would reject it at startup.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant