> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# notifyOn フィルタリング

> notifyOnフィルターを使用してLaserStream gRPCストリームで無操作のアカウント更新をスキップし、トランザクションが実際にアカウントに書き込む場合のみ通知を受け取ります。

LaserStreamの`notifyOn`フィルターを使用すると、トランザクションが**書き込みロックを行ったが書き込みが行われなかった**アカウントの更新をスキップできます。同じフィルターは、WebSocketの`accountSubscribe`および`programSubscribe`メソッドでも利用可能です — [WebSocketでのnotifyOnフィルタリング](/docs/ja/rpc/websocket/notify-on-filtering)をご覧ください。

## 問題: 書き込みロックが重複更新を生成する

Solanaでは、バリデーターはトランザクションが書き込みロックしたすべてのアカウントに対してアカウント更新を発行します — たとえそのアカウントに実際に書き込みを行わなかったとしても、その結果そのlamportsとデータが変更されない場合でも。多忙なアカウントにとって、それは「何も変わっていない」という通知が絶え間なく生成され、新しい情報を運ぶことなく帯域を消費することを意味します。

## フィルターモード

`notifyOn`は次の2つの値を取ります:

| 値       | 更新が送信される条件                                  | 用途                                    |
| ------- | ------------------------------------------- | ------------------------------------- |
| `lock`  | トランザクションがアカウントを書き込みロックした場合、それに書き込むかどうかに関わらず | デフォルト — トランザクションが触れたアカウントも含め、全体を可視化する |
| `write` | トランザクションが実際にアカウントに書き込んだ場合                   | 無操作ノイズの削減 — 多くの消費者は何も失いません            |

知っておくべき2つの詳細:

* **同一データの書き込みも書き込みとしてカウント**され、配信されます。`write`は、単なるロックのみのタッチを除外しますが、結果として同じバイトを残す書き込みは除外しません。実際には、これらの同一データの書き込みは稀です — ほとんどの場合、更新の5％未満。
* `write`が削除する更新は、既に受け取った状態の正確なコピーです。更新を「このアカウントがトランザクションによってロックされた」というシグナルとして利用する場合（例: アクティビティトラッキング）、`lock`のままにしてください。

このフィールドを省略したサブスクリプションは、従来と全く同じように動作するため、既存のフィルターに安全に追加できます。

## LaserStream gRPCでの使用

`notifyOn`をアカウントフィルターで設定します: `SubscribeRequest`:

```typescript theme={"system"}
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream';

const subscriptionRequest: SubscribeRequest = {
  accounts: {
    "write-only": {
      account: ['<ACCOUNT_PUBKEY>'],
      owner: [],
      filters: [],
      notifyOn: 'write' // skip no-op updates
    }
  },
  commitment: CommitmentLevel.CONFIRMED,
  transactions: {}, slots: {}, transactionsStatus: {},
  blocks: {}, blocksMeta: {}, entry: {}, accountsDataSlice: [],
};

const config: LaserstreamConfig = {
  apiKey: 'YOUR_API_KEY',
  endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com',
};

await subscribe(config, subscriptionRequest, async (data) => {
  if (data.account) console.log(data.account);
}, async (error) => {
  console.error('Stream error:', error);
});
```

Rust SDKでは、`notify_on: NotifyOn::Write as i32`を設定します。ワイヤーレベルでは、これはENUM値`NOTIFY_ON_LOCK`（デフォルト）および`NOTIFY_ON_WRITE`（1）の`SubscribeRequestFilterAccounts`（protoタグ31）のフィールドです。すべてのアカウントフィルターフィールドの詳細は[サブスクライブリクエストリファレンス](/docs/ja/laserstream/grpc#サブスクライブ要求)を参照してください。

gRPCを通じて、`notifyOn`は[Helius LaserStream SDK](/docs/ja/laserstream/clients)を通じて利用可能なHelius拡張です — ストックYellowstoneクライアントはこのフィールドを公開していません。

## 関連

<CardGroup cols={2}>
  <Card title="サブスクライブリクエストリファレンス" icon="filter" href="/docs/ja/laserstream/grpc">
    `notifyOn`を含むすべてのgRPCアカウントフィルターフィールド。
  </Card>

  <Card title="notifyOnフィルタリング（WebSocket）" icon="bolt" href="/docs/ja/rpc/websocket/notify-on-filtering">
    `accountSubscribe`および`programSubscribe`での同じ`notifyOn`フィールド。
  </Card>

  <Card title="アカウントサブスクリプションガイド" icon="wallet" href="/docs/ja/laserstream/guides/account-subscription">
    フィルタリング戦略とgRPCを介したアカウント監視の実行例。
  </Card>

  <Card title="トークンアカウント（ATA）フィルタリング" icon="coins" href="/docs/ja/laserstream/token-account-filtering">
    ウォレットが所有するトークンアカウントに触れるトランザクションを一致させる。
  </Card>
</CardGroup>
