新着:HeliusがLight Protocolを買収
Solanaの混雑:Solanaトランザクションを最適に送信する方法
ブログ/基礎

Solanaの混雑:Solanaトランザクションを最適に送信する方法

インテグレーションエンジニアXのHet DagliLinkedInのHet Dagli
読了時間:5分

はじめに

「Transaction simulation failed: Blockhash not found.」「Failed to send transaction.」こうしたエラーメッセージは、あまりにも見慣れたものになりました。ネットワークの混雑により、基本的なトランザクションでさえ運任せになっています。このような苦労は不要です。

このガイドでは、トラフィックが多い時間帯を効果的に乗り切り、トランザクションを確実に取り込ませるためのシンプルな戦略を紹介します。優先手数料、コンピュートユニットの最適化、さらにトランザクションを常に取り込ませるためのHelius独自の秘策など、ネットワーク混雑に対処する包括的なアプローチを解説します。

このガイドでは、以下について解説します。

  • シリアライズ済みトランザクションを使用した優先手数料の設定
  • アカウントキーを使用した優先手数料の設定
  • 高度な優先手数料戦略
  • トランザクションの最適化手法
  • 確実に送信するためのステーク済みエンドポイントの活用

優先手数料

優先手数料は入札メカニズムとして機能し、トランザクションの重要性をバリデータに伝えられます。この手数料はマイクロlamport/コンピュートユニット単位で設定され、トランザクションが操作する特定のアカウントに基づいて決まるため、アカウントごとに独立した手数料市場が形成されます。アカウント固有の混雑状況に応じて手数料を戦略的に設定することで、トランザクションが次のブロックに含まれる可能性を大幅に高められます。

次に、HeliusのPriority Fee APIを使用して、さまざまな方法で優先手数料を正しく設定する方法を見ていきます。

シリアライズ済みトランザクション

優先手数料を設定する最も簡単な方法は、シリアライズ済みトランザクションを使用することです。シリアライズ済みトランザクションとは、ネットワーク経由で送信できるワイヤーフォーマットのバッファに変換された、トランザクションのバイナリ表現です。

  1. トランザクションをシリアライズし、APIに渡します。
コード
const serializedTx = transaction.serialize();

const response = await fetch(heliusEndpoint, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 'helius-example',
    method: 'getPriorityFeeEstimate',
    params: [{
      transaction: serializedTx,
      options: { recommended: true }
    }]
  }),
});

const { result } = await response.json();
const priorityFee = result.priorityFeeEstimate;
  1. 推奨手数料をトランザクションに追加します。インストラクションの順序は問いません。
コード
transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: priorityFee
  })
);

アカウントキー

別の方法として、トランザクションに関与するアカウントキーのリストをPriority Fee APIに渡すこともできます。‍

  1. トランザクションからアカウントキーを抽出します。
コード
const transaction = new Transaction();

// Add your instructions to the transaction

// Extract all account keys from the transaction
const accountKeys = transaction.compileMessage().accountKeys;

// Convert PublicKeys to base58 strings
const publicKeys = accountKeys.map(key => key.toBase58());
  1. アカウントキーをPriority Fee APIに渡します。
コード
const response = await fetch(heliusEndpoint, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 'helius-example',
    method: 'getPriorityFeeEstimate',
    params: [{
      accountKeys: publicKeys,
      options: { recommended: true }
    }]
  }),
});

const { result } = await response.json();
const priorityFee = result.priorityFeeEstimate;
  1. 推奨手数料をトランザクションに追加します。
コード
transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: priorityFee
  })
);

どちらの方法も使用できますが、シリアライズ済みトランザクションを使う方法を推奨します。アカウントキーを使う場合、関連するすべてのアカウントを手動で追跡して含める必要があり、アカウントが1つでも抜けると手数料の見積もりが不正確になる可能性があります。 

シリアライズ済みトランザクションを使う方法では、必要なすべてのアカウントが自動的に含まれ、トランザクション全体のコンテキストに基づいてより正確な手数料が見積もられるため、このリスクを排除できます。

高度な優先手数料戦略

ほとんどの場合、シリアライズ済みトランザクションと推奨優先手数料を使用すれば十分です。ただし、より細かく制御したい場合は、Priority Fee APIで異なる優先度レベルの見積もりをリクエストし、空スロット評価を有効にできます。

優先度レベル

すべての優先手数料レベルをリクエストする方法の例を以下に示します。

コード
const response = await fetch(heliusEndpoint, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 'helius-example',
    method: 'getPriorityFeeEstimate',
    params: [{
      transaction: serializedTx,
      options: {
        includeAllPriorityFeeLevels: true
      }
    }]
  }),
});

const { result } = await response.json();
console.log(result.priorityFeeLevels);

これにより、異なる優先度レベルを含むオブジェクトが返されます。

