Tutorial: Unify Multiple Validators under a Single K2 Fee Recipient for Payouts

Requires mevPlus version 0.2.0+

In this tutorial, we’ll guide you through the process of setting up Native Delegation using Web3Signer for designating a single K2 payout recipient and representative wallet in the context of the K2 protocol. This works regardless of your validator configurations on your node.

Node Operators running validators with different suggested fee recipients

Node operators that are running validators on their node each with a unique suggested fee recipient can map these fee recipients to a single K2 fee recipient wallet (which could be a smart contract that has its own fund distribution logic). This satisfies K2 protocol requirement that one representative account on the execution layer maps to a unique fee recipient.

In order to natively delegate with MEV Plus, you need to pass multiple comma-seperated private keys to the k2.eth1-private-key flag. This ensures there is a representative wallet available and configured for each payout (fee recipient) group of validators so that a K2 fee recipient can be registered.

NOTE: Each validator/group of validators that have a unique fee recipient needs a representative wallet set up. I.e 1 representative wallet for 1 fee recipient for payout management.

For node operators running multiple validators of which each have unique fee recipients, one has the option to set a master fee recipient and a single representative address to register and manage all these validators.

Assumptions and notes

This tutorial assumes a unix-based machine such as Linux with the MEV Plus and K2 Native Delegation Module already installed and configured.

Prerequisites

Before you begin, ensure that you meet the following prerequisites:

  • MEV Plus with K2 Native Delegation Module installed. If not follow the tutorial here to do so: Install MEV Plus with Native Delegation
  • Installed/Downloaded Web3Signer software/binary. You can download the latest release from here: Web3Signer Releases
  • Full Ethereum Node: You should be running a full Ethereum node, including an Execution Layer client (e.g., Geth, Besu, Nethermind, Erigon) and a Consensus Layer client (e.g., Prysm, Lighthouse, Teku, Lodestar, Nimbus).
  • Validator Setup: Make sure you have a validator/validators configured on your node.
  • Ethereum Account: Prepare an Ethereum EOA with sufficient funds to cover gas fees for on-chain transactions.
    • NOTE: This key is the only wallet key that would be granted permission to manage your validators on-chain. Therefore, this must be managed carefully.

Step 1: Setting Up the Web3Signer software

  1. Build/Extract Web3signer binary into a directory of your choosing on your system.

  2. Then navigate to the directory in your terminal.

  3. Run the following command to start Web3Signer. Note, this command may have changed from the time of writing this tutorial so always refer to the documentation Web3Signer Documentation if in need of any assistance running Web3Signer (this software is managed by Consensys and not Blockswap).

./web3signer --http-listen-port 6000 eth2 --keystores-passwords-path <keystore_passwords_dir_path> --keystores-path <keystores_dir_path> --network <eth_network> --slashing-protection-enabled false
  • Replace the <keystore_passwords_dir_path> with the path to a directory that contains only text files of the keystore passwords to each of your validators.
  • Replace the <keystores_dir_path> with the path to your directory that contains your validator keystore files.
  • Replace the <eth_network> with the network to which you are running your node and softwares for i.e mainnet, holesky, etc.
  • The K2 Native Delegation module only uses Web3Signer to sign registration messages and not any other payload. It does not put any validator at risk of slashing through the module.
  • Ensure the password text files’ filenames are EXACTLY the same filenames as its corresponding keystore file it unlocks.
  1. If configured correctly, Web3Signer should be running on http://127.0.0.1:6000. Ensure this host address and port is available on your system and unused by any other service. [mevPlus default builderAPI is run on http://127.0.0.1:18551, mevPlus default K2 API is run on http://127.0.0.1:10000]

Step 2: Setting Up MEV Plus to use Web3Signer for the Native Delegation Module

In your mevPlus service file used to run mevPlus with K2 Native Delegation, set the -k2.web3-signer-url flag to the URL of your running Web3Signer instance.

Additionally, set the -k2.payout-recipient flag to the desired payout recipient address.

[Unit]
Description=MEV Plus Service for Ethereum
Wants=network-online.target
After=network-online.target

[Service]
User=mevPlus
Group=mevPlus
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/mevPlus \
  -builderApi.listen-address <your_preferred_builderapi_address> \
  -externalValidatorProxy.address <your_existing_valdator_proxy_listening_address> \
  -k2.eth1-private-key <your_eth1_private_key> \
  -k2.beacon-node-url <your_beacon_node_url> \
  -k2.execution-node-url <your_execution_node_url> \
 -k2.web3-signer-url <web3signer_url> \
 -k2.payout-recipient <payout_recipient_address>

[Install]
WantedBy=multi-user.target

Replace <web3signer_url> with the address thatWeb3Signer is running on, and set the <payout_recipient_address> to the designated ECDSA address that all rewards should be paid out to.

Additional advanced configurations for proposer and K2 registration are available here.

Save the system file for MEV Plus and reload systemctl to pick up the new service file:

sudo systemctl daemon-reload

Enable:

sudo systemctl enable mevPlus

Start MEV Plus:

sudo systemctl start mevPlus

Step 3: Verify service is running

Check that the service started successfully:

sudo systemctl status mevPlus

Ensure there are no errors in the logs and that Plus is running nominally.

Step 4: Explore MEV Plus Logs

Explore MEV Plus logs to verify its operation:

sudo journalctl -fu mevPlus

Inspect the logs to confirm that MEV Plus is running without issues. Any errors that are thrown in boot-up due to the wrong configuration can be identified and rectified by evaluating the logs. Restart the service after any modifications to the service file if required:

sudo systemctl daemon-reload

By following this tutorial, you’ve successfully set up Native Delegation using Web3Signer to manage master payouts within the K2 protocol. This approach streamlines the process of managing multiple validators with multiple unique fee recipients on the node while ensuring rewards are directed to the desired payout address.