this derivation will be built: /nix/store/imn68dqa2dbp5lixc90l12czqmhgak0g-treefmt-check.drv building '/nix/store/imn68dqa2dbp5lixc90l12czqmhgak0g-treefmt-check.drv' treefmt-check> treefmt v2.5.0traversed 65 files treefmt-check> emitted 62 files for processing treefmt-check> formatted 62 files (5 changed) in 396ms treefmt-check> M DEFAULT_CONFIGS.md treefmt-check> M clanServices/dvt/roles/ecl/lodestar.nix treefmt-check> M clanServices/dvt/roles/ecl/nimbus.nix treefmt-check> M clanServices/dvt/roles/ecl/prysm.nix treefmt-check> M clanServices/dvt/roles/ecl/teku.nix treefmt-check> diff --git a/DEFAULT_CONFIGS.md b/DEFAULT_CONFIGS.md treefmt-check> index e995885..522b7d5 100644 treefmt-check> --- a/DEFAULT_CONFIGS.md treefmt-check> +++ b/DEFAULT_CONFIGS.md treefmt-check> @@ -12,35 +12,35 @@ reference for client configuration in research and testing environments. treefmt-check> treefmt-check> ### Universal settings treefmt-check> treefmt-check> -| Setting | Value | treefmt-check> -|---------|-------| treefmt-check> -| Systemd stop timeout | 300 s | treefmt-check> -| EL P2P port | 30303 | treefmt-check> -| EL HTTP-RPC port | 8545 (localhost only) | treefmt-check> -| EL Engine API port | 8551 (localhost only) | treefmt-check> -| CL P2P port | 9000 | treefmt-check> -| Checkpoint sync URL | `https://beaconstate.ethstaker.cc` | treefmt-check> -| IPv6 | disabled | treefmt-check> -| MEV-Boost | disabled | treefmt-check> +| Setting | Value | treefmt-check> +| -------------------- | ---------------------------------- | treefmt-check> +| Systemd stop timeout | 300 s | treefmt-check> +| EL P2P port | 30303 | treefmt-check> +| EL HTTP-RPC port | 8545 (localhost only) | treefmt-check> +| EL Engine API port | 8551 (localhost only) | treefmt-check> +| CL P2P port | 9000 | treefmt-check> +| Checkpoint sync URL | `https://beaconstate.ethstaker.cc` | treefmt-check> +| IPv6 | disabled | treefmt-check> +| MEV-Boost | disabled | treefmt-check> treefmt-check> ### EL metrics ports treefmt-check> treefmt-check> -| Client | Port | treefmt-check> -|--------|------| treefmt-check> -| Geth | 6060 | treefmt-check> -| Reth | 6060 | treefmt-check> -| Erigon | 6060 | treefmt-check> -| Besu | 9545 | treefmt-check> +| Client | Port | treefmt-check> +| ---------- | ---- | treefmt-check> +| Geth | 6060 | treefmt-check> +| Reth | 6060 | treefmt-check> +| Erigon | 6060 | treefmt-check> +| Besu | 9545 | treefmt-check> | Nethermind | 6060 | treefmt-check> treefmt-check> ### CL REST and metrics ports treefmt-check> treefmt-check> -| Client | REST port | Metrics port | P2P ports | treefmt-check> -|--------|-----------|-------------|-----------| treefmt-check> -| Nimbus | 5051 | 8008 | 9000 TCP+UDP | treefmt-check> -| Prysm | 3500 | 8080 | 13000 TCP / 12000 UDP | treefmt-check> -| Teku | 5051 | 8008 | 9000 TCP+UDP | treefmt-check> -| Lodestar | 9596 | 8008 | 9000 TCP+UDP | treefmt-check> +| Client | REST port | Metrics port | P2P ports | treefmt-check> +| -------- | --------- | ------------ | --------------------- | treefmt-check> +| Nimbus | 5051 | 8008 | 9000 TCP+UDP | treefmt-check> +| Prysm | 3500 | 8080 | 13000 TCP / 12000 UDP | treefmt-check> +| Teku | 5051 | 8008 | 9000 TCP+UDP | treefmt-check> +| Lodestar | 9596 | 8008 | 9000 TCP+UDP | treefmt-check> treefmt-check> ### Notable client-specific defaults treefmt-check> treefmt-check> @@ -56,66 +56,66 @@ reference for client configuration in research and testing environments. treefmt-check> treefmt-check> ### Role-level options (`clanServices/dvt/roles/ecl.nix`) treefmt-check> treefmt-check> -| Option | Default | Notes | treefmt-check> -|--------|---------|-------| treefmt-check> -| `executor.p2p.host` | `0.0.0.0` | all interfaces | treefmt-check> -| `executor.p2p.port` | 30303 | | treefmt-check> -| `executor.p2p.maxPeers` | 50 | ethpandaops leaves this at client default | treefmt-check> -| `executor.p2p.nat` | null | set to `extip:` for public nodes | treefmt-check> -| `beacon.p2p.host` | `0.0.0.0` | all interfaces | treefmt-check> -| `beacon.p2p.port` | 9000 | | treefmt-check> -| `beacon.p2p.maxPeers` | null | use client default | treefmt-check> -| `beacon.p2p.nat` | null | set to `extip:` for public nodes | treefmt-check> -| `beacon.rest.host` | `127.0.0.1` | overridden to `::` in DVT role for WireGuard access | treefmt-check> -| `beacon.rest.port` | 5052 | per-client default used in DVT role | treefmt-check> -| `beacon.checkpointSyncUrl` | null | no sane default set yet | treefmt-check> +| Option | Default | Notes | treefmt-check> +| -------------------------- | ----------- | --------------------------------------------------- | treefmt-check> +| `executor.p2p.host` | `0.0.0.0` | all interfaces | treefmt-check> +| `executor.p2p.port` | 30303 | | treefmt-check> +| `executor.p2p.maxPeers` | 50 | ethpandaops leaves this at client default | treefmt-check> +| `executor.p2p.nat` | null | set to `extip:` for public nodes | treefmt-check> +| `beacon.p2p.host` | `0.0.0.0` | all interfaces | treefmt-check> +| `beacon.p2p.port` | 9000 | | treefmt-check> +| `beacon.p2p.maxPeers` | null | use client default | treefmt-check> +| `beacon.p2p.nat` | null | set to `extip:` for public nodes | treefmt-check> +| `beacon.rest.host` | `127.0.0.1` | overridden to `::` in DVT role for WireGuard access | treefmt-check> +| `beacon.rest.port` | 5052 | per-client default used in DVT role | treefmt-check> +| `beacon.checkpointSyncUrl` | null | no sane default set yet | treefmt-check> treefmt-check> ### EL metrics ports treefmt-check> treefmt-check> -| Client | Our port | Ethpandaops | Match? | treefmt-check> -|--------|----------|-------------|--------| treefmt-check> -| Geth | 6060 | 6060 | ✓ | treefmt-check> -| Reth | 9001 | 6060 | ✗ — inherits ethereum-nix upstream default | treefmt-check> -| Erigon | 6060 | 6060 | ✓ | treefmt-check> -| Besu | 9545 | 9545 | ✓ | treefmt-check> -| Nethermind | 9091 | 6060 | ✗ — hardcoded in our role | treefmt-check> +| Client | Our port | Ethpandaops | Match? | treefmt-check> +| ---------- | -------- | ----------- | ------------------------------------------ | treefmt-check> +| Geth | 6060 | 6060 | ✓ | treefmt-check> +| Reth | 9001 | 6060 | ✗ — inherits ethereum-nix upstream default | treefmt-check> +| Erigon | 6060 | 6060 | ✓ | treefmt-check> +| Besu | 9545 | 9545 | ✓ | treefmt-check> +| Nethermind | 9091 | 6060 | ✗ — hardcoded in our role | treefmt-check> treefmt-check> ### CL REST ports treefmt-check> treefmt-check> -| Client | Our port | Ethpandaops | Notes | treefmt-check> -|--------|----------|-------------|-------| treefmt-check> -| Nimbus | 5052 | 5051 | intentional — set via `beacon.rest.port`; both work | treefmt-check> -| Prysm | 3500 | 3500 | ✓ | treefmt-check> -| Teku | 5051 | 5051 | ✓ | treefmt-check> -| Lodestar | 9596 | 9596 | ✓ | treefmt-check> +| Client | Our port | Ethpandaops | Notes | treefmt-check> +| -------- | -------- | ----------- | --------------------------------------------------- | treefmt-check> +| Nimbus | 5052 | 5051 | intentional — set via `beacon.rest.port`; both work | treefmt-check> +| Prysm | 3500 | 3500 | ✓ | treefmt-check> +| Teku | 5051 | 5051 | ✓ | treefmt-check> +| Lodestar | 9596 | 9596 | ✓ | treefmt-check> treefmt-check> ### Hardcoded DVT-specific behaviours (intentional — not targets for change) treefmt-check> treefmt-check> These are baked in because DVT correctness requires them: treefmt-check> treefmt-check> -| Behaviour | Reason | treefmt-check> -|-----------|--------| treefmt-check> -| `subscribe-all-subnets = true` on all CLs | DVT attestation aggregation requires nodes to aggregate all subnets | treefmt-check> -| Engine API at `http://127.0.0.1:8551` via JWT | EL/CL co-location on same machine; localhost keeps the JWT channel short | treefmt-check> -| CL REST bound to `::` (all interfaces) | Validators reach beacon nodes over WireGuard overlay; localhost-only would break this | treefmt-check> -| Metrics always enabled, scraped by Alloy → Mimir | Observability pipeline is part of the DVT cluster definition | treefmt-check> -| Node keys deterministic per machine | Stable enode/ENR addresses across restarts; needed for static peer config | treefmt-check> +| Behaviour | Reason | treefmt-check> +| ------------------------------------------------ | ------------------------------------------------------------------------------------- | treefmt-check> +| `subscribe-all-subnets = true` on all CLs | DVT attestation aggregation requires nodes to aggregate all subnets | treefmt-check> +| Engine API at `http://127.0.0.1:8551` via JWT | EL/CL co-location on same machine; localhost keeps the JWT channel short | treefmt-check> +| CL REST bound to `::` (all interfaces) | Validators reach beacon nodes over WireGuard overlay; localhost-only would break this | treefmt-check> +| Metrics always enabled, scraped by Alloy → Mimir | Observability pipeline is part of the DVT cluster definition | treefmt-check> +| Node keys deterministic per machine | Stable enode/ENR addresses across restarts; needed for static peer config | treefmt-check> treefmt-check> --- treefmt-check> treefmt-check> ## § 3 — Gaps and discrepancies treefmt-check> treefmt-check> -| # | Area | Ethpandaops | Ours | Priority | treefmt-check> -|---|------|-------------|------|----------| treefmt-check> -| 1 | Reth metrics port | 6060 | 9001 | Low — upstream ethereum-nix issue | treefmt-check> -| 2 | Nethermind metrics port | 6060 | 9091 | Medium — hardcoded in our role | treefmt-check> -| 3 | Nimbus REST port default | 5051 | 5052 | Low — intentional; both work | treefmt-check> -| 4 | Checkpoint sync URL | `beaconstate.ethstaker.cc` | null | High — production usability | treefmt-check> -| 5 | Teku storage mode | PRUNE | not set (archive) | Medium — bounds disk on non-archival nodes | treefmt-check> -| 6 | Besu NAT method | NONE | extip: | Low | treefmt-check> -| 7 | Reth WebSocket RPC | enabled on 8546 | not exposed | Low | treefmt-check> -| 8 | EL maxPeers default | client default | 50 | Low | treefmt-check> -| 9 | Systemd stop timeout | 300 s | not set explicitly | Low | treefmt-check> +| # | Area | Ethpandaops | Ours | Priority | treefmt-check> +| --- | ------------------------ | -------------------------- | ------------------ | ------------------------------------------ | treefmt-check> +| 1 | Reth metrics port | 6060 | 9001 | Low — upstream ethereum-nix issue | treefmt-check> +| 2 | Nethermind metrics port | 6060 | 9091 | Medium — hardcoded in our role | treefmt-check> +| 3 | Nimbus REST port default | 5051 | 5052 | Low — intentional; both work | treefmt-check> +| 4 | Checkpoint sync URL | `beaconstate.ethstaker.cc` | null | High — production usability | treefmt-check> +| 5 | Teku storage mode | PRUNE | not set (archive) | Medium — bounds disk on non-archival nodes | treefmt-check> +| 6 | Besu NAT method | NONE | extip: | Low | treefmt-check> +| 7 | Reth WebSocket RPC | enabled on 8546 | not exposed | Low | treefmt-check> +| 8 | EL maxPeers default | client default | 50 | Low | treefmt-check> +| 9 | Systemd stop timeout | 300 s | not set explicitly | Low | treefmt-check> treefmt-check> --- treefmt-check> treefmt-check> diff --git a/clanServices/dvt/roles/ecl/lodestar.nix b/clanServices/dvt/roles/ecl/lodestar.nix treefmt-check> index d300b19..cded24b 100644 treefmt-check> --- a/clanServices/dvt/roles/ecl/lodestar.nix treefmt-check> +++ b/clanServices/dvt/roles/ecl/lodestar.nix treefmt-check> @@ -66,9 +66,10 @@ in treefmt-check> }) treefmt-check> // (lib.optionalAttrs (settings.network != null) { treefmt-check> checkpointSyncUrl = treefmt-check> - if settings.beacon.checkpointSyncUrl != null treefmt-check> - then settings.beacon.checkpointSyncUrl treefmt-check> - else "https://beaconstate.ethstaker.cc"; treefmt-check> + if settings.beacon.checkpointSyncUrl != null then treefmt-check> + settings.beacon.checkpointSyncUrl treefmt-check> + else treefmt-check> + "https://beaconstate.ethstaker.cc"; treefmt-check> }); treefmt-check> }; treefmt-check> treefmt-check> diff --git a/clanServices/dvt/roles/ecl/nimbus.nix b/clanServices/dvt/roles/ecl/nimbus.nix treefmt-check> index 8e708dc..bc907b7 100644 treefmt-check> --- a/clanServices/dvt/roles/ecl/nimbus.nix treefmt-check> +++ b/clanServices/dvt/roles/ecl/nimbus.nix treefmt-check> @@ -33,9 +33,12 @@ in treefmt-check> # `trustedNodeSync`. Default to the ethpandaops community sync endpoint for treefmt-check> # known public networks; devnets (network = null) skip checkpoint sync. treefmt-check> checkpointSyncUrl = treefmt-check> - if settings.beacon.checkpointSyncUrl != null then settings.beacon.checkpointSyncUrl treefmt-check> - else if settings.network != null then "https://beaconstate.ethstaker.cc" treefmt-check> - else null; treefmt-check> + if settings.beacon.checkpointSyncUrl != null then treefmt-check> + settings.beacon.checkpointSyncUrl treefmt-check> + else if settings.network != null then treefmt-check> + "https://beaconstate.ethstaker.cc" treefmt-check> + else treefmt-check> + null; treefmt-check> treefmt-check> settings = { treefmt-check> # for custom / private chains the deployer overrides `network` with a treefmt-check> diff --git a/clanServices/dvt/roles/ecl/prysm.nix b/clanServices/dvt/roles/ecl/prysm.nix treefmt-check> index 11c158d..2a8a900 100644 treefmt-check> --- a/clanServices/dvt/roles/ecl/prysm.nix treefmt-check> +++ b/clanServices/dvt/roles/ecl/prysm.nix treefmt-check> @@ -67,9 +67,10 @@ in treefmt-check> }) treefmt-check> // (lib.optionalAttrs (settings.network != null) { treefmt-check> "checkpoint-sync-url" = treefmt-check> - if settings.beacon.checkpointSyncUrl != null treefmt-check> - then settings.beacon.checkpointSyncUrl treefmt-check> - else "https://beaconstate.ethstaker.cc"; treefmt-check> + if settings.beacon.checkpointSyncUrl != null then treefmt-check> + settings.beacon.checkpointSyncUrl treefmt-check> + else treefmt-check> + "https://beaconstate.ethstaker.cc"; treefmt-check> }); treefmt-check> }; treefmt-check> treefmt-check> diff --git a/clanServices/dvt/roles/ecl/teku.nix b/clanServices/dvt/roles/ecl/teku.nix treefmt-check> index 47bca50..e5e8e2e 100644 treefmt-check> --- a/clanServices/dvt/roles/ecl/teku.nix treefmt-check> +++ b/clanServices/dvt/roles/ecl/teku.nix treefmt-check> @@ -75,9 +75,10 @@ in treefmt-check> }) treefmt-check> // (lib.optionalAttrs (settings.network != null) { treefmt-check> "checkpoint-sync-url" = treefmt-check> - if settings.beacon.checkpointSyncUrl != null treefmt-check> - then settings.beacon.checkpointSyncUrl treefmt-check> - else "https://beaconstate.ethstaker.cc"; treefmt-check> + if settings.beacon.checkpointSyncUrl != null then treefmt-check> + settings.beacon.checkpointSyncUrl treefmt-check> + else treefmt-check> + "https://beaconstate.ethstaker.cc"; treefmt-check> }); treefmt-check> }; treefmt-check> error: Cannot build '/nix/store/imn68dqa2dbp5lixc90l12czqmhgak0g-treefmt-check.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/v7h08gdim8lycqihcsqlhw5kbinl92j7-treefmt-check Last 25 log lines: > + if settings.beacon.checkpointSyncUrl != null then > + settings.beacon.checkpointSyncUrl > + else > + "https://beaconstate.ethstaker.cc"; > }); > }; > > diff --git a/clanServices/dvt/roles/ecl/teku.nix b/clanServices/dvt/roles/ecl/teku.nix > index 47bca50..e5e8e2e 100644 > --- a/clanServices/dvt/roles/ecl/teku.nix > +++ b/clanServices/dvt/roles/ecl/teku.nix > @@ -75,9 +75,10 @@ in > }) > // (lib.optionalAttrs (settings.network != null) { > "checkpoint-sync-url" = > - if settings.beacon.checkpointSyncUrl != null > - then settings.beacon.checkpointSyncUrl > - else "https://beaconstate.ethstaker.cc"; > + if settings.beacon.checkpointSyncUrl != null then > + settings.beacon.checkpointSyncUrl > + else > + "https://beaconstate.ethstaker.cc"; > }); > }; > For full logs, run: nix log /nix/store/imn68dqa2dbp5lixc90l12czqmhgak0g-treefmt-check.drv