新着:HeliusがLight Protocolを買収
SenderとLaserStreamによるゼロスロット実行の実現
ブログ/開発

SenderとLaserStreamによるゼロスロット実行の実現

Developer Experience EngineerXの0xIchigoLinkedInの0xIchigoGitHubの0xIchigo
読了時間:13分

はじめに

誰もがトランザクションをできる限り速く反映させたいと考えています。しかし、Solanaの取引インフラが高度化し、オンチェーン市場が成熟するなか、単にトランザクションを送信して幸運を祈るだけでは通用しなくなりました。混雑や競争、ネットワーク特有の挙動により、「高速」が「苛立つほど不安定」になってしまうためです。

目標は明快です。価格が特定のしきい値を超える、アカウントが更新される、プログラムが呼び出されるといったシグナルが発生した際、それに反応するトランザクションを同じスロット内で反映させることです。 

これがゼロスロット実行の本質です。検知から送信までをシームレスに行い、わずか数ミリ秒で消える機会を逃さず捉えます。 

実際にこれを実現する難易度は上がっており、超低レイテンシのシグナル取り込みと、信頼性が高く決定論的な配信が必要です。

Heliusはその両方を提供します。

超高速なイベント検知を実現するLaserStreamと、最適化されたトランザクション送信を行うSenderを組み合わせることで、Heliusはゼロスロット実行専用に構築されたエンドツーエンドのパイプラインを提供します。

継ぎはぎのインフラも、当て推量も、無駄な処理もありません。最速のシグナルとリーダーへの最速経路だけを提供し、取引運用に競争優位性をもたらします。

Senderは、私のトランザクションのほとんどを1スロット以内にほぼ即時反映し、常に他のサービスを上回っています。以前はスロットレイテンシが高く、収益性のある取引を逃すことがよくありましたが、今では取り込みがほぼ保証され、信頼性も大幅に向上しました。Heliusは常に優れたサービスを提供しており、Senderも私の成功率を直接高めてくれた傑出したサービスです。

Alan
トレーダー

LaserStreamとSender:統合ワークフロー

SenderはLaserStreamを補完し、Solana上の即応性が求められる取引ワークフロー向けに、シームレスなエンドツーエンドのパイプラインを構築します。実際の流れは次のとおりです。

  1. LaserStreamでシグナルを監視:shredレベルの取り込みと高度なフィルタリングにより、他のどのパイプラインよりも速く、リアルタイムのオンチェーンイベントを取得します。
  2. Helius Senderでシグナルに反応:トランザクションをSWQoSとJito経由で同時に送信し、グローバルルーティングとvalidatorを考慮した配信により、取り込み率を最大化してレイテンシを最小限に抑えます。
  3. 収益化:これらのサービスを組み合わせることで、収益機会の獲得を理論上だけでなく、実際に実現できます。

Heliusを利用すると、開発者は速度と信頼性を追求して構築された垂直統合型スタックを利用できます。

  • サードパーティ製RPCやリレー、自社開発インフラをつなぎ合わせる必要はありません。
  • グローバルルーティング、自動再試行、validatorを考慮した配信が組み込まれています。
  • 透明かつ公正です。ユーザーを積極的にサンドイッチすることはなく、ユーザーに不利益をもたらすMEVを抽出することもありません。

HeliusはすでにLaserStreamで最高水準のシグナル検知を提供しています。それなら、最高水準のトランザクション送信を実現するSenderと組み合わせない理由はありません。 

この2つを組み合わせることで、1ミリ秒が結果を左右するSolanaワークフロー向けの、単一の統合パイプラインが完成します。決定論的で収益性の高い成果を得るための読み書きループは、Heliusにお任せください。

では、実際にはどのような仕組みなのでしょうか。

適切なシグナルを見つける

Solanaでは、アービトラージや清算の機会が数ミリ秒で消えることがあります。適切なオンチェーンシグナルをタイムリーに検知することが極めて重要です。ここでいう「シグナル」とは、トークンの転送、アカウントの更新、プログラムの呼び出しなど、取引機会を示すあらゆるリアルタイムイベントを指します。超低レイテンシで取り込めなければ、対応する前に優位性が失われるため、信頼性の高い高速データストリーミングが不可欠です。

