Skip to main content

新しい運用証明書の発行

ステークプールには、プールを実行する権限があることを確認するための有効な運用証明書が必要です。

ステークプールの運用証明書を確立するには、最新のKESキーペアが必要です。
KES期間は、運用証明書が有効な期間を示します。
運用証明書は、運用証明書で定義されたKES期間の90日後に期限切れになります。
ステークプールでブロックを作成するには、90日ごとに、またはそれより早く、新しいKESキーペアと運用証明書を生成する必要があります。

ステークプールのブロック生成ノードを開始するには、秘密のKESキーが必要です。公開KESキーは機密ではありません。

運用証明書の発行には、ステークプールがブロックを作成するために使用する固有の運用証明書ごとに1ずつ増加するカウンターも使用されます。
有効な運用証明書では、運用証明書の発行に使用するカウンター値は、プロトコルによってCardano ブロックチェーンに登録されたステークプールの現在のカウンター値と一致している必要があります。

info

KESキーのローテーションと新しい運用証明書の発行に役立つコンパニオンスクリプトは、こちらから入手できます。

カウンター値について

カウンター値の決定

ブロックチェーンプロトコルによって登録されたステークプールの現在のカウンター値を取得します。

  • ブロックプロデューサーノードのターミナルウィンドウで、次のように入力します。
cd $NODE_HOME
cardano-cli latest query kes-period-info \
${NODE_NETWORK} \
--op-cert-file node.cert

cardano-cli latest query kes-period-info コマンドは次のような出力を返します。

✓ Operational certificate's KES period is within the correct KES period interval
✓ The operational certificate counter agrees with the node protocol state counter
{
"qKesCurrentKesPeriod": 15,
"qKesEndKesInterval": 18,
"qKesKesKeyExpiry": null,
"qKesMaxKESEvolutions": 6,
"qKesNodeStateOperationalCertificateNumber": 3, ←カウンター値の設定値はこちらに対して+1にする
"qKesOnDiskOperationalCertificateNumber": 3,
"qKesRemainingSlotsInKesPeriod": 690,
"qKesslots_per_kes_period": 300,
"qKesStartKesInterval": 12
}

qKesNodeStateOperationalCertificateNumber キーの値は、ブロックチェーンプロトコルによって登録されたステークプールの現在のカウンター値を示します。
qKesOnDiskOperationalCertificateNumber キーの値は、ステークプールが使用する現在の運用証明書のカウンター値を示します。

新しい運用証明書の場合、カウンター値は qKesNodeStateOperationalCertificateNumber キーの現在の値より正確に1大きくなければなりません。

warning

KES更新前にqKesOnDiskOperationalCertificateNumberqKesNodeStateOperationalCertificateNumberより1以上大きい場合、運用証明書は無効です。
ステークプールは無効な運用証明書を使用してブロックを作成することはできません。

最初のブロックを作成する

ステークプールがゼロ (0) ブロックをミントした場合、ブロックチェーンプロトコルによって qKesNodeStateOperationalCertificateNumber の値が登録されません。
したがって、ステークプールの現在のカウンター値を取得すると、qKesNodeStateOperationalCertificateNumber キーの値が null になります。

ステークプールが初めてブロックを作成した後、現在のカウンター値を取得すると、qKesNodeStateOperationalCertificateNumber キーに値ゼロ (0) が返されます。

したがって、ステークプールがゼロ (0) ブロックをミントした場合、ステークプールが初めてブロックをミントすることを選択したときにブロックが正常に作成されるように、qKesOnDiskOperationalCertificateNumber キーにゼロ (0) の値を設定する必要があります。

カウンター値の設定

新しい運用証明書を発行すると、node.counterファイルによって新しい証明書のカウンター値が設定されます。

info

Coin Cashewの指示に従うと、ブロック生成ノードのキーを生成するときにnode.counterファイルが作成されます。

ブロックプロデューサーノードでcardano-cli latest query kes-period-infoコマンドを実行すると、qKesOnDiskOperationalCertificateNumber キーの値が qKesNodeStateOperationalCertificateNumber キーの値と等しい場合、ステークプールは現在の運用証明書を使用して少なくとも1つのブロックを生成しており、カウンター値を手動で設定する必要はありません。

qKesOnDiskOperationalCertificateNumberキーの値が qKesNodeStateOperationalCertificateNumber キーの値より大きい場合は、新しい運用証明書を発行する前に、次の手順を使用してカウンター値を設定する必要があります。

  1. KES更新のタイミングを確認します。
slot_num_int=`curl -s http://localhost:12798/metrics | grep cardano_node_metrics_slotNum_int | awk '{ print $2 }'`
echo "scale=6; ${slot_num_int} / 129600" | bc | awk '{printf "%.5f\n", $0}'

戻り値の小数点以下が.99800付近の場合は切り替わってから進めてください。

  1. カウンター値の設定をします。
cd $NODE_HOME
cardano-cli latest query kes-period-info ${NODE_NETWORK} --op-cert-file $NODE_HOME/node.cert --out-file kes-period-info.json
node_certificate_number=`cat kes-period-info.json | jq -r '.qKesNodeStateOperationalCertificateNumber'`

if expr "${node_certificate_number}" : "[0-9]*$" >&/dev/null; then
echo '----------------------------------------------'
echo オンチェーンカウンター番号 : ${node_certificate_number}
echo 更新カウンター番号 : $((${node_certificate_number} + 1))
echo '---------------------------------------------'
else
echo '----------------------------'
echo まだブロックを生成していないため、更新カウンター番号は "0" です。
echo '----------------------------'
fi
rm kes-period-info.json

