Skip to main content

개요

LaserStream은 관리되는 Solana gRPC 스트리밍 서비스입니다. 이는 열린 Yellowstone gRPC 프로토콜과 호환되므로 모든 Yellowstone 클라이언트가 바로 작동하며, 과거 재생, 다중 노드 장애 조치 및 완전 관리 환경과 같은 프로덕션 기능을 추가합니다. LaserStream은 오픈 소스 gRPC 프로토콜을 사용하여 벤더 종속이 없고 기존 gRPC 구현과 최대 호환성을 보장합니다. 표준 @triton-one/yellowstone-grpc 클라이언트로 또는 성능 최적화된 **Helius LaserStream SDK**를 사용하여 더 높은 처리량, 자동 재연결, 구독 관리, 오류 처리 등을 포함한 추가 이점을 얻을 수 있습니다.

LaserStream SDK는 JavaScript Yellowstone 클라이언트 대비 40배 더 빠릅니다

Rust Core와 제로 복사 NAPI 바인딩을 사용하여 JavaScript SDK 성능을 최적화한 방법을 알아보세요.
성능 알림: LaserStream 연결에서 지연이나 성능 문제가 발생하면 문제 해결 섹션을 참조하여 일반적인 원인과 해결책을 확인하세요.

엔드포인트 및 지역

LaserStream은 전 세계 여러 지역에서 사용할 수 있습니다. 최적의 성능을 위해 애플리케이션에 가장 가까운 엔드포인트를 선택하세요:

메인넷 엔드포인트

Devnet 엔드포인트

네트워크 및 지역 선택:
  • 프로덕션 앱의 경우, 서버와 가장 가까운 메인넷 엔드포인트를 선택하세요 (예: 유럽에 배포하는 경우 암스테르담 (ams) 또는 프랑크푸르트 (fra) 사용)
  • 테스트의 경우, 다음을 사용하세요: https://laserstream-devnet-ewr.helius-rpc.com.

zstd 압축

모든 LaserStream gRPC 엔드포인트는 zstd 압축을 지원합니다. 압축은 선택 사항입니다: 응답은 클라이언트가 지원을 광고하지 않는 한 압축되지 않습니다. Helius LaserStream TypeScript SDK에서 zstd를 활성화합니다:
zstd는 네트워크 대역폭을 줄이지만 압축 작업을 추가합니다. 지연 시간이 민감한 스트림에 대해 활성화하기 전에 구독 작업 부하와 벤치마크를 수행하세요.

로그 축약

기본적으로, LaserStream은 더 나은 속도와 성능을 위해 거래 로그 메시지를 10 KB로 축약합니다. 전체 로그가 필요한 경우 전용 비축약 엔드포인트를 사용할 수 있습니다 — 로그 축약을 참조하세요.

빠른 시작

Helius 대시보드에서 LaserStream을 시작하세요. 메인넷은 비즈니스 또는 프로페셔널 플랜이 필요하며, Devnet은 개발자 이상에게 제공됩니다. 자세한 내용은 플랜 및 가격을 참조하세요.
1

새 프로젝트 생성

2

의존성 설치

우리는 tsx를 사용합니다. 기본 npx tsc --init가 TypeScript 5.x에서 verbatimModuleSyntax, module: "nodenext", types: []를 설정하여 빠른 ts-node index.ts 실행을 방해하는 것을 방지합니다. tsx는 tsconfig 없이 .ts 파일을 실행합니다.
3

API 키 획득

Helius 대시보드에서 키를 생성하세요.이 키는 LaserStream의 인증 토큰으로 사용됩니다.
플랜 요구 사항: LaserStream devnet은 모든 플랜에서 사용할 수 있습니다. LaserStream 메인넷은 비즈니스 또는 프로페셔널 플랜이 필요합니다.
4

구독 스크립트 생성

다음을 사용하여 **index.ts**를 생성하세요.
5

API 키 교체 및 지역 선택

index.ts에서 config 객체를 다음으로 업데이트하세요:
  1. Helius 대시보드에서 실제 API 키를 입력하세요
  2. 서버 위치에 가장 가까운 LaserStream 엔드포인트
네트워크 및 지역 선택 예시:
  • 프로덕션 (메인넷):
    • 유럽: fra (프랑크푸르트), ams (암스테르담), 또는 lon (런던) 사용
    • 미국 동부: ewr (뉴욕) 사용
    • 미국 서부: slc (솔트레이크시티) 또는 lax (로스앤젤레스) 사용
    • 아시아: tyo (도쿄) 또는 sgp (싱가포르) 사용
  • 개발 (Devnet):
    • https://laserstream-devnet-ewr.helius-rpc.com 사용
