HackMD
  • Beta
    Beta  Get a sneak peek of HackMD’s new design
    Turn on the feature preview and give us feedback.
    Go → Got it
      • Create new note
      • Create a note from template
    • Beta  Get a sneak peek of HackMD’s new design
      Beta  Get a sneak peek of HackMD’s new design
      Turn on the feature preview and give us feedback.
      Go → Got it
      • Sharing Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • More (Comment, Invitee)
      • Publishing
        Please check the box to agree to the Community Guidelines.
        Everyone on the web can find and read all notes of this public team.
        After the note is published, everyone on the web can find and read this note.
        See all published notes on profile page.
      • Commenting Enable
        Disabled Forbidden Owners Signed-in users Everyone
      • Permission
        • Forbidden
        • Owners
        • Signed-in users
        • Everyone
      • Invitee
      • No invitee
      • Options
      • Versions and GitHub Sync
      • Transfer ownership
      • Delete this note
      • Template
      • Save as template
      • Insert from template
      • Export
      • Dropbox
      • Google Drive Export to Google Drive
      • Gist
      • Import
      • Dropbox
      • Google Drive Import from Google Drive
      • Gist
      • Clipboard
      • Download
      • Markdown
      • HTML
      • Raw HTML
    Menu Sharing Create Help
    Create Create new note Create a note from template
    Menu
    Options
    Versions and GitHub Sync Transfer ownership Delete this note
    Export
    Dropbox Google Drive Export to Google Drive Gist
    Import
    Dropbox Google Drive Import from Google Drive Gist Clipboard
    Download
    Markdown HTML Raw HTML
    Back
    Sharing
    Sharing Link copied
    /edit
    View mode
    • Edit mode
    • View mode
    • Book mode
    • Slide mode
    Edit mode View mode Book mode Slide mode
    Note Permission
    Read
    Only me
    • Only me
    • Signed-in users
    • Everyone
    Only me Signed-in users Everyone
    Write
    Only me
    • Only me
    • Signed-in users
    • Everyone
    Only me Signed-in users Everyone
    More (Comment, Invitee)
    Publishing
    Please check the box to agree to the Community Guidelines.
    Everyone on the web can find and read all notes of this public team.
    After the note is published, everyone on the web can find and read this note.
    See all published notes on profile page.
    More (Comment, Invitee)
    Commenting Enable
    Disabled Forbidden Owners Signed-in users Everyone
    Permission
    Owners
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Invitee
    No invitee
       owned this note    owned this note      
    Published Linked with GitHub
    Like17 BookmarkBookmarked
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # 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/` 8. Run your chosen consensus engine, e.g: `docker-compose --env-file kintsugi.vars -f docker-compose.lighthouse.yml up -d` 9. Check your logs to confirm that they are up and syncing, e.g `docker logs lighthouse_beacon -f --tail=20` 10. 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](https://faucet.kintsugi.themerge.dev) ## 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](https://artifacts.consensys.net/public/teku/raw/names/teku.tar.gz/versions/develop/teku-develop.tar.gz) 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](https://github.com/bazelbuild/bazel/releases/tag/4.2.1). ``` 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: - `eth2-val-tools`: https://github.com/protolambda/eth2-val-tools - `ethereal`: https://github.com/wealdtech/ethereal (please build from source) - Metamask connected to the correct network - `jq` for pretty printing output ## Instructions: 1. Obtain some testnet ether by visiting the faucet [here](https://faucet.devnet3.themerge.dev/) 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: ```bash # 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 ``` 4. 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: ```bash 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. 5. 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. 6. Sanity check all the values in `secrets.env` again! 7. Create a new file called `devnet_deposits.sh` with the following content: ```bash #!/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" ``` 8. Make the script executable by running the following: ```bash chmod +x ./devnet_deposits.sh ``` 9. Please double check all the values in `secrets.env` and then finally run the script with: ```bash ./devnet_deposit.sh ``` 10. 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.

    Import from clipboard

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lost their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template is not available.


    Upgrade

    All
    • All
    • Team
    No template found.

    Create custom template


    Upgrade

    Delete template

    Do you really want to delete this template?

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Tutorials

    Book Mode Tutorial

    Slide Mode Tutorial

    YAML Metadata

    Contacts

    Facebook

    Twitter

    Feedback

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions

    Versions and GitHub Sync

    Sign in to link this note to GitHub Learn more
    This note is not linked with GitHub Learn more
     
    Add badge Pull Push GitHub Link Settings
    Upgrade now

    Version named by    

    More Less
    • Edit
    • Delete

    Note content is identical to the latest version.
    Compare with
      Choose a version
      No search result
      Version not found

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub

        Please sign in to GitHub and install the HackMD app on your GitHub repo. Learn more

         Sign in to GitHub

        HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Available push count

        Upgrade

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Upgrade

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully