# 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) )

## 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