메인 콘텐츠로 건너뛰기
Sender Max (최소 팁: 0.001 SOL)을 사용하여 사전 확인에 대응하십시오. 사전 확인은 거래를 먼저 기록한 경우에만 유리합니다 — Sender Max는 이를 수행하는 가장 빠른 방법입니다. 사전 확인의 모든 혜택을 누리기 위해 처음부터 Sender Max를 구축하십시오.

preconfSubscribe란 무엇인가요?

preconfSubscribe는 엔트리로 수집되어 shred로 분할되기 전에 전달되는 트랜잭션인 Preconfirmations을 스트리밍하는 Helius WebSocket 메서드입니다. Helius가 제공하는 트랜잭션 신호 중 지연 시간이 가장 짧습니다. 하나의 구독으로 리더가 트랜잭션을 실행하는 즉시 실행 상태와 함께 전송되는 Helius Preconfirmations와, Jito의 Block Assembly Marketplace 클라이언트를 실행하는 검증자가 트랜잭션 실행을 확약할 때 전송하는 BAM Preconfirmations를 모두 받을 수 있습니다. 모든 유료 플랜에서 이용할 수 있습니다. 자세한 내용은 요금을 참조하세요.
스트림은 연속적이지 않습니다. 커버리지는 Helius로 전달되거나 BAM을 실행하는 지분의 비율에 따라 확장되므로 메시지가 없는 슬롯이 있을 수 있습니다 — 이러한 간격을 우아하게 처리하세요. Coverage를 참조하세요.
preconfSubscribe는 mainnet.helius-rpc.com 대신 Helius Gatekeeper 엔드포인트인 wss://beta.helius-rpc.com에서 제공됩니다. API 키로 쿼리 매개변수를 통해 인증하십시오.
beta 호스트명은 Gatekeeper 롤아웃을 언급하며, 사전 확인의 성숙도를 나타내지 않습니다. 사전 확인은 Gatekeeper 엔드포인트에서 처음 시작됩니다; Helius가 트래픽을 Gatekeeper로 마이그레이션하면서 표준 엔드포인트가 될 것입니다.

구독

preconfSubscribe 메서드로 JSON-RPC 요청을 보냅니다. 서버는 구독 ID로 응답한 후 각 트랜잭션에 대한 알림을 스트리밍합니다. 일치하는 트랜잭션만 받으려면 선택적 필터를 첫 번째 params 요소로 전달하세요; params를 생략하면 Helius와 BAM의 전체 스트림을 수신합니다.

구독 응답

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

필터링

기본적으로 preconfSubscribe는 두 소스의 모든 트랜잭션을 스트리밍합니다. 스트림을 좁히려면 필터 객체를 params의 첫 번째 요소로 전달하세요. 필터링은 서버 측에서 이루어지므로 관심 있는 트랜잭션에 대해서만 비용을 지불하고 수신하게 됩니다.
모든 필드는 선택사항입니다 — 필드가 없으면 해당 조건자에 대해 “제한 없음”을 의미하므로, 빈 필터(또는 params가 없는 경우)는 두 소스의 모든 거래와 일치합니다. 필터 규칙:
  • 모든 조건자는 AND로 결합되며 includeSource → failed → regionInclude → signatures → accountExclude → accountRequired → accountInclude → signerExclude → signerInclude → instructions 순서로 평가됩니다.
  • 상태를 알 수 없는 BAM 사전 확인은 failed 필터를 무시합니다. 상태를 알 수 없는 Helius 사전 확인은 명시적인 failed 필터와 일치하지 않습니다.
  • includeSource는 helius와 bam만 포함하는 배열이어야 합니다. 유효하지 않은 값은 JSON-RPC 오류 -32602(유효하지 않은 매개변수)를 반환합니다.
  • 계정은 base58로 인코딩된 공개 키입니다. 유효하지 않은 값은 JSON-RPC 오류 -32602(유효하지 않은 매개변수)를 반환합니다.
  • 각 계정 또는 서명자 목록은 10,000개 항목으로 제한됩니다. signatures는 1,000개 항목으로 제한됩니다.
더 이상 사용되지 않는 includeBam 필터는 이전 버전과의 호환성을 위해 계속 사용할 수 있습니다. includeBam: false는 includeSource: ["helius"]와 같습니다. includeBam: true 또는 생략된 필드는 두 소스를 모두 선택합니다. includeBam와 includeSource를 함께 전송하지 마세요.
Helius 사전 확인만 수신하려면 다음과 같이 설정하세요.

서명자 및 서명 필터링

특정 계정이 서명한 트랜잭션을 일치시키려면 signerInclude를 사용하세요. 나열된 계정 중 하나라도 서명한 트랜잭션을 제거하려면 signerExclude를 사용하세요. 참조된 계정은 서명자로 간주되지 않습니다. 추적할 트랜잭션을 이미 알고 있다면 signatures를 사용하세요. 이 필터는 Solana RPC 메서드에서 사용하는 서명인 첫 번째 트랜잭션 서명과 일치합니다. 구독 후에는 필터를 변경할 수 없으므로 새 서명을 추적하려면 새 구독을 생성하세요.

