2. ノードインストール¶
インストールバージョン
Node/CLI | GHC | Cabal |
---|---|---|
8.1.1 | 8.10.7 | 3.8.1.0 |
2-1. 依存関係インストール¶
ターミナルを起動し、以下のコマンドを入力しましょう!
まずはじめに、パッケージを更新しUbuntuを最新の状態に保ちます。
sudo apt update -y && sudo apt upgrade -y
sudo apt install git jq bc automake tmux rsync htop curl build-essential pkg-config libffi-dev libgmp-dev libssl-dev libtinfo-dev libsystemd-dev zlib1g-dev make g++ wget libncursesw5 libtool autoconf liblmdb-dev -y
Libsodiumインストール¶
mkdir $HOME/git
cd $HOME/git
git clone https://github.com/input-output-hk/libsodium
cd libsodium
git checkout dbb48cc
./autogen.sh
./configure
make
make check
sudo make install
makeコマンド実行後半に出現する
warning
は無視して大丈夫です。
Secp256k1ライブラリインストール¶
cd $HOME/git
git clone https://github.com/bitcoin-core/secp256k1.git
cd secp256k1/
git checkout ac83be33
./autogen.sh
./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental
make
make check
戻り値確認
Testsuite summary for libsecp256k1 0.1.0-pre
============================================================================
# TOTAL: 2
# PASS: 2
# SKIP: 0
# XFAIL: 0
# FAIL: 0
# XPASS: 0
# ERROR: 0
============================================================================
PASS:2であることを確認する
インストールコマンドを必ず実行する
sudo make install
GHCUPインストール¶
cd $HOME
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
戻り値対応
Press ENTER to proceed or ctrl-c to abort. Note that this script can be re-run at any given time.
⇒Enter
Detected bash shell on your system... Do you want ghcup to automatically add the required PATH variable to "/home/btalonzo/.bashrc"?
[P] Yes, prepend [A] Yes, append [N] No [?] Help (default is "P").
⇒Pと入力しEnter
Do you want to install haskell-language-server (HLS)? HLS is a language-server that provides IDE-like functionality and can integrate with different editors, such as Vim, Emacs, VS Code, Atom, ... Also see https://github.com/haskell/haskell-language-server/blob/master/README.md
[Y] Yes [N] No [?] Help (default is "N").
⇒Nと入力しEnter
Do you want to enable better integration of stack with GHCup? This means that stack won't install its own GHC versions, but uses GHCup's. For more information see: https://docs.haskellstack.org/en/stable/yaml_configuration/#ghc-installation-customisation-experimental If you want to keep stacks vanilla behavior, answer 'No'.
⇒Nと入力しEnter
Press ENTER to proceed or ctrl-c to abort. Installation may take a while.
⇒Enter
Cabal/GHCバージョンについて
最新バージョンはcardano-node/cliのビルドに失敗するため必ず以下で指定されたバージョンをインストールしてください。
cabalインストール
source ~/.bashrc
ghcup upgrade
ghcup install cabal 3.8.1.0
ghcup set cabal 3.8.1.0
GHCインストール
ghcup install ghc 8.10.7
ghcup set ghc 8.10.7
環境変数を設定しパスを通します。
ノード設定ファイルは $NODE_HOME(例:/home/user/cnode) に設定されます。
echo PATH="$HOME/.local/bin:$PATH" >> $HOME/.bashrc
echo export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" >> $HOME/.bashrc
echo export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" >> $HOME/.bashrc
echo export NODE_HOME=$HOME/cnode >> $HOME/.bashrc
環境変数に接続ネットワークを指定する
echo export NODE_CONFIG=mainnet >> $HOME/.bashrc
echo export NODE_NETWORK='"--mainnet"' >> $HOME/.bashrc
echo export CARDANO_NODE_NETWORK_ID=mainnet >> $HOME/.bashrc
テストネットの場合はこちら
echo export NODE_CONFIG=preview >> $HOME/.bashrc
echo export NODE_NETWORK='"--testnet-magic 2"' >> $HOME/.bashrc
echo export CARDANO_NODE_NETWORK_ID=2 >> $HOME/.bashrc
echo export NODE_CONFIG=preprod >> $HOME/.bashrc
echo export NODE_NETWORK='"--testnet-magic 1"' >> $HOME/.bashrc
echo export CARDANO_NODE_NETWORK_ID=1 >> $HOME/.bashrc
source $HOME/.bashrc
バージョン確認
cabal update
cabal --version
ghc --version
チェック
Cabalバージョン:「3.8.1.0」
GHCバージョン:「8.10.7」であることを確認してください。
2-2. ソースコードからビルド¶
確認
バイナリーファイルは必ずソースコードからビルドするようにし、整合性をチェックしてください。IOGは現在ARMアーキテクチャ用のバイナリファイルを提供していません。Raspberry Piを使用してプールを構築する場合は、ARM用コンパイラでコンパイルする必要があります。
Gitからソースコードをダウンロードし、最新のタグに切り替えます。
cd $HOME/git
git clone https://github.com/input-output-hk/cardano-node.git
cd cardano-node
git fetch --all --recurse-submodules --tags
git checkout tags/8.1.2
Cabalのビルドオプションを構成します。
cabal clean
cabal update
cabal configure --with-compiler=ghc-8.10.7
新しいTMUXセッションを開く
tmux new -s build
カルダノノードをビルドします。
cabal build cardano-cli cardano-node
ヒント
サーバスペックによって、ビルド完了までに数分から数時間かかる場合があります。
cardano-cliファイルと cardano-nodeファイルをbinディレクトリにコピーします。
sudo cp $(find $HOME/git/cardano-node/dist-newstyle/build -type f -name "cardano-cli") /usr/local/bin/cardano-cli
sudo cp $(find $HOME/git/cardano-node/dist-newstyle/build -type f -name "cardano-node") /usr/local/bin/cardano-node
cardano-cli と cardano-nodeのバージョンが最新Gitタグバージョンであることを確認してください。
cardano-node version
cardano-cli version
以下の戻り値を確認する
cardano-cli 8.1.2 - linux-x86_64 - ghc-8.10
git rev d2d90b48c5577b4412d5c9c9968b55f8ab4b9767cardano-node 8.1.2 - linux-x86_64 - ghc-8.10
git rev d2d90b48c5577b4412d5c9c9968b55f8ab4b9767
TMUXセッションを閉じる
exit
2-3. ノード設定ファイルの修正¶
ノード構成に必要な設定ファイルを取得します。
config.json、genesis.json、topology.json
mkdir $NODE_HOME
cd $NODE_HOME
wget --no-use-server-timestamps -q https://book.world.dev.cardano.org/environments/${NODE_CONFIG}/byron-genesis.json -O ${NODE_CONFIG}-byron-genesis.json
wget --no-use-server-timestamps -q https://book.world.dev.cardano.org/environments/${NODE_CONFIG}/topology.json -O ${NODE_CONFIG}-topology.json
wget --no-use-server-timestamps -q https://book.world.dev.cardano.org/environments/${NODE_CONFIG}/shelley-genesis.json -O ${NODE_CONFIG}-shelley-genesis.json
wget --no-use-server-timestamps -q https://book.world.dev.cardano.org/environments/${NODE_CONFIG}/alonzo-genesis.json -O ${NODE_CONFIG}-alonzo-genesis.json
wget --no-use-server-timestamps -q https://book.world.dev.cardano.org/environments/${NODE_CONFIG}/conway-genesis.json -O ${NODE_CONFIG}-conway-genesis.json
wget --no-use-server-timestamps -q https://book.world.dev.cardano.org/environments/${NODE_CONFIG}/config.json -O ${NODE_CONFIG}-config.json
以下のコードを実行し config.jsonファイルを更新します。
設定ファイルを書き換える
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/TraceMempool\": true/TraceMempool\": false/g" \
-e 's!"TraceBlockFetchDecisions": false!"TraceBlockFetchDecisions": true!' \
-e '/"defaultScribes": \[/a\ \[\n "FileSK",\n "logs/node.json"\n \],' \
-e '/"setupScribes": \[/a\ \{\n "scFormat": "ScJson",\n "scKind": "FileSK",\n "scName": "logs/node.json"\n \},' \
-e "s/127.0.0.1/0.0.0.0/g"
sed -i ${NODE_CONFIG}-config.json \
-e '2i \ "EnableP2P": true,' \
-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/TraceMempool\": true/TraceMempool\": false/g" \
-e 's!"TraceBlockFetchDecisions": false!"TraceBlockFetchDecisions": true!' \
-e '/"defaultScribes": \[/a\ \[\n "FileSK",\n "logs/node.json"\n \],' \
-e '/"setupScribes": \[/a\ \{\n "scFormat": "ScJson",\n "scKind": "FileSK",\n "scName": "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/TraceMempool\": true/TraceMempool\": false/g" \
-e 's!"TraceBlockFetchDecisions": false!"TraceBlockFetchDecisions": true!' \
-e '/"defaultScribes": \[/a\ \[\n "FileSK",\n "logs/node.json"\n \],' \
-e '/"setupScribes": \[/a\ \{\n "scFormat": "ScJson",\n "scKind": "FileSK",\n "scName": "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/TraceMempool\": true/TraceMempool\": false/g" \
-e 's!"TraceBlockFetchDecisions": false!"TraceBlockFetchDecisions": true!' \
-e '/"defaultScribes": \[/a\ \[\n "FileSK",\n "logs/node.json"\n \],' \
-e '/"setupScribes": \[/a\ \{\n "scFormat": "ScJson",\n "scKind": "FileSK",\n "scName": "logs/node.json"\n \},' \
-e "s/127.0.0.1/0.0.0.0/g"
環境変数を追加し、.bashrcファイルを更新します。
echo export CARDANO_NODE_SOCKET_PATH="$NODE_HOME/db/socket" >> $HOME/.bashrc
source $HOME/.bashrc
2-4. ノード起動スクリプトの作成¶
起動スクリプトには、ディレクトリ、ポート番号、DBパス、構成ファイルパス、トポロジーファイルパスなど、カルダノノードを実行するために必要な変数が含まれています。
全行をコピーしコマンドラインに送信します。
リレーノードで使用するポート番号を指定してターミナルで実行する
PORT=6000
起動スクリプトファイルを作成する
cat > $NODE_HOME/startRelayNode1.sh << EOF
#!/bin/bash
DIRECTORY=$NODE_HOME
PORT=${PORT}
HOSTADDR=0.0.0.0
TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.json
DB_PATH=\${DIRECTORY}/db
SOCKET_PATH=\${DIRECTORY}/db/socket
CONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.json
/usr/local/bin/cardano-node +RTS -N --disable-delayed-os-memory-return -I0.1 -Iw300 -A16m -F1.5 -H2500M -T -S -RTS run --topology \${TOPOLOGY} --database-path \${DB_PATH} --socket-path \${SOCKET_PATH} --host-addr \${HOSTADDR} --port \${PORT} --config \${CONFIG}
EOF
注意
- BPノードポートはセキュリティを高めるために、49513~65535までの任意番号を設定してください。ここで設定する番号は1-3で設定したSSHポート番号とは別の番号を設定してください.
BPノードで使用するポート番号を指定してターミナルで実行する
PORT=xxxxx
起動スクリプトファイルを作成する
cat > $NODE_HOME/startBlockProducingNode.sh << EOF
#!/bin/bash
DIRECTORY=$NODE_HOME
PORT=${PORT}
HOSTADDR=0.0.0.0
TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.json
DB_PATH=\${DIRECTORY}/db
SOCKET_PATH=\${DIRECTORY}/db/socket
CONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.json
/usr/local/bin/cardano-node +RTS -N --disable-delayed-os-memory-return -I0.1 -Iw300 -A16m -F1.5 -H2500M -T -S -RTS run --topology \${TOPOLOGY} --database-path \${DB_PATH} --socket-path \${SOCKET_PATH} --host-addr \${HOSTADDR} --port \${PORT} --config \${CONFIG}
EOF
2-5. ノード起動¶
起動スクリプトに実行権限を付与し、ブロックチェーンの同期を開始します。
リレーノードから実施します。
cd $NODE_HOME
chmod +x startRelayNode1.sh
./startRelayNode1.sh
cd $NODE_HOME
chmod +x startBlockProducingNode.sh
./startBlockProducingNode.sh
勢いよくログが流れていたら起動成功です
一旦ノードを停止します。
Ctrl+C
2-6. 自動起動の設定(systemd)¶
先程のスクリプトだけでは、ターミナル画面を閉じるとノードが終了してしまうので、スクリプトをサービスとして登録し、自動起動するように設定しましょう
ステークプールにsystemdを使用するメリット
- メンテナンスや停電など、自動的にコンピュータが再起動したときステークプールを自動起動します。
- クラッシュしたステークプールプロセスを自動的に再起動します。
- ステークプールの稼働時間とパフォーマンスをレベルアップさせます。
始める前にステークプールが停止しているか確認してください。
killall -s 2 cardano-node
以下のコードを実行して、ユニットファイルを作成します。
cat > $NODE_HOME/cardano-node.service << EOF
# The Cardano node service (part of systemd)
# file: /etc/systemd/system/cardano-node.service
[Unit]
Description = Cardano node service
Wants = network-online.target
After = network-online.target
[Service]
User = ${USER}
Type = simple
WorkingDirectory= ${NODE_HOME}
ExecStart = /bin/bash -c '${NODE_HOME}/startRelayNode1.sh'
KillSignal=SIGINT
RestartKillSignal=SIGINT
TimeoutStopSec=300
LimitNOFILE=32768
Restart=always
RestartSec=5
SyslogIdentifier=cardano-node
[Install]
WantedBy = multi-user.target
EOF
cat > $NODE_HOME/cardano-node.service << EOF
# The Cardano node service (part of systemd)
# file: /etc/systemd/system/cardano-node.service
[Unit]
Description = Cardano node service
Wants = network-online.target
After = network-online.target
[Service]
User = ${USER}
Type = simple
WorkingDirectory= ${NODE_HOME}
ExecStart = /bin/bash -c '${NODE_HOME}/startBlockProducingNode.sh'
KillSignal=SIGINT
RestartKillSignal=SIGINT
TimeoutStopSec=300
LimitNOFILE=32768
Restart=always
RestartSec=5
SyslogIdentifier=cardano-node
[Install]
WantedBy = multi-user.target
EOF
/etc/systemd/system
にユニットファイルをコピーして、権限を付与します。
sudo cp $NODE_HOME/cardano-node.service /etc/systemd/system/cardano-node.service
sudo chmod 644 /etc/systemd/system/cardano-node.service
次のコマンドを実行して、OS起動時にサービスの自動起動を有効にします。
sudo systemctl daemon-reload
sudo systemctl enable cardano-node
sudo systemctl start cardano-node
journalctl --unit=cardano-node --follow
コマンド入力に戻る場合は「Ctrl+C」(この場合ノードは終了しません)
便利なエイリアス設定¶
エイリアス設定
スクリプトへのパスを通し、任意の単語で起動出来るようにする。
echo alias cnode='"journalctl -u cardano-node -f"' >> $HOME/.bashrc
echo alias cnstart='"sudo systemctl start cardano-node"' >> $HOME/.bashrc
echo alias cnrestart='"sudo systemctl reload-or-restart cardano-node"' >> $HOME/.bashrc
echo alias cnstop='"sudo systemctl stop cardano-node"' >> $HOME/.bashrc
source $HOME/.bashrc
単語を入力するだけで、起動状態(ログ)を確認できます。
cnode ・・・ログ表示
cnstart ・・・ノード起動
cnrestart ・・・ノード再起動
cnstop ・・・ノード停止
2-7. gLiveViewのインストール¶
cardano-nodeはログが流れる画面だけでは何が表示されているのかよくわかりません。
それを視覚的に確認できるツールがgLiveViewです。
gLiveViewは重要なノードステータス情報を表示し、systemdサービスとうまく連携します。このツールを作成した Guild Operators の功績によるものです。
Guild LiveViewをインストールします。
mkdir $NODE_HOME/scripts
cd $NODE_HOME/scripts
sudo apt install bc tcptraceroute -y
curl -s -o gLiveView.sh https://raw.githubusercontent.com/cardano-community/guild-operators/master/scripts/cnode-helper-scripts/gLiveView.sh
curl -s -o env https://raw.githubusercontent.com/cardano-community/guild-operators/master/scripts/cnode-helper-scripts/env
chmod 755 gLiveView.sh
env ファイル内の定義を修正します
PORT=`grep "PORT=" $NODE_HOME/startRelayNode1.sh`
b_PORT=${PORT#"PORT="}
echo "リレーポートは${b_PORT}です"
PORT=`grep "PORT=" $NODE_HOME/startBlockProducingNode.sh`
b_PORT=${PORT#"PORT="}
echo "リレーポートは${b_PORT}です"
sed -i $NODE_HOME/scripts/env \
-e '1,73s!#CNODE_HOME="/opt/cardano/cnode"!CNODE_HOME=${NODE_HOME}!' \
-e '1,73s!#CNODE_PORT=6000!CNODE_PORT='${b_PORT}'!' \
-e '1,73s!#UPDATE_CHECK="Y"!UPDATE_CHECK="N"!' \
-e '1,73s!#CONFIG="${CNODE_HOME}/files/config.json"!CONFIG="${CNODE_HOME}/'${NODE_CONFIG}'-config.json"!' \
-e '1,73s!#SOCKET="${CNODE_HOME}/sockets/node0.socket"!SOCKET="${CNODE_HOME}/db/socket"!'
Guild Liveviewを起動します。
./gLiveView.sh
GliveView起動ショートカットコード登録
スクリプトへのパスを通し、任意の単語で起動出来るようにする。
echo alias glive="'cd $NODE_HOME/scripts; ./gLiveView.sh'" >> $HOME/.bashrc
source $HOME/.bashrc
コマンドラインにglive
と入力するだけで、どこからでも起動できます。
gLiveViewについて▼
- このツールを立ち上げてもノードは起動しません。ノードは別途起動しておく必要があります
- リレー/BPの自動判別は、手順4-5終了後に行われるようになります。
- リレーノードでは基本情報に加え、トポロジー接続状況を確認できます。
- BPノードでは基本情報に加え、KES有効期限、ブロック生成状況を確認できます。
CONECTIONSについて▼
ノードにpingを送信する際ICMPpingを使用します。接続先ノードのファイアウォールがICMPトラフィックを受け付ける場合のみ機能します。
重要:ノード同期について
0エポックからブロックチェーンデータをダウンロードし同期します。最新エポックまで追いつくまでに1日半~2日かかり、完全に同期するまで次の項目には進めません。 BPサーバーや2つ目のリレーサーバーでも同じ作業を実施してください。
2-8. エアギャップマシンセットアップ¶
エアギャップマシンとは?
エアギャップオフラインマシンは「コールド環境」と呼ばれコンピュータネットワークにおいてセキュリティを高める方法の一つ。 安全にしたいコンピュータやネットワークを、インターネットや安全でないLANといったネットワークから物理的に隔離することを指す。
- プール運営においてコールドキーを管理し、トランザクション署名ファイルを作成します。
- キーロギング攻撃、マルウエア/ウイルスベースの攻撃、その他ファイアウォールやセキュリティーの悪用から保護します。
- 有線・無線のインターネットには接続しないでください。
- ネットワーク上にあるVMマシンではありません。
- エアギャップについて更に詳しく知りたい場合は、こちらを参照下さい。
1.2-1. 依存関係インストールと2-2. ソースコードからビルドをエアギャップマシンで実行する
2.以下のパスを環境変数にセットし、フォルダを作成します。
echo export NODE_HOME=$HOME/cnode >> $HOME/.bashrc
echo export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" >> $HOME/.bashrc
echo export NODE_NETWORK="--mainnet" >> $HOME/.bashrc
echo export CARDANO_NODE_NETWORK_ID=mainnet >> $HOME/.bashrc
source $HOME/.bashrc
mkdir -p $NODE_HOME
テストネットの場合はこちら
echo export NODE_HOME=$HOME/cnode >> $HOME/.bashrc echo export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" >> $HOME/.bashrc echo export NODE_CONFIG=preview >> $HOME/.bashrc echo export NODE_NETWORK='"--testnet-magic 2"' >> $HOME/.bashrc echo export CARDANO_NODE_NETWORK_ID=2 >> $HOME/.bashrc source $HOME/.bashrc mkdir -p $NODE_HOME
echo export NODE_HOME=$HOME/cnode >> $HOME/.bashrc echo export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" >> $HOME/.bashrc echo export NODE_CONFIG=preview >> $HOME/.bashrc echo export NODE_NETWORK='"--testnet-magic 1"' >> $HOME/.bashrc echo export CARDANO_NODE_NETWORK_ID=1 >> $HOME/.bashrc source $HOME/.bashrc mkdir -p $NODE_HOME