개요
LaserStream은 관리되는 Solana gRPC 스트리밍 서비스입니다. 이는 열린 Yellowstone gRPC 프로토콜과 호환되므로 모든 Yellowstone 클라이언트가 바로 작동하며, 과거 재생, 다중 노드 장애 조치 및 완전 관리 환경과 같은 프로덕션 기능을 추가합니다. LaserStream은 오픈 소스 gRPC 프로토콜을 사용하여 벤더 종속이 없고 기존 gRPC 구현과 최대 호환성을 보장합니다. 표준@triton-one/yellowstone-grpc 클라이언트로 또는 성능 최적화된 **Helius LaserStream SDK**를 사용하여 더 높은 처리량, 자동 재연결, 구독 관리, 오류 처리 등을 포함한 추가 이점을 얻을 수 있습니다.
LaserStream SDK는 JavaScript Yellowstone 클라이언트 대비 40배 더 빠릅니다
엔드포인트 및 지역
LaserStream은 전 세계 여러 지역에서 사용할 수 있습니다. 최적의 성능을 위해 애플리케이션에 가장 가까운 엔드포인트를 선택하세요:메인넷 엔드포인트
Devnet 엔드포인트
- 프로덕션 앱의 경우, 서버와 가장 가까운 메인넷 엔드포인트를 선택하세요 (예: 유럽에 배포하는 경우 암스테르담 (
ams) 또는 프랑크푸르트 (fra) 사용) - 테스트의 경우, 다음을 사용하세요:
https://laserstream-devnet-ewr.helius-rpc.com.
zstd 압축
모든 LaserStream gRPC 엔드포인트는 zstd 압축을 지원합니다. 압축은 선택 사항입니다: 응답은 클라이언트가 지원을 광고하지 않는 한 압축되지 않습니다.
Helius LaserStream TypeScript SDK에서 zstd를 활성화합니다:
zstd는 네트워크 대역폭을 줄이지만 압축 작업을 추가합니다. 지연 시간이 민감한 스트림에 대해 활성화하기 전에 구독 작업 부하와 벤치마크를 수행하세요.
로그 축약
기본적으로, LaserStream은 더 나은 속도와 성능을 위해 거래 로그 메시지를 10 KB로 축약합니다. 전체 로그가 필요한 경우 전용 비축약 엔드포인트를 사용할 수 있습니다 — 로그 축약을 참조하세요.빠른 시작
새 프로젝트 생성
의존성 설치
tsx를 사용합니다. 기본 npx tsc --init가 TypeScript 5.x에서 verbatimModuleSyntax, module: "nodenext", types: []를 설정하여 빠른 ts-node index.ts 실행을 방해하는 것을 방지합니다. tsx는 tsconfig 없이 .ts 파일을 실행합니다.API 키 획득
구독 스크립트 생성
index.ts**를 생성하세요.API 키 교체 및 지역 선택
index.ts에서 config 객체를 다음으로 업데이트하세요:- Helius 대시보드에서 실제 API 키를 입력하세요
- 서버 위치에 가장 가까운 LaserStream 엔드포인트
- 프로덕션 (메인넷):
- 유럽:
fra(프랑크푸르트),ams(암스테르담), 또는lon(런던) 사용 - 미국 동부:
ewr(뉴욕) 사용 - 미국 서부:
slc(솔트레이크시티) 또는lax(로스앤젤레스) 사용 - 아시아:
tyo(도쿄) 또는sgp(싱가포르) 사용
- 유럽:
- 개발 (Devnet):
https://laserstream-devnet-ewr.helius-rpc.com사용
실행 및 결과 보기
confirmed 토큰 거래가 TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA와 관련되면, 콘솔에서 데이터를 확인할 수 있습니다.공통 워크플로우
가장 자주 사용하는 워크플로우에 대한 단계별 가이드입니다. 각 가이드는 자동 재연결 및 히스토리컬 재생 기능이 포함된helius-laserstream SDK를 사용합니다.
계정 구독
거래 모니터링
슬롯 및 블록 모니터링
거래 데이터 디코딩
transactionUpdate 페이로드를 읽기 쉬운 Solana 거래로 파싱합니다.스트림 펌프 AMM 데이터
구독 요청
구독 요청에는 다음의 일반적인 매개변수를 포함해야 합니다:SubscribeRequest 객체에 fromSlot 필드(u64 숫자)를 선택적으로 포함하여 특정 슬롯부터 데이터를 재생할 수 있습니다. 현재 재생은 최근 약 48시간(현재 네트워크 속도 기준 약 691,200개 슬롯)으로 제한됩니다. 약 20분보다 오래된 데이터를 재생하면 확정된 데이터만 반환된다는 점에 유의하세요.{ offset: uint64, length: uint64 }의 배열입니다.슬롯
슬롯
mySlotLabel)는 이 특정 필터 구성에 대한 사용자 정의 레이블로, 필요에 따라 여러 명명된 구성을 정의할 수 있습니다 (일반적으로 하나면 충분합니다).계정
계정
tokenAccounts)는 이 특정 필터 구성에 대한 사용자 정의 레이블입니다.datasize 및/또는 memcmp 필터의 배열입니다. memcmp의 경우, 비교자는 bytes, base58 또는 base64 중 하나에 직접 입력됩니다.notifyOn 설정은 아무 영향을 미치지 않습니다. 이 필드는 나중에 제거될 예정입니다.- 필드는 논리적 AND로 작동합니다.
- 배열 내 값은 논리적 OR로 작동합니다 (
filters내에서는 논리적 AND로 작동합니다).
거래
거래
myTxSubscription)는 이 특정 필터 구성에 대한 사용자 정의 레이블입니다.accountInclude의 반대).tokenAccounts(연결된 토큰 계정) 확장입니다. 설정하면 accountInclude 지갑이 SPL 토큰 잔액을 소유하는 트랜잭션과도 일치합니다. 예를 들어 지갑의 공개 키가 아니라 토큰 계정과 관련된 수신 토큰 전송이 이에 해당합니다. "balanceChanged"(잔액 차이와 일치), "all"(모든 참조, 더 많은 데이터), "none"(확장 없음, 기본값)을 사용할 수 있습니다. SDK는 문자열을 전송 계층의 TokenAccountExpansionControlFlag 열거형(yellowstone-grpc-proto 12.5.0+의 일부)으로 변환합니다. 기능과 작동 방식은 토큰 계정(ATA) 필터링을 참조하세요.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의 경우, 모두 일치해야 합니다).
블록
블록
블록 메타
블록 메타
blockmetadata)는 이 구독에 대한 사용자 정의 레이블입니다. 현재 블록 메타데이터에 대한 필터는 없습니다 — 기본적으로 모든 메시지가 방송됩니다.항목
항목
entrySubscribe)는 이 구독에 대한 사용자 정의 레이블입니다. 현재로서는 항목에 대한 필터가 제공되지 않으며 모든 항목이 방송됩니다.코드 예제 (LaserStream SDK)
- 슬롯 업데이트
- 계정 업데이트
- 거래 업데이트
- 블록
- 블록 메타데이터
- 항목
- Unary Methods
SDK 옵션
여러 프로그래밍 언어용 공식 SDK를 제공합니다.- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
문제 해결 / FAQ
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
- JavaScript 클라이언트 속도 저하: JavaScript 클라이언트가 너무 많은 메시지를 처리하거나 대역폭을 과도하게 사용하면 지연될 수 있습니다. 메시지 양을 줄이도록 구독 필터의 범위를 더 좁히거나, LaserStream JavaScript SDK로 전환하거나, 다른 언어를 사용해 보세요.
- 제한된 로컬 대역폭: 대규모 구독은 네트워크 대역폭이 제한된 클라이언트에 과부하를 일으킬 수 있습니다. 네트워크 사용량을 모니터링하고 연결을 업그레이드하거나 구독 범위를 줄이는 방안을 고려하세요.
-
지리적 거리: 네트워크 경로가 길면 지연 시간과 패킷 손실이 증가합니다. 서버에서 가장 가까운 엔드포인트를 사용하세요. 지연 시간이 긴 연결에서는 네트워크 읽기 버퍼 크기를 늘리세요. 대역폭을 5배 이상 개선할 수 있습니다.
재부팅 후에도 설정을 유지하려면
/etc/sysctl.conf에 추가하세요.흐름 제어 병목 현상을 방지하려면 HTTP/2 스트림 및 연결 윈도 크기를 64MB로 늘리세요. 둘 다 조정해야 합니다. 스트림 윈도만 늘리면 연결 수준 윈도가 여전히 지배적인 제약 조건으로 남습니다. - 클라이언트 측 처리 병목 현상: 메시지 처리 로직이 최적화되어 있고 오랜 시간 기본 스레드를 차단하지 않는지 확인하세요.
Q: I'm getting connection errors. What should I check?
Q: I'm getting connection errors. What should I check?
Q: Why aren't my filters working as expected?
Q: Why aren't my filters working as expected?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
SubscribeRequest 객체 내 여러 키(예: accounts, transactions)에 필터 구성을 정의할 수 있습니다.Q: Does LaserStream support consumer groups?
Q: Does LaserStream support consumer groups?
Q: Why are my transaction log messages cut off?
Q: Why are my transaction log messages cut off?
Q: Why am I only receiving Pong responses with no account or slot data?
Q: Why am I only receiving Pong responses with no account or slot data?
SubscribeRequest에 ping 필드를 포함하면 LaserStream이 모든 구독 필터를 별도의 알림 없이 무시합니다. 이 경우 계정, 트랜잭션 또는 슬롯 데이터는 전혀 없이 Pong만 반환됩니다. 이 문제를 해결하려면 최초 구독 요청에서 ping을 제거하고, 구독이 설정된 후 스트림의 sink를 통해 ping을 별도로 전송하세요. 이렇게 하면 필터를 방해하지 않으면서 연결을 유지할 수 있습니다.