owned this note
owned this note
Published
Linked with GitHub
# Capella interop, Prysm - Nethermind
## Build Nethermind
```bash
git clone --recursive -b feature/shanghai-eip-4895-withdrawals https://github.com/NethermindEth/nethermind.git
cd nethermind/src/Nethermind
dotnet build Nethermind.sln -c release
export NETHERMIND=$(pwd)/Nethermind.Runner/bin/Release/net6.0
```
## Build prysm
```bash
git clone --recursive -b capella https://github.com/prysmaticlabs/prym.git
cd prysm
bazel build //cmd/beacon-chain
bazel build //cmd/validator
export PRYSM=$(pwd)
```
## Prepare the beacon configuration
- Make the devnet directory
```bash
mkdir devnet
export DEVNET=$(pwd)/devnet
```
- Create the beacon config
```bash
$ cat config.yml
CONFIG_NAME: interop
PRESET_BASE: interop
# Genesis
GENESIS_FORK_VERSION: 0x20000089
# Altair
ALTAIR_FORK_EPOCH: 2
ALTAIR_FORK_VERSION: 0x20000090
# Merge
BELLATRIX_FORK_EPOCH: 4
BELLATRIX_FORK_VERSION: 0x20000091
TERMINAL_TOTAL_DIFFICULTY: 16
# Capella
CAPELLA_FORK_EPOCH: 6
CAPELLA_FORK_VERSION: 0x20000092
MAX_WITHDRAWALS_PER_PAYLOAD: 4
# Time parameters
SECONDS_PER_SLOT: 6
SLOTS_PER_EPOCH: 4
```
- Create nethermind's config file
```bash
$ cat nethermind.json
{
"name": "TheMerge_Devnet",
"engine": {
"clique": {
"params": {
"period": 5,
"epoch": 30000
}
}
},
"params": {
"gasLimitBoundDivisor": "0x400",
"accountStartNonce": "0x0",
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"chainID": 32382,
"networkID": 32382,
"eip150Transition": "0x0",
"eip155Transition": "0x0",
"eip158Transition": "0x0",
"eip160Transition": "0x0",
"eip161abcTransition": "0x0",
"eip161dTransition": "0x0",
"eip140Transition": "0x0",
"eip211Transition": "0x0",
"eip214Transition": "0x0",
"eip658Transition": "0x0",
"eip145Transition": "0x0",
"eip1014Transition": "0x0",
"eip1052Transition": "0x0",
"eip1283Transition": "0x0",
"eip1283DisableTransition": "0x0",
"eip152Transition": "0x0",
"eip1108Transition": "0x0",
"eip1344Transition": "0x0",
"eip1884Transition": "0x0",
"eip2028Transition": "0x0",
"eip2200Transition": "0x0",
"eip2565Transition": "0x0",
"eip2929Transition": "0x0",
"eip2930Transition": "0x0",
"eip1559Transition": "0x0",
"eip3198Transition": "0x0",
"eip3529Transition": "0x0",
"eip3541Transition": "0x0",
"eip4895TransitionTimestamp": "0xTIMESTAMP",
"terminalTotalDifficulty": "0x10"
},
"genesis": {
"seal": {
"ethereum": {
"nonce": "0x42",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
},
"difficulty": "0x1",
"author": "0x0000000000000000000000000000000000000000",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extradata": "0x0000000000000000000000000000000000000000000000000000000000000000123463a4B065722E99115D6c222f267d9cABb5240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit":"0x1C9C380",
"baseFeePerGas":"0x7"
},
"accounts": {
"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b":
{
"balance":"0x6d6172697573766477000000"
}
}
}
```
- put this keystore in nethermind's directory
```bash
$cat $NETHERMIND/keystore/key-123463a4b065722e99115d6c222f267d9cabb524
{"address":"123463a4b065722e99115d6c222f267d9cabb524","crypto":{"cipher":"aes-128-ctr","ciphertext":"93b90389b855889b9f91c89fd15b9bd2ae95b06fe8e2314009fc88859fc6fde9","cipherparams":{"iv":"9dc2eff7967505f0e6a40264d1511742"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c07503bb1b66083c37527cd8f06f8c7c1443d4c724767f625743bd47ae6179a4"},"mac":"6d359be5d6c432d5bbb859484009a4bf1bd71b76e89420c380bd0593ce25a817"},"id":"622df904-0bb1-4236-b254-f1b8dfdff1ec","version":3}
```
- create the secrets
```bash
openssl rand -hex 32 | tr -d "\n" > "$DEVNET/jwt.hex"
touch $DEVNET/keystore_password.txt
```
- Put the following scripts in your devnet directory
```bash
cat nethermind.sh
#!/bin/bash
rm -rf $NETHERMIND/nethermind_db/*
$NETHERMIND/Nethermind.Runner --Init.ChainSpecPath ./nethermind.json --JsonRpc.JwtSecretFile $DEVNET/jwt.hex --Init.IsMining true --KeyStore.PasswordFiles $DEVNET/keystore_password.txt --KeyStore.UnlockAccounts 0x123463a4b065722e99115d6c222f267d9cabb524 --KeyStore.BlockAuthorAccount 0x123463a4b065722e99115d6c222f267d9cabb524 --Network.MaxActivePeers 0 --Init.GenesisHash 0x19286b9ba93edd49b64266c1df5e8303ecb3c504528b010b56f5b237aa0896c2 -c withdrawals_test
```
```bash
$cat beacon.sh
#!/bin/bash
GENESIS=$(($(date +%s) + 10))
SHANGHAI=$(($GENESIS + 144))
printf -v SHANGHAI_NETHERMIND "%x" "$SHANGHAI"
sed -i 's/TIMESTAMP/'$SHANGHAI_NETHERMIND'/' $DEVNET/nethermind.json
rm -rf $DEVNET/beaconchaindata
rm $DEVNET/genesis.ssz
cd $PRYSM
bazel run //cmd/prysmctl -- testnet generate-genesis --num-validators=512 --output-ssz=$DEVNET/genesis.ssz --chain-config-file=$DEVNET/config.yml --genesis-time=$GENESIS
bazel run //cmd/beacon-chain -- --datadir=$DEVNET \
--min-sync-peers=0 \
--interop-genesis-state=$DEVNET/genesis.ssz \
--interop-eth1data-votes \
--bootstrap-node= \
--chain-config-file=$DEVNET/config.yml \
--chain-id=32382 \
--accept-terms-of-use \
--jwt-secret=$DEVNET/jwt.hex \
--suggested-fee-recipient=0x123463a4b065722e99115d6c222f267d9cabb524 \
--verbosity debug
```
```bash
cat validator.sh
#!/bin/bash
rm $DEVNET/validator.db
cd $PRYSM
bazel run //cmd/validator -- --datadir=$DEVNET \
--accept-terms-of-use \
--interop-num-validators=512 \
--interop-start-index=0 \
--chain-config-file=$DEVNET/config.yml
```
## Run the clients
In three different terminals run these commands
```bash
$DEVNET/beacon.sh
$DEVNET/validator.sh
$DEVNET/nethermind.sh
```
in this order