Try   HackMD

Connect to the Kintsugi Testnet

Note: We've updated this doc to have information for the kintsugi devnet as best we could, please let us know if you find any stale information.

Please find the information about the latest branch/image to use here: https://notes.ethereum.org/@ExXcnR0-SJGthjz1dwkA1A/HkJ8Aolct

Docker

  1. Clone the repository: https://github.com/parithosh/consensus-deployment-ansible
  2. Ensure docker and docker-compose is installed: docker-compose --version and `docker version
    • If your version of docker does not work try with docker-compose 1.25.4 and docker 20.10.12.
  3. Change directories with cd consensus-deployment-ansible/scripts/quick-run/merge-devnets
  4. Create the required directories for persistent data with mkdir -p execution_data beacon_data
  5. Find your IP address(public IP) and add it to the <testnet-name>.vars(e.g: kintsugi.vars) file file located in consensus-deployment-ansible/scripts/quick-run/merge-devnets, this is just to ensure easy peering
    5.1 curl ifconfig.me or visit https://whatismyipaddress.com
    5.2 Replace IP in the config file kintsugi.vars with your own IP address: https://i.imgur.com/xnNqN6h.png
  6. Run your chosen execution engine, e.g: docker-compose --env-file kintsugi.vars -f docker-compose.geth.yml up -d
  7. Check your logs to confirm execution engine(geth) is up
    • e.g. docker logs geth_init -f --tail=20
    • e.g. docker logs geth -f --tail=20
  • Troubleshooting if execution engine(geth) is not coming up and shows error like below.
Fatal: Failed to write genesis block: database contains incompatible genesis (have 97bd4312dfa0f247e7199b59f243673d45934f3071be44174e007d56d29ada2b, new a28d8d73e087a01d09d8cb806f60863652f30b6b6dfa4e0157501ff07d422399)
Fatal: Failed to write genesis block: database contains incompatible genesis (have 97bd4312dfa0f247e7199b59f243673d45934f3071be44174e007d56d29ada2b, new a28d8d73e087a01d09d8cb806f60863652f30b6b6dfa4e0157501ff07d422399)

Solution :

  • Delete directory beacon_data and execution_data
    in path consensus-deployment-ansible/scripts/quick-run/merge-devnets/
  1. Run your chosen consensus engine, e.g: docker-compose --env-file kintsugi.vars -f docker-compose.lighthouse.yml up -d
  2. Check your logs to confirm that they are up and syncing, e.g docker logs lighthouse_beacon -f --tail=20
  3. To stop the clients, run docker-compose -f <insert file name you used earlier here> down
    • e.g. docker stop geth
    • e.g. docker stop lighthouse_beacon

Setting up Metamask

You can find a "Add to metamask" button on https://kintsugi.themerge.dev. As an alternative, you can also do it manually:

  1. Ensure your nodes are using the current devnet config and are syncing or already synced.
  2. Open your Metamask Extension in your browser.
  3. Click on the network switcher on the top. You will need to configure a custom network. Do NOT simply used "Localhost 8545" as you need to specify the chain ID.
  4. Click on "Add Network"
  5. In the next screen fill in the chainID 1337702 and address of your local RPC. Take care to refer to your rpc endpoint with correct protocol which is http not https!
  6. Now you can select the new network and use Metamask like you are used to! To request funds go to the faucet

Linux

Clone the testnet configuration

git clone https://github.com/eth-clients/merge-testnets.git
cd merge-testnets/kintsugi

Build Geth

Pre-requisites: git, make, go, gcc.

(use geth branch merge-kintsugi from github.com/mariusvanderwijden/go-ethereum)

git clone -b merge-kintsugi https://github.com/MariusVanDerWijden/go-ethereum.git
cd go-ethereum 
make geth
cd ..

Build Nethermind

Pre-requisites: dotnet 6.0 libsnappy-dev libc6-dev libc6

git clone -b themerge_kintsugi https://github.com/NethermindEth/nethermind --recursive
cd nethermind/src/Nethermind
dotnet build Nethermind.sln -c Release

Build Besu

Ensure Java 11 or above is installed (Ubuntu: sudo apt install default-jre).

git clone -b kintsugi https://github.com/hyperledger/besu --recursive
cd besu
./gradlew installDist distTar
cd ..

The besu executable is now available in ./besu/build/install/besu/bin/besu and a tar distribution is available in ./besu/build/distributions. You can also build a docker image by using the distDocker gradle target or use the pre-built docker image hyperledger/besu:kintsugi.

Build Erigon

Build EthereumJS

Build Lighthouse

(use branch unstable)

git clone -b unstable https://github.com/sigp/lighthouse.git
cd lighthouse
make
cd ..

Build Lodestar

git clone https://github.com/chainsafe/lodestar.git
cd lodestar
yarn install --ignore-optional
yarn run build
cd ..

Build Nimbus

git clone -b kintsugi https://github.com/status-im/nimbus-eth2.git
cd nimbus-eth2/
make nimbus_beacon_node
cd ..

Build Teku

Ensure Java 11 or above is installed (Ubuntu: sudo apt install default-jre).

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:develop docker image.

Build Prysm

Ensure you have Bazel-4.2.1 installed in your system. You can simply download the binary from github.

git clone -b kintsugi https://github.com/prysmaticlabs/prysm.git
cd prysm
bazel build //beacon-chain:beacon-chain

If you plan to run a validator

bazel build //validator:validator

Connect Geth-LH

In the kintsugi folder

./go-ethereum/build/bin/geth init genesis.json  --datadir "datadir-lh"
./go-ethereum/build/bin/geth --datadir "datadir-lh" --http --http.api="engine,eth,web3,net,debug" --http.corsdomain "*" --networkid=1337702 --syncmode=full  --catalyst console

in a second window
(use lighthouse branch unstable)

lighthouse \
  --spec mainnet \
  --testnet-dir ./ \
  --debug-level info \
  beacon_node \
  --datadir ./testnet-lh1 \
  --eth1 \
  --http \
  --http-allow-sync-stalled \
  --metrics \
  --merge \
  --execution-endpoints http://127.0.0.1:8545 \
  --enr-udp-port=9001 \
  --enr-tcp-port=9001 \
  --discovery-port=9001 \
  --boot-nodes="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk"

Connect Geth-Prysm

In the kintsugi folder:

mkdir datadir-prysm
./go-ethereum/build/bin/geth --catalyst init genesis.json  --datadir datadir-prysm
./go-ethereum/build/bin/geth --catalyst --datadir datadir-prysm --networkid=1337702 --http --http.api engine,net,eth --ws --ws.api net,eth,engine --bootnodes enode://57745805245c441b71a9f3b3e7d78f75dd576d36b236b9f64cf9a9cccdcb574ec1f64d69c05add598ef26e3d7f646534b4c9976ca53551f71ad579a472635086@165.232.185.207:30303

In a different window in the kintsugi folder

cd prysm
bazel run //beacon-chain -- --genesis-state $PWD/../genesis.ssz --datadir $PWD/../datadir-prysm --http-web3provider=http://localhost:8545 --min-sync-peers=1 --chain-config-file $PWD/../config.yaml --bootstrap-node "enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk"

OR

bazel run //beacon-chain -- --genesis-state $PWD/../genesis.ssz --datadir $PWD/../datadir-prysm --http-web3provider=http://localhost:8545 --kintsugi-testnet

If you plan to run a validator, in yet another window in the kintsugi folder

cd prysm
bazel run //validator -- --chain-config-file $PWD/../config.yaml

Connect Geth-Teku

In the kintsugi folder

./go-ethereum/build/bin/geth init genesis.json  --datadir "datadir-teku"
./go-ethereum/build/bin/geth --datadir "datadir-teku" --http --http.api="engine,eth,web3,net,debug" --http.corsdomain "*" --networkid=1337702 --syncmode=full  --catalyst console

in second window

./teku/build/install/teku/bin/teku \
  --data-path "datadir-teku" \
  --network kintsugi \
  --Xee-endpoint http://localhost:8545 \
  --log-destination console

Connect Geth-Nimbus

In the kintsugi folder

./go-ethereum/build/bin/geth init genesis.json  --datadir "datadir-nimbus"
./go-ethereum/build/bin/geth --datadir "datadir-nimbus" --ws --ws.api="engine,eth,web3,net,debug" --http.corsdomain "*" --networkid=1337702 --syncmode=full  --catalyst  console

in second window

 nimbus-eth2/build/nimbus_beacon_node --network=. --web3-url=ws://127.0.0.1:8546 --log-level=DEBUG --bootstrap-file=bootstrap_nodes.txt --terminal-total-difficulty-override=5000000000 --data-dir=nimbus-beacondata --bootstrap-node=enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk

Connect Geth-Lodestar

In the kintsugi folder

./go-ethereum/build/bin/geth init genesis.json  --datadir "datadir-lodestar"
./go-ethereum/build/bin/geth --datadir "datadir-lodestar" --http --http.api="engine,eth,web3,net,debug" --http.corsdomain "*" --networkid=1337702 --syncmode=full  --catalyst console

In a second window

cd lodestar
./lodestar beacon --rootDir="../lodestar-beacondata" --paramsFile="../config.yaml" --genesisStateFile="../genesis.ssz" --network.discv5.bootEnrs="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk" --eth1.enabled=true --execution.urls="http://127.0.0.1:8545" --network.connectToDiscv5Bootnodes --network.discv5.enabled=true

Connect Nethermind-LH

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window, in the kintsugi folder
(use lighthouse branch kintsugi)

lighthouse \
  --spec mainnet \
  --testnet-dir ./ \
  --debug-level info \
  beacon_node \
  --datadir ./testnet-lh1 \
  --eth1 \
  --http \
  --http-allow-sync-stalled \
  --metrics \
  --merge \
  --execution-endpoints http://127.0.0.1:8550 \
  --enr-udp-port=9001 \
  --enr-tcp-port=9001 \
  --discovery-port=9001 \
  --boot-nodes="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk"

Connect Nethermind-Prysm

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window, in the prysm folder

bazel run //beacon-chain -- \
  --interop-genesis-state merge-testnets/kintsugi/genesis.ssz \
  --datadir $PWD/../datadir-prysm \
  --http-web3provider=http://localhost:8550 \
  --min-sync-peers=1 \
  --chain-config-file merge-testnets/kintsugi/config.yaml \
  --bootstrap-node "enr:-Ly4QGibo1DJfV1BkAf8AnN6matZIlxGrDjnyTpR0qojiGD8XxDysNCEk1NctXRv3e04sHBu-okKgJBZzYHwQDeWG2QBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpDtvzqoQQAAcAQAAAAAAAAAgmlkgnY0gmlwhMBR0MqJc2VjcDI1NmsxoQI69Upbug4HrZ-WKvP3uqZfapzxM7WUG3_eB3F5zoP3B4hzeW5jbmV0cwCDdGNwgiMog3VkcIIjKA" \
  --merge-testnet
  --terminal-total-difficulty-override 5000000000

Connect Nethermind-Teku

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window

teku/build/install/teku/bin/teku   \
  --data-path "datadir-teku"   \
  --network kintsugi   \
  --Xee-endpoint http://localhost:8550

Connect Nethermind-Nimbus

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window, in the kintsugi folder

nimbus-eth2/build/nimbus_beacon_node \
  --network=. \
  --web3-url=ws://127.0.0.1:8551 \
  --log-level=DEBUG  \
  --terminal-total-difficulty-override=5000000000 \
  --data-dir=nimbus-beacondata \
  --bootstrap-node=enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk

Connect Nethermind-Lodestar

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window, in the lodestar folder

./lodestar beacon \
  --rootDir="../lodestar-beacondata" \
  --paramsFile="./config.yaml" \
  --genesisStateFile="./genesis.ssz" \
  --network.discv5.bootEnrs="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk" \
  --eth1.enabled=true \
  --execution.urls="http://127.0.0.1:8550" \
  --network.connectToDiscv5Bootnodes \
  --network.discv5.enabled=true \
  --eth1.depositContractDeployBlock 0

Make sure to copy config.yml and genesis.ssz from merge-testnets/kintsugi folder to lodestar folder

Connect Besu-LH

In the kintsugi folder

mkdir datadir-lh-besu && \
./besu/build/install/besu/bin/besu \
    --data-path "datadir-lh-besu" \
    --rpc-http-enabled \
    --rpc-http-api=ADMIN,ETH,NET,DEBUG,TXPOOL,EXECUTION \ 
    --p2p-enabled=true \ 
    --Xmerge-support=true \
    --network=kintsugi_v1

in a second window
(use lighthouse branch unstable)

lighthouse \
  --spec mainnet \
  --testnet-dir ./ \
  --debug-level info \
  beacon_node \
  --datadir ./testnet-lh1 \
  --eth1 \
  --http \
  --http-allow-sync-stalled \
  --metrics \
  --merge \
  --execution-endpoints http://127.0.0.1:8545 \
  --enr-udp-port=9001 \
  --enr-tcp-port=9001 \
  --discovery-port=9001 \
  --boot-nodes="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk"

Connect Besu-Prysm

In the kintsugi folder:

mkdir datadir-prysm-besu && \
./besu/build/install/besu/bin/besu \
    --data-path "datadir-prysm-besu" \
    --rpc-http-enabled \
    --rpc-http-api=ADMIN,ETH,NET,DEBUG,TXPOOL,EXECUTION \ 
    --p2p-enabled=true \ 
    --Xmerge-support=true \
    --network=kintsugi_v1

In a different window in the kintsugi folder

cd prysm
bazel run //beacon-chain -- --genesis-state $PWD/../genesis.ssz --datadir $PWD/../datadir-prysm --http-web3provider=http://localhost:8545 --min-sync-peers=1 --chain-config-file $PWD/../config.yaml --bootstrap-node "enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk"

OR

bazel run //beacon-chain -- --genesis-state $PWD/../genesis.ssz --datadir $PWD/../datadir-prysm --http-web3provider=http://localhost:8545 --kintsugi-testnet

If you plan to run a validator, in yet another window in the kintsugi folder

cd prysm
bazel run //validator -- --chain-config-file $PWD/../config.yaml

Connect Besu-Teku

In the kintsugi folder

mkdir datadir-teku-besu && \
./besu/build/install/besu/bin/besu \
    --data-path "datadir-teku-besu" \
    --rpc-http-enabled \
    --rpc-http-api=ADMIN,ETH,NET,DEBUG,TXPOOL,EXECUTION \ 
    --p2p-enabled=true \ 
    --Xmerge-support=true \
    --network=kintsugi_v1

in second window

./teku/build/install/teku/bin/teku \
  --data-path "datadir-teku" \
  --network kintsugi \
  --Xee-endpoint http://localhost:8545 \
  --log-destination console

Connect Besu-Nimbus

In the kintsugi folder

mkdir datadir-nimbus-besu && \
./besu/build/install/besu/bin/besu \
    --data-path "datadir-nimbus-besu" \
    --rpc-ws-enabled \
    --rpc-ws-api=ADMIN,ETH,NET,DEBUG,TXPOOL,EXECUTION \ 
    --p2p-enabled=true \ 
    --Xmerge-support=true \
    --network=kintsugi_v1

in second window

 nimbus-eth2/build/nimbus_beacon_node --network=. --web3-url=ws://127.0.0.1:8546 --log-level=DEBUG --bootstrap-file=bootstrap_nodes.txt --terminal-total-difficulty-override=5000000000 --data-dir=nimbus-beacondata --bootstrap-node=enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk

Connect Besu-Lodestar

In the kintsugi folder

mkdir datadir-lodestar-besu && \
./besu/build/install/besu/bin/besu \
    --data-path "datadir-ldoestar-besu" \
    --rpc-http-enabled \
    --rpc-http-api=ADMIN,ETH,NET,DEBUG,TXPOOL,EXECUTION \ 
    --p2p-enabled=true \ 
    --Xmerge-support=true \
    --network=kintsugi_v1

In a second window

cd lodestar
./lodestar beacon --rootDir="../lodestar-beacondata" --paramsFile="../config.yaml" --genesisStateFile="../genesis.ssz" --network.discv5.bootEnrs="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk" --eth1.enabled=true --execution.urls="http://127.0.0.1:8545" --network.connectToDiscv5Bootnodes --network.discv5.enabled=true

Windows

Build Nethermind

git clone -b themerge_kintsugi https://github.com/NethermindEth/nethermind --recursive
cd nethermind/src/Nethermind
dotnet build Nethermind.sln -c Release

Build Lodestar

In Cygwin https://www.cygwin.com/ console:

git clone https://github.com/chainsafe/lodestar.git
cd lodestar
yarn install --ignore-optional
yarn run build
cd ..

Build Lighthouse

(use branch unstable)

git clone -b unstable https://github.com/sigp/lighthouse.git
cd lighthouse
make
cd ..

Connect Nethermind-Lodestar

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In Cygwin https://www.cygwin.com/ console, in the lodestar folder

./lodestar beacon \
  --rootDir="../lodestar-beacondata" \
  --paramsFile="./config.yaml" \
  --genesisStateFile="./genesis.ssz" \
  --network.discv5.bootEnrs="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk" \
  --eth1.enabled=true \
  --execution.urls="http://127.0.0.1:8550" \
  --network.connectToDiscv5Bootnodes \
  --network.discv5.enabled=true \
  --eth1.depositContractDeployBlock 0

Make sure to copy config.yml and genesis.ssz from merge-testnets/kintsugi folder to lodestar folder

Connect Nethermind-LH

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In Cygwin https://www.cygwin.com/ console, in the unstable folder
(use lighthouse branch unstable)

lighthouse \
  --spec mainnet \
  --testnet-dir ./
  --debug-level info \
  beacon_node \
  --datadir ./testnet-lh1 \
  --eth1 \
  --http \
  --http-allow-sync-stalled \
  --metrics \
  --merge   \
  --execution-endpoints http://127.0.0.1:8550 \
  --enr-udp-port=9001 \
  --enr-tcp-port=9001 \
  --discovery-port=9001 \
  --boot-nodes="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk" \
  --eth1-endpoints http://127.0.0.1:8550

MacOS

Clone the testnet configuration

git clone https://github.com/eth-clients/merge-testnets.git
cd merge-testnets/kintsugi

Build Geth

First make sure to have the go compiler installed:

brew install go

(use geth branch merge-kintsugi from github.com/mariusvanderwijden/go-ethereum)

git clone -b merge-kintsugi https://github.com/MariusVanDerWijden/go-ethereum.git
cd go-ethereum 
make geth
cd ..

Build Nethermind

Pre-requisites: dotnet 6.0

Install all prerequisites:

brew install rocksdb gmp snappy lz4 zstd

Build binary on themerge_kintsugi branch:

git clone -b themerge_kintsugi https://github.com/NethermindEth/nethermind --recursive
cd nethermind/src/Nethermind
dotnet build Nethermind.sln -c Release

Build Lighthouse

Install cmake

brew install cmake rust

Install rust compiler and configure it

brew install rustup
rustup-init

Then restart the current shell to have the shell's PATH updated.

(use branch unstable)

git clone -b unstable https://github.com/sigp/lighthouse.git
cd lighthouse
make
cd ..

Build Teku

Ensure Java 11 or above is installed

brew install openjdk
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 distributions from https://github.com/ConsenSys/teku#binary-releases or the consensys/teku:develop docker image.

Connect Geth-LH

In the kintsugi folder

./go-ethereum/build/bin/geth init genesis.json  --datadir "datadir-lh"
./go-ethereum/build/bin/geth --datadir "datadir-lh" --http --http.api="engine,eth,web3,net,debug" --http.corsdomain "*" --networkid=1337702 --syncmode=full  --catalyst console

in second window (always from kintsugi folder):

lighthouse \
  --spec mainnet \
  --testnet-dir ./ \
  --debug-level info \
  beacon_node \
  --datadir ./testnet-lh1 \
  --eth1 \
  --http \
  --http-allow-sync-stalled \
  --metrics \
  --merge \
  --execution-endpoints http://127.0.0.1:8545 \
  --enr-udp-port=9001 \
  --enr-tcp-port=9001 \
  --discovery-port=9001 \
  --boot-nodes="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk"

Connect Geth-Teku

In the kintsugi folder

./go-ethereum/build/bin/geth init genesis.json  --datadir "datadir-teku"
./go-ethereum/build/bin/geth --datadir "datadir-teku" --http --http.api="engine,eth,web3,net,debug" --http.corsdomain "*" --networkid=1337702 --syncmode=full  --catalyst console

in second window

./teku/build/install/teku/bin/teku \
  --data-path "datadir-teku" \
  --network kintsugi \
  --Xee-endpoint http://localhost:8545 \
  --log-destination console

Connect Nethermind-LH

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window, in the kintsugi folder
(use lighthouse branch unstable)

lighthouse \
  --spec mainnet \
  --testnet-dir ./ \
  --debug-level info \
  beacon_node \
  --datadir ./testnet-lh1 \
  --dummy-eth1 \
  --http \
  --http-allow-sync-stalled \
  --metrics \
  --merge \
  --execution-endpoints http://127.0.0.1:8550 \
  --eth1-endpoints http://127.0.0.1:8550 \
  --enr-udp-port=9001 \
  --enr-tcp-port=9001 \
  --discovery-port=9001 \
  --boot-nodes="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk"

Connect Nethermind-Prysm

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window, in the prysm folder

bazel run //beacon-chain -- \
  --interop-genesis-state merge-testnets/kintsugi/genesis.ssz \
  --datadir $PWD/../datadir-prysm \
  --http-web3provider=http://localhost:8550 \
  --min-sync-peers=1 \
  --chain-config-file merge-testnets/kintsugi/config.yaml \
  --bootstrap-node "enr:-Ly4QGibo1DJfV1BkAf8AnN6matZIlxGrDjnyTpR0qojiGD8XxDysNCEk1NctXRv3e04sHBu-okKgJBZzYHwQDeWG2QBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpDtvzqoQQAAcAQAAAAAAAAAgmlkgnY0gmlwhMBR0MqJc2VjcDI1NmsxoQI69Upbug4HrZ-WKvP3uqZfapzxM7WUG3_eB3F5zoP3B4hzeW5jbmV0cwCDdGNwgiMog3VkcIIjKA" \
  --merge-testnet \
  --terminal-total-difficulty-override 5000000000

Connect Nethermind-Teku

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window

teku/build/install/teku/bin/teku   \
  --data-path "datadir-teku"   \
  --network kintsugi   \
  --Xee-endpoint http://localhost:8550

Connect Nethermind-Nimbus

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window, in the kintsugi folder

nimbus-eth2/build/nimbus_beacon_node \
  --network=. \
  --web3-url=ws://127.0.0.1:8551 \
  --log-level=DEBUG  \
  --terminal-total-difficulty-override=5000000000 \
  --data-dir=nimbus-beacondata \
  --bootstrap-node=enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk

Connect Nethermind-Lodestar

In the src/Nethermind/Nethermind.Runner folder of nethermind

dotnet run -c Release -- --config kintsugi

In a second window, in the lodestar folder

./lodestar beacon \
  --rootDir="../lodestar-beacondata" -\
  -paramsFile="./config.yaml" \
  --genesisStateFile="./genesis.ssz" \
  --network.discv5.bootEnrs="enr:-Iq4QKuNB_wHmWon7hv5HntHiSsyE1a6cUTK1aT7xDSU_hNTLW3R4mowUboCsqYoh1kN9v3ZoSu_WuvW9Aw0tQ0Dxv6GAXxQ7Nv5gmlkgnY0gmlwhLKAlv6Jc2VjcDI1NmsxoQK6S-Cii_KmfFdUJL2TANL3ksaKUnNXvTCv1tLwXs0QgIN1ZHCCIyk" \
  --eth1.enabled=true \
  --execution.urls="http://127.0.0.1:8550" \
  --network.connectToDiscv5Bootnodes \
  --network.discv5.enabled=true

Make sure to copy config.yml and genesis.ssz from merge-testnets/kintsugi folder to lodestar folder

Creating a validator deposit

Warning: Please do not try this with real ether, these instructions are purely meant for the merge devnets.

This guide assumes you are using metamask to interact with the faucet and store the funds, Advanced users can bypass this step. There are other methods to perform deposits, this guide merely describes one such method.

Pre-requities:

Instructions:

  1. Obtain some testnet ether by visiting the faucet here
  2. Create a new file called secrets.env. This file will contain our private key, so make sure you don't commit it anywhere.
  3. Fill secrets.env with the follwing variable names:
# sets the deposit amount to use
DEPOSIT_AMOUNT=32000000000
# sets the genesis fork version of the testnet
FORK_VERSION="0x60000069"
# sets the mnemonic to derive the keys from
VALIDATORS_MNEMONIC=""
# sets the mnemonic for withdrawal credentials
WITHDRAWALS_MNEMONIC=""
# temporary location to store the deposit data
DEPOSIT_DATAS_FILE_LOCATION="/tmp/deposit_data.txt"
# sets the deposit contract address
DEPOSIT_CONTRACT_ADDRESS="0x4242424242424242424242424242424242424242"
# sets the eth1 address from which the transaction will be made
ETH1_FROM_ADDR=""
# sets the eth1 private key used to sign the transaction
ETH1_FROM_PRIV=""
# forces the deposit since the deposit contract will not be recognized by the tool
FORCE_DEPOSIT=true
# sets an RPC endpoint to submit the transaction to
ETH1_RPC=https://rpc.kintsugi.themerge.dev
  1. Our Mnemonic is the source of the private keys of the validators. Loosing this mnemonic means the loss of all funds, so please store the mnemonic safely. We can generate the validator and withdrawal mnemonic using the tool eth2-val-tools. In your terminal, type out:
eth2-val-tools mnemonic

The output should contain a list of 24 words. Copy those words into the secrets.env file under the variable VALIDATORS_MNEMONIC. Don't forget to wrap the 24 words inside ""!

Repeat the process for WITHDRAWALS_MNEMONIC.

  1. Now we can finally add our private key and address from which the deposits will be made. This will be in metamask, go to the account with the testnet ether > click on the three dots > click on Account details > click on export private key. We will need the private key in the script to access the funds and perform the deposits, so save this somewhere safely. Fill out ETH1_FROM_ADDR and ETH1_FROM_PRIV in secrets.env accordingly. Don't forget to wrap both inside "" and they should start with 0x.
  2. Sanity check all the values in secrets.env again!
  3. Create a new file called devnet_deposits.sh with the following content:
#!/bin/bash

echo "USE AT YOUR OWN RISK"
read -p "Are you sure you've double checked the values and want to make this deposit? " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
    [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1
fi

source secrets.env

if [[ -z "${ETH1_FROM_ADDR}" ]]; then
  echo "need ETH1_FROM_ADDR environment var"
  exit 1 || return 1
fi
if [[ -z "${ETH1_FROM_PRIV}" ]]; then
  echo "need ETH1_FROM_PRIV environment var"
  exit 1 || return 1
fi


eth2-val-tools deposit-data \
  --source-min=0 \
  --source-max=1 \
  --amount=$DEPOSIT_AMOUNT \
  --fork-version=$FORK_VERSION \
  --withdrawals-mnemonic="$WITHDRAWALS_MNEMONIC" \
  --validators-mnemonic="$VALIDATORS_MNEMONIC" > $DEPOSIT_DATAS_FILE_LOCATION


# Iterate through lines, each is a json of the deposit data and some metadata
while read x; do
   account_name="$(echo "$x" | jq '.account')"
   pubkey="$(echo "$x" | jq '.pubkey')"
   echo "Sending deposit for validator $account_name $pubkey"
   ethereal beacon deposit \
      --allow-unknown-contract=$FORCE_DEPOSIT \
      --address="$DEPOSIT_CONTRACT_ADDRESS" \
      --connection=$ETH1_RPC \
      --data="$x" \
      --value="$DEPOSIT_ACTUAL_VALUE" \
      --from="$ETH1_FROM_ADDR" \
      --privatekey="$ETH1_FROM_PRIV"
   echo "Sent deposit for validator $account_name $pubkey"
   sleep 3
done < "$DEPOSIT_DATAS_FILE_LOCATION"

  1. Make the script executable by running the following:
chmod +x ./devnet_deposits.sh
  1. Please double check all the values in secrets.env and then finally run the script with:
./devnet_deposit.sh
  1. The terminal output will indicate a transaction hash, check the transaction explorer to check the status. Once the transaction is included, you would still need to wait 64 epochs before the validator is included on the beaconchain.

Now that the deposit has been made, please generate your validator keys using your validator mnemonic specified in secrets.env and then start your validator to be a part of the network.