コンテンツにスキップ

ノードアップデートマニュアル

概要

このガイドは ノードバージョン8.7.3に対応しています。最終更新日:2024年1月26日

Node CLI GHC Cabal CNCLI
8.7.3 8.17.0.0 8.10.7 3.8.1.0 6.0.1
  • よくお読みになって進めてください
  • 複数行のコードをコードボックスのコピーボタンを使用してコマンドラインに貼り付ける場合は、最後の行が自動実行されないため確認の上Enterを押してコードを実行してください。

主な変更点と新機能

■cardano-node v8.7.3

  • 8.1.2以前からのダイナミックP2Pの潜在的なバグが解消されています。
  • RAM 24GB以上必須

■ビルド済みバイナリの使用

  • SJGではこれまでソースコードからビルドしてきましたが、検証体制が整ったことで安全性・安定性を十分に確認できるためビルド時間工数削減を目的にIntersectMBO(旧IOG)発行のビルド済みバイナリを使用したインストールを採用を採用します。 これにより、これまで約30分前後かかっていたバイナリファイル作成のビルド時間を省略できます。

■Mithrilブートストラップの導入

  • Mithrilクライアントを用いてDBスナップショットからブートストラップします。
    8.1.2以前のバージョンから8.7.3へのバージョンアップはDB再構築処理が入るため、ノード同期までに6時間~7時間かかりますがこのブートストラップを導入することで約20分で同期することが可能になります。

  • ビルド済みバイナリの使用+Mithrilブートストラップを使用した場合、アップデート全工程所要時間は1サーバーにつき約30分~40分ですべて完了します。

1.依存環境アップデート

1-1. システムアップデート

システムアップデート

sudo apt update -y && sudo apt upgrade -y

1-2. cabal/GHCバージョン確認

cabalパス確認

which cabal

/home/user/.ghcup/bin/cabal なら正常

cabalバージョン確認

cabal --version

以下の戻り値ならOK
cabal-install version 3.8.1.0
compiled using version 3.8.1.0 of the Cabal library

GHCバージョン確認

ghc --version

現在のGHCのバージョンは「8.10.7」
GHC9はベンチマークテストが終わってないため今ノードバージョンでは非推奨

libsodiumコミット確認

cd $HOME/git/libsodium
git branch --contains | grep -m1 HEAD | cut -c 21-28

戻り値が dbb48cce ならOK

各アプリのバージョンが異なる場合
戻り値が[/home/user/.local/bin/cabal]だった場合

戻り値が[/home/user/.local/bin/cabal]だった場合のみ以下を実行

パスを追加する

echo PATH=$PATH:$HOME/.ghcup/bin >> $HOME/.bashrc
source $HOME/.bashrc

旧cabalリネーム

cd $HOME/.local/bin/
mv cabal cabal_bk

cabal 3.6.2.0以下だった場合

cabal 3.6.2.0以下だった場合のみ実行 cabalバージョンアップ

ghcup upgrade
ghcup install cabal 3.8.1.0
ghcup set cabal 3.8.1.0
cabalバージョン確認
cabal --version

以下の戻り値ならOK
cabal-install version 3.8.1.0
compiled using version 3.8.1.0 of the Cabal library

GHC 8.10.4以下だった場合

GHC 8.10.4以下だった場合のみ実行

ghcup upgrade
ghcup install ghc 8.10.7
ghcup set ghc 8.10.7
ghc --version

GHCのバージョンは「8.10.7」であればOK

libsodiumコミット値が違う場合
cd ~/git/libsodium
git fetch --all --prune
git checkout dbb48cc
./autogen.sh
./configure
make
make check
sudo make install

makeコマンド実行後半に出現する warning は無視して大丈夫です。

1-3.blstインストール

blstダウンロード

cd $HOME/git
git clone https://github.com/supranational/blst
cd blst
git checkout v0.3.10
./build.sh

設定ファイル作成

このボックスはすべてコピーして実行してください

cat > libblst.pc << EOF
prefix=/usr/local
exec_prefix=\${prefix}
libdir=\${exec_prefix}/lib
includedir=\${prefix}/include

Name: libblst
Description: Multilingual BLS12-381 signature library
URL: https://github.com/supranational/blst
Version: 0.3.10
Cflags: -I\${includedir}
Libs: -L\${libdir} -lblst
EOF

設定ファイルコピー

このボックスは1行ずつコピーして実行してください