LaserStreamは、Heliusの次世代Solanaデータストリーミングサービスです。shredレベルの取り込み速度と、グローバルに分散されたサービスの信頼性および到達範囲を兼ね備えています。複数の専用ノードを運用するコストや手間はかかりません。

LaserStreamの高度なフィルタリングにより、開発者はトランザクションタイプやアカウント更新などの特定のシグナルに加え、一般的なブロックストリーミングにも集中できます。さらに早いシグナルが必要な場合は、Preprocessed Transactionsを使用すると、shredからデコードした署名済みトランザクションをprocessedコミットメントレベルより最大8ms早くストリーミングでき、Senderともまったく同じ方法で組み合わせられます。

Yellowstone gRPCのドロップイン代替として設計されており、Rust、Go、TypeScriptを含む複数のクライアントをサポートしているため、シームレスに統合できます。 

しかし、最高水準のデータストリーミングサービスを用意するだけでは不十分です。シグナルによって生まれる機会は、次の2つの要素で構成されるためです。

  • イベント検知—潜在的なシグナルを把握します。
  • リアクティブなトランザクション送信—潜在的なシグナルに反応してトランザクションを作成、送信、反映します。

LaserStreamはイベント検知に優位性をもたらし、より効果的なリアクティブトランザクション送信を可能にします。しかし、LaserStreamはトランザクション送信サービスではありません。また残念ながら、Solanaでトランザクションを効果的に反映させることは、単純なsendTransaction RPC呼び出しを実行するほど簡単ではありません。

トランザクション送信ワークフローの最適化

トランザクションの取り込みは、Solanaアーキテクチャのさまざまな領域に対する深い理解を必要とする、多変数の最適化問題です。到着時刻、シミュレーションの成否、アカウントロックの競合、関連するトランザクション手数料、優先度などの要因が相互に作用し、特定のトランザクションがいつオンチェーンで実行されるかを決定します。 

シグナル検知とトランザクション作成のワークフローで、これらの要因を1つでも考慮しなければ、有害な影響が生じ、競争優位性が機会損失に変わる可能性があります。 

たとえば、競合相手より数ミリ秒早くシグナルを検知しても、到着の遅延や手数料不足により、トランザクションが1スロット遅れてオンチェーンで失敗し、収益機会が損失に変わる可能性があります。

トランザクションを効果的に反映させるには、優先度を最大化し、レイテンシを最小化し、スタック全体で起こり得る障害を予測する包括的なワークフローが必要です。 

現在、Solanaでトランザクションを効果的に反映させるために、開発者は次の対応が必要です。

Staked Connectionsを使用する

Staked ConnectionsはSolanaのStake-Weighted Quality of Service(SWQoS)を活用し、ステークされたvalidatorとペアリングされたRPCからのトラフィックを優先して、リーダーへの到達性と伝播速度を高めます。開発者は伝播失敗を最小限に抑えるため、Staked Connections経由でルーティングする必要があります。これにより、混雑の影響を受ける可能性があるパブリックエンドポイントだけに依存せず、到着時間と取り込み率を改善できます。

動的な優先手数料を追加する

優先手数料は、Banking Stageにあるリーダーのスケジューラ内でトランザクションの順位を引き上げるのに役立ちます。ここでは、prio-graph(依存関係を考慮した優先度キュー)がCUあたりの手数料に基づいてオンチェーン実行の順序を決定します。優先手数料は動的に計算し、過払いや支払い不足につながる固定値を避ける必要があります。固定値を使用すると、競合するstateへのアクセスに必要な取り込みが妨げられる可能性があります。

CU使用量を最適化する

Compute Unit(CU)は、トランザクションの計算需要を数値化します。要求した予算を超えると実行に失敗し、過剰に要求すると優先処理のコストが増加します。特に指定しない限り、トランザクションはデフォルトで200,000 CUを要求します。事前にトランザクションをシミュレーションして消費量を推定し、Compute Budget ProgramのSetComputeUnitLimit命令で具体的な値を要求することで、トランザクションのCUを最適化できます。

