よくある質問:ブロックログ関連¶
Q1. ブロック生成に失敗しました。原因は何でしょうか?¶
A. ステータスを確認します
通称:スロットバトル(SlotBattle / Stolen)
スロットバトルとは、複数のプールに同じスロットが割り当てられた時に発生する現象です。
Cardanoでは、1スロットにつき1ブロックしか採用されないため、どのプールのブロックが選ばれるかをVRFのランダム値で決定します。
各プールが生成するVRF値を比較し、最も値が小さいプールのブロックが採用されます。
VRFの比較は完全にランダムであるため、ステーク量による優位性はなく、運次第で結果が決まります。
通称:ハイトバトル(HeightBattle / Ghosted)
Ghostedは、主に次の2つの理由で発生します。
原因1:VRF値による判定(運要素)
ブロック伝播のタイミング差が影響します。
Cardanoでは「ブロックが5秒以内に伝播すれば安全」とされていますが、ブロックサイズやスクリプトメモリの増加に伴い、伝播速度が遅くなることがあります。
その結果、同じスロット周辺(1~3秒以内)に複数のプールにスケジュールが割り当てられると、伝播の遅いブロックが不利になり、VRF値の比較によってどのブロックを採用するかが決定されます。
これは、地理的な伝播速度の差による不公平を避けるための仕組みです。
原因2:サーバー時間のズレ
Cardanoはリアルタイム同期が必須のため、サーバー内部時計がNTPサーバーと正確に同期している必要があります。
予定スケジュールで連続してGhostedが発生する場合は、BPおよびリレーのChrony設定を確認してください。
chronyc tracking
「Leap status」が Normal:問題ありません。
「Leap status」が Not synchronized:問題があります。
確認方法
Missedとなったスロット番号を用いて、ログを確認します。
例:
55901248を実際のMissedのスロット番号に置き換えて実行してください。
cd $NODE_HOME/logs
cat node*.json | grep 55901248
slotsMissedとは?
BPノードは毎秒、スロットリーダーかどうかを確認していますが、ノード状態やサーバー負荷によりチェックが失敗することがあります。
このタイミングでスケジュールが重なるとブロック生成できずMissedになります。
現状では、ノード起動スクリプトにRTSオプションを設定することで軽減可能です。
ただし、契約サーバーの内部仕様(CPU割り当てなど)によっても発生率が変わるため、slotsMissedが多い場合はサーバー乗換えも検討してください。(サーバー内部使用はオペレーター側で変更できません。)
該当スロットのログが表示される場合
ブロック伝播の遅延が原因の可能性があります。
1秒~3秒以内に複数のプールへスケジュールが割り当てられると、自プールのブロック生成時までに最新ブロックを受信できず Missedが発生しやすくなります。
該当スロットのログが表示されない場合
ノードがシャットダウンしていたか、slotsMissedが発生していた可能性があります。
リレー1台構成の場合、そのリレーノードが落ちるとBPは、ブロックを生成できません。
リレーノードが稼働していても、BPノードが停止していれば同様に生成不可となります。
Grafanaなどでノード稼働状態を監視し、停止時にスマホへ通知されるよう設定しておきましょう。
また、Missedとなったスロットの前後、20~30スロットを検索してログが出てくる場合は、ノード自体は稼働していた可能性が高いです。
確認方法
KES更新や運用証明書(opcert)の発行に失敗している可能性がありますのでlogmonitor に表示されるbase64コードをデコードして、原因を特定します。
まずlogmonitorのtmuxセッションにアタッチします。
tmux a -t logmonitor
ログモニターに表示されているecho ~ | base64 -d | jq -rまでのコマンドをコピーします。
以下のコードは一例です。
echo eyJ0aHJlYWQiOiIxMzUiLCJzZXYiOiJFcnJvciIsImRhdGEiOnsidmFsIjp7ImtpbmQiOiJUcmFjZUZvcmdlZEludmFsaWRCbG9jayIsInNsb3QiOjQ5MTY1ODc5LCJyZWFzb24iOnsia2luZCI6IlZhbGlkYXRpb25FcnJvciIsImVycm9yIjp7ImtpbmQiOiJIZWFkZXJQcm90b2NvbEVycm9yIiwiZXJyb3IiOnsiZmFpbHVyZXMiOlt7Im9wQ2VydEV4cGVjdGVkS0VTRXZvbHV0aW9ucyI6IjI1Iiwia2luZCI6IkludmFsaWRLZXNTaWduYXR1cmVPQ0VSVCIsIm9wQ2VydEtFU1N0YXJ0UGVyaW9kIjoiMzU0Iiwib3BDZXJ0S0VTQ3VycmVudFBlcmlvZCI6IjM3OSIsImVycm9yIjoiUmVqZWN0In1dLCJraW5kIjoiQ2hhaW5UcmFuc2l0aW9uRXJyb3IifX19fSwiY3JlZGVudGlhbHMiOiJDYXJkYW5vIn0sImxvYyI6bnVsbCwiZW52IjoiMS4zMi4xOjRmNjVmIiwibXNnIjoiIiwiYXBwIjpbXSwiaG9zdCI6ImlwLTE3Mi0yIiwiYXQiOiIyMDIxLTEyLTI4VDIyOjU2OjEwLjQzWiIsIm5zIjpbImNhcmRhbm8ubm9kZS5Gb3JnZSJdLCJwaWQiOiIzODY1MzAifQ== | base64 -d | jq -r
Ctrl+b dでtmuxからデタッチした後、先ほどコピーしたコマンドをシェルで実行します。
出力されたJSONの"error":"failures":"kind":などの値が失敗した理由を示しています。
{
"thread": "135",
"sev": "Error",
"data": {
"val": {
"kind": "TraceForgedInvalidBlock",
"slot": 49165879,
"reason": {
"kind": "ValidationError",
"error": {
"kind": "HeaderProtocolError",
"error": {
"failures": [
{
"opCertExpectedKESEvolutions": "25",
"kind": "InvalidKesSignatureOCERT",
"opCertKESStartPeriod": "354",
"opCertKESCurrentPeriod": "379",
"error": "Reject"
}
],
"kind": "ChainTransitionError"
}
}
}
},
"credentials": "Cardano"
},
"loc": null,
"env": "1.32.1:4f65f",
"msg": "",
"app": [],
"host": "ip-172-2",
"at": "2021-12-28T22:56:10.43Z",
"ns": [
"cardano.node.Forge"
],
"pid": "386530"
}
Q2. 割り当てられたブロック生成スケジュールをSNSで公開してもいいですか?¶
A. NGです
未来のブロック生成スケジュールを公開すると、その時間を狙って悪意のある攻撃を受ける可能性があります。
このため、予定スケジュールを公開する行為はCardanoネットワークのセキュリティを損なう重大な問題となるため、絶対に公開してはいけません。