6

실행 및 결과 보기

confirmed 토큰 거래가 TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA와 관련되면, 콘솔에서 데이터를 확인할 수 있습니다.

공통 워크플로우

가장 자주 사용하는 워크플로우에 대한 단계별 가이드입니다. 각 가이드는 자동 재연결 및 히스토리컬 재생 기능이 포함된 helius-laserstream SDK를 사용합니다.

계정 구독

특정 계정의 잔액, 데이터 및 소유권 변화를 필터와 함께 모니터링합니다.

거래 모니터링

대상 계정과 관련된 거래 스트리밍을 통해 프로그램, 투표 또는 실패 상태별로 필터링합니다.

슬롯 및 블록 모니터링

네트워크 합의, 블록 생성 및 커밋 수준 전환을 추적합니다.

거래 데이터 디코딩

이진 transactionUpdate 페이로드를 읽기 쉬운 Solana 거래로 파싱합니다.

스트림 펌프 AMM 데이터

실제 예: 다시 연결 가능한 필터를 사용하여 펌프 AMM 거래를 모니터링합니다.
@triton-one/yellowstone-grpc 클라이언트는 raw Yellowstone 프로토콜을 선호할 경우 동일한 엔드포인트에 대해 작동합니다. 프로토콜 수준의 세부 사항은 Yellowstone gRPC 참고서를 참조하세요.

구독 요청

구독 요청에는 다음의 일반적인 매개변수를 포함해야 합니다:
히스토리컬 재생: 메인 SubscribeRequest 객체에 fromSlot 필드(숫자형 u64)를 포함하여 특정 슬롯부터의 데이터를 재생할 수 있습니다. 재생은 현재 마지막 216,000 슬롯(≈24시간)으로 제한됩니다; ~20분을 넘는 재생은 확정된 데이터만 반환합니다 참고.
enum
커밋먼트 수준을 지정합니다. processed, confirmed, finalized 중 하나를 사용할 수 있습니다.
array
계정에서 필요한 데이터 슬라이스만 수신할 수 있도록 하는 개체 { offset: uint64, length: uint64 }의 배열입니다.
boolean
일부 클라우드 제공업체(예: Cloudflare)는 일정 시간 동안 활동이 없으면 유휴 스트림을 닫을 수 있습니다. 필터를 다시 전송하지 않고 이를 방지하여 연결을 유지하려면 이 값을 true로 설정하세요. 서버는 15초마다 Pong 메시지로 응답합니다.
다음으로, 계정, 블록, 슬롯 또는 거래와 같은 구독할 데이터에 대한 필터를 지정해야 합니다.
슬롯 업데이트에 대한 필터를 정의합니다. 사용자가 사용하는 키 (예: mySlotLabel)는 이 특정 필터 구성에 대한 사용자 정의 레이블로, 필요에 따라 여러 명명된 구성을 정의할 수 있습니다 (일반적으로 하나면 충분합니다).
boolean
기본적으로 모든 커밋먼트 수준의 슬롯이 전송됩니다. 이 필터를 사용하면 선택한 커밋먼트 수준만 수신하도록 설정할 수 있습니다.
boolean
새 슬롯이 시작될 때뿐만 아니라 슬롯 내의 변경 사항에 대한 업데이트도 구독하여 수신할 수 있게 합니다. 더 세분화되고 지연 시간이 짧은 슬롯 데이터가 필요할 때 유용합니다.
계정 데이터 업데이트에 대한 필터를 정의합니다. 사용자가 사용하는 키 (예: tokenAccounts)는 이 특정 필터 구성에 대한 사용자 정의 레이블입니다.
array
제공된 배열의 공개 키와 일치합니다.
array
계정 소유자의 공개 키입니다. 제공된 배열의 모든 공개 키와 일치합니다.
array
getProgramAccounts의 필터와 유사합니다. 이는 datasize 및/또는 memcmp 필터의 배열입니다. memcmp의 경우, 비교자는 bytes, base58 또는 base64 중 하나에 직접 입력됩니다.
enum
지원 중단
Agave 4.2부터 더 이상 작동하지 않음 notifyOn 설정은 아무 영향을 미치지 않습니다. 이 필드는 나중에 제거될 예정입니다.
모든 필드가 비어 있으면 모든 계정이 방송됩니다. 그렇지 않으면:
  • 필드는 논리적 AND로 작동합니다.
  • 배열 내 값은 논리적 OR로 작동합니다 (filters 내에서는 논리적 AND로 작동합니다).