データ取得に適切なコミットメントレベルを使用する

コミットメントレベルは、blockhashなど取得データの確認深度を決定します。トランザクションの有効性を確保し、期限切れを防ぐには、blockhashが最新でなければなりません。getLatestBlockhash呼び出しでは、finalizedではなくconfirmedレベルを使用すると大幅に高速化できます。

プリフライトチェックをスキップする

プリフライトチェックは、送信前にRPCノード上でトランザクションをシミュレーションし、署名、命令、実行を検証してエラーを早期に検出します。ただし、100ms以上のレイテンシが加わる場合があります。時間が重要なワークフローで、整形式のトランザクションを送信していると開発者が確信できる場合は、sendTransaction RPCメソッドのskipPreflightパラメータをtrueに設定する必要があります。

トランザクションが正しくフォーマットされ、オンチェーンで正常に反映されることを確認するため、プロトタイプ作成時にはプリフライトチェックをスキップしないことを強く推奨します。プリフライトチェックのスキップは高速化につながりますが、状況を把握できないまま処理することになります。トランザクションはさまざまな理由で失敗する可能性があり、チェックをスキップすると失敗理由に関する情報を得られません。

maxRetriesパラメータをゼロに設定する

sendTransactionメソッドのmaxRetriesパラメータは、失敗時にRPC側で自動再送信を有効にします。ただし、古いblockhashを使用した重複トランザクションを送信するなど、非効率になる場合があります。開発者はmaxRetriesを0に設定して制御を取り戻し、指数バックオフを使用し、再ブロードキャスト時にblockhashと手数料を更新し、blockheightを監視して試行を適切に期限切れにする、独自のクライアント側再試行を実装する必要があります。

Jitoの利用を検討する

Jito tipはMEVオークションを介してオフチェーンバンドルを可能にし、部分ブロックでのトランザクション取り込みと順序を保証します。これは、ブロック先頭での実行や複数トランザクションのアトミック性を必要とするトレーダーやアービトラージャーに最適です。また、高価値で時間依存性の高いトランザクションや、競合するstateを争うあらゆるトランザクションに非常に有効です。ただし、こうしたオークションでは遅延が発生するため、十分に最適化されたトランザクションをStaked Connections経由で送信するよりも、反映時間が遅くなる可能性があります。開発者は、プロトコル外オークションとStaked Connectionsの信頼性を組み合わせ、必要なあらゆるトランザクションを常に可能な限り速く反映させる必要があります。

これらのベストプラクティスを実装すると相乗効果が生まれ、失敗率が大幅に低下し、反映の信頼性が向上します。しかし、これらを手動で管理し、最新のプロトコル開発を追い続け、新たな進展に合わせてワークフローを適応させるには、継続的なチューニング、インフラ変更、エラー処理など、多大なエンジニアリング作業が必要です。その労力は、ほかの領域に充てる方が有効です。

Sender

Senderは、SWQoSとJitoのオフチェーンオークションを活用してMEV最適化された取り込みを実現する、Heliusの超低レイテンシなトランザクション送信サービスです。さらに、地理的ルーティングを組み込むことで伝播遅延を最小限に抑えます。 

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)のtipが必要です。後者はエンドポイントに**?swqos_only=true**を追加して指定できます
  • skipPreflightパラメータはtrueに設定する必要があります。Senderはトランザクション検証よりも速度を優先するよう最適化されています
  • maxRetriesパラメータは0に設定する必要があります。再試行はレイテンシを増加させます
  • リーダーのBanking Stageにおけるトランザクションの優先度を高めるため、優先手数料を追加する必要があります

Sender経由で送信するすべてのトランザクションには、tipと優先手数料の両方を含める必要があります。 

Jitoのインフラとオークションベースのトランザクション取り込みを利用するには、tipが必要です。優先手数料は、優先処理に対する支払い意思をリーダー(トランザクション処理を担当するvalidator)に示します。これには二重の利点があります。tipによってJitoのオークションインフラを利用でき、優先手数料によってトランザクションの優先度が向上します。両者が連携し、トランザクションの取り込みを最大化します。

tipはJitoのtip floor 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のあらゆるメリットをすぐに活用できます。

既存コードからの移行は、次のように簡単です。

Migrating from Yellowstone to 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のクライアントのいずれかを使用することを推奨します。

たとえば、サブスクリプションの開始は次のように簡単です。

A Simple Subscription
// 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転送です。この例には、tip、優先手数料、プリフライトチェックのスキップという必須要素がすべて含まれています。

A Simple SOL Transfer Using Sender
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 tipを含むすべてのCompute Unitと手数料の計算を動的に処理します。 

A Streamlined Sender Example Using the Node.js SDK
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経由でトランザクションを配信し、最速かつ最も信頼性の高い取り込み経路を確保します。

このワークフロー全体を実際に示す最小限の例を以下に示します。 

A unified LaserStream and Sender Workflow
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のトランザクションワークフロー最適化における最有力の選択肢である理由は、ステーク量でネットワーク最大のvalidatorだからです。そのため、ステーク済み帯域幅が問題になることはありません。混雑時のトランザクションの優先度低下やパケットドロップに関連するボトルネックや障害要因を実質的に排除し、制限なく、トランザクションをリーダーへ直接届ける高優先度の経路を提供します。 

Heliusは、さまざまなハードウェアおよびソフトウェアの最適化とステーク済み帯域幅を緊密に統合することで、トッププロバイダーとして優位性を保ち続け、平均スロットレイテンシは業界最低を誇ります。これは、Solanaに関する垂直的な専門性の証です。 

Solanaへのコミットメントにより、Heliusは最新の研究と貢献の最前線に立っています。たとえば、Chorus Oneによるトランザクションレイテンシの調査結果では、特にp95レイテンシが40秒を超えるユーザーにおいて、取り込みまでの時間短縮でSWQoSがJitoを上回る場合が多いことが示されています。SenderはSWQoSとJitoの両方を介して同時にインテリジェントにルーティングし、あらゆるトランザクションタイプで最大限の信頼性を確保します。 

最終的に、取り込みまでの時間を短縮するうえで最も重要な要因は、十分なステークを保有し、Staked Connections経由でトランザクションをルーティングすることです。

より高速に

LaserStreamはレイテンシと不確実性を低減します。シグナルが早く届くほど、結果の予測可能性が高まります。Senderと組み合わせることで、シグナルに反応して送信されるトランザクションの運用上の確実性が高まり、より賢明な意思決定と信頼性の向上につながります。この統合パイプラインは、速度だけを個別に最適化するのではなく、確実性を最適化します。

LaserStreamを使用すれば、開発者は市場最高のデータストリーミングサービスを利用していると確信できます。Senderを使用すれば、トランザクションがブロックリーダーへの最速かつ最も信頼性の高い経路でルーティングされると確信できます。 

これらを組み合わせることで、次のような相乗効果が生まれます。

  • E2Eレイテンシの低減:イベント検知からトランザクション取り込みまで、すべてのステップを数ミリ秒に短縮します
  • 成功率の向上:トランザクションを想定した場所とタイミングで反映させ、機会を逃さず獲得します
  • エンジニアリング負担の軽減:トランザクション送信を最適化するための専用ノードの管理や調整ではなく、プロダクト、戦略、取引アルゴリズムの微調整により注力できます
  • ゼロスロット実行:LaserStreamは、特定のスロットでトランザクションが実行されている最中に通知を提示します。スロットの完了後ではありません。そのため、通知に反応して送信したトランザクションを同じスロットに取り込める可能性があります 

実際には、トレーダーがより多くのアービトラージ機会を獲得し、清算者がより多くのオークションに勝ち、高頻度アプリケーションがよりスムーズなユーザー体験を提供できることを意味します。ゼロスロット実行は、運命に委ねられた理論上の理想ではありません。Heliusでのみ実現できる、再現可能なワークフローです。

今すぐHelius Dashboardにアクセスして、利用を開始してください。

Heliusを購読

Solana開発の最新情報や新しい記事の公開通知を受け取れます

拡大画像