Setting up an Eth 2.0 Staking Validator with Teku

A quick guide to setting up your Eth2 node or validator on Teku with Alchemy as your web3 provider.

This guide assumes you have already generated your validator keys and have submitted your initial 32 Eth to the beacon chain. If you have not done so, please follow this guide.

To learn more about Teku, check out their Eth2 Documentation.

Note: The instructions below were adopted from the Teku Getting Started Guide.

Running an Eth 2.0 validator

1. Install Teku

You can find the full installation guide for Teku on the Teku how-to page.โ€‹

brew tap ConsenSys/teku
brew install teku

2. Run the beacon chain client

You can run just the beacon chain and point your eth1 endpoint to the alchemy url for your app. Make sure your network matches the network that you are trying to connect to:

  • Prymont -> eth-goerli

  • Mainnet -> eth-mainnet

teku --network=pyrmont --eth1-endpoints=<ALCHEMY API ENDPOINT HERE> \
--metrics-enabled --rest-api-enabled

For example:

Mainnet
Testnet
Mainnet
teku --network=mainnet --eth1-endpoints=https://eth-mainnet.alchemyapi.io/v2/<ALCHEMY API KEY> \
--metrics-enabled --rest-api-enabled
Testnet
teku --network=pyrmont --eth1-endpoints=https://eth-goerli.alchemyapi.io/v2/<ALCHEMY API KEY> \
--metrics-enabled --rest-api-enabled

3. Run your validator

In a separate terminal window (from your beacon node), start running the validator using the command below:

Copy the full path of your keys from when you set up your initial deposit. In the previous guide, the path for the keys were saved in

/Users/dubash/Downloads/eth2deposit-cli-256ea21-darwin-amd64/validator_keys/

Mainnet
Testnet
Mainnet
teku validator-client --network=mainnet --beacon-node-api-endpoint=http://192.10.10.101:5051 \
--validator-keys=eth2deposit:validator/passwords
Testnet
teku validator-client --network=pyrmont --beacon-node-api-endpoint=http://192.10.10.101:5051 \
--validator-keys=validator/keys:validator/passwords

At this point you are up and running and ready for validator assignment!

Running beacon chain and validator using Docker

You can run both the beacon chain and validator using docker and docker compose. Full instructions can be found here. This will require you to have Docker Compose.

1. Creating your docker-compose file

Create a docker compose file in the location you want to run your validator:

touch docker-compose.yml

2. Copy your key

Copy the full path of your keys from when you set up your initial deposit. In the previous guide, the example path for the keys were saved in:

~/Downloads/eth2deposit-cli-256ea21-darwin-amd64/validator_keys/as a file called keystore-m_12381_3600_0_0_0-1629939192.json

In this folder, you will find your keys in a json format. Let's make a copy of this and rename it to a txt format

cp keystore-m_12381_3600_0_0_0-1629939192.json keystore-m_12381_3600_0_0_0-1629939192.txt

Now we have two files in our folder, one with a json extension and one with a txt.

We'll then create a folder called teku in our validator_keys directory. In this teku folder, we'll create a subfolder called validator and then create two new folders underneath validator. One called keys and one called passwords. The .json keys file will go in the keys folder and the .txt file will go into the passwords folder like below:

Finally, we'll copy the absolute path of our teku folder by running:

$> pwd
/Users/dubash/Downloads/eth2deposit-cli-256ea21-darwin-amd64/validator_keys/teku

We'll use this path in our docker-compose in our volumes location on line 33. In addition, we'll use our Alchemy endpoint as our eth1 provider (line25).

Mainnet
Testnet
Mainnet
version: '3.4'
services:
besu_node:
image: hyperledger/besu:latest
command: ["--network=goerli",
"--data-path=/opt/besu/data/data",
"--host-allowlist=*",
"--sync-mode=FAST",
"--rpc-http-enabled",
"--rpc-http-cors-origins=*",
"--rpc-http-api=ETH,NET,CLIQUE,DEBUG,MINER,NET,PERM,ADMIN,EEA,TXPOOL,PRIV,WEB3"]
volumes:
- ./besu:/opt/besu/data
ports:
# Map the p2p port(30303) and RPC HTTP port(8545)
- "8545:8545"
- "30303:30303"
โ€‹
teku_node:
environment:
- "JAVA_OPTS=-Xmx4g"
image: consensys/teku:latest
command: ["--network=pyrmont",
"--data-base-path=/opt/teku/data",
"--eth1-endpoint=https://eth-mainnet.alchemyapi.io/v2/<YOUR ALCHEMY API KEY>",
"--validator-keys=/opt/teku/data/:/opt/teku/data/",
"--p2p-port=9000",
"--rest-api-enabled=true",
"--rest-api-docs-enabled=true"]
depends_on:
- besu_node
volumes:
- /Users/dubash/Downloads/eth2deposit-cli-256ea21-darwin-amd64/validator_keys/teku:/opt/teku/data
ports:
# Map the p2p port(9000) and REST API port(5051)
- "9000:9000"
- "5051:5051"
Testnet
version: '3.4'
services:
besu_node:
image: hyperledger/besu:latest
command: ["--network=goerli",
"--data-path=/opt/besu/data/data",
"--host-allowlist=*",
"--sync-mode=FAST",
"--rpc-http-enabled",
"--rpc-http-cors-origins=*",
"--rpc-http-api=ETH,NET,CLIQUE,DEBUG,MINER,NET,PERM,ADMIN,EEA,TXPOOL,PRIV,WEB3"]
volumes:
- ./besu:/opt/besu/data
ports:
# Map the p2p port(30303) and RPC HTTP port(8545)
- "8545:8545"
- "30303:30303"
โ€‹
teku_node:
environment:
- "JAVA_OPTS=-Xmx4g"
image: consensys/teku:latest
command: ["--network=pyrmont",
"--data-base-path=/opt/teku/data",
"--eth1-endpoint=https://eth-goerli.alchemyapi.io/v2/<YOUR ALCHEMY API KEY>",
"--validator-keys=/opt/teku/data/:/opt/teku/data/",
"--p2p-port=9000",
"--rest-api-enabled=true",
"--rest-api-docs-enabled=true"]
depends_on:
- besu_node
volumes:
- ~/Downloads/eth2deposit-cli-256ea21-darwin-amd64/validator_keys:/opt/teku/data
ports:
# Map the p2p port(9000) and REST API port(5051)
- "9000:9000"
- "5051:5051"
โ€‹

Finally run docker compose up!

Running your validator assignment

Be ready for your validator assignment

Keep both terminal windows running so that your validator can receive tasks and execute validator responsibilities. You should already be aware of all the responsibilities and staking logistics for being a validator.

You can check the status of your validator using block explorers: beaconcha.in and beacon.etherscan.io.

You are now officially an Ethereum 2.0 validator, congrats! ๐ŸŽ‰