コンピュートユニット(CU)と優先料金を使用した最適なトランザクション実行

Last updated December 2, 2024

Solanaでトランザクションを送信する際、2つの重要なパラメータを最適化することで、トランザクションの成功率とコスト効率を大幅に向上させることができます:

優先料金

優先料金により、ローカル料金市場で入札を行い、トランザクションをより速く含めることができます。ネットワークが混雑し、複数のトランザクションが同じアカウントの変更を競合する場合、バリデータは優先料金の高いトランザクションを優先します。

優先料金に関する重要なポイント:

  • 計算式:compute_unit_limit * compute_unit_price
  • 料金が高いほど、より速い実行の可能性が向上
  • 現在のネットワーク競合に基づいて必要な分だけ支払う

コンピュートユニット制限

コンピュートユニット(CU)は、トランザクションが必要とする計算リソースを表します。トランザクションは安全策として多くのCUをリクエストすることがデフォルトですが、これは多くの場合非効率です:

  1. 実際の使用量に関係なく、リクエストしたすべてのCUに対して優先料金を支払う
  2. ブロックのCU容量は限られている - 過剰なCUのリクエストはブロック当たりの総トランザクション数を減らす

CU制限の最適化の利点:

  • 必要なCUのみに支払うことによるトランザクションコストの削減
  • ブロック当たりのトランザクション数増加によるネットワーク効率の向上
  • 実行に十分なリソースを確保

例えば、シンプルなトークン転送には20,000 CUしか必要ないかもしれませんが、NFTのミントには100,000 CUが必要な場合があります。これらの制限を適切に設定することで、コストと全体的なネットワークスループットの両方を最適化できます。

実装ガイド

このガイドでは、推測ではなくプログラムで最適な値を計算する方法を説明します。

Umiはまだこれらのメソッドを実装していないため、コード例ではRPC呼び出しにfetchを使用しています。公式サポートが追加された際は、Umiの組み込みメソッドの使用を優先してください。

優先料金の計算

優先料金を使用する際は、競合を考慮に入れることが重要です。手動で巨大な数値を追加すると必要以上の料金を支払うことになり、数値が低すぎると競合が激しい場合にトランザクションがブロックに含まれない可能性があります。

トランザクション内のアカウントに対して支払われた最後の優先料金を取得するには、getRecentPrioritizationFees RPC呼び出しを使用できます。結果を使用して、上位100件の支払済み料金に基づく平均を計算します。この数値は経験に応じて調整できます。

必要な手順:

  1. トランザクションから書き込み可能なアカウントを抽出
  2. それらのアカウントに対して最近支払われた料金を照会
  3. 市場条件に基づいて最適な料金を計算

ページの下部に、これを使ったSol転送の完全な例があります。

コンピュートユニットの計算

トランザクションコストを最適化し、信頼できる実行を確保するために、まずトランザクションをシミュレートして理想的なコンピュートユニット制限を計算できます。このアプローチは固定値を使用するよりも正確で、リソースの過度な割り当てを避けるのに役立ちます。

シミュレーションプロセスの動作:

  1. 最大コンピュートユニット(1,400,000)でトランザクションを構築
  2. シミュレートして実際に消費されるコンピュートユニットを測定
  3. バリエーションを考慮して10%の安全バッファを追加
  4. シミュレーションが失敗した場合は保守的なデフォルトにフォールバック

Sol転送の完全な例

上記のコードに従い、Umiインスタンスを作成するためのボイラープレートを導入すると、Sol転送トランザクションを作成する以下のようなスクリプトが作成できます: