lido
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Help
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # VEBO 2.0 The purpose of this document is to look at changes to the Lido validator exit process in the near future due to new requirements for the process and possible changes to the Ethereum protocol. First, let's take a look at the current exit process. ## Current Implementation The current implementation of validator exits in Lido is based on the Validator Exit Bus Oracle (VEBO). Off-chain oracle demons analyze data from the Consensus Layer (CL) and Execution Layer (EL) and make a decision on whether to exit validators, how many, and from which node operators. ![current](https://hackmd.io/_uploads/Bk-fbjWv6.png) The oracle itself cannot exit validators due to current protocol limitations, namely the absence of EL Triggerable Exits (ELTE). Therefore, the oracle only signals through events on the contract about which validators have been decided to exit. In turn, node operators run Ejector on their side. This program stores pre-signed exit messages and monitors events in VEBO. In case of detecting a relevant event, an exit message is sent to the CL. In the current implementation, the exit of validators pursues only one goal - to cover user withdrawal requests at the expense of ETH withdrawn from the validator after the exit. ## Requirements It is proposed to change the current implementation based on a rethought understanding of the requirements for exiting validators not only from the point of view of covering user withdrawal requests, but also rebalancing stake among operators, exiting validators by governance decision, and at the discretion of the staking module. The possible emergence of ELTE in the Ethereum protocol allows us to reconsider the design of validator exits, allowing the Lido protocol to gain control over the withdrawal of user-locked ETH on the balance of validators. The proposed solutions stem from the following requirements: **Triggerable Exits**. Support Triggerable Exits in the protocol, which may appear in the next hard fork with some probability. The tool is vital for permissionless modules and provides leverage over control of the curated set of operators. **Forced Exits**. Provide a tool for reducing the stake on a node operator without being tied to the volume of user withdrawal requests. The tool is useful for manual rebalancing of stake between node operators and modules regardless of the volume of user withdrawal requests, as well as a tool for forced offboarding of operators or limiting the amount of stake on them. **Specific validators exit**. Provide a tool for the priority withdrawal of specific validators by public key. The tool can be useful for: - Withdrawing specific validators, for example in case of compromise of private keys of some validators or migration of some validators to other tooling. - Withdrawing specific validators in case of key loss or prolonged offline from the validator side. - For withdrawing specific clusters in DVT modules, where the module structure has no operators, in case of violation of Lido policies or the module itself. **Module target share**. Consider the target share of modules not only when distributing stake but also when exiting validators. **Permissionless triggers**. Provide a tool for permissionless request of validators to exit. Such a tool can be useful for scenarios like: - Dual Governance, to allow users to trigger validator exits in case of compromise of the oracle set. - For permissionless modules, which may have their own handles for withdrawing validators in case of any policy violations. ## Proposed Changes It is proposed to keep the current VEBO as a single entry point for withdrawing validators and add additional layers to VEBO: Priority Exit Bus (PEB) and EL Triggerable Exits (ELTE). ### EL Triggerable Exits Based on the current draft of the [EIP-7002](https://eips.ethereum.org/EIPS/eip-7002), it is assumed that for the forced exit of a validator on EL, it will be necessary to send an exit signal on behalf of the Withdrawal Vault (WV) contract, whose address is specified as Withdrawal Credentials (WC) at Lido validators, to the address of the precompiled contract. It is proposed to supplement the Withdrawal Vault contract or write an additional one next to VEBO, so that any validator requested for withdrawal through VEBO can be forcibly exited through ELTE by providing the necessary proof. ![7002](https://hackmd.io/_uploads/Hk1mZi-vp.png) It is assumed that anyone can bring proof that the validator was requested for withdrawal through VEBO. The contract will check the proof and call the corresponding method on the precompiled contract, which will lead to the addition of the validator to the exit queue. The current implementation of VEBO already has everything necessary to prove that a validator was requested to exit earlier. Events contain the necessary data about the validator and one can prove their presence through a merkle proof. However, this is probably not the most gas-efficient way and the proof window is limited by the number of stored historical block hashes. It is suggested that VEBO will be modified to simplify the proof of requested validators, for example, by storing roots of trees of validators requested for exit. The technical solution should take into account the work with multiple WCs in case of their change in the future or support of several WCs in the protocol, for example, for institutional staking. The main idea is to have VEBO as a single source of validator withdrawals and build ELTE based on already accepted decisions. This approach has a number of advantages, which are proposed to be considered separately: #### Single Decision-making Point Allows keeping the current limits and sanity checks built from the general considerations of the entire protocol, such as the throughput of the exit queue on the CL and damage to the protocol in case of compromise of oracles or exploitation of vulnerabilities in smart contracts. Allows coordinating data on the number and priority of validators to exit in one place. The current VEBO already operates a large number of parameters determining the priority of validators to exit, such as delays in processing requests by operators, the number of validators on an operator, the percentage of the entire network, the lifetime of validators. With the appearance of new modules and the release of Staking Router v1.5, new weights in prioritization of calls are expected, such as the module target share, forcing target limits, and similar. Unified limits and priorities will eliminate the need to coordinate data between different validator exiting tools. Various scenarios can be envisioned, such as the forced offboarding of a large node operator and the forced exiting of several validators of the operator due to a lack of bond. The priorities of such scenarios should be implemented in the code explicitly. #### CLTE + ELTE Separating ELTE into an additional layer allows having two ways to exit validators: softly and without transaction costs with the forces of node operators on the CL side or forcibly without the participation of operators on the EL side. Different modules may have different policies around this process. For example, a curated set of operators may have stricter criteria for infrastructure and the requirement to run Ejector, while this requirement may not apply to community operators. Fallback in the form of Consensus Layer Triggerable Exits (CLTE) allows not to be blocked on the presence of ELTE in the Ethereum protocol and design validator exits from general concepts. ### Priority Exit Bus In VEBO, data is brought by oracles, but based on the new requirements, it is assumed that there should be the possibility of exiting validators through governance and, in some scenarios, permissionlessly. To solve this contradiction, it is proposed to add Priority Exit Bus (PEB). ![peb](https://hackmd.io/_uploads/ry2FWZhdp.png) #### Filling the Priority Exit Bus It is proposed that PEB represents a contract into which different actors can bring validators to exit. It is assumed that such actors can be Aragon voting, EasyTrack motions, and Prover, through which one can bring evidence that the validator should be exited, for a pre-agreed list of scenarios. It is assumed that PEB can be used to exit a large number of validators at once, for example through Aragon voting, so it is proposed to store roots of trees of validators to exit instead of the exact list of validators. It is proposed to have a permissionless entry in the form of a Prover contract, which can check different scenarios. The design is proposed in which each scenario is a separate contract for verification. Examples of such scenarios can be: - A scenario of collusion of LDO holders and Oracle holders in which validator exits are stopped and vetoed through Dual Governance. As simple proof in such a scenario may serve the presence of a veto, the volume of unfinalized stETH in the queue, the time elapsed since the date of creation of the first unfinalized request, and the insufficient number of previously requested validators. - Violation of policies by some validators, for example, prolonged offline. - The operator in the module has lost the private key from a validator and intends to exit the validator via triggerable exits. In this case, the operator can bring the key id, module id, and operator id to the Prover, and the Prover will check that `msg.sender` corresponds to the operator's address and add the key to the priority exit queue. #### Submitting Data to VEBO It is suggested that data from PEB to VEBO can be unwrapped by calling the corresponding contract method. The technical solution should provide for unwrapping the tree in several transactions, for large batches. It is proposed that anyone can unwrap the data, but a priority time window is allocated for unwrapping by any member of the VEBO quorum. Until the appearance of ELTE, the time window is proposed to be made very large. Such a solution is based on a security check on the side of the Ejector, validating the signatures of transactions and comparing them with a pre-known list of oracle demon addresses. Thus, without ELTE, validator withdrawals are carried out as before through CLTE with transaction signature verification, and after the appearance of ELTE, there are two streams: priority exiting through CLTE and permissionless exiting with a small delay. #### Processing in VEBO It is proposed to supplement the VEBO contract with a method allowing triggering events for validator exiting outside the frame of the oracle report and allowing this method to be called by PEB. At the same time, consider the limits of the current frame when calling the method. Planned VEBO reports should take into account extraordinary exit requests within the frame limits at the contract level. ### VEBO Improvements #### Module Target Share Module target share now only affect deposits, but not validator exits. Validator exit bus oracle (VEBO) does not consider module target share as a weight when deciding which validator to exit. It’s suggested to investigate how this parameter should be taken into account when exiting validators and implement changes in the code. #### Forced Target Limit Node operators have a target limit property that allows to balance the number of active validators on the operator to the target result. The limit is taken into account when covering withdrawal requests and when making a deposit, but does not allow withdrawing validators regardless of demand in the withdrawal queue. It is proposed to design the ability to exit validators forcibly, without being tied to users’ withdrawal requests. ## Scenario Examples Examples of validator exit scenarios that are enabled by the implementation of PEB, ELTE, and VEBO improvements: - Governance initiates offboarding of a node operator by setting a forced target limit to 0 through CLTE, followed by forced exit through ELTE if the operator rejects the protocol's request. - Governance initiates a targeted exit of a batch of validators that have been offline for an extended period through ELTE, all at once from different modules and operators. - Anyone can trigger the exit of a validator through Prover and CLTE & ELTE by providing proof of policy violation (e.g., extended offline period of a validator). - Modules signal VEBO to forcibly exit a certain number of validators due to a bond shortage using the forced target limit. - Anyone can trigger the exit of validators to cover requests in the Withdrawal Queue through Prover and CLTE & ELTE in cases where a veto is imposed by DG and the Withdrawal Queue is not processed. - The curator of a DVT module with multisig initiates a motion to exit a cluster where quorum has ceased to be formed.

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully