Become a Validator: Building from Source

0. Install Rust

If you don't have Rust installed already, visit rustup.rs to install it.

Note: if you're not familiar with Rust or you'd like more detailed instructions, see our installation guide.

1. Download and install Lighthouse

Once you have Rust installed, you can install Lighthouse with the following commands (don't forget to use the testnet5 branch):

  1. git clone https://github.com/sigp/lighthouse.git
  2. cd lighthouse
  3. git checkout testnet5
  4. make

You may need to open a new terminal window before running make.

You've completed this step when you can run $ lighthouse --help and see the help menu.

2. Start an Eth1 client

Since Eth2 relies upon the Eth1 chain for validator on-boarding, all Eth2 validators must have a connection to an Eth1 node.

We provide instructions for using Geth (the Eth1 client that, by chance, we ended up testing with), but you could use any client that implements the JSON RPC via HTTP. A fast-synced node should be sufficient.

Installing Geth

If you're using a Mac, follow the instructions listed here to install geth. Otherwise see here.

Starting Geth

Once you have geth installed, use this command to start your Eth1 node:

 geth --goerli --rpc

3. Start your beacon node

The beacon node is the core component of Eth2, it connects to other peers over the internet and maintains a view of the chain.

Start your beacon node with:

 lighthouse beacon --eth1 --http

Note: the --http flag enables the HTTP API for the validator client. And the --eth1 flag tells the beacon node that it should sync with an Ethereum1 node (e.g. Geth). These flags are only required if you wish to run a validator.

Your beacon node has started syncing when you see the following (truncated) log:

Dec 09 12:57:18.026 INFO Syncing
est_time: 2 hrs ...

The distance value reports the time since eth2 genesis, whilst the est_time reports an estimate of how long it will take your node to become synced.

You'll know it's finished syncing once you see the following (truncated) log:

Dec 09 12:27:06.010 INFO Synced
slot: 16835, ...

4. Generate your validator key

Generate new validator BLS keypairs using:

 lighthouse account validator new random

Take note of the voting_pubkey of the new validator:

INFO Saved new validator to disk 
voting_pubkey: 0xa1625249d80...

It's the validator's primary identifier, and will be used to find your validator in block explorers.

You've completed this step when you see something like the following line:

Dec 02 21:42:01.337 INFO Generated validator directories         count: 1, base_path: "/home/karl/.lighthouse/validators"

This means you've successfully generated a new sub-directory for your validator in the .lighthouse/validators directory. The sub-directory is identified by your validator's public key (voting_pubkey). And is used to store your validator's deposit data, along with its voting and withdrawal keys.

Note: these keypairs are good enough for the Lighthouse testnet, however they shouldn't be considered secure until we've undergone a security audit (planned March/April).

5. Start your validator client

Since the validator client stores private keys and signs messages generated by the beacon node, for security reasons it runs separately from it.

You'll need both your beacon node and validator client running if you want to stake.

Start the validator client with:

 lighthouse validator

You know that your validator client is running and has found your validator keys from step 3 when you see the following logs:

Dec 09 13:08:59.171 INFO Loaded validator keypair store          voting_validators: 1
Dec 09 13:09:09.000 INFO Awaiting activation                     slot: 17787, ...

To find an estimate for how long your beacon node will take to finish syncing, lookout for the following logs:

beacon_node_1       | Mar 16 11:33:53.979 INFO Syncing
est_time: 47 mins, speed: 16.67 slots/sec, distance: 47296 slots (7 days 14 hrs), peers: 3, service: slot_notifier

You'll find the estimated time under est_time. In the example log above, that's 47 mins.

If your beacon node hasn't finished syncing yet, you'll see some ERRO messages indicating that your node hasn't synced yet:

validator_client_1  | Mar 16 11:34:36.086 ERRO Beacon node is not synced               current_epoch: 6999, node_head_epoch: 5531, service: duties

It's safest to wait for your node to sync before moving on to the next step, otherwise your validator may activate before you're able to produce blocks and attestations (and you may be penalized as a result).

However, since it generally takes somwhere between 4 and 8 hours after depositing for a validator to become active, if your est_time is less than 4 hours, you should be fine to just move on to the next step. After all, this is a testnet and you're only risking Goerli ETH!

Installation complete!

In the next step you'll need to upload your validator's deposit data. This data is stored in a file called eth1_deposit_data.rlp.

You'll find it in /home/.lighthouse/validators -- in the sub-directory that corresponds to your validator's public key (voting_pubkey).

For example, if your username is karlm, and your validator's public key (aka voting_pubkey) is 0x8592c7.., then you'll find your eth1_deposit_data.rlp file in the following directory:

/home/karlm/.lighthouse/validators/0x8592c7../

Once you've located your eth1_deposit_data.rlp file, you're ready to move on to Become a Validator: Step 2.