명령 필터링

프로그램 및 명령 데이터별로 최상위 명령을 일치시키려면 instructions를 사용하세요. 각 명령 필터는 다음 필드를 지원합니다. 각 memcmp 항목은 base58, base64 또는 hex 인코딩을 허용합니다. 기본값은 base58입니다. 하나의 최상위 명령이 명령 필터 중 하나의 모든 조건을 통과하면 트랜잭션이 일치합니다. 다음 요청은 Anchor 식별자를 기준으로 pump.fun buy 명령과 일치합니다.
필터는 최상위 명령만 확인합니다. 교차 프로그램 호출(CPI)을 통해 호출되는 명령은 실행 전에 존재하지 않으므로 일치시킬 수 없습니다. 최대 16개의 명령 필터를 제공할 수 있으며, 각 명령 필터에는 최대 4개의 memcmp 항목을 제공할 수 있습니다. 각 memcmp 값은 디코딩 시 1~128바이트여야 합니다. memcmp 종료 오프셋과 dataSize는 4,096바이트를 초과할 수 없습니다.

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

계정 필터는 트랜잭션의 정적 계정 키뿐만 아니라 더 많은 항목과 일치합니다. Helius가 서버 측에서 v0 주소 조회 테이블을 해석하므로 accountInclude, accountExclude 및 accountRequired는 트랜잭션이 ALT를 통해 로드하는 계정과도 일치합니다. 즉, 조회 테이블을 통해서만 나타나는 계정도 포함하여 트랜잭션이 사용하는 모든 계정을 필터링할 수 있습니다. ALT 매핑을 유지하거나 테이블을 직접 해석할 필요가 없습니다. 계정의 공개 키만 전달하면 필터를 적용하기 전에 Helius가 해석을 처리합니다.

위치 필터링

특정 리전에서 시작된 트랜잭션만 수신하려면 regionInclude를 사용하세요. 하나 이상의 리전 코드를 전달하면 트랜잭션의 출발 리전이 그중 하나와 일치할 때 통과합니다.
출발 리전은 소스에 따라 다릅니다. Helius 사전 확인의 경우 트랜잭션을 수집한 Helius 리전입니다. BAM 사전 확인의 경우 Helius가 트랜잭션을 수집한 위치가 아니라 사전 확인을 내보낸 지역 BAM 엔드포인트입니다. BAM의 싱가포르 및 댈러스 엔드포인트는 sgp 및 dal에 매핑됩니다. 유효한 리전 코드:
regionInclude가 설정된 경우 리전 정보가 없는 트랜잭션은 삭제됩니다. 인식할 수 없는 리전 코드는 JSON-RPC 오류 -32602(유효하지 않은 매개변수)를 반환합니다.

알림 페이로드

알림은 JSON이 아닌 바이너리 WebSocket 프레임으로 전달됩니다. Helius와 BAM 사전 확인은 동일한 레이아웃을 공유합니다. 각 프레임은 단일 트랜잭션을 포함하는 압축된 바이트 레이아웃입니다. 페이로드에는 소스 필드가 없습니다. 다른 소스도 0를 보고할 수 있으므로 tx_index = 0에서 BAM 출처를 추론하지 마세요.

두 소스 구분하기

소스 필드가 없으므로 임의의 메시지를 Helius 또는 BAM으로 분류할 수 없습니다. status 바이트는 단방향 분류 기준을 제공합니다.
  • status가 0 또는 1인 경우 — 메시지는 Helius 사전 확인이며 트랜잭션이 실행되었습니다. BAM은 이러한 값을 보고하지 않습니다.
  • status가 2인 경우 — 소스가 명확하지 않습니다. BAM 사전 확인이거나 실행 상태를 확인할 수 없는 Helius 사전 확인입니다.
다른 필드로는 구분할 수 없습니다. 이 스트림에는 BAM의 시퀀스 ID와 번들 위치가 포함되지 않으므로 기준으로 사용할 BAM 순서 메타데이터가 없습니다. 또한 regionInclude는 페이로드 필드가 아니라 구독 필터이므로 메시지별로 읽을 수 없습니다. 스트림의 모든 메시지에 동일한 종류의 근거를 포함하려면 includeSource: ["helius"] 또는 includeSource: ["bam"]를 설정하세요. Helius 전용 스트림에는 리더 실행 시 내보낸 사전 확인이 포함됩니다.
항상 version 바이트를 먼저 읽고 확인하세요. 현재 값은 1입니다. Helius가 페이로드 형식을 업데이트해야 하는 경우 버전이 증가합니다. 스키마가 변경되어도 디코더가 계속 작동하도록 버전에 따라 분기하세요.
사전 확인은 초기 신호일 뿐 보장하지 않습니다. 트랜잭션은 아직 온체인에 포함되지 않았으며 여전히 삭제될 수 있습니다. 또한 Helius 사전 확인의 실행 상태는 리더의 로컬 결과를 반영하므로 블록이 확인되기 전까지는 최종 상태가 아닙니다. 최종 상태로 처리하기 전에 표준 커밋 수준 검사를 통해 포함 여부를 확인하세요.

