SPO JAPAN GUILD
ステークプール構築

ブロックログ設定

ブロックログについて

このツールはウロボロスにおける自プールのブロック生成スケジュールを事前に取得するツールです。
ブロック生成スケジュールはセキュリティ上パブリックには公開されません。

1. インストール要件

設定サーバー

  • BPノード限定

稼働要件

  • 4つのサービス(プログラム)をsystemdにて常駐させます。
  • ブロックチェーン同期用DBを新しく設置します(sqlite3)
  • 日本語マニュアルのフォルダ構成に合わせて作成されています。
  • vrf.skey と vrf.vkeyが必要です。

プログラム構成図

cardano-nodelogファイルcncli.servicelogmonitor.serviceleaderlog.servicevalidate.serviceGuild-DBblocklog.dbcncli.dbステータス通知blocknotifyblocks.sh各アプリ

2. CNCLIインストール

CNCLIについて

AndrewWestbergさんによって開発されたCNCLIはプールのブロック生成スケジュールを算出し、Shelley期におけるSPOに革命をもたらしました。

RUST環境の準備

mkdir $HOME/.cargo && mkdir $HOME/.cargo/bin
chown -R $USER $HOME/.cargo
touch $HOME/.profile
chown $USER $HOME/.profile

rustupのインストール

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

1) Proceed with standard installation (default - just press enter)が表示されたらEnter

source $HOME/.cargo/env
rustup install stable
rustup default stable
rustup update
rustup component add clippy rustfmt

CNCLIのダウンロード・インストール

cd $HOME
cncli_release="$(curl -s https://api.github.com/repos/cardano-community/cncli/releases/latest | jq -r '.tag_name' | sed -e "s/^.\{1\}//")"
curl -sLJ https://github.com/cardano-community/cncli/releases/download/v${cncli_release}/cncli-${cncli_release}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz -o $HOME/cncli-${cncli_release}-x86_64-unknown-linux-gnu.tar.gz
tar xzvf $HOME/cncli-${cncli_release}-x86_64-unknown-linux-gnu.tar.gz -C $HOME/.cargo/bin/
rm $HOME/cncli-${cncli_release}-x86_64-unknown-linux-gnu.tar.gz

CNCLIのバージョン確認

cncli --version
期待される表示例:
cncli v6.7.0 <8162cfb> (x86_64-unknown-linux-gnu)

3. sqlite3のインストール

sudo apt install sqlite3
sqlite3 --version
期待される表示例:
3.45.1 2024-01-30 16:01:20 e876e51a0ed5c5b3126f52e532044363a014bc594cfefa87ffb5b82257ccalt1 (64-bit)

3.31.1以上のバージョンがインストールされていれば問題ありません。

4. 依存ファイルのダウンロード

cd $NODE_HOME/scripts
wget https://raw.githubusercontent.com/cardano-community/guild-operators/master/scripts/cnode-helper-scripts/cncli.sh -O ./cncli.sh
wget https://raw.githubusercontent.com/cardano-community/guild-operators/master/scripts/cnode-helper-scripts/cntools.library -O ./cntools.library
wget https://raw.githubusercontent.com/btbf/spojapanguild/master/scripts/blocks.sh -O ./blocks.sh 
wget https://raw.githubusercontent.com/btbf/spojapanguild/master/scripts/logMonitor.sh -q -O ./logMonitor.sh

パーミッション変更

chmod 755 cncli.sh
chmod 755 logMonitor.sh
chmod 755 blocks.sh

設定ファイルの修正