~10,000개 이상의 계정을 추적하고 있나요? 명시적 공개 키 목록(계정당 32바이트) 대신 압축된 cuckoo filter(계정당 약 3–4바이트)를 사용하여 하나의 스트림에서 수십만 개의 계정을 구독할 수 있습니다. Rust 및 JavaScript SDK에서 사용할 수 있습니다.
거래 업데이트에 대한 필터를 정의합니다. 사용자가 사용하는 키 (예: myTxSubscription)는 이 특정 필터 구성에 대한 사용자 정의 레이블입니다.
boolean
투표 트랜잭션 전송을 활성화하거나 비활성화합니다.
boolean
실패한 트랜잭션 전송을 활성화하거나 비활성화합니다.
string
지정된 서명과 일치하는 트랜잭션만 전송합니다.
array
제공된 목록에 있는 계정 중 하나라도 관련된 트랜잭션을 필터링합니다.
array
제공된 목록에 있는 계정 중 하나라도 관련된 트랜잭션을 제외합니다(accountInclude의 반대).
array
제공된 목록의 모든 계정이 관련된 트랜잭션을 필터링합니다(모든 계정이 사용되어야 함).
string
선택적 tokenAccounts(연결된 토큰 계정) 확장입니다. 설정하면 accountInclude 지갑이 SPL 토큰 잔액을 소유하는 트랜잭션과도 일치합니다. 예를 들어 지갑의 공개 키가 아니라 토큰 계정과 관련된 수신 토큰 전송이 이에 해당합니다. "balanceChanged"(잔액 차이와 일치), "all"(모든 참조, 더 많은 데이터), "none"(확장 없음, 기본값)을 사용할 수 있습니다. SDK는 문자열을 전송 계층의 TokenAccountExpansionControlFlag 열거형(yellowstone-grpc-proto 12.5.0+의 일부)으로 변환합니다. 기능과 작동 방식은 토큰 계정(ATA) 필터링을 참조하세요.
boolean
선택적 matchMints 플래그입니다(기본값: false). true로 설정하면 accountInclude, accountExclude, accountRequired 목록을 트랜잭션의 계정 키뿐만 아니라 트랜잭션 전후의 토큰 잔액에 포함된 민트와도 대조합니다. accountInclude에 민트를 추가하면 계정 키에서 해당 민트를 참조하지 않는 일반 SPL 전송을 포함하여 해당 토큰과 관련된 모든 트랜잭션을 수신할 수 있습니다. 선택적으로 활성화할 수 있으며 기존 필터에는 영향을 주지 않습니다. helius-laserstream 0.8.5+(JS), 0.6.4+(Rust) 또는 go/v0.3.0+(Go)가 필요합니다. 의미와 예시는 토큰 민트 필터링을 참조하세요.
모든 필드를 비워 두면 모든 트랜잭션이 전송됩니다. 그렇지 않으면:
  • 필드는 논리적 AND로 작동합니다.
  • 배열 내 값은 논리적 OR로 처리됩니다 (accountRequired의 경우, 모두 일치해야 합니다).
블록 업데이트에 대한 필터를 정의합니다. 사용자가 사용하는 키 (예: myBlockLabel)는 이 특정 필터 구성에 대한 사용자 정의 레이블입니다.
array
제공된 목록에 있는 계정 중 하나라도 관련된 트랜잭션과 계정을 필터링합니다.
boolean
전송에 모든 트랜잭션을 포함합니다.
boolean
전송에 모든 계정 업데이트를 포함합니다.
boolean
전송에 모든 항목을 포함합니다.
이는 거래, 계정 및 항목을 제외한 블록과 유사하게 작동합니다. 사용자가 사용하는 키 (예: blockmetadata)는 이 구독에 대한 사용자 정의 레이블입니다. 현재 블록 메타데이터에 대한 필터는 없습니다 — 기본적으로 모든 메시지가 방송됩니다.
원장 항목을 구독합니다. 사용자가 사용하는 키 (예: entrySubscribe)는 이 구독에 대한 사용자 정의 레이블입니다. 현재로서는 항목에 대한 필터가 제공되지 않으며 모든 항목이 방송됩니다.

코드 예제 (LaserStream SDK)

SDK 옵션

우리는 여러 프로그래밍 언어에 대한 공식 SDK를 제공합니다: 다른 언어나 사용자 정의 구현이 필요한 경우, Yellowstone gRPC proto 파일을 직접 사용하여 원하는 언어용 gRPC 클라이언트를 생성할 수 있습니다.