트랜잭션 디코딩

트랜잭션 바이트는 트랜잭션 버전의 표준 와이어 인코딩을 사용하여 검증자가 직렬화한 그대로 전달됩니다. 레거시 및 v0 트랜잭션은 bincode가 생성하는 서명 우선 레이아웃을 사용합니다. 트랜잭션 v1(SIMD-0385)은 서명이 끝에 있는 메시지 우선 레이아웃을 사용하므로 bincode는 v1 페이로드에서 실패합니다. 모든 버전을 처리하는 디코더를 사용하세요.
  • Rust: agave-transaction-view는 중간 복사본 없이 레거시, v0 및 v1 트랜잭션을 제자리에서 파싱합니다. 이 옵션을 권장합니다. 현재 Solana SDK에서 사용하는 bincode 호환 직렬화 도구인 wincode도 v1을 VersionedTransaction로 디코딩합니다.
  • JavaScript / TypeScript: 라이브러리 버전이 트랜잭션 v1을 지원하는지 확인하세요. 이전 VersionedTransaction.deserialize 구현은 레거시 및 v0만 처리합니다. @solana/kit 8.0 이상 또는 @solana/web3.js v3을 사용하세요. 트랜잭션 v1 지원을 참조하세요.

중복 알림

Helius와 BAM 사전 확인은 소스 간이 아니라 소스별로 중복 제거됩니다. 일부 트랜잭션은 두 경로를 모두 통해 Helius에 도달하므로 동일한 서명을 두 번 수신할 수 있으며, 두 사본이 서로 다른 슬롯을 보고할 수도 있습니다. 클라이언트에서 서명별로 중복을 제거하고 트랜잭션으로 트리거되는 작업을 멱등성 있게 만들어 두 번째 알림이 같은 작업을 다시 실행하지 않도록 하세요. 표준 커밋 수준 검사를 통해 실행 및 포함 여부를 확인하세요.

예시

구독 해지

알림 수신을 중지하려면 preconfSubscribe에서 반환된 구독 ID로 preconfUnsubscribe를 호출하세요.

요금

Preconfirmations는 Developer, Business, Professional, Enterprise 등 모든 유료 플랜에서 이용할 수 있습니다. 무료 플랜에서는 이용할 수 없습니다. 자세한 내용은 크레딧을 참조하세요. Preconfirmations 커버리지가 있는 슬롯이라도 전달된 메시지가 0개이면 크레딧이 청구되지 않습니다. 슬롯에서 하나 이상의 메시지가 전달되면 열려 있는 각 preconfSubscribe 구독에 300크레딧과 전달된 메시지당 10크레딧 중 더 큰 금액이 청구됩니다. 커버되지 않는 슬롯에는 크레딧이 청구되지 않습니다. 소스 및 리전별 청구 적용 여부는 요금을 참조하세요. 동시 구독은 하나 이상의 메시지를 수신하면 각각 독립적으로 요금이 청구됩니다. 더 이상 필요하지 않은 구독은 preconfUnsubscribe로 종료하세요. includeSource: ["helius"]를 사용하면 BAM만 커버되는 슬롯은 요금 청구에서 제외됩니다. regionInclude를 설정하면 선택한 리전 외부의 커버된 슬롯에는 해당 구독의 요금이 청구되지 않습니다. 일치하는 슬롯은 구독이 하나 이상의 메시지를 수신한 경우에만 요금이 청구됩니다. 요금은 고유 서명당이 아니라 메시지당 부과됩니다. Helius와 BAM 모두에서 전달된 트랜잭션은 두 번 계산됩니다. Helius 사전 확인만 원한다면 includeSource: ["helius"]를 설정하세요.
비용을 관리하려면 가능한 경우 계정 필터를 하나의 구독으로 통합하고, regionInclude를 사용하여 필요한 리전으로 청구 범위를 제한하며, BAM이 필요하지 않으면 includeSource: ["helius"]를 설정하고, Helius Dashboard에서 크레딧을 모니터링하세요.
Preconfirmations는 새로운 제품이며 요금은 변경될 수 있습니다.

관련 문서

Preconfirmations Overview

Preconfirmations의 정의와 검증자 파이프라인에서의 위치를 알아봅니다.

transactionSubscribe

다양한 필터링을 사용하여 confirmed 커미트먼트 트랜잭션을 스트리밍합니다.

preconfSubscribe API reference

요청 매개변수, 필터 필드, 바이너리 알림 레이아웃을 알아봅니다.