ソースコードからLodestarをインストールする方法
Lodestarは、イーサリアムのコンセンサスクライアント、バリデータクライアント、ライトクライアント機能を提供するTypeScript製のイーサリアムクライアントです。
ethereum.orgに貢献したり、自分でWeb3アプリを開発していることもあり、その過程でTypeScriptの勉強もしたのでTypeScript製のイーサリアムクライアント開発にも貢献したくなりました。
開発の方では、Lodestarのエンジニアの多大な助けを頂けたことが非常に大きいですが、1つのプルリクエストをなんとかマージにたどり着けました。
その開発の過程でLodestarについてもかなり学べたので、メインネットでLodestarを立ち上げることにしました。
以下にて、ソースコードからsystemdサービスとしてインストールする方法を共有します。
前提条件
以前書いた、「約3.5万円でイーサリアムフルノードを構築する手順①」が完了しており、「約3.5万円でイーサリアムフルノードを構築する手順②」にて実行クライアントであるGethのインストールが完了している前提で手順をご紹介します。
※OSでポート9000が開いている必要があります
1. 必要な環境のインストール
必要な環境として、gitとnodejsが必要になります。以下にてインストールをしてください。
$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt install git -y
$ sudo apt install nodejs npm -y
nodejsのバージョン管理ツール「n」をインストールします。
$ sudo npm install n -g
yarnパッケージマネージャをインストールします。
※lodestarのインストールでは、npmではなく、yarnを使うことが必須です)。
$ sudo npm install yarn -g
安定板の最新nodejsをインストールします。
$ n stable
$ node -v
v20.11.1
※nodejsのバージョンが、インストールするLodestarに対応しているか、こちらで必ず確認してください(2024/3/4現在は、GitHubのタグでnode 20.xと表示されています)
2. Lodestarのインストール
それでは、ethereumユーザになり、Lodestarをインストールをしていきます。
$ sudo su - ethereum
Lodestarの現時点の最新版である「v1.16.0」をクローンします。
$ pwd
/home/ethereum #/home/ethereum/ディレクトリであることを前提に進めます
$ git clone https://github.com/ChainSafe/lodestar.git -b v1.16.0
ビーコンデータを保存するディレクトリを作成します。
$ mkdir .lodestar
Lodestarをコンパイルします。
$ cd lodestar
$ yarn install
$ yarn build
$ ./lodestar -v
? Lodestar: TypeScript Implementation of the Ethereum Consensus Beacon Chain.
* Version: v1.16.0/14ea654
* by ChainSafe Systems, 2018-2024
これでプログラムのインストールは完了しました。
※/home/ethereum/lodestar/packages/
以下にプログラムが作成されます
3. systemdによるサービス化
毎回クライアントを長々としたオプション付きのコマンドで立ち上げるのは、不便です。
そのため、systemdを使ってサービス化を行います。
まず、ルートユーザになってsystemdによるサービスファイルを作成します。
$ sudo su - root
# cd /etc/systemd/system/
lodestarのサービスファイルの作成
# touch lodestar.service
# vi lodestar.service
以下内容で保存してください。
※念のため--port 9000
を明示しています。
[Unit]
Description=Ethereum lodestar client
After=network.target
[Service]
User=ethereum
Group=ethereum
Environment=HOME=/home/ethereum
Type=simple
ExecStart=node \
--trace-deprecation \
--max-old-space-size=8192 \
${HOME}/lodestar/packages/cli/bin/lodestar.js beacon \
--network mainnet \
--dataDir ${HOME}/.lodestar \
--jwtSecret ${HOME}/.ethereum/geth/jwtsecret \
--checkpointSyncUrl https://beaconstate-mainnet.chainsafe.io \
--port 9000
KillMode=process
KillSignal=SIGINT
TimeoutStopSec=90
Restart=on-failure
RestartSec=10s
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=lodestar
[Install]
WantedBy=multi-user.target
サービスの有効化
以下コマンドでサービスを有効化します。
# systemctl daemon-reload
# systemctl enable lodestar
4. ログ設定
ログ設定をしないとログファイルが肥大化してしまいます。
本設定では、Lodestarのログを/var/log/lodestar.log
に出力します。
以下、rootユーザーにてrsyslogの設定ファイルを作成します。
Lodestarのrsyslog設定
# cd /etc/rsyslog.d/
# touch 24-lodestar.conf
# vi 24-lodestar.conf
以下の内容で保存してください。
if $programname == 'lodestar' then /var/log/lodestar.log
if $programname == 'lodestar' then ~
ログローテーションファイルの作成
以下コマンドにて、ログローテーションの設定ファイルを作成します。
# cd /etc/logrotate.d/
# touch eth-client
# vi eth-client
今回は、以下内容としました。
※本設定は、各自のお好みになると思います。
/var/log/lodestar.log # <-追加
/var/log/lighthouse.log
/var/log/geth.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
[ -x /usr/lib/rsyslog/rsyslog-rotate ] && /usr/lib/rsyslog/rsyslog-rotate || true
endscript
}
6. クライアントの起動と確認
これで動作せさる準備が整いました。
以下コマンドにて起動することができます。
sudo systemctl start lodestar
プロセスが起動しているか以下コマンドで確認できます。
$ sudo systemctl status -l lodestar
● lodestar.service - Ethereum lodestar client
Loaded: loaded (/etc/systemd/system/lodestar.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2024-03-04 16:17:55 JST; 4h 14min ago
Main PID: 24465 (node)
Tasks: 21 (limit: 18542)
Memory: 4.5G
CGroup: /system.slice/lodestar.service
└─24465 /usr/local/bin/node --trace-deprecation --max-old-space-size=8192 /home/ethereum/lodestar/packages/cli/bin/lode>
Mar 04 20:30:29 rock-5b lodestar[24465]: Mar-04 20:30:29.001[] info: Synced - slot: 8560650 - head: 0x3508…e070 - ex>
Mar 04 20:30:41 rock-5b lodestar[24465]: Mar-04 20:30:41.001[] info: Synced - slot: 8560651 - head: 0x12cd…52e3 - ex>
Mar 04 20:30:53 rock-5b lodestar[24465]: Mar-04 20:30:53.005[] info: Synced - slot: 8560652 - head: 0x4876…f7bf - ex>
Mar 04 20:31:05 rock-5b lodestar[24465]: Mar-04 20:31:05.000[] info: Synced - slot: 8560653 - head: 0x27dc…b329 - ex>
Mar 04 20:31:17 rock-5b lodestar[24465]: Mar-04 20:31:17.003[] info: Synced - slot: 8560654 - head: 0x90dd…4ed6 - ex>
Mar 04 20:31:29 rock-5b lodestar[24465]: Mar-04 20:31:29.001[] info: Synced - slot: 8560655 - head: 0xe1a6…7989 - ex>
Mar 04 20:31:41 rock-5b lodestar[24465]: Mar-04 20:31:41.000[] info: Synced - slot: 8560656 - head: 0x58d3…c717 - ex>
Mar 04 20:31:53 rock-5b lodestar[24465]: Mar-04 20:31:53.000[] info: Synced - slot: 8560657 - head: 0x0490…415b - ex
以下コマンドにて、現在のログの確認ができます。
$ tail -f /var/log/lodestar.log
Weak Subjectivityチェックポイントを使っており、開発者が優秀なためかJavaScriptベースなのにLodestarはかなり高速でした。
1時間もしないうちに同期 (Synced) が完了します。
$ tail -f /var/log/lodestar.log
Mar 4 20:33:53 rock-5b lodestar[24465]: Mar-04 20:33:53.001[] #033[32minfo#033[39m: Synced - slot: 8560667 - head: 0x4b1c…6d3a - exec-block: valid(19361525 0xa950…) - finalized: 0x4f18…a2cd:267518 - peers: 47
Mar 4 20:34:05 rock-5b lodestar[24465]: Mar-04 20:34:05.001[] #033[32minfo#033[39m: Synced - slot: 8560668 - head: 0xea09…5bfb - exec-block: valid(19361526 0x6fdf…) - finalized: 0x4f18…a2cd:267518 - peers: 47
Mar 4 20:34:17 rock-5b lodestar[24465]: Mar-04 20:34:17.000[] #033[32minfo#033[39m: Synced - slot: 8560669 - head: 0x8969…243b - exec-block: valid(19361527 0xa026…) - finalized: 0x4f18…a2cd:267518 - peers: 47
Mar 4 20:34:29 rock-5b lodestar[24465]: Mar-04 20:34:29.312[] #033[32minfo#033[39m: Synced - slot: 8560670 - head: 0xf9e7…6ac9 - exec-block: valid(19361528 0x9093…) - finalized: 0x4f18…a2cd:267518 - peers: 50
Mar 4 20:34:41 rock-5b lodestar[24465]: Mar-04 20:34:41.001[] #033[32minfo#033[39m: Synced - slot: 8560671 - head: 0xcd78…02d5 - exec-block: valid(19361529 0xeb34…) - finalized: 0x4f18…a2cd:267518 - peers: 50
Mar 4 20:34:53 rock-5b lodestar[24465]: Mar-04 20:34:53.002[] #033[32minfo#033[39m: Synced - slot: 8560672 - head: 0x8b3c…d8fc - exec-block: valid(19361530 0xa0e8…) - finalized: 0xb8f0…b453:267519 - peers: 51
Mar 4 20:35:05 rock-5b lodestar[24465]: Mar-04 20:35:05.000[] #033[32minfo#033[39m: Synced - slot: 8560673 - head: 0x6388…5f47 - exec-block: valid(19361531 0x30ea…) - finalized: 0xb8f0…b453:267519 - peers: 51
以下コマンドにてサービスを停止することができます(アップデート時や電源停止前などに実行)。
sudo systemctl stop lodestar
まとめ
以上、簡単にですが、Lodestarをソースコードからインストールしてメインネットで動作させる方法をご紹介しました。
自分の体感ですが、Lighthouseより軽くて素早く動作することに驚きました。
恐らくChainSafeのエンジニアが創意工夫して実装しているためだと思います。
Lodestarは、マイノリティクライアントですので、イーサリアムクライアント全体のセキュリティの向上のためにも、立ち上げることをお勧めします。
また、JavaScriptベースなので開発や改造が始めやすいのも良い点だと思います。
今回の環境では、gitリポジトリにソースコードが入っているので簡単にLinux上で開発を開始できます。
JavaScriptやTypeScriptプログラマーは、日本でも世界でも人口が最も多いと思います。
腕に覚えのあるエンジニアは、イーサリアムクライアントの(良い意味での)ハックに挑戦したり、オープンソースコントリビューションをしてみてはいかがでしょうか?
ご不明点等ございましたら、お気軽にお問い合わせください。
ここまで、読んでくださりありがとうございました。