PORT=`grep "PORT=" $NODE_HOME/startBlockProducingNode.sh`
b_PORT=${PORT#"PORT="}
echo "BPポートは${b_PORT}です"
sed -i $NODE_HOME/scripts/env \
  -e '1,73s!#CNODEBIN="${HOME}/.local/bin/cardano-node"!CNODEBIN="/usr/local/bin/cardano-node"!' \
  -e '1,73s!#CCLI="${HOME}/.local/bin/cardano-cli"!CCLI="/usr/local/bin/cardano-cli"!' \
  -e '1,73s!#CNCLI="${HOME}/.local/bin/cncli"!CNCLI="${HOME}/.cargo/bin/cncli"!' \
  -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/node.socket"!SOCKET="${CNODE_HOME}/db/socket"!' \
  -e '1,73s!#PROM_HOST=127.0.0.1!PROM_HOST=127.0.0.1!' \
  -e '1,73s!#PROM_PORT=12798!PROM_PORT=12798!' \
  -e '1,73s!#BLOCKLOG_TZ="UTC"!BLOCKLOG_TZ="Asia/Tokyo"!' \
  -e '1,73s!#POOL_NAME=""!POOL_DIR=${CNODE_HOME}!' \
  -e '1,116s!#WALLET_PAY_ADDR_FILENAME="payment.addr"!WALLET_PAY_ADDR_FILENAME="payment.addr"!' \
  -e '1,116s!#WALLET_STAKE_ADDR_FILENAME="reward.addr"!WALLET_STAKE_ADDR_FILENAME="stake.addr"!' \
  -e '1,116s!#POOL_HOTKEY_VK_FILENAME="hot.vkey"!POOL_HOTKEY_VK_FILENAME="kes.vkey"!' \
  -e '1,116s!#POOL_HOTKEY_SK_FILENAME="hot.skey"!POOL_HOTKEY_SK_FILENAME="kes.skey"!' \
  -e '1,116s!#POOL_COLDKEY_VK_FILENAME="cold.vkey"!POOL_COLDKEY_VK_FILENAME="node.vkey"!' \
  -e '1,116s!#POOL_COLDKEY_SK_FILENAME="cold.skey"!POOL_COLDKEY_SK_FILENAME="node.skey"!' \
  -e '1,116s!#POOL_OPCERT_COUNTER_FILENAME="cold.counter"!POOL_OPCERT_COUNTER_FILENAME="node.counter"!' \
  -e '1,116s!#POOL_OPCERT_FILENAME="op.cert"!POOL_OPCERT_FILENAME="node.cert"!' \
  -e '1,116s!#POOL_VRF_SK_FILENAME="vrf.skey"!POOL_VRF_SK_FILENAME="vrf.skey"!'

cncli.shファイルの修正

プールIDの確認

pool_hex=`cat $NODE_HOME/pool.id`
pool_bech32=`cat $NODE_HOME/pool.id-bech32`
printf "\nプールID(hex)は \e[32m${pool_hex}\e[m です\n\n"
printf "\nプールID(bech32)は \e[32m${pool_bech32}\e[m です\n\n"

ご自身のプールID 2種類が表示されていることを確認してください
プールIDが表示されていない場合は、こちらの手順を実行してください。

cncli.shファイルの修正

sed -i $NODE_HOME/scripts/cncli.sh \
  -e '1,30s!#POOL_ID=""!POOL_ID="'${pool_hex}'"!' \
  -e '1,30s!#POOL_ID_BECH32=""!POOL_ID_BECH32="'${pool_bech32}'"!' \
  -e '1,30s!#POOL_VRF_SKEY=""!POOL_VRF_SKEY="${CNODE_HOME}/vrf.skey"!' \
  -e '1,30s!#POOL_VRF_VKEY=""!POOL_VRF_VKEY="${CNODE_HOME}/vrf.vkey"!'

5. サービスファイル作成・登録

mkdir -p $NODE_HOME/service
cd $NODE_HOME/service
cat > $NODE_HOME/service/cnode-cncli-sync.service << EOF 
# file: /etc/systemd/system/cnode-cncli-sync.service

[Unit]
Description=Cardano Node - CNCLI sync
BindsTo=cardano-node.service
After=cardano-node.service

[Service]
Type=simple
Restart=on-failure
RestartSec=20
User=$(whoami)
WorkingDirectory=${NODE_HOME}/scripts
ExecStart=/bin/bash -l -c "exec ${NODE_HOME}/scripts/cncli.sh sync"
ExecStop=/bin/bash -l -c "exec kill -2 \$(ps -ef | grep [c]ncli.sync.*.${NODE_HOME}/ | tr -s ' ' | cut -d ' ' -f2) &>/dev/null"
KillSignal=SIGINT
SuccessExitStatus=143
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cnode-cncli-sync
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=cardano-node.service
EOF
cat > $NODE_HOME/service/cnode-cncli-validate.service << EOF 
# file: /etc/systemd/system/cnode-cncli-validate.service

[Unit]
Description=Cardano Node - CNCLI validate
BindsTo=cnode-cncli-sync.service
After=cnode-cncli-sync.service

[Service]
Type=simple
Restart=on-failure
RestartSec=20
User=$(whoami)
WorkingDirectory=${NODE_HOME}/scripts
ExecStartPre=/bin/sleep 5
ExecStart=/bin/bash -l -c "exec ${NODE_HOME}/scripts/cncli.sh validate"
SuccessExitStatus=143
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cnode-cncli-validate
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=cnode-cncli-sync.service
EOF
cat > $NODE_HOME/service/cnode-cncli-leaderlog.service << EOF
# file: /etc/systemd/system/cnode-cncli-leaderlog.service

[Unit]
Description=Cardano Node - CNCLI Leaderlog
BindsTo=cnode-cncli-sync.service
After=cnode-cncli-sync.service

[Service]
Type=simple
Restart=on-failure
RestartSec=20
User=$(whoami)
WorkingDirectory=${NODE_HOME}
ExecStart=/bin/bash -l -c "exec ${NODE_HOME}/scripts/cncli.sh leaderlog"
SuccessExitStatus=143
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cnode-cncli-leaderlog
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=cnode-cncli-sync.service
EOF
cat > $NODE_HOME/service/cnode-logmonitor.service << EOF 
# file: /etc/systemd/system/cnode-logmonitor.service

[Unit]
Description=Cardano Node - CNCLI logmonitor
BindsTo=cardano-node.service
After=cardano-node.service

[Service]
Type=simple
Restart=on-failure
RestartSec=1
User=$(whoami)
WorkingDirectory=${NODE_HOME}
ExecStart=/bin/bash -l -c "exec ${NODE_HOME}/scripts/logMonitor.sh"
ExecStop=/bin/bash -l -c "exec kill -2 \$(ps -ef | grep -m1 ${NODE_HOME}/scripts/logMonitor.sh | tr -s ' ' | cut -d ' ' -f2) &>/dev/null"
KillSignal=SIGINT
SuccessExitStatus=143
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cnode-logmonitor
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=cardano-node.service
EOF

サービスファイルをシステムフォルダにコピーし、権限を付与

sudo cp $NODE_HOME/service/cnode-cncli-sync.service $NODE_HOME/service/cnode-cncli-validate.service $NODE_HOME/service/cnode-cncli-leaderlog.service $NODE_HOME/service/cnode-logmonitor.service /etc/systemd/system/
sudo chmod 644 /etc/systemd/system/cnode-cncli-sync.service /etc/systemd/system/cnode-cncli-validate.service /etc/systemd/system/cnode-cncli-leaderlog.service /etc/systemd/system/cnode-logmonitor.service

サービスファイルの有効化

sudo systemctl daemon-reload
sudo systemctl enable --now cnode-cncli-sync.service cnode-cncli-validate.service cnode-cncli-leaderlog.service cnode-logmonitor.service

便利なエイリアス設定

エイリアス設定

スクリプトへのパスを通し、エイリアスで起動出来るようにします。

echo alias cnclilog='"journalctl --no-hostname -u cnode-cncli-sync -f"' >> $HOME/.bashrc
echo alias validate='"journalctl --no-hostname -u cnode-cncli-validate -f"' >> $HOME/.bashrc
echo alias leaderlog='"journalctl --no-hostname -u cnode-cncli-leaderlog -f"' >> $HOME/.bashrc
echo alias logmonitor='"journalctl --no-hostname -u cnode-logmonitor -f"' >> $HOME/.bashrc

環境変数再読み込み

source $HOME/.bashrc

以下のコマンドを入力して実行すると、サービスファイルログが閲覧できます。
単語を入力するだけで、起動状態(ログ)を確認できます。

cnclilog の例:cnode-cncli-syncサービスのログが表示されます。
validate の例:cnode-cncli-validateサービスのログが表示されます。
leaderlog の例:cnode-cncli-leaderlogサービスのログが表示されます。
logmonitor の例:cnode-logmonitorサービスのログが表示されます。

6. ブロックチェーンとDBを同期

cncliログ確認

cnclilog

ログ確認

期待される表示例:
INFO cncli::nodeclient::sync: block ******** of ********: 100.00% sync'd

100.00% sync'dになるまでお待ちください。 Ctrl+cで閉じます。

他サービスの起動確認
以下のコマンドを入力して実行すると、サービスファイルログが閲覧できます。
単語を入力するだけで、起動状態(ログ)を確認できます。

ブロック検証確認

こちらのサービスは生成したブロックがブロックチェーン上に記録されているか照合します。

validate
期待される表示例:
~ CNCLI Block Validation started ~

スロットリーダー確認

こちらのサービスはスロットリーダーを自動的に算出します。 次エポックの1.5日前から次エポックのスケジュールを算出することができます。

leaderlog
期待される表示例:
~ CNCLI Leaderlog started ~

ログモニター確認

こちらのサービスはプールのノードログからブロック生成結果を抽出します。

logmonitor
期待される表示例:
~~ LOG MONITOR STARTED ~~
monitoring ./logs/node.json for traces

7. ブロックログを表示する

このツールでは上記で設定してきたプログラムを組み合わせ、割り当てられたスロットリーダーに対してのブロック生成結果をデータベースに格納し、確認することができます。

cd $NODE_HOME/scripts
./blocks.sh

便利な設定

スクリプトへのパスを通し、任意の単語で起動出来るようにする。

echo alias blocks="'cd $NODE_HOME/scripts; ./blocks.sh'" >> $HOME/.bashrc
source $HOME/.bashrc

ターミナル上でblocksと入力し実行するだけで起動できます。

(s)実績概要---エポック毎のブロック生成実績参照
(e)エポック詳細---個別エポックのブロック生成スケジュールおよび生成実績参照

ブロックステータス

項目意味
Leaderブロック生成割り当て数
Idealアクティブステーク(シグマ)に基づいて割り当てられたブロック数の期待値/理想値
Luck期待値における実際に割り当てられたスロットリーダー数のパーセンテージ
Adoptedブロック生成フラグ
Confirmed生成したブロックのうち確実にオンチェーンであることが検証されたブロック (ブロック生成成功)
Missedスロットでスケジュールされているが、 cncli DB には記録されておらず他のプールがこのスロットのためにブロックを作った可能性
Ghostedブロックは作成されましたが「Orphans(孤立ブロック)」となっております。 スロットバトル・ハイトバトルで敗北したか、ブロック伝播の問題で有効なブロックになっていません
Stolen別のプールに有効なブロックが登録されているため、スロットバトルで敗北した可能性
Invalidプールはブロックの作成に失敗しました。base64でエンコードされたエラーメッセージがlogmonitorに表示されます

Invalidのエラー内容は次のコードでデコードできます

echo (base64コードを入れる) | base64 -d | jq -r

メニュー項目が文字化けする場合は、システム文字コードが「UTF-8」であることを確認してください。

echo $LANG

8. ブロック生成スケジュールと通知

SPO BlockNotify設定を導入することでブロックログDBに保存されるブロック生成ステータスをLINE/Slack/Discord/Telegramに通知することができます。

ブロック生成スケジュール取得のタイミング

ブロック生成スケジュールは、エポックスロットが約302,400を超えた時点次エポックのスケジュールを自動取得します。これは 次エポック開始の約1.5日前 に相当します。

1エポックで1ブロック割り当てられる委任量の目安

委任量割り当て確率
1M ADA約60%
2M ADA約85%
3M ADA約95%

プール開設後のエポックの流れ

新しくプールを登録した場合、ブロック割り当ては約2エポック後から開始されます。

エポック状態
603プール登録
604待機期間(次エポックスケジュール算出)
605委任有効 / ブロック生成開始
606報酬計算
607報酬支払い

9. CNCLI更新手順

注意

以下は最新版がリリースされた場合に実行してください。
1時間以内にブロック生成スケジュールがないことを確認してから、以下を実施してください。

CNCLIのアップデート

cd $HOME
cncli_release="$(curl -s https://api.github.com/repos/cardano-community/cncli/releases/latest | jq -r '.tag_name' | sed -e "s/^.\{1\}//")"
curl -sLJ https://github.com/cardano-community/cncli/releases/download/v${cncli_release}/cncli-${cncli_release}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz -o $HOME/cncli-${cncli_release}-x86_64-unknown-linux-gnu.tar.gz
tar xzvf $HOME/cncli-${cncli_release}-x86_64-unknown-linux-gnu.tar.gz -C $HOME/.cargo/bin/
rm $HOME/cncli-${cncli_release}-x86_64-unknown-linux-gnu.tar.gz

バージョン確認

cncli --version
期待される表示例:
cncli v6.7.0 <8162cfb> (x86_64-unknown-linux-gnu)

ノード再起動

sudo systemctl reload-or-restart cardano-node

ログ確認

cnclilog
期待される表示例:
~~~
INFO cncli::nodeclient::sync: block ******* of *******: 100.00% sync'd

cncli同期確認「100.00% synced」になるまで待ちます。
Ctrl+cで閉じます。

スケジュールにないブロックが生成される場合

ヒント

CNCLIのブロック生成スケジュールは正しい値が取得できていれば、100%正確です。
cncli.dbを再作成することで正しいスケジュールを取得することができます。

サービス停止

sudo systemctl stop cnode-cncli-sync.service

cncli.dbを削除

rm $NODE_HOME/guild-db/cncli/cncli.db

サービス再起動

sudo systemctl restart cnode-cncli-sync.service

ログ確認

cnclilog
期待される表示例:
INFO cncli::nodeclient::sync: block ******** of ********: 100.00% sync'd

100.00% sync'dになるまでお待ちください。

制作クレジット

このツールは海外ギルドオペレーター制作のCNCLI By AndrewWestbergGuild LiveViewBLOCK LOG for CNToolsを組み合わせたツールとなっております。
カスタマイズするにあたり、開発者のAHLNET(AHL)にご協力頂きました。
ありがとうございます。


Last updated on

Cookieの使用について

当サイトでは、ドキュメントの効果測定と利用状況の把握のため、Google Analytics を使用しています。

同意すると、分析用 Cookie が有効になります。