コード
{
  "priorityFeeLevels": {
    "min": 10000.0,
    "low": 10000.0,
    "medium": 10000.0,
    "high": 100000.0,
    "veryHigh": 5483924.800000011,
    "unsafeMax": 8698904817.0
  }
}

優先度レベルは、直近のトランザクション手数料の異なるパーセンタイルに対応します。

  • min:0パーセンタイル
  • low:25パーセンタイル
  • medium:50パーセンタイル
  • high:75パーセンタイル
  • veryHigh:95パーセンタイル
  • unsafeMax:100パーセンタイル(使用には注意が必要です)

トランザクションが取り込まれる確率をさらに高めるには、highまたはvery highの優先度レベルの使用を検討してください。ただし、優先度の高いレベル、特にveryHighとunsafeMaxはトランザクションコストを大幅に増加させる可能性があるため、使用には注意が必要です。‍

空スロット評価

Priority Fee APIの最近のアップデートにより、空スロットを考慮した、よりスマートな手数料見積もりが可能になりました。特定のアカウントについてトランザクションを含まないブロックがある場合、APIでこれらのスロットの手数料をゼロとして評価するよう設定でき、ネットワークアクティビティが少ないときに、より正確な見積もりを得られます。

コード
const response = await fetch(heliusEndpoint, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 'helius-example',
    method: 'getPriorityFeeEstimate',
    params: [{
      transaction: serializedTx,
      options: {
        recommended: true,
        evaluateEmptySlotAsZero: true
      }
    }]
  }),
});

evaluateEmptySlotAsZeroを有効にすると、APIは以下を実行します。

  • 対象アカウントのトランザクションがないブロックを特定します
  • これらの空スロットの手数料をゼロとして計算します
  • 混雑が少ないときは見積もりを引き下げます
  • ネットワークアクティビティが少ないときの過払いを防ぎます

トランザクション最適化戦略

優先手数料に加えて、トランザクションの最適化には、取り込まれる確率を高めるために連携する複数の重要な要素があります。

コンピュートユニットの管理

  1. Helius SDKを使用して、トランザクションに最適なコンピュートユニットを取得します。‍
コード
const response = await helius.rpc.getComputeUnits({
  transaction: serializedTransaction
});

const computeUnits = response.computeUnits;
  1. コンピュートユニット上限をトランザクションに追加します。
コード
transaction.add(
  ComputeBudgetProgram.setComputeUnitLimit({
    units: computeUnits
  })
);

コミットメントレベル

‍ほとんどのアプリケーションでは、processedコミットメントレベルが最適なバランスを提供します。次の利点があります。

  • 確認時間が最も短くなります
  • ほとんどのユースケースに十分なセキュリティを提供します
  • ブロックハッシュが期限切れになるリスクを軽減します
  • 混雑時にトランザクションがドロップされる可能性を最小限に抑えます

アプリケーションの動作に一貫性を持たせるため、トランザクションの送信と確認には常に同じコミットメントレベルを使用してください。

RPCの設定

トランザクションの再送信をより細かく制御するため、maxRetriesを0に設定し、独自の再試行ロジックを実装してください。レイテンシを低減するには、skipPreflight: trueを使用します。これは特に混雑が激しい時間帯に有効です。

コード
const signature = await connection.sendTransaction(transaction, {
  maxRetries: 0,
  skipPreflight: true
});

ステーク済みエンドポイントの使用

Heliusのステーク済みエンドポイントを使用すると、ステーク済み接続へ直接かつ確実にアクセスでき、優先手数料を手動で最適化する必要がなくなります。

コード
const connection = new Connection(
  'https://staked.helius-rpc.com?api-key=YOUR_API_KEY'
);

// Transaction will be processed with optimal priority
const signature = await connection.sendTransaction(transaction);

ステーク済みエンドポイントには、次の利点があります。

  • ステーク済み帯域幅が保証されます
  • 混雑時のトランザクション失敗を減らします
  • 専用インフラストラクチャにより、トランザクションをより速く伝播します

まとめ

Solanaでトランザクションを確実に取り込ませるには、特にネットワーク混雑時に、優先手数料を効果的に活用することが重要です。Helius Priority Fee APIを活用し、ここで紹介した戦略を実装することで、コストとのバランスを取りながらトランザクションの成功率を大幅に高められます。最適な結果を得るため、最新情報を把握し、ネットワーク状況に応じて対応を調整してください。

ここまでお読みいただき、ありがとうございます。このガイドが、Solanaでトランザクションを最適化する方法を理解する一助となれば幸いです。Solanaの最新情報を見逃さないよう、ぜひニュースレターをご購読ください。 

さらに詳しく知りたいですか?

今すぐHeliusブログで最新記事を読み、Solanaの旅を続けてください。

Heliusを購読

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

拡大画像