
Sender와 LaserStream으로 제로 슬롯 실행 달성하기
소개
누구나 트랜잭션이 최대한 빠르게 처리되기를 원합니다. 하지만 Solana 거래 인프라가 고도화되고 온체인 시장이 성숙하면서, 단순히 트랜잭션을 전송하고 잘 처리되기를 바라는 것만으로는 부족합니다. 혼잡, 경쟁, 네트워크의 특성 때문에 ‘빠른 처리’가 ‘답답할 정도로 불안정한 처리’로 바뀔 수 있습니다.
목표는 명확합니다. 가격이 특정 임계값을 넘거나, 계정이 업데이트되거나, 프로그램이 호출되는 등 신호가 발생하면 이에 반응하는 트랜잭션이 같은 슬롯에 포함되어야 합니다.
이것이 바로 제로 슬롯 실행의 핵심입니다. 감지와 제출이 매끄럽게 이어져 밀리초 만에 사라지는 기회를 포착합니다.
실제로 이를 달성하기는 갈수록 어려워지고 있습니다. 지연 시간이 극히 낮은 신호 수집과 안정적이고 결정론적인 전송이 필요합니다.
Helius는 이 두 가지를 모두 제공합니다.
Helius는 초고속 이벤트 감지를 위한 LaserStream과 최적화된 트랜잭션 제출을 위한 Sender를 결합해 제로 슬롯 실행에 특화된 엔드투엔드 파이프라인을 제공합니다.
여러 인프라를 이어 붙일 필요도, 추측도, 낭비되는 사이클도 없습니다. 가장 빠른 신호와 리더까지의 가장 빠른 경로만 제공합니다. 거래 운영에 경쟁 우위를 더하도록 설계되었습니다.
Sender는 제 트랜잭션을 거의 즉시, 대부분 단일 슬롯 안에 포함해 다른 서비스를 꾸준히 앞섭니다. 이전에는 슬롯 지연 시간이 길어 수익성 높은 거래를 자주 놓쳤지만, 이제는 포함이 거의 보장되며 훨씬 안정적입니다. Helius는 늘 훌륭한 서비스를 제공해 왔고, Sender 역시 제 성과를 직접 높여준 뛰어난 서비스입니다.
LaserStream 무료 체험을 신청하고 Solana의 진정한 속도를 경험해 보세요.
LaserStream과 Sender: 통합 워크플로
Sender는 LaserStream과 결합해 Solana의 반응형 거래 워크플로를 위한 매끄러운 엔드투엔드 파이프라인을 구성합니다. 실제 과정은 다음과 같습니다.
- LaserStream으로 신호 수신: 샤드 수준의 수집과 고급 필터링으로 다른 어떤 파이프라인보다 빠르게 실시간 온체인 이벤트를 전달합니다.
- Helius Sender로 신호에 반응: SWQoS와 Jito를 통해 트랜잭션을 동시에 전송합니다. 글로벌 라우팅과 검증인 인식 전송으로 포함률은 높이고 지연 시간은 줄입니다.
- 수익 창출: 두 서비스를 함께 사용하면 이론에 그치지 않고 실제로 수익성 높은 기회를 확보할 수 있습니다.
Helius를 사용하면 개발자는 속도와 안정성에 특화된 수직 통합 스택을 활용할 수 있습니다.
- 타사 RPC, 릴레이 또는 자체 구축 인프라를 이어 붙일 필요가 없습니다.
- 글로벌 라우팅, 자동 재시도, 검증인 인식 전송이 기본 제공됩니다.
- 투명하고 공정합니다. Helius는 사용자를 의도적으로 샌드위치 공격하지 않으며, 사용자에게 불리한 어떤 형태의 MEV도 추출하지 않습니다.
Helius는 이미 LaserStream으로 업계 최고 수준의 신호 감지를 제공합니다. 여기에 업계 최고 수준의 트랜잭션 전송 서비스인 Sender를 결합하지 않을 이유가 없습니다.
두 서비스를 함께 사용하면 밀리초가 중요한 Solana 워크플로를 위한 하나의 통합 파이프라인이 완성됩니다. 결정론적이고 수익성 높은 결과를 위해 읽기-쓰기 루프는 Helius에 맡기세요.
그렇다면 실제로는 어떻게 작동할까요?
적절한 신호 찾기
Solana에서는 차익거래와 청산 기회가 밀리초 만에 사라질 수 있습니다. 적절한 온체인 신호를 제때 감지하는 것이 무엇보다 중요합니다. 여기서 ‘신호’란 토큰 전송, 계정 업데이트, 프로그램 호출처럼 거래 기회를 제공하는 모든 실시간 이벤트를 의미합니다. 지연 시간이 극히 낮은 수집 환경이 없으면 대응하기도 전에 우위가 사라집니다. 따라서 안정적인 고속 데이터 스트리밍이 필수입니다.
LaserStream은 Helius의 차세대 Solana 데이터 스트리밍 서비스입니다. 여러 전용 노드를 운영하는 비용과 운영 부담 없이 샤드 수준 수집의 속도와 전 세계에 분산된 서비스의 안정성 및 도달 범위를 결합합니다.
LaserStream의 고급 필터링을 사용하면 트랜잭션 유형, 계정 업데이트 같은 특정 신호는 물론 일반적인 블록 스트리밍에도 집중할 수 있습니다. 더 이른 신호가 필요하다면 Preprocessed Transactions을 사용할 수 있습니다. 샤드에서 디코딩한 서명된 트랜잭션을 processed 커밋 수준보다 최대 8ms 먼저 스트리밍하며, Sender와 동일한 방식으로 연동됩니다.
통합도 매끄럽습니다. Yellowstone gRPC를 즉시 대체하도록 설계되었으며 Rust, Go, TypeScript를 포함한 여러 클라이언트를 지원합니다.
하지만 업계 최고 수준의 데이터 스트리밍 서비스는 절반에 불과합니다. 신호가 제공하는 기회는 두 부분으로 구성됩니다.
- 이벤트 감지—잠재적인 신호를 인지합니다.
- 반응형 트랜잭션 제출—잠재적인 신호에 반응해 트랜잭션을 생성하고 제출하여 포함시킵니다.
LaserStream은 이벤트 감지에서 우위를 제공해 더욱 효과적인 반응형 트랜잭션 제출을 지원합니다. 하지만 LaserStream은 트랜잭션 전송 서비스가 아닙니다. 안타깝게도 Solana에서 트랜잭션을 효과적으로 포함하는 과정은 간단한 sendTransaction RPC 호출을 보내는 것만큼 단순하지 않습니다.
트랜잭션 전송 워크플로 최적화
트랜잭션 포함은 Solana 아키텍처의 여러 영역에 대한 깊은 이해가 필요한 다변수 최적화 문제입니다. 도착 시간, 시뮬레이션 성공 여부, 계정 잠금 충돌, 관련 트랜잭션 수수료, 우선순위 같은 요소가 서로 맞물려 특정 트랜잭션의 온체인 실행 시점을 결정합니다.
신호 감지와 트랜잭션 생성 워크플로에서 이 중 하나라도 고려하지 않으면 심각한 문제가 발생할 수 있습니다. 경쟁 우위가 놓친 기회로 바뀔 수 있습니다.
예를 들어 트레이더가 경쟁자보다 몇 밀리초 먼저 신호를 감지하더라도, 도착이 지연되거나 수수료가 부족하면 트랜잭션이 한 슬롯 늦게 온체인에서 실패할 수 있습니다. 수익성 높은 기회가 매출 손실로 바뀌는 것입니다.
트랜잭션을 효과적으로 포함하려면 우선순위를 극대화하고 지연 시간을 최소화하며 스택 전반의 잠재적 실패 사례를 예측하는 종합적인 워크플로가 필요합니다.
현재 Solana에서 트랜잭션을 효과적으로 포함하려면 개발자는 다음을 수행해야 합니다.
Staked Connections 사용
Staked Connections는 Solana의 Stake-Weighted Quality of Service(SWQoS)를 활용합니다. 스테이킹된 검증인과 페어링된 RPC의 트래픽에 우선순위를 부여해 리더 도달 가능성과 전파 속도를 높입니다. 개발자는 전파 실패를 최소화하기 위해 Staked Connections를 통해 라우팅해야 합니다. 혼잡이 발생할 수 있는 퍼블릭 엔드포인트에만 의존하지 않고 도착 시간과 포함률을 개선할 수 있습니다.
동적 우선순위 수수료 추가
우선순위 수수료는 Banking Stage에 있는 리더의 스케줄러에서 트랜잭션의 순위를 높이는 데 도움이 됩니다. 여기서 prio-graph, 즉 의존성을 인식하는 우선순위 큐는 CU당 수수료에 따라 온체인 실행 순서를 정합니다. 고정값으로 인해 과다 또는 과소 지급이 발생해 경합 상태 접근을 위한 포함이 방해받지 않도록 우선순위 수수료를 동적으로 계산해야 합니다.
CU 사용량 최적화
Compute Unit(CU)은 트랜잭션의 연산 요구량을 나타냅니다. 요청한 예산을 초과하면 실행이 실패하고, 필요 이상으로 요청하면 우선순위 비용이 증가합니다. 별도 지정이 없으면 트랜잭션은 기본적으로 200,000 CU를 요청합니다. 트랜잭션을 미리 시뮬레이션해 사용량을 추정한 뒤 Compute Budget Program의 SetComputeUnitLimit 명령어로 구체적인 양을 요청하면 CU를 최적화할 수 있습니다.
데이터 가져오기에 적절한 커밋 수준 사용
커밋 수준은 blockhash 같은 데이터의 확인 깊이를 결정합니다. 만료를 방지하고 트랜잭션의 유효성을 보장하려면 최신 데이터여야 합니다. getLatestBlockhash 호출에는 finalized보다 confirmed 수준을 사용하는 것이 훨씬 빠릅니다.
프리플라이트 검사 건너뛰기
프리플라이트 검사는 제출 전에 RPC 노드에서 트랜잭션을 시뮬레이션합니다. 서명, 명령어, 실행을 확인해 오류를 조기에 포착합니다. 하지만 지연 시간이 100ms 이상 늘어날 수 있습니다. 시간에 민감한 워크플로에서 올바르게 구성된 트랜잭션을 전송한다고 확신하는 경우, 개발자는 sendTransaction RPC 메서드의 skipPreflight 매개변수를 true로 설정해야 합니다.
트랜잭션 형식이 올바르고 온체인에 성공적으로 포함되는지 확인하기 위해 프로토타입 단계에서는 프리플라이트 검사를 건너뛰지 않는 것을 강력히 권장합니다. 프리플라이트 검사를 건너뛰면 속도는 빨라지지만 아무 정보 없이 진행하게 됩니다. 트랜잭션은 다양한 이유로 실패할 수 있으며, 검사를 건너뛰면 실패 원인을 파악할 수 없습니다.
maxRetries 매개변수를 0으로 설정
sendTransaction 메서드의 maxRetries 매개변수는 실패 시 RPC 측에서 자동 재전송을 활성화합니다. 오래된 blockhash로 중복 트랜잭션을 보내는 등 비효율적일 수 있습니다. 개발자는 maxRetries를 0으로 설정해 제어권을 확보해야 합니다. 또한 지수 백오프를 사용하고, 재브로드캐스트 시 blockhash와 수수료를 갱신하며, blockheight를 모니터링해 시도를 정상적으로 만료하는 클라이언트 측 재시도 로직을 직접 구현해야 합니다.
Jito 사용 고려
Jito 팁은 MEV 경매를 통한 오프체인 번들을 지원해 부분 블록에서 트랜잭션 포함과 순서를 보장합니다. 블록 상단 실행이나 여러 트랜잭션의 원자성이 필요한 트레이더 또는 차익거래자에게 적합합니다. 가치가 높거나 시간에 민감한 트랜잭션, 또는 경합 상태를 두고 경쟁하는 모든 트랜잭션에 매우 유용합니다. 하지만 경매에는 지연이 추가되므로, 잘 최적화된 트랜잭션을 Staked Connections로 보내는 것보다 포함 시간이 더 길어질 수 있습니다. 개발자는 어떤 트랜잭션이든 항상 최대한 빠르게 포함하기 위해 프로토콜 외부 경매와 Staked Connections의 안정성을 결합해야 합니다.
이러한 모범 사례를 구현하면 복합적인 효과가 발생해 실패율이 크게 낮아지고 포함 안정성이 향상됩니다. 하지만 이를 수동으로 관리하고 최신 프로토콜 개발 사항을 따라가며 새로운 변화에 맞게 워크플로를 조정하려면 상당한 엔지니어링 노력이 필요합니다. 지속적인 튜닝, 인프라 변경, 오류 처리에 들어가는 노력은 다른 곳에 더 효과적으로 사용할 수 있습니다.
Sender
Sender는 Helius의 초저지연 트랜잭션 전송 서비스입니다. SWQoS와 Jito의 오프체인 경매를 활용해 MEV에 최적화된 포함을 지원하며, 지리적 라우팅으로 전파 지연을 최소화합니다.
Sender는 Staked Connections와 Jito 경매소를 통해 트랜잭션을 동시에 전송합니다. 추가 크레딧을 사용하지 않으면서도 트랜잭션 포함을 위한 이중 경로를 제공해 안정성을 높이고 실행 시간을 단축합니다.
Sender는 모든 플랜에서 사용할 수 있으며 기본 속도 제한은 6 TPS입니다. 요청 시 상향할 수 있습니다. 결정론적 결과가 필요한 트레이더, MEV 서처, 고빈도 앱을 위해 설계되었습니다. Sender는 LaserStream과 연동해 제로 슬롯 실행을 위한 매끄러운 반응형 워크플로를 지원합니다.
Sender의 작동 방식
Sender는 일반적인 트랜잭션 처리와 같은 방식으로 트랜잭션을 처리합니다. 트랜잭션을 base64로 직렬화한 뒤 간단한 JSON-RPC POST 요청을 통해 엔드포인트 중 하나에 제출합니다.
Sender에는 가장 가까운 지역으로 자동 라우팅하는 글로벌 HTTPS 엔드포인트가 있습니다. CORS 문제를 피할 수 있어 프런트엔드 애플리케이션에 권장됩니다.
Sender는 최적의 서버 간 지연 시간을 위해 여러 지역별 HTTP 엔드포인트도 제공합니다. 예를 들어 솔트레이크시티, 도쿄, 프랑크푸르트가 있습니다.
중요한 점은 API 키 인증이 없다는 것입니다. 트랜잭션 수신과 제출 사이에 중개 서비스가 없는 최소 구성으로, 초저지연 사용 사례에 적합합니다.
Sender를 효과적으로 사용하려면 트랜잭션을 다음과 같이 준비해야 합니다.
- Jito에는 최소 0.0002 SOL, SWQoS 전용 제출에는 최소 0.000005 SOL(5,000 lamports)의 팁이 필요합니다. 엔드포인트에 ?swqos_only=true를 추가해 SWQoS 전용 제출을 지정할 수 있습니다
- skipPreflight 매개변수를 true로 설정해야 합니다. Sender는 트랜잭션 검증보다 속도를 우선하도록 최적화되어 있습니다
- maxRetries 매개변수를 0으로 설정해야 합니다. 재시도는 지연 시간을 늘립니다
- 리더의 Banking Stage에서 트랜잭션의 우선순위를 높이려면 우선순위 수수료를 추가해야 합니다
Sender를 통해 전송되는 모든 트랜잭션에는 팁과 우선순위 수수료가 모두 반드시 포함되어야 합니다.
Jito의 인프라와 경매 기반 트랜잭션 포함을 이용하려면 팁이 필요합니다. 우선순위 수수료는 리더, 즉 트랜잭션 처리를 담당하는 검증인에게 우선 처리 비용을 지불할 의사가 있음을 알립니다. 두 가지 이점을 동시에 제공합니다. 팁은 Jito의 경매 인프라에 대한 접근을 제공하고, 우선순위 수수료는 트랜잭션의 우선순위를 높입니다. 두 요소가 함께 트랜잭션 포함을 극대화합니다.
Jito의 팁 하한 API를 사용해 팁을 동적으로 가져오는 것을 권장합니다. 예를 들어 75번째 백분위수에 소량의 버퍼를 추가할 수 있습니다. 우선순위 수수료에는 Helius Priority Fee API를 사용하세요.
제출이 완료되면 Sender는 SWQoS와 Jito를 통해 트랜잭션을 병렬로 전송합니다. 추가 비용 없이 트랜잭션 포함을 극대화합니다.
콜드 스타트를 방지하려면 유휴 기간, 즉 1분을 초과하는 기간에 /ping, 즉 https://sender.helius-rpc.com/ping으로 ping을 보내 연결을 워밍업하는 것도 권장합니다. 최적의 트랜잭션 포함을 더욱 확실히 하려면 트랜잭션 제출 모범 사례를 따르세요.
시작 방법
LaserStream과 Sender로 거래를 시작하는 방법은 다음과 같습니다.
LaserStream 사용하기
LaserStream은 gRPC와 동일한 개발자 경험을 제공합니다. 엔드포인트와 API 키가 LaserStream을 가리키도록 변경하기만 하면 LaserStream이 제공하는 모든 이점을 즉시 활용할 수 있습니다.
기존 코드는 다음과 같이 간단히 마이그레이션할 수 있습니다.
// Before: Using standard Yellowstone gRPC
const connection = new GeyserConnection(
"your-current-endpoint.com",
{ token: "your-current-token" }
);
// After: Using LaserStream (just change the endpoint and token)
const connection = new GeyserConnection(
"https://laserstream-mainnet-ewr.helius-rpc.com", // Choose the closest region to you
{ token: "your-helius-api-key" }
);개발 프로세스를 간소화하려면 LaserStream의 클라이언트 중 하나를 사용하는 것이 좋습니다.
예를 들어 구독 시작은 다음과 같이 간단합니다.
// Using the dedicated LaserStream SDK
import { subscribe, CommitmentLevel, LaserstreamConfig } from 'helius-laserstream';
const config = {
apiKey: "your-helius-api-key",
endpoint: "https://laserstream-mainnet-ewr.helius-rpc.com" // Choose the closest region to you
};
// The SDK automatically handles:
// - Connection management
// - Reconnection with backoff
// - Historical replay after disconnects
// - Subscription management
await subscribe(config, subscriptionRequest, handleData, handleError);LaserStream 무료 체험하기
마이그레이션 전에 LaserStream을 테스트하고 싶으신가요? 무료 체험을 시작해 LaserStream의 지연 시간을 측정하고, 다른 스트리밍 솔루션과 비교하며, 구체적인 사용 사례에 적합한지 평가해 보세요.
Sender 사용하기
Helius Sender는 모든 사용자가 이용할 수 있으며 추가 크레딧을 사용하지 않습니다. 유료 플랜이나 별도 접근 권한이 필요하지 않습니다.
시작하려면 Helius Dashboard에서 계정을 생성하세요. 그런 다음 API Keys 섹션으로 이동해 제공된 키를 복사합니다. Sender는 트랜잭션 제출만 처리하므로 blockhash를 가져오고 트랜잭션을 확인하려면 이 키가 필요합니다.
아래는 Sender를 사용한 간단한 SOL 전송 예시입니다. 팁, 우선순위 수수료, 프리플라이트 검사 건너뛰기 등 필요한 모든 요소가 포함되어 있습니다.
import { pipe } from "@solana/kit";
import {
createSolanaRpc,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
lamports,
getBase64EncodedWireTransaction,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
(async () => {
const HELIUS_API_KEY = "your_api_key";
const PRIV_KEY_B58 = "your_private_key";
const RECIPIENT = "recipient_address";
const TIP_ACCOUNTS = [
"4ACfpUFoaSD9bfPdeu6DBt89gB6ENTeHBXCAi87NhDEE",
"D2L6yPZ2FmmmTKPgzaMKdhu6EWZcTpLy1Vhx8uvZe7NZ",
"9bnz4RShgq1hAnLnZbP8kbgBg1kEmcJBYQq3gQbmnSta",
"5VY91ws6B2hMmBFRsXkoAAdsPHBJwRfBht4DXox3xkwn",
"2nyhqdwKcJZR2vcqCyrYsaPVdAnFoJjiksCXJ7hfEYgD",
"2q5pghRs6arqVjRvT5gfgWfWcHWmw1ZuCzphgd5KfWGJ",
"wyvPkWjVZz1M8fHQnMMCDTQDbkManefNNhweYk5WkcF",
"3KCKozbAaF75qEU33jtzozcJ29yJuaLJTy2jFdzUY8bT",
"4vieeGHPYPG2MmyPRcYjdiDmmhN3ww7hsFNap8pVN3Ey",
"4TQLFNWK8AovT1gFvda5jfw2oJeRMKEmw7aH6MGBJ3or"
];
// Load signer from base58 private key
const ownerSigner = await createKeyPairSignerFromBytes(bs58.decode(PRIV_KEY_B58));
// Init RPC and fetch blockhash
const rpc = createSolanaRpc(`https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`);
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// Build and sign transaction
const tx = pipe(
createTransactionMessage({ version: 0 }),
(m) => setTransactionMessageFeePayerSigner(ownerSigner, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
(m) => appendTransactionMessageInstruction(getSetComputeUnitLimitInstruction({ units: 1000 }), m),
(m) => appendTransactionMessageInstruction(getSetComputeUnitPriceInstruction({ microLamports: 200_000 }), m),
(m) =>
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: ownerSigner,
destination: RECIPIENT,
amount: lamports(1_000_000n), // 0.001 SOL
}),
m
),
(m) =>
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: ownerSigner,
destination: TIP_ACCOUNTS[Math.floor(Math.random() * TIP_ACCOUNTS.length)],
amount: lamports(200_000n), // 0.0002 SOL
}),
m
)
);
const signedTx = await signTransactionMessageWithSigners(tx);
const base64Tx = getBase64EncodedWireTransaction(signedTx);
// Send via Sender
const res = await fetch("https://sender.helius-rpc.com/fast", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: Date.now().toString(),
method: "sendTransaction",
params: [
base64Tx,
{ encoding: "base64", skipPreflight: true, maxRetries: 0 },
],
}),
});
const { result: sig, error } = await res.json();
if (error) throw new Error(error.message);
console.log("Transaction sent: ", sig);
console.log(`Explorer: https://orb.helius.dev/tx/${sig}?cluster=mainnet`);
})();Node.js SDK를 사용하면 Sender를 통한 트랜잭션 전송이 매끄럽습니다. `sendTransactionWithSender` 메서드는 Jito 팁을 포함한 모든 Compute Unit 및 수수료 계산을 동적으로 처리합니다.
import { createHelius } from "helius-sdk";
import { address, createKeyPairSignerFromBytes, lamports } from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
import bs58 from "bs58";
(async () => {
const apiKey = ""; // From Helius dashboard
const helius = createHelius({ apiKey });
try {
const feePayerSigner = await createKeyPairSignerFromBytes(
bs58.decode(process.env.FEEPAYER_SECRET ?? "")
);
const toPubkey = address("your_to_address");
const transferIx = getTransferSolInstruction({
amount: lamports(1_000_000n), // 0.001 SOL
destination: toPubkey,
source: feePayerSigner,
});
const sig = await helius.tx.sendTransactionWithSender({
signers: [feePayerSigner],
instructions: [transferIx],
version: 0,
commitment: "confirmed",
minUnits: 1_000,
bufferPct: 0.1,
region: "US_EAST",
swqosOnly: true,
pollTimeoutMs: 60_000,
pollIntervalMs: 2_000,
});
console.log("Confirmed signature:", sig);
console.log(
`Explorer link: https://orb.helius.dev/tx/${sig}?cluster=mainnet`
);
} catch (error) {
console.error("Error:", error);
}
})();Rust SDK의 send_smart_transaction_with_sender() 메서드를 사용하면 이 프로세스를 간소화할 수도 있습니다.
LaserStream과 Sender 함께 사용하기
Helius의 진정한 강점은 LaserStream과 Sender를 하나의 워크플로로 결합할 때 드러납니다. LaserStream은 실행 가능한 신호가 발생하는 즉시 노출하고, Sender는 신호에 반응하는 트랜잭션이 최대한 빠르게 포함되도록 합니다.
패턴은 간단합니다.
- LaserStream으로 구독하여 계정 변경, 프로그램 호출 또는 전송을 수신합니다.
- 주어진 신호에 반응해 트랜잭션을 생성합니다.
- Sender를 통해 트랜잭션을 전송하여 가장 빠르고 안정적인 포함 경로를 확보합니다.
다음은 전체 워크플로를 실제로 보여주는 최소 예시입니다.
import bs58 from "bs58";
import { subscribe, CommitmentLevel } from "helius-laserstream";
import {
pipe,
createSolanaRpc,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
getBase64EncodedWireTransaction,
createKeyPairSignerFromBytes,
lamports,
address,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
const HELIUS_API_KEY = "your_api_key";
const LASERSTREAM_ENDPOINT = "https://laserstream-mainnet-ewr.helius-rpc.com"; // Pick the nearest region
const PRIV_KEY_B58 = "your_private_key";
const RECIPIENT = "recipient_address";
const TIP_ACCOUNTS = [
"4ACfpUFoaSD9bfPdeu6DBt89gB6ENTeHBXCAi87NhDEE",
"D2L6yPZ2FmmmTKPgzaMKdhu6EWZcTpLy1Vhx8uvZe7NZ",
"9bnz4RShgq1hAnLnZbP8kbgBg1kEmcJBYQq3gQbmnSta",
"5VY91ws6B2hMmBFRsXkoAAdsPHBJwRfBht4DXox3xkwn",
"2nyhqdwKcJZR2vcqCyrYsaPVdAnFoJjiksCXJ7hfEYgD",
"2q5pghRs6arqVjRvT5gfgWfWcHWmw1ZuCzphgd5KfWGJ",
"wyvPkWjVZz1M8fHQnMMCDTQDbkManefNNhweYk5WkcF",
"3KCKozbAaF75qEU33jtzozcJ29yJuaLJTy2jFdzUY8bT",
"4vieeGHPYPG2MmyPRcYjdiDmmhN3ww7hsFNap8pVN3Ey",
"4TQLFNWK8AovT1gFvda5jfw2oJeRMKEmw7aH6MGBJ3or"
];
// Example: scope the stream to a program you care about
const PROGRAM_OWNER_TO_WATCH = "11111111111111111111111111111111";
(async () => {
// Setup signer and fetch blockhash
const ownerSigner = await createKeyPairSignerFromBytes(bs58.decode(PRIV_KEY_B58));
const rpc = createSolanaRpc(`https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`);
// Setup LaserStream config and request
const config = {
apiKey: HELIUS_API_KEY,
endpoint: LASERSTREAM_ENDPOINT,
};
// We keep it scoped to a given program for less noise
const request = {
accounts: {
watch: {
account: [],
owner: [PROGRAM_OWNER_TO_WATCH],
filters: [],
},
},
commitment: CommitmentLevel.PROCESSED, // Can also change to CONFIRMED for more reliability
slots: {},
transactions: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
accountsDataSlice: [],
};
// On signal, build and send a reactive transaction via Sender
const handleData = async () => {
// Fresh blockhash for lifetime
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// Build the transaction with compute-budget ixs first, then user ixs
const tx = pipe(
createTransactionMessage({ version: 0 }),
(m) => setTransactionMessageFeePayerSigner(ownerSigner, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
(m) => appendTransactionMessageInstruction(getSetComputeUnitLimitInstruction({ units: 100_000 }), m),
(m) => appendTransactionMessageInstruction(getSetComputeUnitPriceInstruction({ microLamports: 200_000 }), m),
(m) =>
// In prod, this could be a buy / sell instruction
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: ownerSigner,
destination: address(RECIPIENT),
amount: lamports(1_000_000n), // 0.001 SOL
}),
m
),
(m) =>
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: ownerSigner,
destination: address(TIP_ACCOUNTS[Math.floor(Math.random() * TIP_ACCOUNTS.length)]),
amount: lamports(200_000n), // 0.0002 SOL tip
}),
m
)
);
const signedTx = await signTransactionMessageWithSigners(tx);
const base64Tx = getBase64EncodedWireTransaction(signedTx);
// Send via Sender (i.e., skip preflight and no RPC-side retries)
const res = await fetch("https://sender.helius-rpc.com/fast", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: Date.now().toString(),
method: "sendTransaction",
params: [base64Tx, { encoding: "base64", skipPreflight: true, maxRetries: 0 }],
}),
});
const { result: sig, error } = await res.json();
if (error) throw new Error(error.message);
console.log("Reactive transaction sent: ", sig);
console.log(`Explorer: https://orb.helius.dev/tx/${sig}?cluster=mainnet`);
};
const handleError = console.error;
// Start the stream (signals → reactive sends)
const stream = await subscribe(config, request, handleData, handleError);
console.log(`LaserStream subscription started (id: ${stream.id})`);
})();Helius를 선택해야 하는 이유
Helius는 스테이킹 기준 네트워크 최대 검증인으로서 Solana 트랜잭션 워크플로 최적화를 위한 최고의 선택입니다. Helius에는 스테이킹 대역폭이 문제가 되지 않습니다. 혼잡 시 트랜잭션의 우선순위 하락이나 패킷 손실과 관련된 병목 현상과 실패 사례를 사실상 제거합니다. 제한 없이 트랜잭션에 리더까지 이어지는 직접적인 고우선순위 경로를 제공합니다.
Helius는 다양한 하드웨어 및 소프트웨어 최적화를 스테이킹 대역폭과 긴밀하게 통합해 최고의 제공업체로서 계속 앞서가고 있습니다. 가장 낮은 평균 슬롯 지연 시간은 Solana에 대한 Helius의 수직적 전문성을 입증합니다.
Solana에 대한 Helius의 헌신은 최신 연구와 기여의 최전선에 서게 합니다. 예를 들어 Chorus One의 트랜잭션 지연 시간 연구 결과에 따르면, 포함 시간을 줄이는 데 SWQoS가 Jito보다 더 나은 성능을 보이는 경우가 많습니다. 특히 p95 지연 시간이 40초를 초과하는 사용자에게 두드러집니다. Sender는 SWQoS와 Jito를 통해 동시에 지능적으로 라우팅하여 모든 트랜잭션 유형에서 최고의 안정성을 보장합니다.
궁극적으로 포함 시간을 단축할 때 고려해야 할 가장 중요한 요소는 충분한 스테이킹 지분을 보유하고 Staked Connections를 통해 트랜잭션을 라우팅하는 것입니다.
더 빠르게
LaserStream은 지연 시간과 불확실성을 줄입니다. 신호가 일찍 도착할수록 결과는 더 예측 가능해집니다. Sender와 결합하면 신호에 반응해 전송된 트랜잭션을 바탕으로 운영 확신을 높이고, 더 현명하게 결정하며, 안정성을 개선할 수 있습니다. 이 통합 파이프라인은 속도만 따로 최적화하지 않습니다. 확신까지 최적화합니다.
LaserStream을 사용하면 개발자는 시장 최고의 데이터 스트리밍 서비스를 사용하고 있다는 확신을 가질 수 있습니다. Sender를 사용하면 트랜잭션이 블록 리더까지 가장 빠르고 안정적인 경로로 라우팅된다는 것을 확신할 수 있습니다.
두 서비스를 함께 사용하면 다음과 같은 복합 효과가 발생합니다.
- 더 낮은 E2E 지연 시간: 이벤트 감지부터 트랜잭션 포함까지 모든 단계가 밀리초 단위로 단축됩니다
- 더 높은 성공률: 트랜잭션이 원하는 위치와 시점에 포함되므로 기회를 놓치지 않고 포착할 수 있습니다
- 더 적은 엔지니어링 부담: 최적의 트랜잭션 전송을 위해 전용 노드를 관리하고 조정하는 대신 제품, 전략, 거래 알고리즘 미세 조정에 더 집중할 수 있습니다
- 제로 슬롯 실행: LaserStream은 특정 슬롯의 트랜잭션 실행이 끝난 후가 아니라 실행되는 동안 알림을 노출합니다. 따라서 알림에 반응해 전송한 트랜잭션이 같은 슬롯에 포함될 수 있습니다
실제로 이는 트레이더가 더 많은 차익거래 기회를 포착하고, 청산자가 더 많은 경매에서 승리하며, 고빈도 애플리케이션이 더 매끄러운 사용자 경험을 제공한다는 뜻입니다. 제로 슬롯 실행은 운명처럼 정해진 이론적 이상이 아닙니다. Helius로만 달성할 수 있는 반복 가능한 워크플로입니다.
지금 Helius Dashboard를 방문해 시작하세요.
관련 아티클
Helius 구독하기
최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요


