Polygon zkEVM

Instructions to set up your Polygon ZkEVM node.

ℹ️

Note: Currently ARM-based CPUs are not supported

This is the most straightforward path to run a zkEVM node, and it’s perfectly fine for most use cases, This is quite opinionated, feel free to run this software in a different way, for instance it’s not needed to use Docker, you could use the Go and C++ binaries directly. Some instructions to install Prerequisites are give here however be sure to check the official documentation to install docker compose in case this doesn’t work

Terminal window
sudo apt-get install jq -y
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

You can modify the paths as per your requirements

Terminal window
# ZKEVM CONFIG DIR
mkdir -p ~/.zkevm/config
# ZKEVM NODE STATEDB DATA DIR
mkdir -p ~/.zkevm/data/statedb
# ZKEVM NODE POOLDB DATA_ DIR
mkdir -p ~/.zkevm/data/pooldb

Get network configurations

Storing directory paths to variables to reuse

bash ZKEVM_NET=mainnet

bash ZKEVM_NET=testnet

Terminal window
ZKEVM_DIR=~/.zkevm
ZKEVM_CONFIG_DIR=~/.zkevm/config

Fetch network configuration files

Terminal window
# get zip and unzip into $ZKEVM_DIR
curl -L https://github.com/0xPolygonHermez/zkevm-node/releases/latest/download/$ZKEVM_NET.zip > $ZKEVM_NET.zip && unzip -o $ZKEVM_NET.zip -d $ZKEVM_DIR && rm $ZKEVM_NET.zip
# create .env file from example.env
cp $ZKEVM_DIR/$ZKEVM_NET/example.env $ZKEVM_CONFIG_DIR/.env

Update the variables in $ZKEVM_CONFIG_DIR/.env

Terminal window
# your network could be either mainnet or testnet, we defined this earlier
ZKEVM_NETWORK=$ZKEVM_NET
# L1 node rpc
ZKEVM_NODE_ETHERMAN_URL="your_ETH_rpc"
# ZKEVM NODE STATEDB DATA DIR, we created this earlier
ZKEVM_NODE_STATEDB_DATA_DIR="$HOME/.zkevm/data/statedb"
# ZKEVM NODE POOLDB DATA_ DIR, we created this earlier
ZKEVM_NODE_POOLDB_DATA_DIR="$HOME/.zkevm/data/pooldb"

ℹ️

Note: ZKEVM_NODE_ETHERMAN_URL must point to the validator’s ethereum rpc node for security

We will need to use directories defined earlier when we want to pass config and env file to docker-compose, it would be nice to persist them across sessions Add them to your shell file of your choice

Terminal window
ZKEVM_NET=testnet
ZKEVM_DIR=~/.zkevm
ZKEVM_CONFIG_DIR=~/.zkevm/config

Start the node

Terminal window
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml up -d

This should show an output like this:

Terminal window
b08a0a826235 Pull complete 90.5s
d71d159599c3 Downloading [> ]
...

After it is done, verify by listing the services and their status

Terminal window
docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml ps

You should see the following containers running

Terminal window
docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
zkevm-pool-db postgres "docker-entrypoint.s…" zkevm-pool-db 12 minutes ago Up 12 minutes (healthy) 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp
zkevm-prover hermeznetwork/zkevm-prover:v1.1.4-fork.4 "zkProver -c /usr/sr…" zkevm-prover 12 minutes ago Up 12 minutes 0.0.0.0:50061->50061/tcp, :::50061->50061/tcp, 0.0.0.0:50071->50071/tcp, :::50071->50071/tcp
zkevm-rpc hermeznetwork/zkevm-node:v0.1.2 "/bin/sh -c '/app/zk…" zkevm-rpc 12 minutes ago Up 12 minutes 0.0.0.0:8545->8545/tcp, :::8545->8545/tcp, 8123/tcp, 0.0.0.0:9091->9091/tcp, :::9091->9091/tcp
zkevm-state-db postgres "docker-entrypoint.s…" zkevm-state-db 12 minutes ago Up 12 minutes (healthy) 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp
zkevm-sync hermeznetwork/zkevm-node:v0.1.2 "/bin/sh -c '/app/zk…" zkevm-sync 12 minutes ago Up 12 minutes 8123/tcp
Terminal window
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml logs zkevm-rpc -f

