notifyOnフィルターを使用すると、トランザクションが書き込みロックを行ったが書き込みが行われなかったアカウントの更新をスキップできます。同じフィルターは、WebSocketのaccountSubscribeおよびprogramSubscribeメソッドでも利用可能です — WebSocketでのnotifyOnフィルタリングをご覧ください。
問題: 書き込みロックが重複更新を生成する
Solanaでは、バリデーターはトランザクションが書き込みロックしたすべてのアカウントに対してアカウント更新を発行します — たとえそのアカウントに実際に書き込みを行わなかったとしても、その結果そのlamportsとデータが変更されない場合でも。多忙なアカウントにとって、それは「何も変わっていない」という通知が絶え間なく生成され、新しい情報を運ぶことなく帯域を消費することを意味します。フィルターモード
notifyOnは次の2つの値を取ります:
知っておくべき2つの詳細:
- 同一データの書き込みも書き込みとしてカウントされ、配信されます。
writeは、単なるロックのみのタッチを除外しますが、結果として同じバイトを残す書き込みは除外しません。実際には、これらの同一データの書き込みは稀です — ほとんどの場合、更新の5%未満。 writeが削除する更新は、既に受け取った状態の正確なコピーです。更新を「このアカウントがトランザクションによってロックされた」というシグナルとして利用する場合(例: アクティビティトラッキング)、lockのままにしてください。
LaserStream gRPCでの使用
notifyOnをアカウントフィルターで設定します: SubscribeRequest:
notify_on: NotifyOn::Write as i32を設定します。ワイヤーレベルでは、これはENUM値NOTIFY_ON_LOCK(デフォルト)およびNOTIFY_ON_WRITE(1)のSubscribeRequestFilterAccounts(protoタグ31)のフィールドです。すべてのアカウントフィルターフィールドの詳細はサブスクライブリクエストリファレンスを参照してください。
gRPCを通じて、notifyOnはHelius LaserStream SDKを通じて利用可能なHelius拡張です — ストックYellowstoneクライアントはこのフィールドを公開していません。
関連
サブスクライブリクエストリファレンス
notifyOnを含むすべてのgRPCアカウントフィルターフィールド。notifyOnフィルタリング(WebSocket)
accountSubscribeおよびprogramSubscribeでの同じnotifyOnフィールド。アカウントサブスクリプションガイド
フィルタリング戦略とgRPCを介したアカウント監視の実行例。
トークンアカウント(ATA)フィルタリング
ウォレットが所有するトークンアカウントに触れるトランザクションを一致させる。