-
-
owned this note
-
Published
Linked with GitHub
# How to run a node on the Mekong testnet?
## Who is this guide for?
This guide is meant to be a starting point and provides a mid-level summary of the required steps. It is not intended to be a beginner's guide, so copying and running commands from here may not work without some tweaking.
## What is in the Mekong testnet?
The Mekong testnet aims to test the following features:
- [EIP-2537: Precompile for BLS12-381 curve operations](https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-2537.md)
- [EIP-2935: Save historical block hashes in state](https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-2935.md)
- [EIP-6110: Supply validator deposits on chain](https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-6110.md)
- [EIP-7002: Execution layer triggerable exits](https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-7002.md)
- [EIP-7251: Increase the MAX_EFFECTIVE_BALANCE](https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-7251.md)
- [EIP-7549: Move committee index outside Attestation](https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-7549.md)
- [EIP-7685: General purpose execution layer requests](https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-7685.md)
- [EIP-7702: Set EOA account code for one transaction](https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-7702.md)
- [v1.5.0-alpha.8](https://github.com/ethereum/consensus-specs/releases/tag/v1.5.0-alpha.8) Consensus spec
[EIP-7600](https://eips.ethereum.org/EIPS/eip-7600) - Meta EIP lists all pectra EIPs that are scheduled to be included in Pectra.
A Mekong testnet launched on the 5th of Nov at 16:00 UTC 2024 that implements (almost) all the final Prague EIPs. - As of launch it will have the spec list of [pectra-devnet-4](http://notes.ethereum.org/@ethpandaops/pectra-devnet-4).
The Prague-Electra (pectra) fork takes place exactly 256 epochs ~ 1 day later.
The JSON-RPC endpoint, faucet, and other tooling URLs can be found on https://mekong.ethpandaops.io/
### Main features explanation:
#### MaxEB
The MaxEB feature will allow the user to have a > 32ETH effective balance. This would allow users to consolidate many validators (or deposit new ones) into one up to 2048ETH. The requirement to use this feature is the setting of the `0x02` withdrawal credentials. A user can either make a deposit directly with `0x02` credentials or the user can move from `0x01` to `0x02`.
#### EIP-7702/Account abstraction
The user wallet would be able to delegate control to a smart contract. This pattern allows a new wallet and app interaction design space, leading the path for future full account abstraction solutions.
#### Execution Layer triggered exits
The EL triggered exits feature allows the withdrawal address set in the `0x01` or `0x02` withdrawal credential is able to perform exits directly in the execution layer without any reliance on pre-signed BLS keys. This feature is mainly targeted at staking pools, who would be able to use smart contracts to fully control the validator lifecycle.
Please refer to the FAQ document found [here](https://github.com/eth-protocol-fellows/protocol-studies/blob/main/docs/wiki/pectra-faq.md#stakers) for more information on how to use these features.
# Which version/branch do I use?
#### Consensus layer
| Client Name | Git Branch | Docker image |
|--- |--- |--- |
| Lighthouse | [electra-alpha7](https://github.com/pawanjay176/lighthouse/tree/electra-alpha7) | ethpandaops/lighthouse:pawan-electra-alpha7-0dd215c |
| Teku | [mekong](https://github.com/Consensys/teku/tree/mekong) | ethpandaops/teku:mekong |
| Lodestar | [devnet-4](https://github.com/chainsafe/lodestar/tree/devnet-4) | ethpandaops/lodestar:devnet-4-1531b19 |
| Prysm | [develop](https://github.com/prysmaticlabs/prysm/tree/develop) | ethpandaops/prysm-beacon-chain:develop-4aa5410 ethpandaops/prysm-validator:develop-4aa5410 |
| Nimbus | [unstable](https://github.com/status-im/nimbus-eth2/tree/unstable) | ethpandaops/nimbus-eth2:4JM-25aae76 |
| Grandine | [pectra-devnet4](https://github.com/grandinetech/grandine/tree/pectra-devnet4) | ethpandaops/grandine:pectra-devnet4--4bcbfac |
#### Execution layer
| Client Name | Git Branch | Docker image |
|--- |--- |--- |
| Geth | [master (lightclients fork)](https://github.com/lightclient/go-ethereum/tree/prague-devnet-4) | ethpandaops/geth:lightclient-prague-devnet-4-37035c5 |
| Nethermind | [master](https://github.com/NethermindEth/nethermind/tree/pectra_devnet_4) | ethpandaops/nethermind:pectra_devnet_4-c3827bc |
| Besu | [pectra-devnet-4](https://github.com/hyperledger/besu/tree/pectra-devnet-4) | ethpandaops/besu:pectra-devnet-4-8ab3aac |
| EthereumJS | [7702-devnet-4-plus-t8ntool](https://github.com/ethereumjs/ethereumjs-monorepo/tree/7702-devnet-4-plus-t8ntool) | ethpandaops/ethereumjs:7702-devnet-4-plus-t8ntool-f487448 |
| Erigon 2 | [pectra_e2](https://github.com/erigontech/erigon/tree/pectra_e2) | ethpandaops/erigon:pectra_e2-b3fbcc0 |
| Erigon 3 | [docker_pectra](https://github.com/erigontech/erigon/tree/docker_pectra) | ethpandaops/erigon:docker_pectra |
| Reth | [main](https://github.com/paradigmxyz/reth) | ethpandaops/reth:main-dd18af1 |
## Preparation
Download the configs from https://github.com/ethpandaops/mekong-devnets/tree/master/network-configs/devnet-0/metadata.
```shell=
git clone https://github.com/ethpandaops/mekong-devnets.git
cd network-configs/devnet-0/metadata
```
Generate the JWT secret with openssl
```shell=
openssl rand -hex 32 | tr -d "\n" > "/tmp/jwtsecret"
```
This file needs to be passed to both the Execution Client and the Consensus Client. If you do not specify a JWT secret, then the execution and/or consensus layer client will automatically generate one for you. You will then have to specify this secret in the Consensus Layer client.
# Run an Execution Layer Client
## Geth
Pre-requisites: `git, make, go, gcc`.
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make geth
cd ..
```
From the `metadata` folder start the client
```shell=
# Initalize database
./go-ethereum/build/bin/geth --datadir "geth-datadir" init genesis.json
# Run geth
./go-ethereum/build/bin/geth \
--datadir "geth-datadir" \
--http --http.api="engine,eth,web3,net,debug" \
--ws --ws.api="engine,eth,web3,net,debug" \
--http.corsdomain "*" \
--networkid=7078815900 \
--syncmode=full \
--authrpc.jwtsecret=/tmp/jwtsecret \
--bootnodes "enode://125d2dddd0dc0d34b526910d49592545a1e4fe25139be9d9e0eed396211dbd37aa0c0a7fa0444c315803d814e743f890529b58b9261289d5303e16477c216b39@157.230.225.158:30303?discport=30303,enode://508bff69cbb852337cfbf3db9e58fe66ec3254e6a3960c0ef266a2ab1ea78e12f101bba51e3d2e066947a0b9b315e5b26009af81584510394c1b87a5908dca7b@137.184.72.127:30303?discport=30303,enode://b273c662dd15148162c23a5c8407d3d5dbb35fb331ae0c1c3a80c6bfa2bbe077683b28c0cd59f7a482efc00a64a09273eb4767a173441a79b833fdf705d331ae@152.42.247.97:30303?discport=30303"
```
## Nethermind
Pre-requisites: `git, dotnet`
Please ensure you have Node 12.x+ installed.
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone https://github.com/NethermindEth/nethermind.git
cd nethermind/src/Nethermind
dotnet build Nethermind.sln -c Release
```
From the `metadata/nethermind/src/Nethermind/` folder start the client
```shell=
cd Nethermind.Runner
dotnet run -c Release -- \
--config none.cfg \
--datadir="../../../../nethermind-datadir" \
--JsonRpc.Host=0.0.0.0 \
--JsonRpc.JwtSecretFile=/tmp/jwtsecret \
--Init.ChainSpecPath="../../../../chainspec.json" \
--Discovery.Bootnodes="enode://125d2dddd0dc0d34b526910d49592545a1e4fe25139be9d9e0eed396211dbd37aa0c0a7fa0444c315803d814e743f890529b58b9261289d5303e16477c216b39@157.230.225.158:30303?discport=30303,enode://508bff69cbb852337cfbf3db9e58fe66ec3254e6a3960c0ef266a2ab1ea78e12f101bba51e3d2e066947a0b9b315e5b26009af81584510394c1b87a5908dca7b@137.184.72.127:30303?discport=30303,enode://b273c662dd15148162c23a5c8407d3d5dbb35fb331ae0c1c3a80c6bfa2bbe077683b28c0cd59f7a482efc00a64a09273eb4767a173441a79b833fdf705d331ae@152.42.247.97:30303?discport=30303"
```
## Besu
Pre-requisites: `git, jvm`
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone --recursive https://github.com/hyperledger/besu
cd besu
./gradlew installDist
cd ..
```
From the `metadata` folder start the client
```shell=
besu/build/install/besu/bin/besu \
--network-id=7078815900 \
--data-path="besu-datadir" \
--genesis-file="besu.json" \
--rpc-http-enabled=true \
--rpc-http-host="0.0.0.0" \
--rpc-http-cors-origins="*"\
--rpc-ws-enabled=true \
--rpc-ws-host="0.0.0.0" \
--host-allowlist="*" \
--engine-host-allowlist="*"\
--engine-jwt-enabled=true \
--engine-jwt-secret=/tmp/jwtsecret \
--bootnodes="enode://125d2dddd0dc0d34b526910d49592545a1e4fe25139be9d9e0eed396211dbd37aa0c0a7fa0444c315803d814e743f890529b58b9261289d5303e16477c216b39@157.230.225.158:30303?discport=30303,enode://508bff69cbb852337cfbf3db9e58fe66ec3254e6a3960c0ef266a2ab1ea78e12f101bba51e3d2e066947a0b9b315e5b26009af81584510394c1b87a5908dca7b@137.184.72.127:30303?discport=30303,enode://b273c662dd15148162c23a5c8407d3d5dbb35fb331ae0c1c3a80c6bfa2bbe077683b28c0cd59f7a482efc00a64a09273eb4767a173441a79b833fdf705d331ae@152.42.247.97:30303?discport=30303"
```
## EthereumJS
Pre-requisites: `git, node, npm`
Please ensure you have [Node 18.x+](https://github.com/nodesource/distributions/blob/master/README.md) installed.
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone --depth 1 --branch master https://github.com/ethereumjs/ethereumjs-monorepo.git
cd ethereumjs-monorepo
npm i
```
From the `metadata` folder start the client
```shell=
cd packages/client
npm run client:start -- \
--datadir ../../../ethereumjs-datadir \
--gethGenesis ../../../genesis.json \
--saveReceipts \
--rpc --rpcport=8545 \
--ws \
--jwt-secret=/tmp/jwtsecret \
--rpcEngine --rpcEnginePort=8551 \
--bootnodes="enode://125d2dddd0dc0d34b526910d49592545a1e4fe25139be9d9e0eed396211dbd37aa0c0a7fa0444c315803d814e743f890529b58b9261289d5303e16477c216b39@157.230.225.158:30303?discport=30303,enode://508bff69cbb852337cfbf3db9e58fe66ec3254e6a3960c0ef266a2ab1ea78e12f101bba51e3d2e066947a0b9b315e5b26009af81584510394c1b87a5908dca7b@137.184.72.127:30303?discport=30303,enode://b273c662dd15148162c23a5c8407d3d5dbb35fb331ae0c1c3a80c6bfa2bbe077683b28c0cd59f7a482efc00a64a09273eb4767a173441a79b833fdf705d331ae@152.42.247.97:30303?discport=30303"
```
This will create a secret in ethereumjs-datadir/jwtsecret, you will need to provide this secret to the CL client.
## Erigon
Pre-requisites: `git, go`
You can either choose the Erigon 2 or the Erigon 3 branch to follow this section. Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone https://github.com/ledgerwatch/erigon
cd erigon
make erigon rpcdaemon
cd ..
```
From the `metadata` folder start the client
```shell=
# Initialize database
./erigon/build/bin/erigon init \
--datadir=erigon-datadir genesis.json
# Run Erigon
./erigon/build/bin/erigon \
--datadir erigon-datadir \
--networkid=7078815900 \
--authrpc.jwtsecret=/tmp/jwtsecret \
--http --http.api=engine,net,eth \
--bootnodes="enode://125d2dddd0dc0d34b526910d49592545a1e4fe25139be9d9e0eed396211dbd37aa0c0a7fa0444c315803d814e743f890529b58b9261289d5303e16477c216b39@157.230.225.158:30303?discport=30303,enode://508bff69cbb852337cfbf3db9e58fe66ec3254e6a3960c0ef266a2ab1ea78e12f101bba51e3d2e066947a0b9b315e5b26009af81584510394c1b87a5908dca7b@137.184.72.127:30303?discport=30303,enode://b273c662dd15148162c23a5c8407d3d5dbb35fb331ae0c1c3a80c6bfa2bbe077683b28c0cd59f7a482efc00a64a09273eb4767a173441a79b833fdf705d331ae@152.42.247.97:30303?discport=30303"
```
## Reth
Pre-requisites: `git, rust`
Please ensure you have [RustC 1.81.x+](https://rustup.rs) installed.
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone https://github.com/paradigmxyz/reth.git
cd reth
cargo build --release
```
From the `metadata` folder, start the client:
```shell=
./reth node \
--datadir=/data \
--port=30303 \
--authrpc.port=8551 \
--authrpc.jwtsecret=/tmp/jwtsecret \
--chain=../../../genesis.json \
--bootnodes="enode://125d2dddd0dc0d34b526910d49592545a1e4fe25139be9d9e0eed396211dbd37aa0c0a7fa0444c315803d814e743f890529b58b9261289d5303e16477c216b39@157.230.225.158:30303?discport=30303,enode://508bff69cbb852337cfbf3db9e58fe66ec3254e6a3960c0ef266a2ab1ea78e12f101bba51e3d2e066947a0b9b315e5b26009af81584510394c1b87a5908dca7b@137.184.72.127:30303?discport=30303,enode://b273c662dd15148162c23a5c8407d3d5dbb35fb331ae0c1c3a80c6bfa2bbe077683b28c0cd59f7a482efc00a64a09273eb4767a173441a79b833fdf705d331ae@152.42.247.97:30303?discport=30303"
```
# Execution layer conclusions
After starting the client, you will be able to interact with the client using the following ports:
* localhost:8545: Web3 json rpc
* localhost:8550: Engine json rpc
* localhost:8551: Engine json rpc with json rpc authentication
* jwt.hex in the repository where you ran the rpcdaemon: verification key for JWT authentication
# Run a Consensus Layer Client and Validators
## Lighthouse
Pre-requisites: `git, rust`
Please ensure you have [RustC 1.81.x+](https://rustup.rs) installed.
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone https://github.com/sigp/lighthouse.git
cd lighthouse
make
cd ..
```
From the `metadata` folder start the client
```shell=
lighthouse \
--testnet-dir="." \
bn \
--datadir=lighthouse-datadir \
--eth1 \
--http \
--execution-endpoints=http://127.0.0.1:8551 \
--enr-udp-port=9000 \
--enr-tcp-port=9000 \
--discovery-port=9000 \
--jwt-secrets="/tmp/jwtsecret" \
--boot-nodes="enr:-Iq4QB2ny1q6gkBjqNRU_e-GTbpcJQcI4i3cIZDea0mnAzGgbUTKH8j81g9PRl_-m40F1V4GFBlqZElrcbGnUj9AjGeGAZL8bgmtgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ3h8aUO3GJHv-bdvHtsQZ2OEisutelYfGjXO4lSg8BYN1ZHCCIzI,enr:-LK4QF2XD_Fe5H9QMVVwBoDs6P_37eURcFvNTcLzOc60p_XlDKIBleMgudA7nltZ7TyAiOuY0BSQzHsdv5iUs7sFyWQEh2F0dG5ldHOIAwAAAAAAAACEZXRoMpDY3UMGYGN2JAABAAAAAAAAgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ7y6LF_to7NYQd3BVRW1840gm5r1Lm3lfAfC9Wqmw8YN0Y3CCIyiDdWRwgiMo,enr:-Mm4QPtT8J4rpYkixx-COebnEPreuWv9OpgOGOvM01hqZ19eeySxCxOEEVHl2r2c0BYwBuct_yZhvkLqUQatRORlIP4Bh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEibhIf4RxdWljgiMpiXNlY3AyNTZrMaEDjight_62uShKNt4IorH13hfqm7kZzVyFxXKI_qDlsTGIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg,enr:-Mm4QBL6auezk-Zi385j0PyjkzGwQJW7TdOFZKGZMKTGRkI4fxTSTiHLe7kTvdjhBq4kgjPXvUnFiXR6AisA8a0w2lQBh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEmCr3YYRxdWljgiMpiXNlY3AyNTZrMaEDJ4xl2Our0Y7OKsSDX9f908HznXm3PKzmC9zD8OB2d0mIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg" \
--suggested-fee-recipient=<enter-eth-address-here> #If validators enabled
```
To import validator keys to a validator client from `metadata`:
```shell=
lighthouse \
account validator import \
--datadir=lighthouse-datadir/validator-data \
--directory=<path/to/validator_keys>
```
To start the validator client from `metadata`
```shell=
lighthouse \
vc \
--testnet-dir="." \
--datadir=lighthouse-datadir/validator-data \
--suggested-fee-recipient=<enter-eth-address-here>
```
## Lodestar
Pre-requisites: `git, nodejs, yarn`
More info about how to install dependencies can be found [here](https://chainsafe.github.io/lodestar/install/source/)
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone https://github.com/chainsafe/lodestar.git
cd lodestar
yarn install --ignore-optional
yarn run build
```
From the `metadata/lodestar` folder start the client
```shell=
./lodestar beacon \
--dataDir="../lodestar-datadir" \
--paramsFile="../config.yaml" \
--genesisStateFile="../genesis.ssz" \
--execution.urls="http://127.0.0.1:8551" \
--jwt-secret="/tmp/jwtsecret" \
--eth1.depositContractDeployBlock=0 \
--bootnodes="enr:-Iq4QB2ny1q6gkBjqNRU_e-GTbpcJQcI4i3cIZDea0mnAzGgbUTKH8j81g9PRl_-m40F1V4GFBlqZElrcbGnUj9AjGeGAZL8bgmtgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ3h8aUO3GJHv-bdvHtsQZ2OEisutelYfGjXO4lSg8BYN1ZHCCIzI,enr:-LK4QF2XD_Fe5H9QMVVwBoDs6P_37eURcFvNTcLzOc60p_XlDKIBleMgudA7nltZ7TyAiOuY0BSQzHsdv5iUs7sFyWQEh2F0dG5ldHOIAwAAAAAAAACEZXRoMpDY3UMGYGN2JAABAAAAAAAAgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ7y6LF_to7NYQd3BVRW1840gm5r1Lm3lfAfC9Wqmw8YN0Y3CCIyiDdWRwgiMo,enr:-Mm4QPtT8J4rpYkixx-COebnEPreuWv9OpgOGOvM01hqZ19eeySxCxOEEVHl2r2c0BYwBuct_yZhvkLqUQatRORlIP4Bh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEibhIf4RxdWljgiMpiXNlY3AyNTZrMaEDjight_62uShKNt4IorH13hfqm7kZzVyFxXKI_qDlsTGIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg,enr:-Mm4QBL6auezk-Zi385j0PyjkzGwQJW7TdOFZKGZMKTGRkI4fxTSTiHLe7kTvdjhBq4kgjPXvUnFiXR6AisA8a0w2lQBh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEmCr3YYRxdWljgiMpiXNlY3AyNTZrMaEDJ4xl2Our0Y7OKsSDX9f908HznXm3PKzmC9zD8OB2d0mIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg" \
--suggestedFeeRecipient=<enter-eth-address-here> #If validators enabled
```
To import the validator keys from `metadata/lodestar` and enter the password you used to generate the keystore file:
```shell=
./lodestar validator import \
--dataDir="../lodestar-datadir/validator-data" \
--importKeystores="<path/to/validator_keys>"
```
To run a validator:
```shell=
./lodestar validator \
--paramsFile="../config.yaml" \
--dataDir="../lodestar-datadir/validator-data" \
--keystoresDir="../lodestar-datadir/validator-data/keystores" \
--secretsDir="../lodestar-datadir/validator-data/secrets" \
--suggestedFeeRecipient=<enter-eth-address-here>
```
## Teku
Pre-requisites: `git, java`
Ensure Java 11 or above is installed (Ubuntu: sudo apt install default-jre).
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone https://github.com/ConsenSys/teku.git
cd teku
./gradlew installDist
cd ..
```
The teku executable is now available in ./teku/build/install/teku/bin/teku. You can also use the pre-built distribution or the consensys/teku:24.10.3 docker image.
From the `metadata` folder start the client
```shell=
./teku/build/install/teku/bin/teku \
--data-path="teku-datadir" \
--network="../config.yaml" \
--initial-state="../genesis.ssz" \
--ee-endpoint="http://localhost:8551" \
--ee-jwt-secret-file="/tmp/jwtsecret" \
--p2p-discovery-bootnodes="enr:-Iq4QB2ny1q6gkBjqNRU_e-GTbpcJQcI4i3cIZDea0mnAzGgbUTKH8j81g9PRl_-m40F1V4GFBlqZElrcbGnUj9AjGeGAZL8bgmtgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ3h8aUO3GJHv-bdvHtsQZ2OEisutelYfGjXO4lSg8BYN1ZHCCIzI,enr:-LK4QF2XD_Fe5H9QMVVwBoDs6P_37eURcFvNTcLzOc60p_XlDKIBleMgudA7nltZ7TyAiOuY0BSQzHsdv5iUs7sFyWQEh2F0dG5ldHOIAwAAAAAAAACEZXRoMpDY3UMGYGN2JAABAAAAAAAAgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ7y6LF_to7NYQd3BVRW1840gm5r1Lm3lfAfC9Wqmw8YN0Y3CCIyiDdWRwgiMo,enr:-Mm4QPtT8J4rpYkixx-COebnEPreuWv9OpgOGOvM01hqZ19eeySxCxOEEVHl2r2c0BYwBuct_yZhvkLqUQatRORlIP4Bh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEibhIf4RxdWljgiMpiXNlY3AyNTZrMaEDjight_62uShKNt4IorH13hfqm7kZzVyFxXKI_qDlsTGIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg,enr:-Mm4QBL6auezk-Zi385j0PyjkzGwQJW7TdOFZKGZMKTGRkI4fxTSTiHLe7kTvdjhBq4kgjPXvUnFiXR6AisA8a0w2lQBh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEmCr3YYRxdWljgiMpiXNlY3AyNTZrMaEDJ4xl2Our0Y7OKsSDX9f908HznXm3PKzmC9zD8OB2d0mIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg" \
--validator-keys="<path/to/validator/keys>:</path/to/validator/secrets>" \ #If validators enabled
--validators-proposer-default-fee-recipient=<Enter-eth-address-here> #If validators enabled
```
## Prysm
Pre-requisites: `git, bazel`
Ensure bazel 5.3.+ is [installed](https://docs.prylabs.network/docs/install/install-with-bazel#install-bazel-using-bazelisk).
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
mkdir -p prysm-dir
export genesis=$PWD/genesis.ssz
export prysmdir=$PWD/prysm-datadir
export config=$PWD/config.yaml
git clone https://github.com/prysmaticlabs/prysm.git
cd prysm
bazel build //cmd/beacon-chain:beacon-chain
```
From the `metadata/prysm` folder start the beaconchain client
```shell=
bazel run //cmd/beacon-chain -- \
--accept-terms-of-use=true \
--genesis-state=$genesis \
--datadir=$prysmdir \
--chain-config-file=$config \
--execution-endpoint=http://localhost:8551 \
--jwt-secret=/tmp/jwtsecret \
--contract-deployment-block=0 \
--bootstrap-node=enr:-Iq4QB2ny1q6gkBjqNRU_e-GTbpcJQcI4i3cIZDea0mnAzGgbUTKH8j81g9PRl_-m40F1V4GFBlqZElrcbGnUj9AjGeGAZL8bgmtgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ3h8aUO3GJHv-bdvHtsQZ2OEisutelYfGjXO4lSg8BYN1ZHCCIzI \
--bootstrap-node=enr:-LK4QF2XD_Fe5H9QMVVwBoDs6P_37eURcFvNTcLzOc60p_XlDKIBleMgudA7nltZ7TyAiOuY0BSQzHsdv5iUs7sFyWQEh2F0dG5ldHOIAwAAAAAAAACEZXRoMpDY3UMGYGN2JAABAAAAAAAAgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ7y6LF_to7NYQd3BVRW1840gm5r1Lm3lfAfC9Wqmw8YN0Y3CCIyiDdWRwgiMo \
--bootstrap-node=enr:-Mm4QPtT8J4rpYkixx-COebnEPreuWv9OpgOGOvM01hqZ19eeySxCxOEEVHl2r2c0BYwBuct_yZhvkLqUQatRORlIP4Bh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEibhIf4RxdWljgiMpiXNlY3AyNTZrMaEDjight_62uShKNt4IorH13hfqm7kZzVyFxXKI_qDlsTGIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg \
--bootstrap-node=enr:-Mm4QBL6auezk-Zi385j0PyjkzGwQJW7TdOFZKGZMKTGRkI4fxTSTiHLe7kTvdjhBq4kgjPXvUnFiXR6AisA8a0w2lQBh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEmCr3YYRxdWljgiMpiXNlY3AyNTZrMaEDJ4xl2Our0Y7OKsSDX9f908HznXm3PKzmC9zD8OB2d0mIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg \
--suggested-fee-recipient=<Enter-eth-address-here> #If validators enabled
```
To import validator keys:
```shell=
bazel run //validator:validator -- accounts import \
--accept-terms-of-use \
--wallet-dir=$prysmdir/validator-data \
--keys-dir=<path/to/validator/keys>
```
To start the validator client, make sure you have created a secret file (containing with your secret info in) and call it `prysm-dir/validator-data/secret.txt`. Then it will not prompt you at each startup.
```shell=
bazel run //cmd/validator -- \
--accept-terms-of-use=true \
--datadir=$prysmdir \
--chain-config-file=$config \
--beacon-rpc-provider=http://localhost:4000 \
--wallet-dir=$prysmdir/validator-data \
--wallet-password-file=$prysmdir/validator-data/secret.txt \
--suggested-fee-recipient=<Enter-eth-address-here>
```
## Nimbus
Pre-requisites: `git, make, gcc`
Ensure that the websocket related flags (--ws) are present on your EL (e.g: Geth). Nethermind enables websockets by default. Nimbus can use either http or ws.
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone --branch=unstable https://github.com/status-im/nimbus-eth2.git
cd nimbus-eth2
make update
make -j4 nimbus_beacon_node
cd ..
```
Start the beaconchain client
```shell=
nimbus-eth2/build/nimbus_beacon_node \
--data-dir=./nimbus-datadir\
--jwt-secret=/tmp/jwtsecret \
--web3-url=http://127.0.0.1:8551 \
--rest \
--network="."\
--bootstrap-node=enr:-Iq4QB2ny1q6gkBjqNRU_e-GTbpcJQcI4i3cIZDea0mnAzGgbUTKH8j81g9PRl_-m40F1V4GFBlqZElrcbGnUj9AjGeGAZL8bgmtgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ3h8aUO3GJHv-bdvHtsQZ2OEisutelYfGjXO4lSg8BYN1ZHCCIzI \
--bootstrap-node=enr:-LK4QF2XD_Fe5H9QMVVwBoDs6P_37eURcFvNTcLzOc60p_XlDKIBleMgudA7nltZ7TyAiOuY0BSQzHsdv5iUs7sFyWQEh2F0dG5ldHOIAwAAAAAAAACEZXRoMpDY3UMGYGN2JAABAAAAAAAAgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ7y6LF_to7NYQd3BVRW1840gm5r1Lm3lfAfC9Wqmw8YN0Y3CCIyiDdWRwgiMo \
--bootstrap-node=enr:-Mm4QPtT8J4rpYkixx-COebnEPreuWv9OpgOGOvM01hqZ19eeySxCxOEEVHl2r2c0BYwBuct_yZhvkLqUQatRORlIP4Bh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEibhIf4RxdWljgiMpiXNlY3AyNTZrMaEDjight_62uShKNt4IorH13hfqm7kZzVyFxXKI_qDlsTGIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg \
--bootstrap-node=enr:-Mm4QBL6auezk-Zi385j0PyjkzGwQJW7TdOFZKGZMKTGRkI4fxTSTiHLe7kTvdjhBq4kgjPXvUnFiXR6AisA8a0w2lQBh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEmCr3YYRxdWljgiMpiXNlY3AyNTZrMaEDJ4xl2Our0Y7OKsSDX9f908HznXm3PKzmC9zD8OB2d0mIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg \
--suggested-fee-recipient=<Enter-eth-address-here> #If validators enabled
```
Import your validator keys:
```shell=
nimbus-eth2/build/nimbus_beacon_node deposits import \
--data-dir=nimbus-datadir \
<path/to/validator/keys>
```
Now restart your nimbus with the same command as when you first time started, and the validator keys will be loaded up already.
It is also possible to have a separate validator process for nimbus. More info on how to do this can be found [here](https://nimbus.guide/validator-client.html).
## Grandine
Pre-requisites: `git, rust`
Please ensure you have [RustC 1.81.x+](https://rustup.rs) installed.
Clone and build the branch indicated [version list](#Which-versionbranch-do-I-use). Example:
```shell=
git clone https://github.com/grandinetech/grandine.git
cd grandine
git submodule update --init dedicated_executor eth2_libp2p
cargo build --profile compact --features default-networks
cd ..
```
Start the beaconchain client
```shell=
grandine/target/release/grandine \
--data-dir=./grandine-datadir \
--eth1-rpc-urls=http://127.0.0.1:8551 \
--jwt-secret=/tmp/jwtsecret \
--network=custom \
--configuration-directory="." \
--p2p-discovery-bootnodes="enr:-Iq4QB2ny1q6gkBjqNRU_e-GTbpcJQcI4i3cIZDea0mnAzGgbUTKH8j81g9PRl_-m40F1V4GFBlqZElrcbGnUj9AjGeGAZL8bgmtgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ3h8aUO3GJHv-bdvHtsQZ2OEisutelYfGjXO4lSg8BYN1ZHCCIzI,enr:-LK4QF2XD_Fe5H9QMVVwBoDs6P_37eURcFvNTcLzOc60p_XlDKIBleMgudA7nltZ7TyAiOuY0BSQzHsdv5iUs7sFyWQEh2F0dG5ldHOIAwAAAAAAAACEZXRoMpDY3UMGYGN2JAABAAAAAAAAgmlkgnY0gmlwhJ3m4Z6Jc2VjcDI1NmsxoQJJ7y6LF_to7NYQd3BVRW1840gm5r1Lm3lfAfC9Wqmw8YN0Y3CCIyiDdWRwgiMo,enr:-Mm4QPtT8J4rpYkixx-COebnEPreuWv9OpgOGOvM01hqZ19eeySxCxOEEVHl2r2c0BYwBuct_yZhvkLqUQatRORlIP4Bh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEibhIf4RxdWljgiMpiXNlY3AyNTZrMaEDjight_62uShKNt4IorH13hfqm7kZzVyFxXKI_qDlsTGIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg,enr:-Mm4QBL6auezk-Zi385j0PyjkzGwQJW7TdOFZKGZMKTGRkI4fxTSTiHLe7kTvdjhBq4kgjPXvUnFiXR6AisA8a0w2lQBh2F0dG5ldHOIAAAAAAAAAACDY3NjBIRldGgykNjdQwZgY3YkAAEAAAAAAACCaWSCdjSCaXCEmCr3YYRxdWljgiMpiXNlY3AyNTZrMaEDJ4xl2Our0Y7OKsSDX9f908HznXm3PKzmC9zD8OB2d0mIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg",
--keystore-dir=<datadir to your keys> \
--keystore-password-file=<datadir to your secrets> \,
```
{%hackmd theme-dark %}
<style>
.markdown-body pre {background-color: #1E1E1E;border: 1px solid #555 !important;color: #73BCE0;border-radius:8px;/*border-radius:0px;*/ } .markdown-body pre .htmlembedded {color: #C8D4C8 !important; } .markdown-body pre .hljs-tag {color: #6D726E; } .markdown-body pre .token.keyword {color: #C586C0; } .markdown-body pre .token.string, .markdown-body pre .hljs-string {color: #C68362; } .markdown-body pre .hljs-comment, .markdown-body pre .token.comment {color: #6A9955; } .markdown-body pre .hljs-attr {color: #73BCE0; } .markdown-body pre .hljs-name {color:#569CD6; } .markdown-body pre .token.operator {color:#C8D4C8;background:transparent; } .markdown-body pre .token.property {color: #73BCE0; } .markdown-body pre .token.function {color: #DCDCAA; } .markdown-body pre .token.builtin {color: #34B294; } .markdown-body pre .token.number {color: #B5CEA8; } .markdown-body pre .token.constant {color: #3BC1FF; } .markdown-body pre .hljs-addition {color: #96D47D;background: #373D29; } .markdown-body pre .hljs-deletion {color: #E76A6A;background: #4B1818; } .markdown-body pre .hljs-selector-class {color: #D7BA5F; } .markdown-body pre .hljs-attribute {color: #9CDCFE; } .markdown-body pre .hljs-number {color: #C68362; } .markdown-body pre .hljs-meta {color: #2C7CD6; }
</style>
{%hackmd theme-dark %}
<style>
.markdown-body pre {background-color: #1E1E1E;border: 1px solid #555 !important;color: #73BCE0;border-radius:8px;/*border-radius:0px;*/ } .markdown-body pre .htmlembedded {color: #C8D4C8 !important; } .markdown-body pre .hljs-tag {color: #6D726E; } .markdown-body pre .token.keyword {color: #C586C0; } .markdown-body pre .token.string, .markdown-body pre .hljs-string {color: #C68362; } .markdown-body pre .hljs-comment, .markdown-body pre .token.comment {color: #6A9955; } .markdown-body pre .hljs-attr {color: #73BCE0; } .markdown-body pre .hljs-name {color:#569CD6; } .markdown-body pre .token.operator {color:#C8D4C8;background:transparent; } .markdown-body pre .token.property {color: #73BCE0; } .markdown-body pre .token.function {color: #DCDCAA; } .markdown-body pre .token.builtin {color: #34B294; } .markdown-body pre .token.number {color: #B5CEA8; } .markdown-body pre .token.constant {color: #3BC1FF; } .markdown-body pre .hljs-addition {color: #96D47D;background: #373D29; } .markdown-body pre .hljs-deletion {color: #E76A6A;background: #4B1818; } .markdown-body pre .hljs-selector-class {color: #D7BA5F; } .markdown-body pre .hljs-attribute {color: #9CDCFE; } .markdown-body pre .hljs-number {color: #C68362; } .markdown-body pre .hljs-meta {color: #2C7CD6; }
</style>