技術 ブログ

約4.5万円でBaseフルノードを構築する手順②



はじめに



前回「約4.5万円でBaseフルノードを構築する手順①」では、Baseを起動するためのハードウェアを含めたサーバー環境を用意しました。

次は、Baseを起動するためのソフトウェア環境を用意していきます。

Baseでは、ノードオペレータ用に簡単にインストールおよび起動できるdocker-composeを公開しています。

しかし、ドキュメントがL1のイーサリアムのクライアントと違って充実しているわけではありません。


OPスタックを利用しているため、実際の運用では、L2の実行クライアントの役割をもつop-gethや、ブロックを伝播するop-nodeについてOptimismのドキュメントやリポジトリから調査する必要があります。

また、op-gethについては、L1の実行クライアントであるgethを改造しているので、gethのドキュメントが役立ちます。

dockerやdocker-composeを使ったDockerネットワークやDockerコンテナの操作知識もある程度必要になります。

dockerは良くできたソフトウェアですが、色々と自動化されている分、その複雑さは意外にあなどれません。


以下にて説明していきますが、各技術で分からない点があった場合は、上記のドキュメントや各技術のサイトをご参照ください。


1. Docker環境の構築


Dockerのインストール

$ sudo apt update
$ sudo apt install docker -y
# インストールされているとバージョンが見れます
$ sudo docker -v


Dockerコマンドの設定

Dockerをsudo無しで起動するようにします。

$ sudo gpasswd -a $USER docker
$ sudo systemctl restart docker
$ exit

※上記コマンド実行後再度ログインが必要です。


Docker-composeのインストール

$ sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-aarch64 -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose -v

※ARM用のdocker-composeをインストールしないと稼働しないことにご注意ください。



2. ソースの取得


gitのインストール

$ sudo apt-get install git


Baseリポジトリのクローン

$ git clone https://github.com/base-org/node.git


これでBaseを構築するソフトウェアはそろいました。

次に設定を行います。


3. 稼働のための設定


docker-compose.ymlの設定

docker-compose.ymlを開いてMainnet環境で動くようにします。

$ cd node
# スナップショットの保存ディレクトリ
$ mkdir data
$ vi docker-compose.yml


①「- .env.mainnet」(2か所)のコメントを外します。

②「volumes:」 を設定し「$PWD/data/data:/data」を追加します。

③「logging:」を追加して、10MBの3ファイルに制限しています(ログがディスクを逼迫するため)。

以下が完成例です。

version: '3.8'


services:
  geth: # this is Optimism's geth client
    build: .
    ports:
      - 8545:8545       # RPC
      - 8546:8546       # websocket
      - 30303:30303     # P2P TCP (currently unused)
      - 30303:30303/udp # P2P UDP (currently unused)
      - 7301:6060       # metrics
    command: [ "sh", "./geth-entrypoint" ]
    env_file:
      # select your network here:
#      - .env.goerli
      - .env.mainnet
    volumes:
      - $PWD/data/data:/data

    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"


  node:
    build: .
    depends_on:
      - geth
    ports:
      - 7545:8545     # RPC
      - 9222:9222     # P2P TCP
      - 9222:9222/udp # P2P UDP
      - 7300:7300     # metrics
      - 6060:6060     # pprof
    command: [ "sh", "./op-node-entrypoint" ]
    env_file:
      # select your network here:
#      - .env.goerli
      - .env.mainnet

    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"


以下コマンドで、docker-composeのフォーマットが正しいか確認してください。

$ docker-compose config

※改行や設定を間違っているとエラーメッセージが出ます。


環境変数ファイルの設定

環境変数ファイルを編集します。

$ vi .env.mainnet


①「OP_NODE_L1_ETH_RPC」に自分のイーサリアムノードのIPを指定してください。

※パフォーマンスの良いウェブソケット(ws:)にしています。

②「OP_NODE_L2_ENGINE_AUTH_RAW」に対してコマンド「openssl rand -hex 32 」で出力した内容を設定してください。

$ openssl rand -hex 32

③「OP_NODE_L1_TRUST_RPC=true」のコメントを外してください。
※同期が比較的早くなるようです。

以下が完成例です。

OP_GETH_GENESIS_FILE_PATH=mainnet/genesis-l2.json
OP_GETH_SEQUENCER_HTTP=https://mainnet-sequencer.base.org

# [optional] used to enable geth stats:
# OP_GETH_ETH_STATS=nodename:secret@host:port

