コンテンツにスキップ

LocalMessageSubmissionのリプレイ保護

このガイドでは、gOuroboros v0.213.7で追加された認証済みLocalMessageSubmissionメッセージのリプレイ保護について説明します。リプレイ保護は、メッセージのExpiresAtが過ぎるまで、認証済みメッセージIDを保持します。

有効期限内の同じメッセージIDを受信すると、最初に予約に成功した送信だけがSubmitMessageFuncに到達します。サーバーは、アプリケーションコールバックを実行する前にIDを予約し、同じIDの後続送信を拒否します。

詳細はLocalMessageSubmission APIリファレンスと、gOuroboros v0.213.7のリリース情報を参照してください。

Config.MaxReplayEntriesは、期限切れになるまで保持する認証済みメッセージIDの最大数を指定します。NewConfigは既定値として10,000を設定します。ゼロを指定した場合も、この既定値が使用されます。localmessagesubmission.WithMaxReplayEntries(...)を使用すると、保持数を変更できます。

config := localmessagesubmission.NewConfig(
localmessagesubmission.WithMaxReplayEntries(10000),
)

接続をまたぐリプレイ状態が必要な場合は、Configを接続の受け付けループの外側で構築します。共有方法の詳細は「接続間での利用」を参照してください。

ホストが複数の接続を処理する場合、1つのConfigインスタンスをすべてのLocalMessageSubmissionサーバーに渡します。同じConfigから作成した接続は、認証済みメッセージIDの予約状態を共有します。そのため、ある接続で受け付けたIDを別の接続から再送しても、SubmitMessageFuncには到達しません。

NewConfigを接続ごとに呼び出すと、各設定が別々のリプレイ状態を持ちます。別々のConfigインスタンスは重複を相互に検出しないため、接続の受け付けループ内でNewConfigを呼び出さないでください。

  • 同じメッセージIDを有効期限内に再送すると、サーバーはpcommon.AlreadyReceivedReasonで拒否します。連続した再送と、共有されたConfigを使う接続からの同時送信のどちらも同じ動作になります。
  • サーバーは、リプレイ状態から期限切れのIDを削除してから新しいIDを予約します。MaxReplayEntriesに達した場合、期限切れのIDが削除されるまで新しいIDを拒否します。
  • MaxReplayEntriesに負の値を設定すると、サーバーは送信をアプリケーションコールバックへ渡す前に拒否します。

リプレイ保護は認証と有効期限の検証を通過したメッセージに適用します。予約に成功したIDだけがSubmitMessageFuncへ進み、コールバックが受け付けた場合はサーバーがメッセージを受け付けます。コールバックが拒否した場合も、予約済みIDはExpiresAtまでリプレイ保護の対象になります。


Doc Holiday logo

Docs authored by Doc Holiday