You should see logs like

Terminal window
zkevm-rpc | 2023-06-25T05:53:07.044Z INFO state/l2block.go:104 new l2 blocks detected, Number 9294, Hash 0x1395cd706d44cff77f895b499c6edb12ab2590d5bada01c0e281813ed059e9fa {"pid": 1, "version": "v0.1.2"}
zkevm-rpc | 2023-06-25T05:53:07.045Z INFO state/l2block.go:104 new l2 blocks detected, Number 9295, Hash 0x9e60cef2b322bc0452b74f0ac29ce147e24765251de09b03c4bf949358fce789 {"pid": 1, "version": "v0.1.2"}
zkevm-rpc | 2023-06-25T05:53:24.062Z INFO state/l2block.go:104 new l2 blocks detected, Number 9296, Hash 0x3d74c8d35b1a60a9c345dcb70239635e69a3579361ee6d11d81c942e626e8ccf {"pid": 1, "version": "v0.1.2"}
zkevm-rpc | 2023-06-25T05:53:24.062Z INFO state/l2block.go:104 new l2 blocks detected, Number 9297, Hash 0x21c3a1ef7098e26dca1d9f77525e2ecd2d5e7ca8e7f9a070d92725ee3071bc47 {"pid": 1, "version": "v0.1.2"}
zkevm-rpc | 2023-06-25T05:53:24.063Z INFO state/l2block.go:104 new l2 blocks detected, Number 9298, Hash 0x951d2aac1a0fb068b3cb34cb5bc7608b845108ffda4e8f8d54d56a051d6e60b4 {"pid": 1, "version": "v0.1.2"}
zkevm-rpc | 2023-06-25T05:53:24.063Z INFO state/l2block.go:104 new l2 blocks detected, Number 9299, Hash 0x824b0fae2fdfefb67bd5840700eb91e4dc435e5e9bb26353e6c2cbf09f45da19 {"pid": 1, "version": "v0.1.2"}
zkevm-rpc | 2023-06-25T05:53:24.063Z INFO state/l2block.go:104 new l2 blocks detected, Number 9300, Hash 0x7596608aae585568e2c3be91ffa21c898508cb3d39aa6f7cb94533bb0da87db5 {"pid": 1, "version": "v0.1.2"}
zkevm-rpc | 2023-06-25T05:53:24.064Z INFO state/l2block.go:104 new l2 blocks detected, Number 9301, Hash 0x6f3bf5c0c1a60a277db53a65b1b6c1885d99d7365880d328f25db1525bdf8952 {"pid": 1, "version": "v0.1.2"}
zkevm-rpc | 2023-06-25T05:53:24.064Z INFO state/l2block.go:104 new l2 blocks detected, Number 9302, Hash 0x54540dd02f16197734fa4597fe691d37fb3f0dd4386734795ccab853eb78c87d {"pid": 1, "version": "v0.1.2"}

Similarly, you can check logs for other containers too

Terminal window
#check logs
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml logs zkevm-pool-db -f
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml logs zkevm-prover -f
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml logs zkevm-rpc -f
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml logs zkevm-state-db -f
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml logs zkevm-sync -f
Terminal window
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' http://localhost:8545 | jq
{
"jsonrpc": "2.0",
"id": 83,
"result": "0x802"
}
Terminal window
echo "$(curl -4 ifconfig.co):8545"
Terminal window
curl -X POST [rpc] -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' | jq

If you get something like this in response to the above rpc call, your node is setup correctly

{
"jsonrpc": "2.0",
"id": 1,
"result": "0x3df827"
}

You can use a hex to number convertor to get the block height

You can compare the block height on your node with explorer (mainnet or testnet), use your RPC node only when it has caught up with the latest block height.

In order for vald to connect to your Zk EVM node, your rpc_addr should be exposed in vald’s config.toml

Terminal window
"http://IP:PORT" start-with-bridge = true
Terminal window
"http://IP:PORT" start-with-bridge = true

To start

Terminal window
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml up -d

To stop

Terminal window
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml down

To update

To update the zkNode software, repeat the setup steps, being careful not to overwrite the configuration files that you have modified.

To stop and wipe out everything

Terminal window
sudo docker-compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml down -v

Edit on GitHub