スロットリーダー計算の設定
スロットリーダースケジュールを計算すると、ステークプールがブロックを作成する順番がわかります。
これにより、ステークプールのメンテナンスをスケジュールする最適な時間を把握できます。
また、プールの順番が来たときに、プールがブロックを正しく作成しているかどうかを確認するのにも役立ちます。
これは、ブロックプロデューサーノードで設定および実行されます。
CNCLIツール
CNCLI by BCSH, SAND, SALAD
コミュニティベースの cardano-node CLI ツール。これは、cardano-cli で利用できるものを強化および拡張するためのユーティリティのコレクションです。
CNCLIのインストール
- BP
Rustのインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- 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
rustup target add x86_64-unknown-linux-musl
開発環境の依存ツールをインストール
sudo apt update -y && sudo apt install -y automake build-essential pkg-config libffi-dev libgmp-dev libssl-dev libtinfo-dev libsystemd-dev zlib1g-dev make g++ tmux git jq wget libncursesw5 libtool autoconf musl-tools
CNCLIのインストール
cd $HOME
release_tag=$(curl -s https://api.github.com/repos/cardano-community/cncli/releases/latest | jq -r .tag_name)
version=$(echo ${release_tag} | cut -c 2-)
echo "Release tag : ${release_tag}"
echo "Release version : ${version}"
ダウンロードして、解凍
curl -sLJ https://github.com/cardano-community/cncli/releases/download/${release_tag}/cncli-${version}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz -o $HOME/cncli-${version}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz
tar xzvf $HOME/cncli-${version}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz -C $HOME/.cargo/bin/
ダウンロードファイルの削除
rm $HOME/cncli-${version}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz
CNCLIが正しくインストールされていることを確認するために次のコマンドを実行します。
cncliが正しくインストールされ、システムの PATH 変数で使用可能かどうかを確認します。
command -v cncli
/home/user_name/.cargo/bin/cncliが返されるはずです。
バージョンの確認
cncli -V
ステークスナップショットでLeaderLogを実行します。
このコマンドは、ステークプールの予想されるスロットリストを計算します。
- 同期されたデータベースがある限り、
prevログとcurrentログは利用できます。 - 「次の」ログは、エポックの終了の 1.5 日前 (36 時間) にのみ利用可能です。
nextにはpoolStakeMarkとactiveStakeMark、currentにはpoolStakeSetとactiveStakeSet、prevにはpoolStakeGoとactiveStakeGoを使用する必要があります。
next エポックの stake-snapshot アプローチの使用例
次のエポックが始まる 1.5日 (36時間) 前にこのコマンドを実行します。
port=`grep "PORT=" $NODE_HOME/startCardanoNodeBP.sh`
node_port=${port#"PORT="}
echo "BPポート : ${node_port}"
$HOME/.cargo/bin/cncli sync --host 127.0.0.1 --port ${node_port} --no-service
my_pool_id=$(cat $NODE_HOME/pool-bech32.id)
echo "LeaderLog - POOLID ${my_pool_id}"
snapshot=$(/usr/local/bin/cardano-cli latest query stake-snapshot --stake-pool-id ${my_pool_id} ${NODE_NETWORK})
pool_stake=$(echo "${snapshot}" | jq -r ".pools.${my_pool_id}.stakeMark")
active_stake=$(echo "${snapshot}" | jq -r ".total.stakeMark")
my_pool=`$HOME/.cargo/bin/cncli leaderlog --consensus praos --pool-id ${my_pool_id} --pool-vrf-skey ${NODE_HOME}/vrf.skey --byron-genesis ${NODE_HOME}/byron-genesis.json --shelley-genesis ${NODE_HOME}/shelley-genesis.json --pool-stake ${pool_stake} --active-stake ${active_stake} --ledger-set next`
echo ${my_pool} | jq .
epoch=`echo ${my_pool} | jq .epoch`
echo "\`Epoch ${epoch}\` 🧙🔮:"
slots=`echo ${my_pool} | jq .epochSlots`
ideal=`echo ${my_pool} | jq .epochSlotsIdeal`
performance=`echo ${my_pool} | jq .maxPerformance`
echo "\`MYPOOL - ${slots} \`🎰\`, ${performance}% \`🍀max, \`${ideal}\` 🧱ideal"
currentエポックのstake-snapshotアプローチの使用例
port=`grep "PORT=" $NODE_HOME/startCardanoNodeBP.sh`
node_port=${port#"PORT="}
echo "BPポート : ${node_port}"
$HOME/.cargo/bin/cncli sync --host 127.0.0.1 --port ${node_port} --no-service
my_pool_id=$(cat $NODE_HOME/pool-bech32.id)
echo "LeaderLog - POOLID ${my_pool_id}"
snapshot=$(/usr/local/bin/cardano-cli latest query stake-snapshot --stake-pool-id ${my_pool_id} ${NODE_NETWORK})
pool_stake=$(echo "${snapshot}" | jq -r ".pools.${my_pool_id}.stakeSet")
active_stake=$(echo "${snapshot}" | jq -r ".total.stakeSet")
my_pool=`$HOME/.cargo/bin/cncli leaderlog --consensus praos --pool-id ${my_pool_id} --pool-vrf-skey ${NODE_HOME}/vrf.skey --byron-genesis ${NODE_HOME}/byron-genesis.json --shelley-genesis ${NODE_HOME}/shelley-genesis.json --pool-stake ${pool_stake} --active-stake ${active_stake} --ledger-set current`
echo ${my_pool} | jq .
epoch=`echo ${my_pool} | jq .epoch`
echo "\`Epoch ${epoch}\` 🧙🔮:"
slots=`echo ${my_pool} | jq .epochSlots`
ideal=`echo ${my_pool} | jq .epochSlotsIdeal`
performance=`echo ${my_pool} | jq .maxPerformance`
echo "\`MYPOOL - ${slots} \`🎰\`, ${performance}% \`🍀max, \`${ideal}\` 🧱ideal"
previousエポックの stake-snapshot アプローチの使用例:
port=`grep "PORT=" $NODE_HOME/startCardanoNodeBP.sh`
node_port=${port#"PORT="}
echo "BPポート : ${node_port}"
$HOME/.cargo/bin/cncli sync --host 127.0.0.1 --port ${node_port} --no-service
my_pool_id=$(cat $NODE_HOME/pool-bech32.id)
echo "LeaderLog - POOLID ${my_pool_id}"
snapshot=$(/usr/local/bin/cardano-cli latest query stake-snapshot --stake-pool-id ${my_pool_id} ${NODE_NETWORK})
pool_stake=$(echo "${snapshot}" | jq -r ".pools.${my_pool_id}.stakeGo")
active_stake=$(echo "${snapshot}" | jq -r ".total.stakeGo"))
my_pool=`$HOME/.cargo/bin/cncli leaderlog --consensus praos --pool-id ${my_pool_id} --pool-vrf-skey ${NODE_HOME}/vrf.skey --byron-genesis ${NODE_HOME}/byron-genesis.json --shelley-genesis ${NODE_HOME}/shelley-genesis.json --pool-stake ${pool_stake} --active-stake ${active_stake} --ledger-set prev`
echo ${my_pool} | jq .
epoch=`echo ${my_pool} | jq .epoch`
echo "\`Epoch ${epoch}\` 🧙🔮:"
slots=`echo ${my_pool} | jq .epochSlots`
ideal=`echo ${my_pool} | jq .epochSlotsIdeal`
performance=`echo ${my_pool} | jq .maxPerformance`
echo "\`MYPOOL - ${slots} \`🎰\`, ${performance}% \`🍀max, \`${ideal}\` 🧱ideal"
PoolToolとの統合
PoolTool は、ステークプールに次のデータを送信するためのサンプルスクリプトを提供します。
- 現在のブロックの高さ
- ステークプールが現在ブロックを作成するために選出されているスロットの数。
ノードがブロックチェーンと完全に同期されているときにPoolToolがステークプールの横に緑色のバッジを表示します。 Cardanoコミュニティによって開発された CNCLIユーティリティを使用して、ブロックの高さとスロット数をPoolToolに送信することもできます。
Pool ToolのSendTipの設定
- envファイルを修正します。
sed -i $NODE_HOME/scripts/env \
-e '1,73s!#CNODEBIN="${HOME}/.local/bin/cardano-node"!CNODEBIN="/usr/local/bin/cardano-node"!'
- PoolToolのAPI KEYを変数に代入します。
pt_api_key=
- cncli.shファイルを修正します。
port=`grep "PORT=" $NODE_HOME/startCardanoNodeBP.sh`
node_port=${port#"PORT="}
echo "BPポート : ${node_port}"
sed -i \
-e '1,73s!#PT_API_KEY=""!PT_API_KEY="'${pt_api_key}'"!' \
-e '1,73s!#POOL_TICKER=""!POOL_TICKER="'$(echo `jq -r '.ticker' $NODE_HOME/pool-metadata.json`)'"!' \
-e '1,73s!#PT_HOST="127.0.0.1"!PT_HOST="127.0.0.1"!' \
-e '1,73s!#PT_PORT="${CNODE_PORT}"!PT_PORT="'${node_port}'"!' \
-e '1,73s!#PT_SENDSLOTS_START=30!PT_SENDSLOTS_START=30!' \
-e '1,73s!#PT_SENDSLOTS_STOP=60!PT_SENDSLOTS_STOP=60!' \
-e '1,73s!#SLEEP_RATE=60!SLEEP_RATE=60!' \
"$NODE_HOME/scripts/cncli.sh"
- サービスファイルの作成・登録
cat > $NODE_HOME/service/cnode-cncli-ptsendtip.service << EOF
# file: /etc/systemd/system/cnode-cncli-ptsendtip.service
[Unit]
Description=Cardano Node - CNCLI PoolTool SendTip
BindsTo=cnode-cncli-sync.service
After=cnode-cncli-sync.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 ptsendtip"
ExecStop=/bin/bash -l -c "exec kill -2 \$(ps -ef | grep [c]ncli.sendtip.*.cnode-pooltool.json | tr -s ' ' | cut -d ' ' -f2) &>/dev/null"
KillSignal=SIGINT
SuccessExitStatus=143
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cnode-cncli-ptsendtip
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=cnode-cncli-sync.service
EOF
- サービスファイルをコピーして、有効化と起動をします。
sudo cp $NODE_HOME/service/cnode-cncli-ptsendtip.service /etc/systemd/system/cnode-cncli-ptsendtip.service
sudo chmod 644 /etc/systemd/system/cnode-cncli-ptsendtip.service
sudo systemctl daemon-reload
sudo systemctl enable cnode-cncli-ptsendtip.service
sudo systemctl start cnode-cncli-ptsendtip.service
Pool ToolのSendSlotsの設定
- PoolToolのAPI KEYを変数に代入します。
pt_api_key=
- cncli.shファイルを修正します。
port=`grep "PORT=" $NODE_HOME/startCardanoNodeBP.sh`
node_port=${port#"PORT="}
echo "BPポート : ${node_port}"
sed -i \
-e '1,73s!#PT_API_KEY=""!PT_API_KEY="'${pt_api_key}'"!' \
-e '1,73s!#POOL_TICKER=""!POOL_TICKER="'$(echo `jq -r '.ticker' $NODE_HOME/pool-metadata.json`)'"!' \
-e '1,73s!#PT_HOST="127.0.0.1"!PT_HOST="127.0.0.1"!' \
-e '1,73s!#PT_PORT="${CNODE_PORT}"!PT_PORT="'${node_port}'"!' \
-e '1,73s!#PT_SENDSLOTS_START=30!PT_SENDSLOTS_START=30!' \
-e '1,73s!#PT_SENDSLOTS_STOP=60!PT_SENDSLOTS_STOP=60!' \
-e '1,73s!#SLEEP_RATE=60!SLEEP_RATE=60!' \
"$NODE_HOME/scripts/cncli.sh"
- サービスファイルの作成・登録
cat > $NODE_HOME/service/cnode-cncli-ptsendslots.service << EOF
# file: /etc/systemd/system/cnode-cncli-ptsendslots.service
[Unit]
Description=Cardano Node - CNCLI PoolTool SendSlots
BindsTo=cnode-cncli-sync.service
After=cnode-cncli-sync.service
[Service]
Type=simple
User=$(whoami)
WorkingDirectory=${NODE_HOME}/scripts
ExecStart=/usr/bin/bash -lc 'sleep 20; . ${NODE_HOME}/scripts/env && ./cncli.sh ptsendslots'
Restart=on-failure
RestartSec=60
StandardOutput=journal
StandardError=journal
SyslogIdentifier=cnode-cncli-ptsendslots
[Install]
WantedBy=multi-user.target
EOF
- サービスファイルをコピーして、有効化と起動をします。
sudo cp $NODE_HOME/service/cnode-cncli-ptsendslots.service /etc/systemd/system/cnode-cncli-ptsendslots.service
sudo chmod 644 /etc/systemd/system/cnode-cncli-ptsendslots.service
sudo systemctl daemon-reload
sudo systemctl enable cnode-cncli-ptsendslots.service
sudo systemctl start cnode-cncli-ptsendslots.service
- 起動確認
journalctl -u cnode-cncli-ptsendslots.service -n 50 --no-pager
CNCLI のアップグレードについて
cd $HOME
release_tag=$(curl -s https://api.github.com/repos/cardano-community/cncli/releases/latest | jq -r .tag_name)
version=$(echo ${release_tag} | cut -c 2-)
echo "Release tag : ${release_tag}"
echo "Release version : ${version}"
ダウンロードして、解凍
curl -sLJ https://github.com/cardano-community/cncli/releases/download/${release_tag}/cncli-${version}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz -o $HOME/cncli-${version}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz
tar xzvf $HOME/cncli-${version}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz -C $HOME/.cargo/bin/
ダウンロードファイルの削除
rm $HOME/cncli-${version}-ubuntu22-x86_64-unknown-linux-gnu.tar.gz
CNCLI アップグレードの確認
cncli -V
更新されたバージョン番号を返す必要があります。
スロットリーダーログは機密にしておく必要があります。この情報を公開すると、攻撃者がこの情報を使用してステークプールを攻撃する可能性があります。