Setup Astar zkEVM Permissionless RPC Node
さて、今回は2023年11月の頭にドキュメントがアップされた「Setup Astar zkEVM Permissionless RPC Node」について、私自身で試しに構築をしてみたので解説記事を書きたいと思います。
なお、本記事の対象読者は少なくとも、ICTに関する基本的知識および、Linux のシェルや基本的なオペレーションができるエンジニアを対象としているため、一部詳細な手順を省略していますのでご了承ください。
はじめに
本記事は、Astar zkEVM用のパーミッションレスRPCノードを構築する手順を記載しています。以下のドキュメントの流れにそってノード構築をセットアップしていきます。
この記事を記載時点では、Astar zkEVM はテストネットが展開されており、この手順もそのテストネットである zKatana testnetで動かされる事を想定されたものとなっています。
必要なマシンスペック
16GB の RAM
4 Core CPU
100GB ストレージ以上(これは時間の経過とともに増加)
参考までに私が試行した具体的なマシンを以下に紹介します。
Beelink というブランドの MiniPC です。
Intel Alder Lake - N100 4Core
16GB SODIMM DDR4 3200
M.2 NVMe SSD 500GB
準備
Ubuntu OS インストール
はじめは、用意したマシンにOSをインストールしなければなりませんので今回は「Ubuntu Server 22.04.3 LTS」をインストールをしています。
Ubuntu のインストールは以下のドキュメントを参考にしています。
マシンにインストールするためのUSBインストールメディアを作成します。その後、そのUSBメディアをマシンにさして起動、OSのインストールを実施するといった流れです。以下はその流れのサマリーです。
1,balenaEtcher をダウンロード
2,Ubuntu ISOイメージをダウンロード
3,balenaEthcer を使ってISOイメージをUSBドライブにセットアップ
4,USBドライブをノードをセットアップするマシンに挿入し起動
5,Ubuntu インストールセットアップを実施
Ubuntu インストールのセットアップ手順は省略します。Minimalインストールで問題ありません。
Ethereum RPC ノードの用意
今回の、Astar zkEVM RPCノードを実行するためには、Ethereum RPC ノードが必要です。ドキュメント内の手順では、パブリックRPCエンドポイント(”https://eth-sepolia-public.unifra.io”)を使う流れで説明されていますが、この場合、レートが制限されているため、ノードが正しく同期されない可能性があります。(実際セットアップしてログをみるとわかりますが、度々エラーが確認されました。)
そのため、今回は Alchemy で今回専用のエンドポイントを作ってそれを指定しています。この作成方法は詳しくは書きませんが、簡単なプロセスを載せておきます。
1,Alckemy アカウント作成
2,Appsメニューから「Create new app」を選択し必要な事項を入力
3,作成されたAppの「API Key」を確認し記録
ここで、"API Key"と"HTTPS"の値を記録しておきます。
docker , docker-compose の用意
今回の Astar zkEVM RPC ノードはコンテナで起動するようになっています。そのためコンテナが起動するための環境の準備が必要です。具体的には、docker, docker-compose が使える状態にします。
docker-compose はdockerのプラグインのもので問題ないですが、スタンドアロンもセットアップしておきます。ドキュメントは以下を参考にします。
・https://www.docker.com/get-started
・https://docs.docker.com/compose/install/
以下にこれらのセットアップのログを記載しますが、あくまで参考としていただき、きちんとドキュメントを参照して準備してください。
$ sudo apt-get update
$ sudo apt -y install build-essential
### docker
$ sudo apt-get -y install ca-certificates curl gnupg
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
$ sudo echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
### docker-compose
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
$ mkdir -p $DOCKER_CONFIG/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
$ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
$ echo "export PATH=$PATH:$DOCKER_CONFIG/cli-plugins/" > ~/.bashrc
$ . ~/.bashrc
$ docker-compose version
Docker Compose version v2.23.0
Astar zkNode(RPC Node)のセットアップ
Astar zkEVM RPCノードは以下の5つのコンテナが起動します。
zkevm-rpc(zkevm-nodeイメージ)
zkevm-sync(zkevm-nodeイメージ)
zkevm-state-db(PostgreSQLイメージ)
zkevm-pool-db(PostgreSQLイメージ)
zkevm-prover(zkevm-proverイメージ)
前述したとおり、この記事執筆次点では、zKatana testnet で稼働する前提の手順となります。
コンテナのセットアップ
設定用、インストール用、データ用のディレクトリを作成します。
※シェルは一般ユーザーとなっている前提です。
$ sudo mkdir -p /etc/zkevm/{install,config} && sudo chown -R $USER:$USER /etc/zkevm
$ sudo mkdir -p /var/lib/zkevm/{statedb,pooldb} && sudo chown -R $USER:$USER /var/lib/zkevm/
ローカル変数を設定します。(.profileや.bashrcなどに追記します。)
# define installation and config path
ZKEVM_NET=testnet
ZKEVM_DIR=/etc/zkevm/install
ZKEVM_CONFIG_DIR=/etc/zkevm/config
zkatana.tar.gz (セットアップファイルのアーカイブ)をダウンロードして展開します。
$ wget https://shared-assets.astar.network/files/zkevm/zkatana/zkatana.tar.gz
$ tar -xf zkatana.tar.gz -C $ZKEVM_DIR && rm zkatana.tar.gz
env ファイルをコピーし、L1 RPC URL を編集します。
ここで、Alchemy で作成した "HTTPS" の値を指定します。
$ cp $ZKEVM_DIR/$ZKEVM_NET/example.env $ZKEVM_CONFIG_DIR/.env
$ nano $ZKEVM_CONFIG_DIR/.env
# Use your own Sepolia RPC URL here!!
ZKEVM_NODE_ETHERMAN_URL = "ここに Alchemy で作成した"HTTPS"の値を入れる"
次に、ノード構成ファイルを編集します。
ここでも、Alchemy で作成した "HTTPS" の値を指定します。
$ nano $ZKEVM_DIR/$ZKEVM_NET/config/environments/$ZKEVM_NET/node.config.toml
[Etherman]
# Set your own Sepolia RPC URL
URL = "ここに Alchemy で作成した"HTTPS"の値を入れる"
コンテナを起動します。
$ sudo docker compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml up -d
[+] Building 0.0s (0/0) docker:default
[+] Running 6/6
✔ Network zkevm Created 0.1s
✔ Container zkevm-pool-db Healthy 0.0s
✔ Container zkevm-state-db Healthy 0.0s
✔ Container zkevm-sync Started 0.0s
✔ Container zkevm-prover Started 0.0s
✔ Container zkevm-sync Started 0.0s
✔ Container zkevm-prover Started 0.0s
✔ Container zkevm-rpc Started
全てのコンテナが起動しているかを確認します。以下のコマンドは見やすいように出力していますが、単に "sudo docker ps" と打ってもOkです。 STATUS がすべてUpになっていたら起動しています。
$ sudo docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
NAMES STATUS PORTS
zkevm-rpc Up 17 minutes 0.0.0.0:8545->8545/tcp, :::8545->8545/tcp, 8123/tcp, 0.0.0.0:9091->9091/tcp, :::9091->9091/tcp
zkevm-prover Up 17 minutes 0.0.0.0:50061->50061/tcp, :::50061->50061/tcp, 0.0.0.0:50071->50071/tcp, :::50071->50071/tcp
zkevm-sync Up 17 minutes 8123/tcp, 0.0.0.0:9092->9091/tcp, :::9092->9091/tcp
zkevm-state-db Up 17 minutes (healthy) 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp
zkevm-pool-db Up 17 minutes (healthy) 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp
ここで、Astar zkEVM RPCノードとして待ち受けているのは、"zkevm-rpc"コンテナです。8545 ポートで稼働しているのがわかります。
RPC Request によるテスト
以下のコマンドを実行してみて、期待する応答が確認できたら正しく起動しています。
①チェーンIDの確認
$ curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "eth_chainId", "params": []}' http://localhost:8545
{"jsonrpc":"2.0","id":1,"result":"0x133e40"}
②最後のブロックIDの確認
$ curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method":"eth_getBlockByNumber", "params":["latest", false]}' http://localhost:8545
{"jsonrpc":"2.0","id":1,"result":{"parentHash":"0xf4cf938c5cffdd493bf677831f28b114c36b48d5e09834d091c07005c6fe4461","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","miner":"0xde29a1693c7fbdb0917d2d1b10eecf877e03cc8a","stateRoot":"0x8ae41066e82e21ca1e4b256338ef39fa8ad3e2f6dc55c4bbcb48f9930340b4a1","transactionsRoot":"0xb00ab663744adc2a96b9ab688b1a460477d2b3d2e95a064a978643203bdb5387","receiptsRoot":"0x0a8ac4b7db33b587f6a30bb15fd9ff38eda8eb6fbdc96ad20e8c2cd3ea779abd","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","difficulty":"0x0","totalDifficulty":"0x0","size":"0x495","number":"0x25ef","gasLimit":"0x1c9c380","gasUsed":"0x15c4a8","timestamp":"0x6535042b","extraData":"0x","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","hash":"0xc3425d64a79a51e9407165745f1e0c1671a44bdd57c1fb80cca02d783978e754","transactions":["0xf1fde0ef379af799fd185addadd008ef593997c92d7cbfeec8e1228d61aecbbf"],"uncles":[]}}
(参考)ログ出力
正しく起動していない、curl によるチェックでエラーになる、といった場合はログを確認してみましょう。以下は"zkevm-rpc"コンテナのログを見るコマンドです。
$ sudo docker logs -fn30 zkevm-rpc
(参考)コンテナの停止
$ sudo docker compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml down
[+] Running 6/6
✔ Container zkevm-rpc Removed 0.3s
✔ Container zkevm-prover Removed 10.4s
✔ Container zkevm-sync Removed 0.2s
✔ Container zkevm-pool-db Removed 0.3s
✔ Container zkevm-state-db Removed 0.5s
✔ Network zkevm Removed
以上です。
テストの際には身近にRPCノードを置いておいた方がよい場合もあるでしょう。その際の助けになれば幸いです。
参考
https://ubuntu.com/download/alternative-downloads