nixbot

builds
1treefmt v2.5.0traversed 79 files2emitted 77 files for processing3formatted 77 files (6 changed) in 573ms4 M DEFAULT_CONFIGS.md5 M clanServices/dvt/roles/ecl/adapters.unit.nix6 M clanServices/dvt/roles/ecl/grandine.nix7 M clanServices/dvt/roles/ecl/lighthouse.nix8 M clanServices/dvt/roles/ecl/lodestar.nix9 M clanServices/dvt/roles/ecl/nimbus.nix10diff --git a/DEFAULT_CONFIGS.md b/DEFAULT_CONFIGS.md11index e995885..522b7d5 10064412--- a/DEFAULT_CONFIGS.md13+++ b/DEFAULT_CONFIGS.md14@@ -12,35 +12,35 @@ reference for client configuration in research and testing environments.15 16 ### Universal settings17 18-| Setting | Value |19-|---------|-------|20-| Systemd stop timeout | 300 s |21-| EL P2P port | 30303 |22-| EL HTTP-RPC port | 8545 (localhost only) |23-| EL Engine API port | 8551 (localhost only) |24-| CL P2P port | 9000 |25-| Checkpoint sync URL | `https://beaconstate.ethstaker.cc` |26-| IPv6 | disabled |27-| MEV-Boost | disabled |28+| Setting | Value |29+| -------------------- | ---------------------------------- |30+| Systemd stop timeout | 300 s |31+| EL P2P port | 30303 |32+| EL HTTP-RPC port | 8545 (localhost only) |33+| EL Engine API port | 8551 (localhost only) |34+| CL P2P port | 9000 |35+| Checkpoint sync URL | `https://beaconstate.ethstaker.cc` |36+| IPv6 | disabled |37+| MEV-Boost | disabled |38 39 ### EL metrics ports40 41-| Client | Port |42-|--------|------|43-| Geth | 6060 |44-| Reth | 6060 |45-| Erigon | 6060 |46-| Besu | 9545 |47+| Client | Port |48+| ---------- | ---- |49+| Geth | 6060 |50+| Reth | 6060 |51+| Erigon | 6060 |52+| Besu | 9545 |53 | Nethermind | 6060 |54 55 ### CL REST and metrics ports56 57-| Client | REST port | Metrics port | P2P ports |58-|--------|-----------|-------------|-----------|59-| Nimbus | 5051 | 8008 | 9000 TCP+UDP |60-| Prysm | 3500 | 8080 | 13000 TCP / 12000 UDP |61-| Teku | 5051 | 8008 | 9000 TCP+UDP |62-| Lodestar | 9596 | 8008 | 9000 TCP+UDP |63+| Client | REST port | Metrics port | P2P ports |64+| -------- | --------- | ------------ | --------------------- |65+| Nimbus | 5051 | 8008 | 9000 TCP+UDP |66+| Prysm | 3500 | 8080 | 13000 TCP / 12000 UDP |67+| Teku | 5051 | 8008 | 9000 TCP+UDP |68+| Lodestar | 9596 | 8008 | 9000 TCP+UDP |69 70 ### Notable client-specific defaults71 72@@ -56,66 +56,66 @@ reference for client configuration in research and testing environments.73 74 ### Role-level options (`clanServices/dvt/roles/ecl.nix`)75 76-| Option | Default | Notes |77-|--------|---------|-------|78-| `executor.p2p.host` | `0.0.0.0` | all interfaces |79-| `executor.p2p.port` | 30303 | |80-| `executor.p2p.maxPeers` | 50 | ethpandaops leaves this at client default |81-| `executor.p2p.nat` | null | set to `extip:<IP>` for public nodes |82-| `beacon.p2p.host` | `0.0.0.0` | all interfaces |83-| `beacon.p2p.port` | 9000 | |84-| `beacon.p2p.maxPeers` | null | use client default |85-| `beacon.p2p.nat` | null | set to `extip:<IP>` for public nodes |86-| `beacon.rest.host` | `127.0.0.1` | overridden to `::` in DVT role for WireGuard access |87-| `beacon.rest.port` | 5052 | per-client default used in DVT role |88-| `beacon.checkpointSyncUrl` | null | no sane default set yet |89+| Option | Default | Notes |90+| -------------------------- | ----------- | --------------------------------------------------- |91+| `executor.p2p.host` | `0.0.0.0` | all interfaces |92+| `executor.p2p.port` | 30303 | |93+| `executor.p2p.maxPeers` | 50 | ethpandaops leaves this at client default |94+| `executor.p2p.nat` | null | set to `extip:<IP>` for public nodes |95+| `beacon.p2p.host` | `0.0.0.0` | all interfaces |96+| `beacon.p2p.port` | 9000 | |97+| `beacon.p2p.maxPeers` | null | use client default |98+| `beacon.p2p.nat` | null | set to `extip:<IP>` for public nodes |99+| `beacon.rest.host` | `127.0.0.1` | overridden to `::` in DVT role for WireGuard access |100+| `beacon.rest.port` | 5052 | per-client default used in DVT role |101+| `beacon.checkpointSyncUrl` | null | no sane default set yet |102 103 ### EL metrics ports104 105-| Client | Our port | Ethpandaops | Match? |106-|--------|----------|-------------|--------|107-| Geth | 6060 | 6060 | ✓ |108-| Reth | 9001 | 6060 | ✗ — inherits ethereum-nix upstream default |109-| Erigon | 6060 | 6060 | ✓ |110-| Besu | 9545 | 9545 | ✓ |111-| Nethermind | 9091 | 6060 | ✗ — hardcoded in our role |112+| Client | Our port | Ethpandaops | Match? |113+| ---------- | -------- | ----------- | ------------------------------------------ |114+| Geth | 6060 | 6060 | ✓ |115+| Reth | 9001 | 6060 | ✗ — inherits ethereum-nix upstream default |116+| Erigon | 6060 | 6060 | ✓ |117+| Besu | 9545 | 9545 | ✓ |118+| Nethermind | 9091 | 6060 | ✗ — hardcoded in our role |119 120 ### CL REST ports121 122-| Client | Our port | Ethpandaops | Notes |123-|--------|----------|-------------|-------|124-| Nimbus | 5052 | 5051 | intentional — set via `beacon.rest.port`; both work |125-| Prysm | 3500 | 3500 | ✓ |126-| Teku | 5051 | 5051 | ✓ |127-| Lodestar | 9596 | 9596 | ✓ |128+| Client | Our port | Ethpandaops | Notes |129+| -------- | -------- | ----------- | --------------------------------------------------- |130+| Nimbus | 5052 | 5051 | intentional — set via `beacon.rest.port`; both work |131+| Prysm | 3500 | 3500 | ✓ |132+| Teku | 5051 | 5051 | ✓ |133+| Lodestar | 9596 | 9596 | ✓ |134 135 ### Hardcoded DVT-specific behaviours (intentional — not targets for change)136 137 These are baked in because DVT correctness requires them:138 139-| Behaviour | Reason |140-|-----------|--------|141-| `subscribe-all-subnets = true` on all CLs | DVT attestation aggregation requires nodes to aggregate all subnets |142-| Engine API at `http://127.0.0.1:8551` via JWT | EL/CL co-location on same machine; localhost keeps the JWT channel short |143-| CL REST bound to `::` (all interfaces) | Validators reach beacon nodes over WireGuard overlay; localhost-only would break this |144-| Metrics always enabled, scraped by Alloy → Mimir | Observability pipeline is part of the DVT cluster definition |145-| Node keys deterministic per machine | Stable enode/ENR addresses across restarts; needed for static peer config |146+| Behaviour | Reason |147+| ------------------------------------------------ | ------------------------------------------------------------------------------------- |148+| `subscribe-all-subnets = true` on all CLs | DVT attestation aggregation requires nodes to aggregate all subnets |149+| Engine API at `http://127.0.0.1:8551` via JWT | EL/CL co-location on same machine; localhost keeps the JWT channel short |150+| CL REST bound to `::` (all interfaces) | Validators reach beacon nodes over WireGuard overlay; localhost-only would break this |151+| Metrics always enabled, scraped by Alloy → Mimir | Observability pipeline is part of the DVT cluster definition |152+| Node keys deterministic per machine | Stable enode/ENR addresses across restarts; needed for static peer config |153 154 ---155 156 ## § 3 — Gaps and discrepancies157 158-| # | Area | Ethpandaops | Ours | Priority |159-|---|------|-------------|------|----------|160-| 1 | Reth metrics port | 6060 | 9001 | Low — upstream ethereum-nix issue |161-| 2 | Nethermind metrics port | 6060 | 9091 | Medium — hardcoded in our role |162-| 3 | Nimbus REST port default | 5051 | 5052 | Low — intentional; both work |163-| 4 | Checkpoint sync URL | `beaconstate.ethstaker.cc` | null | High — production usability |164-| 5 | Teku storage mode | PRUNE | not set (archive) | Medium — bounds disk on non-archival nodes |165-| 6 | Besu NAT method | NONE | extip: | Low |166-| 7 | Reth WebSocket RPC | enabled on 8546 | not exposed | Low |167-| 8 | EL maxPeers default | client default | 50 | Low |168-| 9 | Systemd stop timeout | 300 s | not set explicitly | Low |169+| # | Area | Ethpandaops | Ours | Priority |170+| --- | ------------------------ | -------------------------- | ------------------ | ------------------------------------------ |171+| 1 | Reth metrics port | 6060 | 9001 | Low — upstream ethereum-nix issue |172+| 2 | Nethermind metrics port | 6060 | 9091 | Medium — hardcoded in our role |173+| 3 | Nimbus REST port default | 5051 | 5052 | Low — intentional; both work |174+| 4 | Checkpoint sync URL | `beaconstate.ethstaker.cc` | null | High — production usability |175+| 5 | Teku storage mode | PRUNE | not set (archive) | Medium — bounds disk on non-archival nodes |176+| 6 | Besu NAT method | NONE | extip: | Low |177+| 7 | Reth WebSocket RPC | enabled on 8546 | not exposed | Low |178+| 8 | EL maxPeers default | client default | 50 | Low |179+| 9 | Systemd stop timeout | 300 s | not set explicitly | Low |180 181 ---182 183diff --git a/clanServices/dvt/roles/ecl/adapters.unit.nix b/clanServices/dvt/roles/ecl/adapters.unit.nix184index be5cba2..2bae3c0 100644185--- a/clanServices/dvt/roles/ecl/adapters.unit.nix186+++ b/clanServices/dvt/roles/ecl/adapters.unit.nix187@@ -139,7 +139,9 @@ let188 if matching == [ ] then "" else lib.removePrefix prefix (lib.head matching);189 intValueOf = key: lib.toInt (rawValueOf key);190 in191- { inherit intValueOf; };192+ {193+ inherit intValueOf;194+ };195 196 # Full teku nixosModule eval (not via the adapter) for asserting the197 # resources.memory.request -> JAVA_OPTS translation and the explicit-Xmx precedence.198diff --git a/clanServices/dvt/roles/ecl/grandine.nix b/clanServices/dvt/roles/ecl/grandine.nix199index bea535e..417824f 100644200--- a/clanServices/dvt/roles/ecl/grandine.nix201+++ b/clanServices/dvt/roles/ecl/grandine.nix202@@ -72,9 +72,12 @@ in203 "metrics-port" = 8008;204 205 "checkpoint-sync-url" =206- if settings.beacon.checkpointSyncUrl != null then settings.beacon.checkpointSyncUrl207- else if settings.network != null then "https://beaconstate.ethstaker.cc"208- else null;209+ if settings.beacon.checkpointSyncUrl != null then210+ settings.beacon.checkpointSyncUrl211+ else if settings.network != null then212+ "https://beaconstate.ethstaker.cc"213+ else214+ null;215 }216 // (lib.optionalAttrs (settings.beacon.p2p.maxPeers != null) {217 target-peers = settings.beacon.p2p.maxPeers;218diff --git a/clanServices/dvt/roles/ecl/lighthouse.nix b/clanServices/dvt/roles/ecl/lighthouse.nix219index f25d7a8..f83a3fe 100644220--- a/clanServices/dvt/roles/ecl/lighthouse.nix221+++ b/clanServices/dvt/roles/ecl/lighthouse.nix222@@ -15,9 +15,12 @@223 let224 cfg = config.services.ethereum.lighthouse-beacon.${instanceName};225 checkpointUrl =226- if settings.beacon.checkpointSyncUrl != null then settings.beacon.checkpointSyncUrl227- else if settings.network != null then "https://beaconstate.ethstaker.cc"228- else null;229+ if settings.beacon.checkpointSyncUrl != null then230+ settings.beacon.checkpointSyncUrl231+ else if settings.network != null then232+ "https://beaconstate.ethstaker.cc"233+ else234+ null;235 in236 {237 imports = [238@@ -85,8 +88,8 @@ in239 "--enr-address=${lib.removePrefix "extip:" settings.beacon.p2p.nat}"240 ]241 ++ lib.optionals (checkpointUrl != null) [242- "--checkpoint-sync-url=${checkpointUrl}"243- ]244+ "--checkpoint-sync-url=${checkpointUrl}"245+ ]246 ++ lib.optionals (settings.beacon.p2p.directPeering && beaconDirectPeers != [ ]) [247 # --trusted-peers takes peer IDs (not multiaddrs): each peer becomes a248 # GossipSub explicit peer with unconditional message forwarding and249diff --git a/clanServices/dvt/roles/ecl/lodestar.nix b/clanServices/dvt/roles/ecl/lodestar.nix250index 9183662..164f841 100644251--- a/clanServices/dvt/roles/ecl/lodestar.nix252+++ b/clanServices/dvt/roles/ecl/lodestar.nix253@@ -93,9 +93,10 @@ in254 })255 // (lib.optionalAttrs (settings.network != null) {256 checkpointSyncUrl =257- if settings.beacon.checkpointSyncUrl != null258- then settings.beacon.checkpointSyncUrl259- else "https://beaconstate.ethstaker.cc";260+ if settings.beacon.checkpointSyncUrl != null then261+ settings.beacon.checkpointSyncUrl262+ else263+ "https://beaconstate.ethstaker.cc";264 });265 };266 267diff --git a/clanServices/dvt/roles/ecl/nimbus.nix b/clanServices/dvt/roles/ecl/nimbus.nix268index 1775208..098b73f 100644269--- a/clanServices/dvt/roles/ecl/nimbus.nix270+++ b/clanServices/dvt/roles/ecl/nimbus.nix271@@ -55,9 +55,12 @@ in272 # `trustedNodeSync`. Default to the ethpandaops community sync endpoint for273 # known public networks; devnets (network = null) skip checkpoint sync.274 checkpointSyncUrl =275- if settings.beacon.checkpointSyncUrl != null then settings.beacon.checkpointSyncUrl276- else if settings.network != null then "https://beaconstate.ethstaker.cc"277- else null;278+ if settings.beacon.checkpointSyncUrl != null then279+ settings.beacon.checkpointSyncUrl280+ else if settings.network != null then281+ "https://beaconstate.ethstaker.cc"282+ else283+ null;284 285 settings = {286 # for custom / private chains the deployer overrides `network` with a