Ubuntu22サーバーにイーサリアムテストネットの「HoleskyRPCサーバー」を構築する方法
この記事は仮想通貨コミュニティ、Crypto流星街によって運営されています。
こんにちは、エンジニア兼エアドロ難民のanoneです。
推奨スペック
スペックはメモリが24GB以上じゃないと同期の途中で止まります。CPUは8コア、SSDは将来的に1TBぐらいまで増えるかもだけどsnapモードなら300GBもあれば余裕。fullノードだと1TB程度必要。
構成
クライアントはgeth、コンセンサスはLodestarを採用してみました。eth-dockerという便利なツールもあるけどメモリとCPUをすごく食うしなんか不安定です。
前準備
VPSはcontaboなりで事前に契約してubuntu22をインストールし、ローカルからssh接続して下さい。あと、rootで実行しているのでセキュリティ的に心配な人は実行ユーザーを追加してから構築したりufwでポートを絞るなど対策を。
実践
sshでサーバーに接続したら以下コマンドを1行づつ実行してください。契約したばかりのUbuntu22サーバーを想定しているので不要なライブラリは各自判断してスキップしてね。
sudo apt-get update -y && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
sudo reboot
再起動すると接続が切れるのでsshで再接続して続きを実行
#nodejsやgethのインストールに最低限必要なライブラリをインストール
apt install libssl-dev libboost-dev libprotobuf-dev libpq-dev python3-pip python3-dev jq git curl npm -y
#gethインストール
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
#確認
geth -v
#結果
geth version 1.13.12-stable-02eb36af
#node環境の構築
sudo apt install git -y
git clone https://github.com/creationix/nvm.git ~/.nvm
echo -e "if [ -s ~/.nvm/nvm.sh ]; then\n source ~/.nvm/nvm.sh\nfi" >> .bash_profile
source .bash_profile
#確認
nvm -v
#結果
0.39.7
#nodejsインストール
nvm install --lts --latest-npm
node -v
#結果
v20.11.0
#21以上だと後で入れるlodestarがビルドエラーになります。(2024/02/11現在)
#イーサコンセンサスクライアントlodestarに必要なパッケージインストール
apt install yarn -y
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
apt install npm -y
curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH"
#確認
yarn -v
#結果
1.22.19
#イーサコンセンサスクライアントlodestarインストール
git clone -b stable https://github.com/chainsafe/lodestar.git
cd lodestar
yarn install
yarn run build
#~/lodestar 直下で確認
./lodestar --version
#結果
🌟 Lodestar: TypeScript Implementation of the Ethereum Consensus Beacon Chain.
* Version: v1.15.1/stable/1857a49
* by ChainSafe Systems, 2018-2024
#通信用暗号キー生成
cd ~
openssl rand -hex 32 | tr -d "\n" > "jwtsecret"
#ethデータフォルダ生成
mkdir ~/eth_data
#lodestar起動
cd lodestar
node --max-old-space-size=8192 ./packages/cli/bin/lodestar.js beacon --network holesky --dataDir ~/eth_data --jwtSecret ~/jwtsecret --checkpointSyncUrl https://beaconstate-holesky.chainsafe.io
ここまで実行するとlodestarが起動します。以下のようなログが現れSyncingでslotの数値が増えていけば問題なし。サーバのメモリが足らないと途中でkilledしてお亡くなりになります。
Feb-11 09:40:03.513[] info: Lodestar network=holesky, version=v1.15.1/stable/1857a49, commit=1857a49404f2ad965025333f0f6b3422d4c1943f
Feb-11 09:40:03.541[] info: Connected to LevelDB database path=/root/eth_data/chain-db
Feb-11 09:40:03.544[] info: Fetching checkpoint state checkpointSyncUrl=https://beaconstate-holesky.chainsafe.io
Feb-11 09:40:33.612[] info: Download in progress, please wait...
Feb-11 09:40:58.244[] info: Download completed stateId=finalized
Feb-11 09:42:00.732[] info: Initializing beacon from a valid checkpoint state slot=978112, epoch=30566, stateRoot=*******, isWithinWeakSubjectivityPeriod=true
Feb-11 09:42:04.049[eth1] info: Eth1 provider urls=http://localhost:8551
Feb-11 09:42:04.085[execution] info: Execution client urls=http://localhost:8551
Feb-11 09:43:50.420[network] info: running libp2p instance in worker thread
Feb-11 09:43:51.648[network] info: libp2p worker started peer=*******
Feb-11 09:43:52.660[network] info: PeerId *******, Multiaddrs /ip4/0.0.0.0/tcp/9000
Feb-11 09:43:52.955[rest] info: Started REST API server address=http://127.0.0.1:9596
Feb-11 09:43:52.957[] info: Searching peers - peers: 0 - slot: 978219 - head: (slot -107) 0x4bc8…b7b3 - exec-block: syncing(921056 0x0d2d…) - finalized: 0x6b03…fe9d:30564
・
・
・
Feb-11 09:44:07.071[] info: Syncing - ? left - 0.00 slots/s - slot: 978220 - head: (slot -108) 0x4bc8…b7b3 - exec-block: syncing(921056 0x0d2d…) - finalized: 0x6b03…fe9d:30564 - peers: 11
lodestarはそのまま放置して、ローカルから再度ssh接続して別窓で接続。
snapモードなら以下を実行。
geth --holesky \
--syncmode snap \
--cache=2048 \
--authrpc.addr localhost \
--authrpc.port 8551 \
--authrpc.vhosts localhost \
--authrpc.jwtsecret ~/jwtsecret \
--datadir ~/eth_data
full(archive)モードでなら以下を実行。
geth --holesky \
--syncmode full \
--cache=2048 \
--authrpc.addr localhost \
--authrpc.port 8551 \
--authrpc.vhosts localhost \
--authrpc.jwtsecret ~/jwtsecret \
--datadir ~/eth_data \
--gcmode archive --cache.snapshot 20 --cache.trie 30 --cache.gc 0
以下のようなログを吐き同期が走れば成功。あとはsyncedが100%になってHolesky explorerの最新ブロックと同じnumber=*******を出力してたらOK。snapモードで最新ブロックまでおおよそ1時間くらいで取得完了(2024/02/11現在)
INFO [02-11|09:43:22.668] Starting Geth on Holesky testnet...
INFO [02-11|09:43:22.677] Maximum peer count ETH=50 total=50
INFO [02-11|09:43:22.684] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [02-11|09:43:22.725] Set global gas cap cap=50,000,000
INFO [02-11|09:43:22.730] Initializing the KZG library backend=gokzg
INFO [02-11|09:43:22.872] Allocated trie memory caches clean=307.00MiB dirty=512.00MiB
INFO [02-11|09:43:22.873] Defaulting to pebble as the backing database
INFO [02-11|09:43:22.873] Allocated cache and file handles database=/root/eth_data/geth/chaindata cache=1024.00MiB handles=524,288
INFO [02-11|09:43:22.900] Opened ancient database database=/root/eth_data/geth/chaindata/ancient/chain readonly=false
INFO [02-11|09:43:22.901] State schema set to default scheme=hash
INFO [02-11|09:43:22.901] Initialising Ethereum protocol network=17000 dbversion=<nil>
INFO [02-11|09:43:22.907] Writing custom genesis block
INFO [02-11|09:43:22.964] Persisted trie from memory database nodes=487 size=68.50KiB time=8.487348ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=0 livesize=0.00B
INFO [02-11|09:43:22.980]
INFO [02-11|09:43:22.980] ---------------------------------------------------------------------------------------------------------------------------------------------------------
INFO [02-11|09:43:22.992] Chain ID: 17000 (holesky)
INFO [02-11|09:43:22.992] Consensus: Beacon (proof-of-stake), merged from Ethash (proof-of-work)
INFO [02-11|09:43:22.992]
INFO [02-11|09:43:22.992] Pre-Merge hard forks (block based):
・
・
・
INFO [02-11|09:46:00.263] Syncing: state download in progress synced=1.66% state=72.46MiB accounts=276,583@65.18MiB slots=24231@5.21MiB codes=434@2.08MiB eta=8m2.967s
これにてRPCサーバーの起動は完了
起動確認
起動を確認をするにはローカルから再度ssh接続して別窓で以下のコマンドを実行します。
curl -X POST http://localhost:8545 -H "Content-type:application/json" --data '{"jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": ""}'
こんな感じのレスポンスが返ってきたら接続はできてます。
{"jsonrpc":"2.0","id":"","result":"0xe1166"}
外部に公開する
この設定では同じVPS内しかアクセスすることはできません。もし他のサーバーから接続するにはgeth起動時に--httpオプションを付加して以下のように起動。
geth --holesky \
・
・
・
--http --http.addr 0.0.0.0 --http.api personal,web3,eth
ws接続の公開もするなら--wsオプションも追加して起動。
geth --holesky \
・
・
・
--http --http.addr 0.0.0.0 --http.api personal,web3,eth \
--ws --ws.addr 0.0.0.0 --ws.api personal,web3,eth
フルオープンになるので攻撃が心配な人は特定のドメインに公開する--http.vhosts や --http.corsdomainを活用しましょう。特定のIPに公開する方法はないのでUbuntuのufwをactiveにしてポートやIPを絞って調整して下さい。その際はssh(22ポート)を許可しないと2度とアクセスできなくなるので注意。その他、gethのファイアーウォール設定はこちらが参考になります。
wsの公開もちゃんと確認したい
ws接続の確認は他サーバでnpmライブラリのwscatをインストールして
npm install -g wscat
wscat -c ws://{公開したサーバーIP}:8546
接続ができたら OK。念の為↓を実行するとレスがあるはず。
{"jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": ""}
以上RPCサーバーと公開方法でした!あとはデーモン化すればOK!それもあとで追記しときます。
追記:2024.02.12
デーモン化
このままだと実行画面を閉じるとgethもlodestatもサービスが終了するのでデーモン化をします。まずはgethから。以下のソースを全部コピーして実行すると、/etc/systemd/system/フォルダにgeth.serviceファイルが生成されます。
sudo tee /etc/systemd/system/geth.service > /dev/null << EOF
[Unit]
Description=geth service
After=syslog.target network.target
[Service]
User=root
ExecStart=/usr/bin/geth --holesky --syncmode full --cache=2048 --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret ~/jwtsecret --datadir ~/eth_data --gcmode archive --cache.snapshot 20 --cache.trie 30 --cache.gc 0 --http --http.api personal,web3,eth --ws --ws.api personal,web3,eth
Restart=on-failure
RestartSec=600
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
外部に公開したい場合はgeth.serviceファイルのExecStart=の最後に
--http.addr 0.0.0.0 --ws.addr 0.0.0.0
を追記して下さい。
そのファイルのパーミッションを755に変更してリロード&次回から起動時に有効になるようにしておきます。
sudo chmod 755 /etc/systemd/system/geth.service
sudo systemctl daemon-reload
sudo systemctl enable geth.service
続いてlodestarのデーモン化。以下を実行。
sudo tee /etc/systemd/system/lodestar.service > /dev/null << EOF
[Unit]
Description=lodestar
After=syslog.target network.target
[Service]
User=root
Type=simple
WorkingDirectory=/root/lodestar
ExecStart=/root/.nvm/versions/node/v20.11.0/bin/node --max-old-space-size=8192 ./packages/cli/bin/lodestar.js beacon --network holesky --dataDir /root/eth_data --jwtSecret /root/jwtsecret --checkpointSyncUrl https://beaconstate-holesky.chainsafe.io
KillMode=process
Restart=on-failure
RestartSec=15
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
同じく有効化しておきます。
sudo chmod 755 /etc/systemd/system/lodestar.service
sudo systemctl daemon-reload
sudo systemctl enable lodestar.service
gethとlodestarのデーモン化準備ができたので、gethとlodestarが起動している場合は止めて、デーモンから起動します。
sudo systemctl start geth.service & sudo systemctl start lodestar.service
ログが出力されてるか確認
#gethのログ確認
sudo journalctl -u geth.service -f --no-hostname -o cat
#lodestarのログ確認
sudo journalctl -u lodestar.service -f --no-hostname -o cat
#止めたい時
sudo systemctl stop geth.service & sudo systemctl stop lodestar.service
はじめに起動した時に表示されたようなログが表示されたら無事デーモン化されました!バリデーターのRPCや、Dappsの開発に役立てて下さい!
この記事を読んで役に立った!という方は❤️をクリックして下さい!
分からないことがあれば、以下コミュニティで!
コミュニティ紹介
Crypto流星街(Crypto Meteor City)は、仮想通貨コミュニティおよび投資グループです。
Crypto流星街は常に新しいコミュニティメンバーを募集しています。
仮想通貨(暗号資産)やNFTについて質問や困ったことがあればお気軽に初心者部屋へお越しください。
Crypto流星街 初心者部屋🔰オープンチャット
Crypto流星街 ディスコードサーバー
Crypto流星街 コミュニティ紹介note