트러블슈팅 / FAQ

A: LaserStream 연결의 성능 문제는 일반적으로 다음과 같은 이유로 발생합니다:
  • 자바스크립트 클라이언트의 느린 처리 속도: 자바스크립트 클라이언트는 너무 많은 메시지를 처리하거나 너무 많은 대역폭을 소비할 때 뒤처질 수 있습니다. 구독을 더 좁게 필터링하여 메시지 양을 줄이십시오. LaserStream 자바스크립트 SDK로 전환하거나 다른 언어를 사용해보세요.
  • 제한된 로컬 대역폭: 대규모 구독은 제한된 네트워크 대역폭을 가진 클라이언트를 압도할 수 있습니다. 네트워크 사용량을 모니터링하고 연결을 업그레이드하거나 구독 범위를 줄입니다.
  • 지리적 거리: 긴 네트워크 경로는 지연 시간과 패킷 손실을 증가시킵니다. 서버에 가장 가까운 엔드포인트를 사용하세요. 높은 지연 시간의 연결에 대해서는 네트워크 읽기 버퍼 크기를 늘리세요 (대역폭을 5배 이상 향상시킬 수 있습니다):
    재부팅 후에도 유지하려면 /etc/sysctl.conf에 추가합니다:
    HTTP/2 스트림 및 연결 윈도우 크기를 64MB로 늘려 흐름 제어 병목 현상을 방지하세요. 둘 다 필요합니다 — 스트림 윈도우만을 늘리면 연결 수준의 윈도우가 제약이 됩니다:
  • 클라이언트 측 처리 병목: 메시지 처리 로직이 최적화되어 메인 스레드를 장시간 차단하지 않도록 하십시오.
클라이언트 지연 디버깅: 클라이언트를 디버그할 수 있도록 Laserstream gRPC 서버로의 최대 대역폭을 테스트할 수 있는 도구를 만들었습니다. 사용하려면 다음을 실행하세요:
출력은 서버와 Laserstream 서버 간의 최대 네트워크 용량을 반환합니다. 모든 거래 데이터에 구독하려면 최소한 10MB/s가 필요하며 모든 계정 데이터에 구독하려면 80MB/s가 필요합니다. 최적의 성능을 위해 최소한 요구 용량의 2배를 권장합니다.
A: API 키와 엔드포인트가 올바른지 확인하고 지정된 엔드포인트에 대한 gRPC 연결을 허용하는 네트워크인지 확인하세요. Helius 상태 페이지에서 진행 중인 사고가 있는지 확인하세요.
A: 필터 섹션에 설명된 논리 연산자 (AND/OR)를 두 번 확인하세요. 공개 키가 정확한지 확인하세요. 요청에 지정한 커밋 수준을 검토하세요.
A: 네, 하나의 SubscribeRequest 객체 내 여러 키 (예: accounts, transactions) 아래에 필터 구성을 정의할 수 있습니다.
A: 우리는 소비자 그룹을 구현하지 않습니다. 대신, LaserStream은 팀이 원하는 동일한 결과를 제공합니다: 재개, 재생 및 다중 노드 신뢰성을 제공합니다. 대부분의 작업 부하에 대해 소비자 그룹이 필요하지 않으며 지연과 운영 오버헤드를 추가한다고 믿고 있습니다. 예를 들어, 단일 LaserStream gRPC 연결은 Solana의 트랜잭션 + 계정 데이터의 최대 10배를 전송할 수 있으며 대부분의 클라이언트는 작은 필터링된 슬라이스를 구독합니다. 이 경우 소비자 그룹을 사용하면 성능 여유가 소모되고 또 다른 실패 지점이 추가됩니다.
A: LaserStream은 더 나은 속도와 성능을 위해 기본적으로 거래 로그 메시지를 10 KB로 축약합니다. 전체 로그가 필요하면 전용 비축약 엔드포인트에 연결하세요 — 사용 가능한 목록은 로그 축약을 참조하세요.
A: 최초 SubscribeRequestping 필드를 포함하면 LaserStream이 모든 구독 필터를 조용히 무시하게 되어 계정, 거래 또는 슬롯 데이터가 없는 Pong만 반환됩니다. 이를 해결하려면 구독 요청 초기에서 ping를 제거하고 대신 구독이 설정된 후 스트림의 싱크를 통해 별도로 핑을 전송하세요. 이렇게 하면 필터에 영향을 주지 않고 연결을 유지할 수 있습니다.