コンピュートユニット(CU)と優先料金によるトランザクション実行の最適化
Last updated September 21, 2026
まとめ
UmiのV1トランザクションでは、シミュレーションでコンピュート消費量を推定し、コンピュート制限と優先料金の合計をTransactionV1Configに格納します。
- 1,400,000のコンピュートユニット制限でシミュレーションします。
- 消費されたユニットに安全マージンを加えます。
- コンピュートユニットあたりのマイクロラムポートで市場価格を見積もります。
setTransactionConfig()を呼び出す前に、見積もりをラムポート単位の合計料金へ変換します。
Solanaでトランザクションを送信する際は、2つの重要なパラメータを最適化することで、トランザクションの成功率とコスト効率を大幅に向上させることができます。
クイックスタート
トランザクションを送信する前に、V1のコンピュート制限と優先料金の合計を見積もります。
- トランザクションの書き込み可能アカウントに対して最近支払われた料金から優先料金を見積もります。
- V1の最大コンピュート制限でトランザクションをシミュレーションします。
setTransactionConfig()を使用して見積もった値を適用します。- SOL転送の完全な例を実行します。
優先料金
優先料金を使用すると、ローカル料金市場で入札し、トランザクションをより早く取り込ませることができます。ネットワークが混雑し、複数のトランザクションが同じアカウントの変更を競う場合、バリデーターは優先料金が高いトランザクションを優先します。
優先料金の要点:
- 計算式は
compute_unit_limit * compute_unit_priceです - 料金が高いほど、より早く取り込まれる可能性が高まります
- 現在のネットワーク競合に基づき、必要な金額だけを支払います
コンピュートユニット制限
コンピュートユニット(CU)は、トランザクションに必要な計算リソースを表します。トランザクションは安全策として多くのCUを要求するのがデフォルトですが、多くの場合これは非効率です。
- 実際の使用量に関係なく、要求したすべてのCUに対して優先料金を支払います
- ブロックのCU容量は限られているため、過剰なCUの要求はブロックあたりの総トランザクション数を減らします
CU制限を最適化する利点:
- 必要なCUのみに支払うことでトランザクションコストを削減できます
- 1ブロックに含められるトランザクション数が増え、ネットワーク効率が向上します
- 実行に十分なリソースを確保できます
たとえば、単純なトークン転送には20,000 CUで十分でも、NFTのミントには100,000 CUが必要な場合があります。これらの制限を適切に設定すると、コストとネットワーク全体のスループットの両方を最適化できます。
実装ガイド
このガイドでは、推測ではなくプログラムによって最適な値を計算する方法を説明します。
Umiはまだこれらのメソッドを実装していないため、コード例ではRPC呼び出しにfetchを使用しています。公式サポートが追加されたら、Umiの組み込みメソッドを優先して使用してください。
優先料金を計算する
優先料金を使用する際は、競合を考慮することが重要です。手動で非常に大きな値を指定すると必要以上の料金を支払う可能性があり、低すぎる値を指定すると競合が激しい場合にトランザクションがブロックへ取り込まれない可能性があります。
トランザクション内のアカウントに対して最近支払われた優先料金は、getRecentPrioritizationFees RPC呼び出しで取得できます。ここでは、支払われた料金の上位100件に基づいて平均を計算します。この件数は経験に応じて調整できます。
必要な手順:
- トランザクションから書き込み可能なアカウントを抽出します
- それらのアカウントに対して最近支払われた料金を照会します
- 市場の状況に基づいて最適な料金を計算します
ページ下部には、この処理を使用したSOL転送の完全な例があります。
コンピュートユニットを計算する
トランザクションコストを最適化し、信頼性の高い実行を確保するには、最初にトランザクションをシミュレーションして、理想的なコンピュートユニット制限を計算します。この方法は固定値を使用するより正確で、リソースの過剰割り当てを防ぐのに役立ちます。
シミュレーションの手順:
- 最大コンピュートユニット(1,400,000)でトランザクションを構築します
- シミュレーションして、実際に消費されるコンピュートユニットを測定します
- 変動を考慮して10%の安全バッファを追加します
- シミュレーションが失敗した場合は、保守的なデフォルト値へフォールバックします
SOL転送の完全な例
上記のコードにUmiインスタンスを作成するためのボイラープレートを加えると、SOL転送トランザクションを作成する次のようなスクリプトになります。
注意事項
- このガイドはUmi 1.6.0以降とV1トランザクションを対象としています。
TransactionV1Config.priorityFeeはラムポート単位の合計金額ですが、getRecentPrioritizationFeesはコンピュートユニットあたりのマイクロラムポート単位の価格を返します。- V1トランザクションはAddress Lookup TablesやCompute Budget命令をサポートしません。
- 既存のV0トランザクションビルダーを変換する場合は、V0からV1トランザクションへの移行を参照してください。
