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

# preconfSubscribe 사용 방법

> preconfSubscribe WebSocket 메서드를 사용하여 가능한 가장 낮은 대기 시간으로 예정된 Solana 거래를 스트리밍하십시오. 구독하고, 페이로드를 디코드하고, 거래가 기록되기 전에 반응합니다.

<Tip>
  **[Sender Max](/docs/ko/sending-transactions/sender-max) (최소 팁: 0.001 SOL)을 사용하여 사전 확인에
  대응하십시오.** 사전 확인은 거래를 먼저 기록한 경우에만 유리합니다 — Sender Max는
  이를 수행하는 가장 빠른 방법입니다. 사전 확인의 모든 혜택을 누리기 위해 처음부터 Sender Max를
  구축하십시오.
</Tip>

## `preconfSubscribe`란 무엇인가요?

`preconfSubscribe`는 Helius WebSocket 메서드로, [사전 확인](/docs/ko/pre-confirmations/overview) — 즉, 분해되기 전에 예정된 거래 단계를 전달합니다. 이는 Helius가 제공하는 가장 낮은 대기 시간의 거래 신호입니다. [Professional 플랜 이상의 가입이 필요합니다](/docs/ko/billing/plans) — [가격](#가격)을 참조하세요.

<Note>
  스트림은 연속적이지 않습니다. 커버리지는 Helius로 전달된 지분의 비율에 비례하므로, 메시지가 없는 슬롯이 존재할 수 있습니다 — 이러한 간극을 잘 처리하십시오. [커버리지](/docs/ko/pre-confirmations/overview#커버리지)를 참조하세요.
</Note>

`preconfSubscribe`는 `mainnet.helius-rpc.com` 대신 Helius [Gatekeeper](/docs/ko/gatekeeper/overview) 엔드포인트인 `wss://beta.helius-rpc.com`에서 제공됩니다. API 키로 쿼리 매개변수를 통해 인증하십시오.

```
wss://beta.helius-rpc.com/?api-key=<API_KEY>
```

<Note>
  `beta` 호스트명은 [Gatekeeper](/docs/ko/gatekeeper/overview) 롤아웃을 언급하며,
  사전 확인의 성숙도를 나타내지 않습니다. 사전 확인은 Gatekeeper 엔드포인트에서 처음
  시작됩니다; Helius가 트래픽을 Gatekeeper로 마이그레이션하면서 표준 엔드포인트가 될 것입니다.
</Note>

## 구독

`preconfSubscribe` 메서드를 사용하여 JSON-RPC 요청을 전송하십시오. 서버는 구독 ID로 응답한 후 각 예정된 거래에 대한 알림을 스트리밍합니다. 일치하는 거래만 받기 위해 첫 번째 `params` 요소로 선택적 [필터](#필터링)를 전달하십시오; 전체 스트림을 받으려면 `params`를 생략하십시오.

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "preconfSubscribe"
}
```

### 구독 응답

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": 24040,
  "id": 1
}
```

`result`를 저장하십시오 — 이는 [구독 취소](#구독-취소)에 사용되는 구독 ID입니다. 이 확인 후, 알림은 바이너리 프레임으로 스트리밍됩니다 (아래 참조).

## 필터링

기본적으로 `preconfSubscribe`는 모든 예정된 거래를 스트리밍합니다. 스트림을 좁히려면 첫 번째 요소로 필터 개체를 `params`에 전달하십시오. 필터링은 서버 측에서 수행되므로, 관심 있는 거래만 받으며 비용을 지불합니다.

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "preconfSubscribe",
  "params": [
    {
      "failed": false,
      "regionInclude": ["ewr", "fra"],
      "accountInclude": ["9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM"],
      "accountExclude": ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],
      "accountRequired": ["11111111111111111111111111111111"]
    }
  ]
}
```

모든 필드는 선택적입니다 — 필드가 없는 경우 해당 조건에 대한 제한이 없습니다, 따라서 빈 필터 (또는 `params` 없음)는 모든 거래에 일치합니다.

| Field             | Type       | Semantics                                                                                        |
| ----------------- | ---------- | ------------------------------------------------------------------------------------------------ |
| `failed`          | `boolean`  | `false`는 실패한 (되돌려진) 거래를 제외합니다; 성공 및 상태가 미확인인 거래는 여전히 통과합니다. `true` — 필드 생략과 동일하게 — 모든 상태를 유지합니다. |
| `regionInclude`   | `string[]` | 값을 비워두지 않으면, 거래는 **이 중 하나**의 [지역](#지역-필터링)에서 시작해야 합니다.                                           |
| `accountInclude`  | `string[]` | 값을 비워두지 않으면, 거래는 **이 중 하나**의 계정을 참조해야 합니다.                                                       |
| `accountExclude`  | `string[]` | 거래가 **이 중 하나**의 계정을 참조하면 삭제됩니다. `accountInclude`보다 우선합니다.                                        |
| `accountRequired` | `string[]` | 거래는 **이 모든** 계정을 참조해야 합니다.                                                                       |

필터 규칙:

* 모든 조건자는 AND로 결합되어 평가 순서는 `regionInclude` → `accountExclude` → `accountRequired` → `accountInclude`입니다.
* 계정은 base58로 인코딩된 공개키입니다. 잘못된 값은 JSON-RPC 오류 `-32602` (잘못된 매개변수)를 반환합니다.
* 각 계정 목록은 **500**개 항목으로 제한됩니다.

### 주소 조회 테이블 (ALT) 해석

계정 필터는 거래의 정적 계정 키보다 더 많은 것을 일치합니다 — Helius는 v0 [주소 조회 테이블](/docs/ko/glossary#address-lookup-table-alt)을 서버 측에서 해석하므로 `accountInclude`, `accountExclude` 및 `accountRequired`는 거래가 ALT를 통해 로드하는 계정도 일치합니다.

이렇게 하면 조회 테이블 뒤에만 나타나더라도 거래가 건드리는 모든 계정에 대해 필터링 할 수 있습니다 — ALT 매핑을 유지하거나 테이블을 직접 해석할 필요가 없습니다. 계정의 공개키를 전달하면 Helius가 필터링이 적용되기 전에 해석을 처리합니다.

### 지역 필터링

특정 Helius 지역에서 시작된 거래만 받으려면 `regionInclude`를 사용하십시오. 하나 이상의 지역 코드를 전달하십시오; 거래의 원산지 지역이 이 중 하나와 일치하면 거래가 통과됩니다.

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "preconfSubscribe",
  "params": [{ "regionInclude": ["ewr", "fra"] }]
}
```

유효한 지역 코드는 다음과 같습니다:

| Code  | Location |
| ----- | -------- |
| `slc` | 솔트레이크시티  |
| `fra` | 프랑크푸르트   |
| `lon` | 런던       |
| `pit` | 피츠버그     |
| `sgp` | 싱가포르     |
| `ewr` | 뉴어크      |
| `tyo` | 도쿄       |
| `ams` | 암스테르담    |
| `dal` | 댈러스      |
| `dub` | 더블린      |
| `mia` | 마이애미     |
| `lax` | 로스앤젤레스   |
| `iad` | 애시번      |
| `sea` | 시애틀      |

<Note>
  `regionInclude`가 설정되면 지역 정보를 포함하지 않은 거래는 삭제됩니다. 인식되지 않은 지역 코드는 JSON-RPC 오류 `-32602` (잘못된 매개변수)를 반환합니다.
</Note>

## 알림 페이로드

알림은 **바이너리** WebSocket 프레임으로 전달됩니다 (JSON 아님). 각 프레임은 단일 예정된 거래를 전송하는 압축 바이트 레이아웃입니다:

| Bytes | Field         | Type                            | Description                                                                              |
| ----- | ------------- | ------------------------------- | ---------------------------------------------------------------------------------------- |
| 0     | `version`     | `u8`                            | 페이로드 스키마 버전. 현재 `1`입니다.                                                                  |
| 1–8   | `slot`        | `u64` (little-endian)           | 거래가 예정된 슬롯.                                                                              |
| 9–16  | `tx_index`    | `u64` (little-endian)           | 슬롯 내 거래의 인덱스.                                                                            |
| 17    | `status`      | `u8`                            | 거래 상태: `0` = 실패, `1` = 성공, `2` = 알 수 없음. 실행 상태는 가능한 최선을 다해 검증자가 보고합니다 — 사용할 수 없는 경우 `2`. |
| 18+   | `transaction` | `bincode(VersionedTransaction)` | bincode-직렬화된 예정된 거래.                                                                     |

필드를 순서대로 읽은 다음, 남은 바이트를 `VersionedTransaction`로 [`bincode`](https://docs.rs/bincode)-역직렬화하여 명령, 계정 및 서명을 읽습니다.

<Warning>
  **`version` 바이트를 먼저 읽고 확인하십시오.** 현재 `1`입니다. Helius가 페이로드 형식을 업데이트해야 하는 경우, 버전은 증가합니다 — 귀하의 디코더가 스키마 변경을 통해 계속 작동하도록 분기하십시오.
</Warning>

<Note>
  사전 확인은 초기 신호이지 보장이 아닙니다. 거래는 아직 온체인에 기록되지 않았으며 실패하거나 삭제될 수 있습니다. 마지막으로 처리하기 전에 표준 커밋 확인을 통해 기록 여부를 확인하십시오.
</Note>

## 예시

```javascript theme={"system"}
const WebSocket = require('ws');

const ws = new WebSocket('wss://beta.helius-rpc.com/?api-key=<API_KEY>');

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'preconfSubscribe'
    // Optional: only successful txs from EWR/FRA touching a given account
    // params: [{ failed: false, regionInclude: ['ewr', 'fra'], accountInclude: ['9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM'] }]
  }));

  // Keep the connection alive
  setInterval(() => ws.ping(), 30_000);
});

ws.on('message', (data, isBinary) => {
  // The subscribe acknowledgement arrives as a JSON text frame
  if (!isBinary) {
    const msg = JSON.parse(data.toString());
    if (msg.id === 1) console.log('Subscribed, ID:', msg.result);
    return;
  }

  // Notifications arrive as binary frames:
  // version (u8) | slot (u64 LE) | tx_index (u64 LE) | status (u8) | bincode(VersionedTransaction)
  const buf = Buffer.from(data);
  const version = buf.readUInt8(0); // currently 1 — branch on this if it changes
  if (version !== 1) return; // unknown schema version; update your decoder
  const slot = buf.readBigUInt64LE(1);
  const txIndex = buf.readBigUInt64LE(9);
  const status = buf.readUInt8(17); // 0 = failed, 1 = success, 2 = unknown
  const txBytes = buf.subarray(18); // bincode-serialized VersionedTransaction

  console.log('Scheduled transaction:', { version, slot, txIndex, status, bytes: txBytes.length });
  // Deserialize txBytes (bincode) into a VersionedTransaction with your Solana tooling
});

ws.on('error', console.error);
ws.on('close', () => process.exit(1));
```

## 구독 취소

알림 수신을 중지하려면 `preconfSubscribe`에서 반환된 구독 ID를 사용하여 `preconfUnsubscribe`을 호출하십시오.

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "preconfUnsubscribe",
  "params": [24040]
}
```

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": true,
  "id": 2
}
```

## 가격

사전 확인은 **Professional 플랜 이상**이 필요하며 **메시지당 10 크레딧**이 소요됩니다 — 스트리밍된 거래당 한 메시지입니다 — 폐하의 플랜에서 청구됩니다. 자세한 내용은 [크레딧](/docs/ko/billing/credits)을 참조하세요.

<Note>
  사전 확인은 새로운 제품이며 가격은 변경될 수 있습니다.
</Note>

## 관련 항목

<CardGroup cols={2}>
  <Card title="사전 확인 개요" icon="bolt" href="/docs/ko/pre-confirmations/overview">
    사전 확인이란 무엇이며 검증자 파이프라인에서의 위치.
  </Card>

  <Card title="transactionSubscribe" icon="tower-broadcast" href="/docs/ko/rpc/websocket/transaction-subscribe">
    풍부한 필터링으로 확인된 커밋 거래를 스트리밍합니다.
  </Card>

  <Card title="preconfSubscribe API 참조" icon="code" href="/docs/ko/api-reference/pre-confirmations/preconfsubscribe">
    요청 매개변수, 필터 필드 및 바이너리 알림 레이아웃.
  </Card>
</CardGroup>
