---
# System prepended metadata

title: 'Prysm Merge Interop M3 :panda_face:'

---

# Prysm Merge Interop M3 :panda_face: 

## Requirement

You will need Bazel version 3.7.0 to build Prysm from source. You can find full information on how to build Prysm from source [here](https://docs.prylabs.network/docs/install/install-with-bazel/). Once you have Bazel 3.7.0 installed, you can check with the following to verify prysm beacon node and validator can build:

```
git clone -b merge-oct https://github.com/prysmaticlabs/prysm.git && cd prysm
bazel build //beacon-chain:beacon-chain
bazel build //validator:validator
```


## Run Geth
Prysm currently uses go bindings on top of newly defined [exeuction engine APIs](https://github.com/ethereum/execution-apis/blob/main/src/engine/interop/specification.md). For prototyping, we currently are maintaining our own fork which implements the go bindings on top of consensus API.
Please checkout the following branch: 
https://github.com/terencechain/go-ethereum/tree/merge-interop-spec

To satisfy [M3](https://hackmd.io/_9XZIkDBTlqGJejVnOSOJg?view#Milestones) milestone, we need the execution client to build up the PoW chain so the instructions will be different than M2 before. Refer `genesis.json` and `sk.json` in the following link:
https://notes.ethereum.org/_UH57VUPRrC-re3ubtmo2w

Then run the following commands:


```bash=
make
./build/bin/geth --catalyst --http --ws -http.api "engine" --datadir "~/ethereum/taunus" init genesis.json
./build/bin/geth --catalyst --http --ws -http.api "engine" --datadir "~/ethereum/taunus" account import sk.json
./build/bin/geth --catalyst --http --ws -http.api "engine,eth,net"  --datadir "~/ethereum/taunus" --allow-insecure-unlock --unlock "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" --password "" --nodiscover console
```
In the geth console start the miner:
> miner.start()

## Before running Prysm, define merge config file
To satisfy [M3](https://hackmd.io/_9XZIkDBTlqGJejVnOSOJg?view#Milestones) milestone, we choose to simulate 2 network upgrades. From *Phase0* to *Altair* then to *Merge*. We also utilize terminal total difficulty override feature to be specified in the beacon node CLI. For transitioning to the Merge, please save the following yml to `/tmp/merge.yml` file, it will be pointed by the beacon node later.
```yml
ALTAIR_FORK_EPOCH: 1
MERGE_FORK_EPOCH: 2
```

## Run Prysm
To kick off an interop chain, we first need to generate a Phase0 genesis state. In this example, we generate a genesis state with 256 validators
```
bazel run //tools/genesis-state-gen -- --num-validators=256 --output-ssz=/tmp/genesis.ssz --mainnet-config
```

Then we start beacon node using the interop genesis state and interop mode
(**Note**: we set `--terminal-total-difficulty-override 10` at the end)
```
bazel run //beacon-chain -- --datadir /tmp/chaindata --force-clear-db --interop-genesis-state /tmp/genesis.ssz --interop-eth1data-votes --min-sync-peers=0 --http-web3provider=http://localhost:8545 --deposit-contract 0x8A04d14125D0FDCDc742F4A05C051De07232EDa4  --bootstrap-node= --chain-config-file=/tmp/merge.yaml --terminal-total-difficulty-override 10
```

Finally we start validator client with 256 keys using interop mode
```
bazel run //validator -- --beacon-rpc-provider localhost:4000 --interop-num-validators=256 --interop-start-index=0 --force-clear-db --chain-config-file=/tmp/merge.yaml
```

## Result
A screenshot of what it looks like from running beacon node (left), validator client (middle), and execution client (right):
(**Note**: Key logs are `terminal difficulty reached`(left) and `Entered PoS Stage`(right) )
![](https://i.imgur.com/U3P4nv6.jpg)


## Contribution

Want to contribute? Check out: https://github.com/prysmaticlabs/prysm/pull/9754

Have questions? Join our Discord: https://discord.gg/gwWGStWR

Spec readings? Check out:
* Consensus specs: https://github.com/ethereum/consensus-specs/tree/v1.1.0/specs/merge
* Engine API spec: https://github.com/ethereum/execution-apis/blob/v1.0.0-alpha.2/src/engine/interop/specification.md