sudo cp libblst.pc /usr/local/lib/pkgconfig/
sudo cp bindings/blst_aux.h bindings/blst.h bindings/blst.hpp  /usr/local/include/
sudo cp libblst.a /usr/local/lib
sudo chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}

1-4.CNCLIバージョン確認(BPのみ)

CNCLIバージョン確認

cncli --version

以下の戻り値ならOK
cncli 6.0.1

cncli v6.0.0以下だった場合(クリックして開く)

CNCLIをアップデートする

rustup update
cd $HOME/git/cncli
git fetch --all --prune
git checkout $(curl -s https://api.github.com/repos/cardano-community/cncli/releases/latest | jq -r .tag_name)
cargo install --path . --force

バージョン確認

cncli --version

cncli 6.0.1になったことを確認する

2.ノードアップデート

バイナリファイルインストール方法の違いについて

  • ビルド済みバイナリ・・・IntersectMBO(旧IOG)リポジトリソースコードからビルドされたバイナリファイルをダウンロードします。ビルド不要のためビルド時間を短縮できます。
  • ソースコードからビルド・・・ご自身のサーバーでソースコードからビルドしてバイナリファイルを作成します。検証目的やソースコードからビルドしたい場合に利用できます。ビルドに30分前後かかります。

どちらも同じソースコードからビルドされたバイナリファイルなので安定性・安全面に差異はございません。お好みの方法でインストールして頂けます。

2-1.バイナリダウンロード

旧バイナリを削除する

rm -rf $HOME/git/cardano-node-old/

バイナリファイルをダウンロードする

mkdir $HOME/git/cardano-node2
cd $HOME/git/cardano-node2
wget https://github.com/IntersectMBO/cardano-node/releases/download/8.7.3/cardano-node-8.7.3-linux.tar.gz

解凍する

tar zxvf cardano-node-8.7.3-linux.tar.gz ./cardano-node ./cardano-cli

バージョン確認

$(find $HOME/git/cardano-node2 -type f -name "cardano-cli") version  
$(find $HOME/git/cardano-node2 -type f -name "cardano-node") version  
以下の戻り値を確認する

cardano-cli 8.17.0.0 - linux-x86_64 - ghc-8.10
git rev a4a8119b59b1fbb9a69c79e1e6900e91292161e7

cardano-node 8.7.3 - linux-x86_64 - ghc-8.10
git rev a4a8119b59b1fbb9a69c79e1e6900e91292161e7

ノードをストップする

sudo systemctl stop cardano-node

2-2.バイナリインストール

バイナリーファイルをシステムフォルダーへコピーする

sudo cp $(find $HOME/git/cardano-node2 -type f -name "cardano-cli") /usr/local/bin/cardano-cli
sudo cp $(find $HOME/git/cardano-node2 -type f -name "cardano-node") /usr/local/bin/cardano-node

2-1.ソースコードダウンロード

新しいTMUXセッションを開く

tmux new -s build

アップデート作業中にSSHが中断した場合は、tmux a -t buildで再開できます。

旧ビルドを削除する

rm -rf $HOME/git/cardano-node-old/

ソースコードをダウンロードする

cd $HOME/git
git clone https://github.com/IntersectMBO/cardano-node.git cardano-node2
cd cardano-node2/

2-2.ソースコードからビルド

cabal clean
cabal update
git fetch --all --recurse-submodules --tags
git checkout tags/8.7.3
cabal configure --with-compiler=ghc-8.10.7
cabal build cardano-node cardano-cli

ヒント

  • ビルド完了までに数十分ほどかかります。
  • SSH接続が途中で切断された場合、再度接続してtmux a -t buildで再開してください。
  • ビルド中にデタッチ(Ctrl+B D)してバックグラウンド処理へ切り替えられます。

バージョン確認

$(find $HOME/git/cardano-node2/dist-newstyle/build -type f -name "cardano-cli") version  
$(find $HOME/git/cardano-node2/dist-newstyle/build -type f -name "cardano-node") version  
以下の戻り値を確認する

cardano-cli 8.17.0.0 - linux-x86_64 - ghc-8.10
git rev a4a8119b59b1fbb9a69c79e1e6900e91292161e7

cardano-node 8.7.3 - linux-x86_64 - ghc-8.10
git rev a4a8119b59b1fbb9a69c79e1e6900e91292161e7

ビルド用TMUXセッションを終了する

exit

ノードをストップする

sudo systemctl stop cardano-node

バイナリーファイルをシステムフォルダーへコピーする

sudo cp $(find $HOME/git/cardano-node2/dist-newstyle/build -type f -name "cardano-cli") /usr/local/bin/cardano-cli
sudo cp $(find $HOME/git/cardano-node2/dist-newstyle/build -type f -name "cardano-node") /usr/local/bin/cardano-node

システムに反映されたノードバージョンを確認する

cardano-cli version
cardano-node version

以下の戻り値を確認する

cardano-cli 8.17.0.0 - linux-x86_64 - ghc-8.10
git rev a4a8119b59b1fbb9a69c79e1e6900e91292161e7

cardano-node 8.7.3 - linux-x86_64 - ghc-8.10
git rev a4a8119b59b1fbb9a69c79e1e6900e91292161e7

2-3.設定ファイルの追加と更新

既存ファイルバックアップ

mkdir $NODE_HOME/backup
cp $NODE_HOME/${NODE_CONFIG}-config.json $NODE_HOME/backup/${NODE_CONFIG}-config.json
cp $NODE_HOME/${NODE_CONFIG}-conway-genesis.json $NODE_HOME/backup/${NODE_CONFIG}-conway-genesis.json\n

新ファイルダウンロード

cd $NODE_HOME
wget --no-use-server-timestamps -q https://book.play.dev.cardano.org/environments/${NODE_CONFIG}/conway-genesis.json -O ${NODE_CONFIG}-conway-genesis.json
wget --no-use-server-timestamps -q https://book.play.dev.cardano.org/environments/${NODE_CONFIG}/config.json -O ${NODE_CONFIG}-config.json

設定ファイルを書き換える

運用中のP2P形式を調べる方法

cat mainnet-topology.json | grep localRoots
  • 戻り値がない場合・・・手動P2P運用
  • "localRoots": [の戻り値がある場合・・・ダイナミックP2P
sed -i ${NODE_CONFIG}-config.json \
    -e '2i \  "SnapshotInterval": 86400,' \
    -e 's!"EnableP2P": true!"EnableP2P": false!' \
    -e 's!"AlonzoGenesisFile": "alonzo-genesis.json"!"AlonzoGenesisFile": "'${NODE_CONFIG}'-alonzo-genesis.json"!' \
    -e 's!"ByronGenesisFile": "byron-genesis.json"!"ByronGenesisFile": "'${NODE_CONFIG}'-byron-genesis.json"!' \
    -e 's!"ShelleyGenesisFile": "shelley-genesis.json"!"ShelleyGenesisFile": "'${NODE_CONFIG}'-shelley-genesis.json"!' \
    -e 's!"ConwayGenesisFile": "conway-genesis.json"!"ConwayGenesisFile": "'${NODE_CONFIG}'-conway-genesis.json"!' \
    -e 's!"TraceBlockFetchDecisions": false!"TraceBlockFetchDecisions": true!' \
    -e 's!"rpKeepFilesNum": 10!"rpKeepFilesNum": 30!' \
    -e 's!"rpMaxAgeHours": 24!"rpMaxAgeHours": 48!' \
    -e '/"defaultScribes": \[/a\    \[\n      "FileSK",\n      "'${NODE_HOME}'/logs/node.json"\n    \],' \
    -e '/"setupScribes": \[/a\    \{\n      "scFormat": "ScJson",\n      "scKind": "FileSK",\n      "scName": "'${NODE_HOME}'/logs/node.json"\n    \},' \
    -e "s/127.0.0.1/0.0.0.0/g"
sed -i ${NODE_CONFIG}-config.json \
    -e '2i \  "SnapshotInterval": 86400,' \
    -e 's!"AlonzoGenesisFile": "alonzo-genesis.json"!"AlonzoGenesisFile": "'${NODE_CONFIG}'-alonzo-genesis.json"!' \
    -e 's!"ByronGenesisFile": "byron-genesis.json"!"ByronGenesisFile": "'${NODE_CONFIG}'-byron-genesis.json"!' \
    -e 's!"ShelleyGenesisFile": "shelley-genesis.json"!"ShelleyGenesisFile": "'${NODE_CONFIG}'-shelley-genesis.json"!' \
    -e 's!"ConwayGenesisFile": "conway-genesis.json"!"ConwayGenesisFile": "'${NODE_CONFIG}'-conway-genesis.json"!' \
    -e 's!"TraceBlockFetchDecisions": false!"TraceBlockFetchDecisions": true!' \
    -e 's!"rpKeepFilesNum": 10!"rpKeepFilesNum": 30!' \
    -e 's!"rpMaxAgeHours": 24!"rpMaxAgeHours": 48!' \
    -e '/"defaultScribes": \[/a\    \[\n      "FileSK",\n      "'${NODE_HOME}'/logs/node.json"\n    \],' \
    -e '/"setupScribes": \[/a\    \{\n      "scFormat": "ScJson",\n      "scKind": "FileSK",\n      "scName": "'${NODE_HOME}'/logs/node.json"\n    \},' \
    -e "s/127.0.0.1/0.0.0.0/g"
テストネットの場合はこちら
sed -i ${NODE_CONFIG}-config.json \
    -e 's!"EnableP2P": true!"EnableP2P": false!' \
    -e 's!"AlonzoGenesisFile": "alonzo-genesis.json"!"AlonzoGenesisFile": "'${NODE_CONFIG}'-alonzo-genesis.json"!' \
    -e 's!"ByronGenesisFile": "byron-genesis.json"!"ByronGenesisFile": "'${NODE_CONFIG}'-byron-genesis.json"!' \
    -e 's!"ShelleyGenesisFile": "shelley-genesis.json"!"ShelleyGenesisFile": "'${NODE_CONFIG}'-shelley-genesis.json"!' \
    -e 's!"ConwayGenesisFile": "conway-genesis.json"!"ConwayGenesisFile": "'${NODE_CONFIG}'-conway-genesis.json"!' \
    -e 's!"TraceBlockFetchDecisions": false!"TraceBlockFetchDecisions": true!' \
    -e '/"defaultScribes": \[/a\    \[\n      "FileSK",\n      "'${NODE_HOME}'/logs/node.json"\n    \],' \
    -e '/"setupScribes": \[/a\    \{\n      "scFormat": "ScJson",\n      "scKind": "FileSK",\n      "scName": "'${NODE_HOME}'/logs/node.json"\n    \},' \
    -e "s/127.0.0.1/0.0.0.0/g"
sed -i ${NODE_CONFIG}-config.json \
    -e 's!"AlonzoGenesisFile": "alonzo-genesis.json"!"AlonzoGenesisFile": "'${NODE_CONFIG}'-alonzo-genesis.json"!' \
    -e 's!"ByronGenesisFile": "byron-genesis.json"!"ByronGenesisFile": "'${NODE_CONFIG}'-byron-genesis.json"!' \
    -e 's!"ShelleyGenesisFile": "shelley-genesis.json"!"ShelleyGenesisFile": "'${NODE_CONFIG}'-shelley-genesis.json"!' \
    -e 's!"ConwayGenesisFile": "conway-genesis.json"!"ConwayGenesisFile": "'${NODE_CONFIG}'-conway-genesis.json"!' \
    -e 's!"TraceBlockFetchDecisions": false!"TraceBlockFetchDecisions": true!' \
    -e '/"defaultScribes": \[/a\    \[\n      "FileSK",\n      "'${NODE_HOME}'/logs/node.json"\n    \],' \
    -e '/"setupScribes": \[/a\    \{\n      "scFormat": "ScJson",\n      "scKind": "FileSK",\n      "scName": "'${NODE_HOME}'/logs/node.json"\n    \},' \
    -e "s/127.0.0.1/0.0.0.0/g"

3.Mithrilクライアント設定

3-1. インストール

cd $HOME/git
mithril_release="$(curl -s https://api.github.com/repos/input-output-hk/mithril/releases/latest | jq -r '.tag_name')"
wget https://github.com/input-output-hk/mithril/releases/download/${mithril_release}/mithril-${mithril_release}-linux-x64.tar.gz -O mithril.tar.gz

設定

tar zxvf mithril.tar.gz mithril-client
sudo cp mithril-client /usr/local/bin/mithril-client
パーミッション設定
sudo chmod +x /usr/local/bin/mithril-client

DLファイル削除

rm mithril.tar.gz mithril-client

バージョン確認

mithril-client -V

mithril-client 0.5.17+254d266

3-2.スナップショット復元

作業用TMUX起動

tmux new -s mithril

変数セット

export NETWORK=mainnet
export AGGREGATOR_ENDPOINT=https://aggregator.release-mainnet.api.mithril.network/aggregator
export GENESIS_VERIFICATION_KEY=$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/genesis.vkey)
export SNAPSHOT_DIGEST=latest

旧dbをバックアップしたい方はこちら

空き容量に関しての注意事項

DBをバックアップする場合、サーバーディスクの空き容量をご確認ください。 安定稼働のためには250GB以上の空き容量が必要です。

df -h /usr | awk '{print $4}'
Availが250GB以上あることを確認してください。

dbをリネームする

mv $NODE_HOME/db/ $NODE_HOME/backup/db8-1-2/

ノードバージョンアップ後、稼働に問題がないことが確認できれば削除することをお勧めます

rm -rf $NODE_HOME/backup/db8-1-2/

既存DB削除

rm -rf $NODE_HOME/db

最新スナップショットDL

mithril-client snapshot download --download-dir $NODE_HOME latest

スナップショットダウンロード~解凍まで自動的に行われます。1/5~5/5が終了するまで待ちましょう
5/5 - Verifying the snapshotsignature…
Snapshot 'xxxxx' has been unpacked and successfully checked against Mithril multi-signature contained in the certificate. ('xxxxx'は作業時期によって変わります。下の文字列は無視して大丈夫です)

tmux作業ウィンドウを終了する

exit

3-3.サーバー再起動

作業フォルダリネーム

前バージョンで使用していたバイナリフォルダをリネームし、バックアップとして保持します。最新バージョンを構築したフォルダをcardano-nodeとして使用します。

cd $HOME/git
mv cardano-node/ cardano-node-old/
mv cardano-node2/ cardano-node/

サーバーを再起動する

sudo reboot

SSH接続してDB再構築進捗を確認する

journalctl --unit=cardano-node --follow

数分経過してもProgress: xx.xx%が表示されない場合、何かが不備でエラーになっています。

4. サービス起動確認(BPのみ)

BPノードが完全に同期した後、サービスを再起動し起動状態を確認する

sudo systemctl restart cnode-cncli-sync.service

ヒント

ノードを再起動してから、約20秒後に5プログラムがバックグラウンドで起動中であればOKです

tmux ls
  • cncli
  • leaderlog
  • validate
  • logmonitor
  • blockcheck(ブロック生成ステータス通知を導入している場合)
tmux a -t cncli

「100.00% synced」になっていることを確認します 100%になったら、Ctrl+bを押した後に d を押し元の画面に戻ります (バックグラウンド実行に切り替え)

Missing eta_v for block xxxxxx エラーが出る場合の対処法

cncliを再同期してください

rm $NODE_HOME/guild-db/cncli/*
sudo systemctl restart cnode-cncli-sync.service
tmux a -t cncli
100% sync'dになるまでお待ち下さい

5. エアギャップアップデート

SFTP機能ソフト導入

R-loginの転送機能が遅いので、大容量ファイルをダウン・アップロードする場合は、SFTP接続可能なソフトを使用すると効率的です。(FileZilaなど)
ファイル転送に便利なSFTP機能ソフトの導入手順はこちら

5-1.バイナリファイルコピー

リレーサーバーで以下を実行する

sudo cp $(find $HOME/git/cardano-node -type f -name "cardano-cli") ~/cardano-cli

リレーサーバーで以下を実行する

sudo cp $(find $HOME/git/cardano-node/dist-newstyle/build -type f -name "cardano-cli") ~/cardano-cli

SFTP機能ソフト(Filezillaなど)で転送元サーバーに接続し、以下をダウンロードする

  • /home/usr/cardano-cli

をローカルパソコンにダウンロードします
(エアギャップUbuntuとの共有フォルダ)


エアギャップマシンにファイルを入れる

  • $HOME/git/cardano-node2/ にcardano-cliを入れる
    (cardano-node2が無ければ作成する)

5-2.インストール

エアギャップマシンで以下を実行する

cardano-cliをシステムフォルダへコピーする

sudo cp $(find $HOME/git/cardano-node2 -type f -name "cardano-cli") /usr/local/bin/cardano-cli

5-3.バージョン確認

cardano-cli version

以下の戻り値を確認する

cardano-cli 8.17.0.0 - linux-x86_64 - ghc-8.10
git rev a4a8119b59b1fbb9a69c79e1e6900e91292161e7

確認

エアギャップではcardano-nodeは使用しないため転送してもしなくてもOKです。