Skip to content

Refine Validator Registration Approval section#116

Open
ulieth wants to merge 4 commits into
feature/improve-oraclesfrom
review/validator-registration-approval
Open

Refine Validator Registration Approval section#116
ulieth wants to merge 4 commits into
feature/improve-oraclesfrom
review/validator-registration-approval

Conversation

@ulieth
Copy link
Copy Markdown
Contributor

@ulieth ulieth commented Jun 1, 2026

No description provided.

@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 1, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
docs Ready Ready Preview Jun 3, 2026 4:07pm

Request Review

Comment thread docs/docs/oracles/oracle-duties.mdx Outdated
3. verifies the `deposit_root` matches current Beacon Chain state and commits to it by signing its approval message;
4. uploads the encrypted exit shares to IPFS and includes the IPFS hash in the approval message it signs, so the location of the shares becomes part of the on-chain record.

Once enough Oracles have signed, the Operator Service submits the bundled signatures to the Vault contract. The [Keeper contract ↗](https://etherscan.io/address/0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5#code) verifies the threshold (`validatorsMinOracles`, currently **6 of 11**) and confirms the current `deposit_root` still matches the one the Oracles signed. The last check protects against the [front-running withdrawal credentials attack ↗](https://blog.lido.fi/vulnerability-response-update/). Finally, the Vault forwards the deposit to the Beacon Chain Deposit Contract, and the validator is queued for activation.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

validator is queued for activation.

Be careful with 'queued' word. There is pending_queued validator status which means validator is in beacon chain activation queue. But when deposit is congested by Beacon chain it does not immediately create validator. It is put into pending deposits queue. Validator does not yet exist at this point. Currently deposits queue processing takes ~50 days.

Comment thread docs/docs/oracles/oracle-duties.mdx Outdated
3. verifies the `deposit_root` matches current Beacon Chain state and commits to it by signing its approval message;
4. uploads the encrypted exit shares to IPFS and includes the IPFS hash in the approval message it signs, so the location of the shares becomes part of the on-chain record.

Once enough Oracles have signed, the Operator Service submits the bundled signatures to the Vault contract. The [Keeper contract ↗](https://etherscan.io/address/0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5#code) verifies the threshold (`validatorsMinOracles`, currently **6 of 11**) and confirms the current `deposit_root` still matches the one the Oracles signed. The last check protects against the [front-running withdrawal credentials attack ↗](https://blog.lido.fi/vulnerability-response-update/). Finally, the Vault forwards the deposit to the Beacon Chain Deposit Contract, and the validator is queued for activation.
Copy link
Copy Markdown
Contributor

@evgeny-stakewise evgeny-stakewise Jun 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is done to maintain the protocol's ability to exit validators on demand

This statement was lost.
deposit_root check exists to ensure we predicted validator index correctly. Validator index is a part of exit message. Index is NOT provided by beacon chain at this point. So we could only guess.
Deposit root check ensures that deposit contract state did not change since the moment we created exit signature.

@ulieth ulieth changed the base branch from main to feature/improve-oracles June 1, 2026 17:52
Comment thread docs/docs/oracles/oracle-duties.mdx Outdated
:::
Each Oracle then independently:

1. re-derives the Vault's withdrawal credentials from the Vault address and verifies the deposit signature against those credentials;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i would say Oracle rebuilds deposit message. Not just withdrawal creds

class DepositMessage(Serializable):
    fields = [
        ('pubkey', bytes48),
        ('withdrawal_credentials', bytes32),
        ('amount', uint64),
    ]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deposit signature is built upon deposit message.

Comment thread docs/docs/oracles/oracle-duties.mdx Outdated

The recheck guards two things. The pre-signed exit signature is bound to a specific validator index the Operator Service predicted at registration — a new deposit would shift that index and invalidate the signature. The recheck also protects from the [front-running withdrawal credentials attack ↗](https://blog.lido.fi/vulnerability-response-update/), where a malicious operator races their own deposit ahead of the Vault's.

Once everything passes, the Vault forwards the deposit to the Beacon Chain [Deposit Contract ↗](https://etherscan.io/address/0x00000000219ab540356cbb839cbe05303d7705fa#code). The deposit enters the Beacon Chain's [deposit queue ↗](https://beaconcha.in/validators/queues) before the validator is queued for activation. Processing time depends on network congestion.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

before the validator is queued for activation

Validator is pending_initialized when created, then pending_queued, then ...
i would remove this part (about validator) if we dont want to dive into validator lifecycle.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe say that validator is created once pending deposit is processed

Comment thread docs/docs/oracles/oracle-duties.mdx Outdated
1. re-derives the Vault's withdrawal credentials from the Vault address and verifies the deposit signature against those credentials;
2. decrypts its own exit-signature share and verifies it is a valid BLS signature against the corresponding public-key shard;
3. verifies the `deposit_root` matches current Beacon Chain state and commits to it by signing its approval message;
4. includes the IPFS hash of the encrypted exit shares in the approval message it signs. The shares are uploaded to IPFS. This is done to maintain the protocol's ability to exit validators on demand.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if you want clarity about signing process, then maybe describe approval message to sign

'KeeperValidators': [
                {'name': 'validatorsRegistryRoot', 'type': 'bytes32'},
                {'name': 'vault', 'type': 'address'},
                {'name': 'validators', 'type': 'bytes'},
                {'name': 'exitSignaturesIpfsHash', 'type': 'string'},
                {'name': 'deadline', 'type': 'uint256'},
            ],

Comment thread docs/docs/oracles/oracle-duties.mdx Outdated
Oracles approve validator registration requests before the Vault contract forwards the deposit to the Beacon Chain [Deposit Contract ↗](https://etherscan.io/address/0x00000000219ab540356cbb839cbe05303d7705fa#code).

This process ensures Oracles approve validators based on current Beacon Chain state, bridging the consensus and execution layers while preventing stale approvals and replay attacks.
The Operator Service monitors the Vault and, once enough ETH has accumulated (32 ETH per validator), prepares a registration and sends an **approval request** to all 11 Oracles. The request carries all the information each Oracle needs to verify the registration trustlessly, including the encrypted exit signature shares that let the protocol exit the validators on demand.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

32 ETH per validator

Since Pectra fork the things have changed. Upper bound 32 eth was removed. So all staked amount likely will go to register single validator.

Maybe rephrase "per validator" to

at least 32 ETH

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.

2 participants