新しい運用証明書を発行するためのカウンター値を設定

  1. 変数update_counter_numberにBPで出力した更新カウンター番号を入力します。
read -p "BPで出力した 更新カウンター番号 を入力 : " update_counter_number
  1. 必要なカウンター値を持つ新しい node.counterファイルを生成します。
chmod u+rwx $HOME/cold-keys

cd $NODE_HOME
cardano-cli latest node new-counter \
--cold-verification-key-file $HOME/cold-keys/node.vkey \
--counter-value ${update_counter_number} \
--operational-certificate-issue-counter-file $HOME/cold-keys/node.counter
info

ステークプールのqKesNodeStateOperationalCertificateNumberキーの現在の値がnullの場合は、--counter-valueオプションをゼロ(0)に設定します。
新しい node.counter ファイルを生成すると、新しい運用証明書を発行するまで description キーの値は空になります。

  1. 正しくカウンター番号が生成されているか確認します。
cardano-cli latest text-view decode-cbor \
--in-file $HOME/cold-keys/node.counter \
| grep int | head -1 | cut -d"(" -f2 | cut -d")" -f1

入力した更新カウンター番号であること

新しい運用証明書の発行

  1. 既存のKESキーペア、運用証明書をバックアップし、新規KESキーペアを生成します。
date=`date +\%Y\%m\%d\%H\%M`
mkdir -p $NODE_HOME/kes-backup
cp $NODE_HOME/kes.vkey $NODE_HOME/kes-backup/${date}-kes.vkey
cp $NODE_HOME/kes.skey $NODE_HOME/kes-backup/${date}-kes.skey
cp $NODE_HOME/node.cert $NODE_HOME/kes-backup/${date}-node.cert
cardano-cli latest node key-gen-KES \
--verification-key-file $NODE_HOME/kes.vkey \
--signing-key-file $NODE_HOME/kes.skey
  1. ブロックチェーンの現在のスロットの高さを照会し、結果内のスロットキーの値を取得します。
cd $NODE_HOME
current_slot=$(cardano-cli latest query tip ${NODE_NETWORK} | jq -r '.slot')
  1. ステークプールが使用するShelley GenesisJSON構成ファイルのslotsPerKESPeriodというキーからKES期間あたりのスロット数を取得します。
slots_per_kes_period=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r '.slotsPerKESPeriod')
  1. 現在のKES期間を計算するには、現在のスロットの高さをKES期間あたりのスロット数で割ります。
kes_period=$((${current_slot} / ${slots_per_kes_period}))
starting_kes_period=${kes_period}
echo KES期間の開始 : ${starting_kes_period}

新しい運用証明書を発行するには、開始KES期間を計算し、設定する必要があります。

  1. ファイルハッシュ値の確認
sha256sum $NODE_HOME/kes.vkey
sha256sum $NODE_HOME/kes.skey
ファイル転送

BPのkes.vkeykes.skeyをエアギャップのcnodeディレクトリにコピーします。

  1. BPで確認したファイルハッシュ値と比較確認します。
sha256sum $NODE_HOME/kes.vkey
sha256sum $NODE_HOME/kes.skey

BPで確認したファイルハッシュ値と一致していること

  1. 変数starting_kes_periodにBPで出力したKES期間の開始の番号を入力します。
read -p "BPで出力した KES期間の開始 の番号を入力してください : " starting_kes_period
  1. 新しい運用証明書node.certを発行します。
chmod u+rwx $HOME/cold-keys

cd $NODE_HOME
cardano-cli latest node issue-op-cert \
--kes-verification-key-file $NODE_HOME/kes.vkey \
--cold-signing-key-file $HOME/cold-keys/node.skey \
--operational-certificate-issue-counter $HOME/cold-keys/node.counter \
--kes-period ${starting_kes_period} \
--out-file $NODE_HOME/node.cert

chmod a-rwx $HOME/cold-keys
tip

cold-keysディレクトリへのパーミッションを変更する

  • ロック
chmod a-rwx $HOME/cold-keys
  • ロック解除
chmod u+rwx $HOME/cold-keys
info

新しい運用証明書を発行すると、node.counterファイルの値が1増加します。

cat $HOME/cold-keys/node.counter
  1. ファイルハッシュ値の確認
sha256sum $NODE_HOME/node.cert
ファイル転送

エアギャップのnode.certをBPのcnodeディレクトリにコピーします。

  1. エアギャップで確認したファイルハッシュ値と比較確認します。
sha256sum $NODE_HOME/node.cert

エアギャップで確認したファイルハッシュ値と一致していること

  1. ノード再起動
sudo systemctl reload-or-restart cardano-node
  1. ノード起動後に、上記で発行した運用証明書を確認します。
cd $NODE_HOME
cardano-cli latest query kes-period-info \
${NODE_NETWORK} \
--op-cert-file node.cert
info

cardano-cli latest query kes-period-info コマンドの結果では、ステークプールが上記で発行した運用証明書を使用してブロックを作成する前に、有効な運用証明書の qKesOnDiskOperationalCertificateNumber キーの値が qKesNodeStateOperationalCertificateNumber キーの値よりちょうど1大きくなります。
ステークプールが上記で発行した運用証明書を使用して初めてブロックを作成すると、qKesNodeStateOperationalCertificateNumber の値が1増加して qKesOnDiskOperationalCertificateNumber キーの値と等しくなります。

tip

忘れずにUSBへバックアップしておきましょう!