# Plataberget spec :::info :mega: Plataberget targets to launch in early August 2026. **Exact date deferred to ACDT #90 (2026-08-03)** ::: :::info :checkered_flag: **Scope.** Short-lived fork-transition devnet: all clients fork together from a big pre-fork state (config similar to devnet-7). EL discovery runs **discv5-only** (per-client flags under Networking); QUIC stays enabled on the CL. The new **builder API** flow (Beacon API / Keymanager / Builder Specs PRs below) is **best effort**. Benchmark-driven repricing updates (EIP-8037/8038 numbers) may still land before launch. Stress goals: SSZ/stable-container performance and builder lifecycle at scale (see Testing focus). devnet-9 (non-finality testing) follows within the month. ::: :::info 8282 system contracts are unchanged from devnet-7 (no sys-asm bytecode changes since): | Contract | Req | type | Address | |----------|---------|------|--------------------------------------------| | same as devnet-7 | deposit | 0x03 | 0x0000bff46984e3725691fa540a8c7589300d8282 | | same as devnet-7 | exit | 0x04 | 0x000064d678505ad48f8ccb093bc65613800e8282 | ::: ## EIP List for Plataberget testnet | EIP | Title |Status |--------|-----|:-----:| |[EIP-2780](https://eips.ethereum.org/EIPS/eip-2780) | Reduce intrinsic transaction gas — **transfer log cost folded into `TX_VALUE_COST`** (create-with-value cost changes) | :up: |[EIP-7610](https://eips.ethereum.org/EIPS/eip-7610) | Revert creation in case of non-empty storage |[EIP-7688](https://eips.ethereum.org/EIPS/eip-7688) | Forward compatible consensus data structures | |[EIP-7708](https://eips.ethereum.org/EIPS/eip-7708) | ETH transfers emit a log | |[EIP-7732](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-7732.md) | Enshrined Proposer-Builder Separation | |[EIP-7778](https://eips.ethereum.org/EIPS/eip-7778) | Block Gas Accounting without Refunds | |[EIP-7843](https://eips.ethereum.org/EIPS/eip-7843) | SLOTNUM opcode | | [EIP-7904](https://eips.ethereum.org/EIPS/eip-7904) | Compute Gas Cost Analysis (informational only) | ℹ️ | |[EIP-7928](https://eips.ethereum.org/EIPS/eip-7928) | Block-Level Access Lists — recipient excluded when a runtime halt precedes | :up: |[EIP-7954](https://eips.ethereum.org/EIPS/eip-7954) | Increase Maximum Contract Size (**→ 64 KiB**) | |[EIP-7975](https://eips.ethereum.org/EIPS/eip-7975) | eth/70 - partial block receipt lists | |[EIP-7976](https://eips.ethereum.org/EIPS/eip-7976) | Increase Calldata Floor Cost (64/64) | |[EIP-7981](https://eips.ethereum.org/EIPS/eip-7981) | Increase Access List Cost | |[EIP-7997](https://eips.ethereum.org/EIPS/eip-7997) | Deterministic Factory Predeploy — spec unchanged; clients **must not** check contract existence at the fork boundary (no BAL read, no witness) | :up: |[EIP-8024](https://eips.ethereum.org/EIPS/eip-8024) | Backward compatible SWAPN, DUPN, EXCHANGE |[EIP-8037](https://eips.ethereum.org/EIPS/eip-8037) | State Creation Gas — CPSB=1530, source-based refunds; "regular gas" renamed to **"execution gas"** (terminology only) | :up: |[EIP-8038](https://eips.ethereum.org/EIPS/eip-8038) | State-access gas cost update | |[EIP-8045](https://eips.ethereum.org/EIPS/eip-8045) | Exclude slashed validators from proposing | |[EIP-8061](https://eips.ethereum.org/EIPS/eip-8061) | Increase exit and consolidation churn | |[EIP-8070](https://eips.ethereum.org/EIPS/eip-8070) | Sparse Blobpool — **Engine API half now required**: `engine_getBlobsV3` *and* `V4` both served, FCU v4 `custody_columns`. eth/72 cell exchange stays optional; cell-level DAS deferred | :exclamation: |[EIP-8159](https://eips.ethereum.org/EIPS/eip-8159) | eth/71 - Block Access List Exchange | |[EIP-8246](https://eips.ethereum.org/EIPS/eip-8246) | Remove SELFDESTRUCT Burn | |[EIP-8282](https://github.com/ethereum/EIPs/pull/11760) | Add builder execution requests | **Key:** - :up: EIP has updated - :new: New EIP added - :exclamation: scope changed (now required) - :sparkles: Optional (nice to have) ## Testing focus - **Fork transition** (primary goal): all clients through the fork without restarts. Regression checks from devnet-7: Lodestar+Besu/Erigon post-fork head hang, Teku rejecting valid buildoor bids, `debug_traceBlockByHash`, ePBS payload-body reconstruction. - **SSZ / stable containers (EIP-7688) performance**: devnet-7 showed 10–20% slower processing across clients plus large-Merkle-tree issues with the big validator set. Verify the optimization round landed; compare block-processing/hashing metrics against devnet-7. - **Builder lifecycle at scale**: each builder can only bid once per slot, so stressing the exit/withdrawal path needs breadth — deposit a few thousand builders, exit them en masse, drain the full-withdrawal sweep. Throughput bounds: deposits target 8/block on the 8282 contract (fee ramps exponentially above target; CL cap `MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD` = 64), exits ≤ `MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD` = 16/payload, withdrawability +64 epochs, sweep scans ≤ `MAX_BUILDERS_PER_WITHDRAWALS_SWEEP` = 16,384 builders/block, sharing the withdrawal pipeline with the exited-validator sweep. Also stresses the `ProgressiveList` builder registry (ties into the SSZ goal). Note: assertoor `builder-lifecycle.yaml` skips its full-withdrawal step when `MIN_BUILDER_WITHDRAWABILITY_DELAY` ≥ 10 epochs — playbook needs extending for this scenario. - **discv5-only verification**: each EL must publish — and refresh at the fork — the `eth` forkid ENR entry on its discv5 record; geth's dial-candidate filter drops nodes without it. Confirm bootnode ENR distribution, and watch for besu's silent V4 fallback masking failures. - **Txpool across the fork**: start spamming before the fork (devnet-7 started post-fork) so pools full of pre-fork-priced txs (EIP-2780 intrinsic gas, create-with-value change) get revalidated at the boundary. ## Network config overrides (vs mainnet defaults) Goal: a 1024 ETH validator joins/exits at least as fast as a 32 ETH validator on mainnet, and entry/exit churn is high enough to grow and drain the validator and builder sets quickly. All of these are runtime config values — no client rebuilds. | Config var | Mainnet default | devnet-8 | Why | |------------|-----------------|----------|-----| | `MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_GLOAS` | `256000000000` (256 ETH) | `16384000000000` (16384 ETH) | 16 × 1024-ETH activations/epoch — saturates the `MAX_PENDING_DEPOSITS_PER_EPOCH` = 16 preset cap; 2× mainnet's count-rate | | `CHURN_LIMIT_QUOTIENT_GLOAS` | `32768` | `128` (TBD — size against genesis active stake) | keeps exit churn *proportional* (the EIP-8061 mechanism) while meaningful at devnet stake; at the mainnet quotient the 128 ETH floor binds and one 1024-ETH exit eats 8 epochs | | `CONSOLIDATION_CHURN_LIMIT_QUOTIENT` | `65536` | `256` (TBD — only if consolidation flows are in scope) | consolidation churn has no floor (EIP-8061); at devnet stake levels with the mainnet quotient it rounds to ~0 and consolidations stall | | `MIN_BUILDER_WITHDRAWABILITY_DELAY` | `64` epochs | `8` epochs | fast mass-withdrawal drain for the builder stress test; also un-skips the assertoor `builder-lifecycle` full-withdrawal step (its guard is < 10 epochs) | Deliberately left at mainnet values: - `MAX_PENDING_DEPOSITS_PER_EPOCH` = 16 is a **preset** (compile-time for most CL clients) — validator onboarding is hard-capped at 16/epoch ≈ 3,600/day regardless of churn. Bulk validator count belongs in genesis; incremental state growth is faster via builders (~57,000/day at the 8282 contract's 8/block target — no churn, no pending-deposit queue). - Builder per-payload caps (`MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD` = 64, `MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD` = 16) and `MAX_BUILDERS_PER_WITHDRAWALS_SWEEP` = 16,384 are preset SSZ bounds — consensus-breaking to change. - sys-asm 8282 contract bytecode stays at mainnet parameters (`TARGET_PER_BLOCK` = 8, exponential fee ramp) — the fee mechanism is itself under test. ### Specs & Tests **Consensus Layer** - [ ] target `v1.7.0-alpha.13` — version bump merged ([PR-5470](https://github.com/ethereum/consensus-specs/pull/5470)); **release not cut** (latest `v1.7.0-alpha.12`, 2026-07-08). Slipped past the ACDT #89 target :hourglass: **Execution Layer** - [x] target [tests-glamsterdam-devnet@v8.0.0](https://github.com/ethereum/execution-specs/releases/tag/tests-glamsterdam-devnet@v8.0.0) ### Open PRs **EIPs** - [PR-11902 - EIP-7928: exclude the recipient when a runtime halt precedes](https://github.com/ethereum/EIPs/pull/11902) Merged :heavy_check_mark: - [PR-11991 - EIP-7997: specify activation-block deployment and BAL recording](https://github.com/ethereum/EIPs/pull/11991) Closed :x: - closed 07-27 - [PR-11997 - EIP-2780: fold transfer log cost into TX_VALUE_COST](https://github.com/ethereum/EIPs/pull/11997) Merged :heavy_check_mark: - [PR-11998 - EIP-8037: rename "regular gas" to "execution gas"](https://github.com/ethereum/EIPs/pull/11998) Merged :heavy_check_mark: - [PR-12009 - EIP-7997: simplify spec, clarify rationale](https://github.com/ethereum/EIPs/pull/12009) Closed :x: - closed 07-27 ACDT #89 closed both: existing spec text is correct, and no BAL read or contract-existence check happens at the fork boundary. Follow-up: geth uniquely reads/deploys the 7997 contract at the boundary — harmless on mainnet, divergent on chains without the factory pre-deployed. **Builder Specs** [ethereum/builder-specs](https://github.com/ethereum/builder-specs) — best effort for devnet-8 - [PR-165 - request auth clarifications](https://github.com/ethereum/builder-specs/pull/165) Open :exclamation: - Will there be a release? **Beacon API** - [ISSUE-599 - event to signal the builder that its bid was accepted](https://github.com/ethereum/beacon-APIs/issues/599) Open :exclamation: - builders have no clean signal that their bid won, hence whether to reveal - [PR-606 - feat: extend /eth/v1/node/peers with peer scoring and disconnect reasons](https://github.com/ethereum/beacon-APIs/pull/606) Open :exclamation: - [PR-624 - remove BlindedExecutionPayloadEnvelope](https://github.com/ethereum/beacon-APIs/pull/624) Merged :heavy_check_mark: - merged 07-16. Builders send `Eth-Blob-Data-Included: true`, and keep `Eth-Execution-Payload-Blinded: false` for pre-624 beacon nodes - [PR-625 - Add a POST produceBlockV4](https://github.com/ethereum/beacon-APIs/pull/625) Open :exclamation: - [PR-627 - Add `produceBlockV4WithBid`](https://github.com/ethereum/beacon-APIs/pull/627) Open :exclamation: - best effort - [PR-630 - Update Beacon API for parity with Builder API and KeyManager API](https://github.com/ethereum/beacon-APIs/pull/630) Open :exclamation: - best effort **Keymanager API** Best effort for devnet-8. - [PR-87 - Deprecate prior and add /validator/config endpoint](https://github.com/ethereum/keymanager-APIs/pull/87) Open :exclamation: - [PR-88 - add per-key builders endpoints](https://github.com/ethereum/keymanager-APIs/pull/88) Open :exclamation: **Review order for the builder-config stack:** keymanager (#87/#88) first — builder-specs#165 and beacon-APIs#630 both depend on the shape it lands on. Open points: whether to cut per-builder p2p config options; overloading `builder_pubkey` for p2p builders (makes `url` optional, which SSZ handles badly without a first-class `Optional`); `min_bid`/boost-factor are VC-local hints the beacon node must not forward. At least one client must implement e2e before merge — the reason this flow stays best effort for devnet-8. **Consensus Specs** *Builder-bid fork-choice — PR-5472 vs PR-5491, pick one before the freeze.* :exclamation: - [PR-5179 - Add `beacon_block_headers_by_root` req/resp on Gloas](https://github.com/ethereum/consensus-specs/pull/5179) Open :exclamation: - required for devnet-8 - [PR-5294 - Add executable gossip validation functions for gloas](https://github.com/ethereum/consensus-specs/pull/5294) Open :exclamation: - required for devnet-8 - [PR-5442 - Fix payload availability lookup for attestations to skipped slots](https://github.com/ethereum/consensus-specs/pull/5442) Closed :x: - closed 07-28, superseded by PR-5473 - [PR-5443 - Add dependent root check to `proposer_preferences` validation](https://github.com/ethereum/consensus-specs/pull/5443) Merged :heavy_check_mark: - merged 07-24 - [PR-5459 - Add p2p helper functions for epoch inclusivity check](https://github.com/ethereum/consensus-specs/pull/5459) Merged :heavy_check_mark: - [PR-5462 - Correct `MIN_SLOTS_FOR_INCLUSION_LISTS_REQUESTS` value](https://github.com/ethereum/consensus-specs/pull/5462) Merged :heavy_check_mark: - [PR-5472 - Allow builders to bid on multiple branches](https://github.com/ethereum/consensus-specs/pull/5472) Open :exclamation: - builder-bid fork-choice option A — emerging preference: bounds DoS by a constant factor and decouples fork choice from bid processing - [PR-5473 - Fix payload availability lookup using the parent block's slot](https://github.com/ethereum/consensus-specs/pull/5473) Merged :heavy_check_mark: - merged 07-29; the alternative that superseded PR-5442 - [PR-5491 - Only allow bids compatible with the head view](https://github.com/ethereum/consensus-specs/pull/5491) Open :exclamation: - builder-bid fork-choice option B — requires processing attestations every slot - [PR-5495 - Preserve PTC votes when a known block is re-delivered in Gloas](https://github.com/ethereum/consensus-specs/pull/5495) Draft :exclamation: **Execution APIs** JSON-RPC alignment targeted for devnet-8. - [PR-851 - eth/debug: specify block access list getter semantics](https://github.com/ethereum/execution-apis/pull/851) Open :exclamation: - required for devnet-8 - [PR-852 - debug: specify callTracer output and add EIP-8037 two-dimensional gas to tracing](https://github.com/ethereum/execution-apis/pull/852) Open :exclamation: - required for devnet-8 - [PR-854 - eth_createAccessList: clarify gas-fee affordability when fee fields omitted](https://github.com/ethereum/execution-apis/pull/854) Draft :exclamation: - [PR-855 - debug: standardize callTracer output and add debug_traceCall](https://github.com/ethereum/execution-apis/pull/855) Draft :exclamation: - follow-on to PR-852 - **`rpc-compat` / hivechain**: blocked on the fork definition being stable enough to generate a chain loadable by production clients. A combined execution-apis branch is being assembled. **Action: declare the EL fork definition frozen modulo the repricing constants so hivechain generation can start.** **Networking** - **EL discovery: discv5-only.** Per-client flags: | Client | discv5-only flags | |--------|-------------------| | geth | `--discovery.v4=false --discovery.v5=true` | | besu | `--discovery-mode=V5` (falls back to V4 if the node key is not secp256k1) | | nethermind | `--Discovery.DiscoveryVersion V5` | | reth | `--disable-discv4-discovery` (discv5 on by default) | | erigon | `--discovery.v4=false --discovery.v5=true` | | ethrex | `--p2p.discv4 false` (discv5 on by default) | - **Also disable DNS discovery** — a second silent fallback that runs independently of discv4/discv5, so peers can still be found while discv5 is quietly broken. geth: `--discovery.dns ""`. Besu uses it independently of v4/v5 and can disable it. Nimbus EL/CL do not use it. Confirm per client. - CL: QUIC stays enabled (carried over from devnet-7) **Execution Specs** - [PR-2948 - EIP-8070 sparse blobpool execute-only tests](https://github.com/ethereum/execution-specs/pull/2948) Merged :heavy_check_mark: - merged 07-29 - [PR-3200 - add EIP-7997 deterministic factory deployment (fork-transition BAL entries)](https://github.com/ethereum/execution-specs/pull/3200) Closed :x: - closed 07-24 - [PR-3214 - fold transfer log cost into value transfer cost](https://github.com/ethereum/execution-specs/pull/3214) Merged :heavy_check_mark: - merged 07-29 **System Contracts** - No changes since devnet-7 (only a geas v0.3.3 toolchain bump, bytecode unchanged) ## Local testing Kurtosis example: ``` participants_matrix: el: - el_type: geth el_image: ethpandaops/geth:glamsterdam-devnet-8 - el_type: ethrex el_image: ethpandaops/ethrex:glamsterdam-devnet-8 - el_type: nethermind el_image: ethpandaops/nethermind:glamsterdam-devnet-8 cl: - cl_type: lighthouse cl_image: ethpandaops/lighthouse:glamsterdam-devnet-8 - cl_type: lodestar cl_image: ethpandaops/lodestar:glamsterdam-devnet-8 - cl_type: prysm cl_image: ethpandaops/prysm-beacon-chain:glamsterdam-devnet-8-minimal network_params: preset: minimal gloas_fork_epoch: 1 # (deploy_eip8282_contracts: true) at the same addresses as devnet-7: # deposit: 0x0000bFF46984e3725691FA540a8C7589300D8282 # exit: 0x000064D678505ad48F8cCb093BC65613800E8282 additional_services: - assertoor - spamoor - dora assertoor_params: run_stability_check: false run_block_proposal_check: false tests: - { file: "https://raw.githubusercontent.com/ethpandaops/assertoor/refs/heads/master/playbooks/gloas-dev/builder-lifecycle.yaml" } - { file: "https://raw.githubusercontent.com/ethpandaops/assertoor/refs/heads/master/playbooks/gloas-dev/builder-deposit.yaml" } dora_params: image: ethpandaops/dora:master-latest port_publisher: additional_services: enabled: true global_log_level: debug ``` --- ## Metrics https://notes.ethereum.org/@ethpandaops/bal-otel Previous devnet spec sheets for reference: https://notes.ethereum.org/@ethpandaops/glamsterdam-devnet-7