User Stories for RPIP-79: Faster Withdrawal Credentials Check¶
RPIP-79 speeds up megapool validator creation by replacing the mandatory beacon state proof with an optimistic challenge. Today, the second (31 ETH) deposit can only happen after the validator's first (1 ETH) deposit clears the beacon pending_deposits queue and a state proof is submitted — a sequential dependency on the entry queue. RPIP-79 lets the 31 ETH stake proceed without a state proof, and instead opens a short window in which anyone can prove a withdrawal-credential exploit. In the common case — an honest operator with correct credentials — no proof is ever needed.
This matters because RPIP-73 is expected to drive significant validator churn, so minimising the time new validators spend waiting in the beacon queue becomes a priority.
Prestake Challenge Lifecycle Diagram¶
flowchart TD
Prestake[Operator prestakes 1 ETH] --> Window{"prestake_challenge_period (12h)"}
Window -- "Fraud proof submitted" --> Verify["Proof: matching pubkey + incorrect withdrawal_credentials"]
Verify --> Slash["rETH share of 31 ETH returned to deposit pool"]
Slash --> Reward["Node operator share awarded to challenger (direct or credit)"]
Window -- "No proof within window" --> Stake["Anyone calls stake_without_state_proof"]
Stake --> Staked([Remaining 31 ETH staked, validator active])
Actors¶
- Node Operator: Prestakes the validator (1 ETH) and, in the honest case, has it staked after the challenge window with no proof required.
- Challenger (any user): During the challenge window, may submit a beacon state proof of incorrect withdrawal credentials and claim the node operator's share as a reward.
- pDAO: Sets the challenge period and the
reduced_bondguardrail via on-chain governance.
Protocol Parameters¶
New parameters¶
| Parameter | Type | Initial Value | Guardrail | Description |
|---|---|---|---|---|
prestake_challenge_period |
Hours |
12 |
>= 12 |
Window after prestake during which anyone may submit a withdrawal-credential fraud proof before the validator can be staked. |
Modified guardrails¶
| Parameter | Old Guardrail | New Guardrail | Reason |
|---|---|---|---|
reduced_bond |
>= 1 and <= 4 |
>= 1.1 and <= 4 |
Ensures at least a 0.1 ETH node operator share remains in the 31 ETH stake, guaranteeing a minimum challenger reward. |
Epic 1: Optimistic Staking¶
1.1: Stake Without a State Proof¶
As a Node Operator with correct withdrawal credentials,
I want to have my validator's remaining 31 ETH staked without generating or submitting a beacon state proof,
So that the common path is cheaper and faster and my validator is not delayed by the beacon chain entry queue.
- Acceptance Criteria:
- A
stake_without_state_proofmethod performs the remaining 31 ETH stake without requiring a validator state proof. - No proof is required from the node operator for staking to proceed.
- Once
prestake_challenge_periodhas elapsed without a valid proof, anyone may callstake_without_state_proofto complete the stake. - The method cannot be called before the challenge period has elapsed.
- Staking no longer depends on the validator's first deposit clearing the
pending_depositsqueue.
- A
Epic 2: Fraud Proof Challenge¶
2.1: Challenge via the Validators Set¶
As a Challenger,
I want to submit a beacon state proof that the validators set contains a validator with a matching pubkey and incorrect withdrawal_credentials,
So that a withdrawal-credential exploit on an already-registered validator is stopped before the protocol's 31 ETH is staked to it.
- Acceptance Criteria:
- Between
prestakeandstake/stake_without_state_proof, anyone may submit a beacon state proof thatvalidatorscontains a validator with a matchingpubkeyand incorrectwithdrawal_credentials. - Proof verification uses BLS12-381 signature verification via the EIP-2537 precompiles.
- A validator with a valid challenge is not staked.
- On a valid proof, the rETH share of the remaining 31 ETH is returned to the deposit pool.
- The node operator share of the remaining 31 ETH is awarded to the proof provider, either directly or as credit (in which case the full 31 ETH is sent to the deposit pool); the
reduced_bond >= 1.1guardrail ensures this share is at least 0.1 ETH.
- Between
2.2: Challenge via Pending Deposits¶
As a Challenger,
I want to submit a beacon state proof that pending_deposits contains a validator with a matching pubkey, incorrect withdrawal_credentials, and a valid signature,
So that a withdrawal-credential exploit can be proven before the validator's deposit has cleared the entry queue.
- Acceptance Criteria:
- Between
prestakeandstake/stake_without_state_proof, anyone may submit a beacon state proof thatpending_depositscontains a validator with a matchingpubkey, incorrectwithdrawal_credentials, and a validsignature. - A challenge is rejected if the
pending_depositsdeposit it refers to has an invalid signature, preventing a 1 ETH griefing vector that would otherwise dissolve legitimate Rocket Pool validators. - A validator with a valid challenge is not staked.
- On a valid proof, the rETH share of the remaining 31 ETH is returned to the deposit pool.
- The node operator share of the remaining 31 ETH is awarded to the proof provider, either directly or as credit (in which case the full 31 ETH is sent to the deposit pool); the
reduced_bond >= 1.1guardrail ensures this share is at least 0.1 ETH.
- Between
Epic 3: Governance¶
3.1: Update the Challenge Period¶
As the pDAO,
I want to update prestake_challenge_period via on-chain governance,
So that the safety/latency trade-off of the challenge window can be tuned over time.
- Acceptance Criteria:
prestake_challenge_periodcan only be updated by pDAO proposal.- The update proposal executes when setting
prestake_challenge_periodto any value at or above the 12-hour guardrail, emitting an event. - The update proposal reverts with a clear error when attempting to set
prestake_challenge_periodbelow 12 hours.
3.2: Update the Reduced Bond Guardrail¶
As the pDAO,
I want to update reduced_bond via on-chain governance, bounded to the >= 1.1 and <= 4 ETH guardrail,
So that the minimum bond — and therefore the minimum challenger reward of 0.1 ETH — can be tuned over time while staying within safe bounds.
- Acceptance Criteria:
reduced_bondcan only be updated by pDAO proposal.- The update proposal executes when setting
reduced_bondto any value in[1.1, 4]ETH, emitting an event. - The update proposal reverts with a clear error when attempting to set
reduced_bondbelow 1.1 ETH or above 4 ETH, and a rejected update does not alter the currentreduced_bondvalue.
Epic 4: Monitoring & Tooling¶
4.1: Challenge Window Visibility¶
As a Challenger or monitoring service,
I want to see which prestaked validators are within their challenge window,
So that withdrawal-credential exploits can be detected and proven before staking completes.
- Acceptance Criteria:
- A feed surfaces prestaked validators awaiting stake and the time remaining in
prestake_challenge_period.
- A feed surfaces prestaked validators awaiting stake and the time remaining in
4.2: Operator Staking Status¶
As a Rocket Pool Node Operator,
I want to see when my prestaked validators clear their challenge window and are staked,
So that I can confirm my validators are active without tracking the beacon queue manually.
- Acceptance Criteria:
- The dashboard shows each validator's prestake/challenge/staked status.
Questions¶
- The split between the rETH share and the node operator share of the 31 ETH is not numerically specified beyond the 0.1 ETH minimum reward — is the challenger reward always exactly the node bond, or capped/floored otherwise?
- Who is expected to run challenge monitoring in practice — the oDAO, a public watcher service, or purely market-incentivised challengers? The 0.1 ETH reward may be thin relative to proof gas costs.
- Is there any penalty to the node operator beyond losing their bond share, e.g. for a deliberate (vs accidental) wrong-credential attempt?
- Does
stake_without_state_proofcoexist with the existing state-proofstakepath, or fully replace it? - How does the 12-hour challenge window interact with RPIP-73 churn and RPIP-71 reentry tickets — does it add latency to redeployed capital?