KESの更新¶
以降は、すべて手動で行うKES更新手順です。
ドキュメントとして記載しておきますが、実運用では、半自動更新が可能なSJG TOOLの利用を推奨します。
概要
KESとは
Key Evolving Signatureの略です。
キーを悪意のある攻撃者(クラッカー)からステークプールを保護するために作成されます。
90日ごとに再生成する必要があり、有効期限が切れる前に更新すれば期限内ならいつ更新しても問題ありません。
注意
-
KESの有効期限が切れるとブロック生成が出来なくなります。
必ず期限が切れる前に、以下の手順で更新してください。 -
Cardanoノード1.35.x以降、KESカウンター番号の取扱い規則(レギュレーション)が変更されています。
- オンチェーンに記録されている自プールのKESカウンター値 +
1で更新する必要があります。 - オンチェーンにまだ自プールが生成したブロックがない場合は、毎回
0で更新します。
- オンチェーンに記録されている自プールのKESカウンター値 +
KES更新の流れ
- BP:KES更新タイミングを確認
- BP:新しいKESファイルを生成
- BP:KESファイル(
kes.skey/kes.vkey)をエアギャップのcnodeディレクトリへコピー - BP & エアギャップ:
kes.vkeyファイルハッシュを比較 - BP:オンチェーンカウンター番号を算出
- エアギャップ:
node.counterを生成 - BP:現在の
KesPeriodを算出 - エアギャップ:
node.certを生成 (項目7で算出したKesPeriodを使うこと) - エアギャップ:
node.certをBPのcnodeディレクトリへコピー - BP & エアギャップ:
node.certファイルハッシュを比較 - BP:ノードを再起動
1. KES更新タイミングの確認¶
slotNumInt=`curl -s http://localhost:12798/metrics | grep cardano_node_metrics_slotNum_int | awk '{ print $2 }'`
echo "scale=6; ${slotNumInt} / 129600" | bc | awk '{printf "%.5f\n", $0}'
戻り値の小数点以下が
.99800前後になっている場合、startKesPeriodの切り替わりが間近です。
切り替わり後(.00000付近)になってから作業を開始してください。
2. KESファイルのバックアップ、新規作成¶
既存ファイルのバックアップ
cp $NODE_HOME/kes.vkey $NODE_HOME/kes-bk.vkey
cp $NODE_HOME/kes.skey $NODE_HOME/kes-bk.skey
cp $NODE_HOME/node.cert $NODE_HOME/node-bk.cert
KESファイルの新規作成
cardano-cli conway node key-gen-KES \
--verification-key-file $NODE_HOME/kes.vkey \
--signing-key-file $NODE_HOME/kes.skey
3. KESファイルをエアギャップにコピー¶
BPで生成したKESファイル(kes.skey/kes.vkey)をエアギャップのcnodeディレクトリへコピー
ファイル転送
BPで生成したkes.skey/kes.vkeyをエアギャップのcnodeディレクトリにコピーします。
graph LR
A[BP] -->|**kes.skey** / **kes.vkey**| B[エアギャップ];
4. ハッシュ値の確認¶
BPとエアギャップでkes.vkeyファイルハッシュを比較します。
cd $NODE_HOME
sha256sum kes.vkey
cd $NODE_HOME
sha256sum kes.vkey
確認
BPとエアギャップの両方で表示された戻り値を比較し、ハッシュ値が一致していれば問題ありません。
5. オンチェーンカウンター取得¶
kesperiodinfo=$(cardano-cli conway query kes-period-info $NODE_NETWORK --op-cert-file $NODE_HOME/node.cert --out-file kesperiod.json)
lastBlockCnt=`cat kesperiod.json | jq -r '.qKesNodeStateOperationalCertificateNumber'`
if expr "$lastBlockCnt" : "[0-9]*$" >&/dev/null; then
echo '----------------------------------------------'
echo オンチェーンカウンター番号は: $lastBlockCnt です。
echo 更新カウンター番号は $(($lastBlockCnt+1)) です。
echo '---------------------------------------------'
else
echo '----------------------------'
echo まだブロックを生成していません。
echo 更新カウンター番号は: "0" です。
echo '----------------------------'
fi
rm kesperiod.json
上記のコマンドをそのままコピーしてターミナルに入力してください。
6. カウンターファイル生成¶
cd $NODE_HOME
read -p "BPで算出した更新カウンター番号を入力してください: " cnt_No
上記のコマンドをそのままコピーしてターミナルに入力してください。
コマンド実行後に、数字入力モードになりますので項目5で確認した更新カウンター番号を入力します。
chmod u+rwx $HOME/cold-keys
cardano-cli conway node new-counter \
--cold-verification-key-file $HOME/cold-keys/node.vkey \
--counter-value $cnt_No \
--operational-certificate-issue-counter-file $HOME/cold-keys/node.counter
カウンター番号が正しく生成されているか確認します。
cardano-cli conway text-view decode-cbor \
--in-file $HOME/cold-keys/node.counter \
| grep int | head -1 | cut -d"(" -f2 | cut -d")" -f1
上記コマンドの戻り値が、あなたが入力した更新カウンター番号と一致していることを確認してください。
7. BPで現在のKesPeriodを算出¶
cd $NODE_HOME
slotNo=$(cardano-cli conway query tip $NODE_NETWORK | jq -r '.slot')
slotsPerKESPeriod=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r '.slotsPerKESPeriod')
kesPeriod=$((${slotNo} / ${slotsPerKESPeriod}))
startKesPeriod=${kesPeriod}
echo "startKesPeriod: ${startKesPeriod}"
8. node.certファイルの生成¶
次のコマンドで、新しいnode.certファイルを作成します。
cd $NODE_HOME
read -p "BPで算出した startKesPeriod を入力してください: " kes
上記のコマンドをそのままコピーしてターミナルに入力してください。
コマンド実行後に、数字入力モードになりますので項目7で算出したstartKesPeriodの数字を入力します。
必ずBPで算出した値と一致していることを確認してから入力してください。
echo "入力した startKesPeriod は: $kes"
戻り値に入力した数字が表示されているかを確認します。
chmod u+rwx $HOME/cold-keys
cardano-cli conway 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 $kes \
--out-file $NODE_HOME/node.cert
chmod a-rwx $HOME/cold-keys
ヒント
コールドキーのアクセス権限を適切に設定することで、セキュリティを向上させるとともに、誤削除や誤編集からキーを保護できます。
ロックするには:
chmod a-rwx $HOME/cold-keys
ロックを解除するには:
chmod u+rwx $HOME/cold-keys
9. node.certファイルをBPへコピー¶
エアギャップで生成したnode.certをBPのcnodeディレクトリへコピー
ファイル転送
エアギャップで生成したnode.certをBPのcnodeディレクトリにコピーします。
graph LR
A[エアギャップ] -->|**node.cert**| B[BP];
10. ハッシュ値確認¶
BPとエアギャップでnode.certのハッシュ値が一致していることを確認します。
cd $NODE_HOME
sha256sum node.cert
cd $NODE_HOME
sha256sum node.cert
確認
BPとエアギャップで表示された戻り値を比較し、ハッシュ値が一致していれば問題ありません。
11. ノード再起動¶
この手順を完了するため、ブロックプロデューサーを再起動してください。
sudo systemctl reload-or-restart cardano-node
gLiveviewでノード同期を確認します。
glive
10分以上経ってもノードが同期を再開しない場合はこちら
KES更新に失敗している可能性があります。
以下の手順でバックアップファイルから復元してください。
-
ノードを停止
sudo systemctl stop cardano-node -
バックアップファイルを復元
mv $NODE_HOME/kes-bk.vkey $NODE_HOME/kes.vkey mv $NODE_HOME/kes-bk.skey $NODE_HOME/kes.skey mv $NODE_HOME/node-bk.cert $NODE_HOME/node.cert -
ノードを起動
sudo systemctl start cardano-node -
ノード同期状況を確認
glive
12. チェックプログラム実行¶
確認のため、SJG TOOLを実行します。
gtool
[2] ブロック生成状態チェックを選択します。
13. バックアップファイル削除¶
ブロック生成状態のチェックがすべて正常(OK)であることを確認したら、不要となったバックアップファイルを削除してください。
rm $NODE_HOME/kes-bk.vkey
rm $NODE_HOME/kes-bk.skey
rm $NODE_HOME/node-bk.cert