Skip to content

Proposed mitigation against a malicious staking pool refusing to exit a validator #2666

Closed
@zah

Description

@zah

The security of stakers who trust the services of staking pools has been greatly enhanced with the introduction Eth1 withdrawal credentials that allow an arbitrary smart contract to govern the funding process and the withdrawal rights of potentially multiple stakers.

One possible problem though is that nothing guarantees that the node operator who holds the signing key for the validator will perform an exit at an agreed upon exit date. The operator can decide to keep validating forever with the goal of extracting MEV value from proposed execution layer blocks.

One simple mitigation for this problem is to require the operator to share a pre-signed exit message specifying the exit epoch for the created validator before the stakers have deposited their funds ("require" in the sense that potential stakers will seek out the services of operators that offer this). The stakers will be then able to broadcast the message on their own to trigger the exit. The current problem with this approach is that the exit message features a validator index instead of a validator public key and the stakers cannot know the final validator index before the deposit is submitted to the deposit contract. To facillitate the practice of pre-sharing an exit message, we can define the following new form of an exit message:

class KeyedVoluntaryExit(Container):
    epoch: Epoch  # Earliest epoch when voluntary exit can be processed
    validator_pubkey: BLSPubkey
    
class SignedKeyedVoluntaryExit(Container):
    message: KeyedVoluntaryExit
    signature: BLSSignature

Furthermore, in order to make the new exit messages portable across forks, the domain of their signature can always use the GENESIS_FORK_VERSION (just like deposit signatures).

It would be enough to introduce a new gossip topic for broadcasting such messages and a new List field in the BeaconBlockBody container that will have zero cost when not used. Alternatively, the new definition can just replace the previous one, assuming it is introduced in a fork that changes the gossip topic names.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions