Description
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.