# [recommended] replace with your preferred L1 (Ethereum, not Base) node RPC URL:
OP_NODE_L1_ETH_RPC=ws://[イーサリアムノードのIP]:8546

# auth secret used by op-geth engine API:
OP_NODE_L2_ENGINE_AUTH_RAW=ffffffffffffffffffffffffffffffffffffffffffffffffffffff

OP_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt
OP_NODE_L2_ENGINE_RPC=http://geth:8551
OP_NODE_LOG_LEVEL=info
OP_NODE_METRICS_ADDR=0.0.0.0
OP_NODE_METRICS_ENABLED=true
OP_NODE_METRICS_PORT=7300
OP_NODE_P2P_AGENT=base
OP_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG
OP_NODE_P2P_LISTEN_IP=0.0.0.0
OP_NODE_P2P_LISTEN_TCP_PORT=9222
OP_NODE_P2P_LISTEN_UDP_PORT=9222
OP_NODE_ROLLUP_CONFIG=mainnet/rollup.json
OP_NODE_RPC_ADDR=0.0.0.0
OP_NODE_RPC_PORT=8545
OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log
OP_NODE_VERIFIER_L1_CONFS=4

# OP_NODE_L1_TRUST_RPC allows for faster syncing, but should be used *only* if your L1 RPC node
# is fully trusted. It also allows op-node to work with clients such as Erigon that do not
# support storage proofs:
OP_NODE_L1_TRUST_RPC=true


スナップショットファイルの取得

Dataディレクトリに移動してBaseの状態データのスナップショットを取得します。

注意:ダウンロード容量が、500GB程度なので、ダウンロードに1日近くかかります。

$ cd data
$ nohup bash -c "wget -O - https://base-mainnet-archive-snapshots.s3.us-east-1.amazonaws.com/$(curl https://base-mainnet-archive-snapshots.s3.us-east-1.amazonaws.com/latest) | tar -zxf-" &

※コンソールがログアウトされても稼働するようにバックグランドで実行しています。
※他に安全にダウンロードできるaxelコマンドなどのツールを使うのもよいでしょう。


以下コマンドでダウンロードの進捗を確認できます。

$ tail -f nohup



イーサリアムノードのGethクライアントの設定変更

イーサリアムノードにあるGethクライアントの起動を変更します。

$ sudo su root
# vi /etc/systemd/system/geth.service


--http.addr "0.0.0.0"」と「--ws.addr "0.0.0.0"」を加えRPCとWSの外部からの接続を有効化します。

ExecStart=/usr/bin/geth --ws \
                        --http \
                        --http.api "eth,net,web3,txpool" \
                        --http.addr "0.0.0.0" \
                        --ws.addr "0.0.0.0" 


設定を有効にするためにGethを再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart geth


Baseがアクセスできるように、RPCとWSのUFWのポートも許可してください。

$ sudo ufw allow 8545
$ sudo ufw allow 8546
$ sudo ufw reload



3. Baseの起動


ここまでで、起動の準備が整いました。

以下コマンドで立ち上げることが出来ます。

# Baseのリポジトリへ移動
cd ~/node
docker compose up -d


docker-compose ps」や「docker-compose logs -f --tail 100」などでコンテナの稼働状況を確認できます。

$ docker-compose ps
$ docker-compose logs -f --tail 100


状況によりますが、数分後に同期が開始し、スナップショットの位置から現在のブロックまでに追いくのに数日かかる模様です。

同期が開始すると以下のように膨大なトランザクションログが表示されます。



まとめ



オプティミスティックロールアップであるOPスタックのBaseの構築方法は、そこまで難しくありません。

しかし、スナップショットのダウンロードに膨大な時間が掛かることは留意する必要があります。

また、1つでも設定を誤るとコンテナが立ち上がりません。

失敗した場合は、「docker-compose down」や「docker-compose build」などでコンテナの再構成を行ってください。

エラーメッセージを確認したり、BaseOptimismのDiscordに質問をしてみるのも良いと思います。

ここまで長い道のりですが、読んでくださりありがとうございました。

さらに、Baseノードは、ブロック番号が進むのが早く完全に同期するのに数日を要します。

ノードの構築は、ハマりポイントが多いので何か疑問点があれば、お気軽にお問い合わせください。


イーサリアムフルノードの構築には、以下記事を参考にしていただければ幸いです。


1.約3.5万円でイーサリアムフルノードを構築する手順①

2.約3.5万円でイーサリアムフルノードを構築する手順②


コメント投稿フォーム

メールアドレスが公開されることはありません。 が付いている欄は必須項目です