> ## 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.

# WebSocket経由でのnotifyOnフィルタリング

> LaserStream WebSocketストリームでのアカウント更新をno-opスキップするために、accountSubscribeとprogramSubscribeでnotifyOnオプションを使用して、実際にトランザクションがアカウントに書き込まれたときのみ通知を受け取ります。

[`accountSubscribe`](/docs/ja/api-reference/rpc/websocket/accountsubscribe)および[`programSubscribe`](/docs/ja/api-reference/rpc/websocket/programsubscribe) WebSocketメソッドの`notifyOn`オプションにより、トランザクションが**書き込みロックをかけたが書き込まれていない**アカウントの更新をサブスクリプションからスキップできます。同じフィルタがgRPCでも利用可能です。詳しくは[gRPCのnotifyOnフィルタリング](/docs/ja/laserstream/notify-on-filtering)をご覧ください。

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

Solanaでは、バリデーターはトランザクションが書き込みロックをかけるすべてのアカウントに対してアカウント更新を発行します。これは実際にアカウントに書き込まれていなくても発生し、アカウントのラプソンとデータが変更されなかったとしてもです。多忙なアカウントでは、「何も変わらなかった」という重複通知が連続的に発生し、新しい情報を運ぶことなく帯域を消費します。

## フィルターモード

`notifyOn`は2つの文字列値のいずれかを取ります：

| 値         | 通知が送信される条件                                     | 使用目的                                      |
| --------- | ---------------------------------------------- | ----------------------------------------- |
| `"lock"`  | トランザクションがアカウントに書き込みロックをかけるとき（書き込まれるかどうかにかかわらず） | デフォルト — トランザクションによって単に触れられたアカウントを含む完全な可視性 |
| `"write"` | トランザクションが実際にアカウントに書き込むとき                       | no-opノイズのカット — 大半の消費者は問題なし                |

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

* **同一データの書き込みも書き込みと見なされ**、配信されます。`write`はロックのみのタッチをフィルタリングし、同じバイトが残る書き込みをすることはありません。実際には、これらの同一データの書き込みはまれで、ほとんどの場合更新の5％未満です。
* `write`がドロップする更新は、すでに受け取った状態の正確な重複です。通知を「このアカウントがトランザクションによってロックされた」シグナルとして依存している場合（例：アクティビティ追跡）、`lock`を維持してください。

フィールドを省略したサブスクリプションはこれまで通り動作するため、既存のサブスクリプションに安全に追加できます。

## `accountSubscribe`での使用方法

設定オブジェクトに`notifyOn`を追加します：

```javascript theme={"system"}
const ws = new WebSocket('wss://mainnet.helius-rpc.com/?api-key=<API_KEY>');

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'accountSubscribe',
    params: [
      '<ACCOUNT_PUBKEY>',
      {
        encoding: 'jsonParsed',
        commitment: 'confirmed',
        notifyOn: 'write' // skip no-op updates
      }
    ]
  }));
  setInterval(() => ws.ping(), 30_000);
});

ws.on('message', (data) => {
  const msg = JSON.parse(data.toString());
  if (msg.params?.result) console.log(msg.params.result);
});
```

## `programSubscribe`での使用方法

同じキーが`programSubscribe`設定オブジェクトで機能し、プログラムが所有するすべてのアカウントでno-op更新をフィルタリングします：

```javascript theme={"system"}
ws.send(JSON.stringify({
  jsonrpc: '2.0',
  id: 1,
  method: 'programSubscribe',
  params: [
    '<PROGRAM_ID>',
    {
      encoding: 'jsonParsed',
      commitment: 'confirmed',
      filters: [{ dataSize: 165 }],
      notifyOn: 'write' // skip no-op updates
    }
  ]
}));
```

パースはフェイルオープンであり、`"write"` (大文字小文字を区別しない) のみがオプトインします。他は何でも — 欠如、タイプミス、未知のトークン — は`lock`に解決されるため、ミスが発生してもすべての更新パスを維持します。

## 関連

<CardGroup cols={2}>
  <Card title="accountSubscribe" icon="bolt" href="/docs/ja/api-reference/rpc/websocket/accountsubscribe">
    完全な`accountSubscribe`メソッドリファレンス、`notifyOn`を含む。
  </Card>

  <Card title="programSubscribe" icon="code" href="/docs/ja/api-reference/rpc/websocket/programsubscribe">
    完全な`programSubscribe`メソッドリファレンス、`notifyOn`を含む。
  </Card>

  <Card title="notifyOn Filtering (gRPC)" icon="filter" href="/docs/ja/laserstream/notify-on-filtering">
    LaserStream gRPCアカウントフィルタでの同じフィルタ。
  </Card>

  <Card title="How to Use accountSubscribe" icon="wallet" href="/docs/ja/rpc/websocket/account-subscribe">
    WebSocket経由でのアカウント更新ストリーミングのガイド。
  </Card>
</CardGroup>
