すべてのSolanaトランザクションには、SOLで支払われるトランザクション手数料が必要です。トランザクション手数料は、基本手数料と優先手数料の2つの部分に分かれています。基本手数料は、トランザクションを処理するバリデータへの報酬です。優先手数料は任意の手数料で、現在のリーダーがあなたのトランザクションを処理する可能性を高めるためのものです。
基本手数料
すべてのトランザクションは、含まれる署名ごとに5000lamportsのコストがかかります。この手数料は、トランザクションの最初の署名者によって支払われます。System Programが所有するアカウントのみがトランザクション手数料を支払うことができます。基本手数料は次のように分配されます。
- 50%バーン: 半分はバーン(流通しているSOL供給量から除外)されます。
- 50%分配: 半分は、トランザクションを処理したバリデータに支払われます。
優先手数料
優先手数料は、現在のリーダー(validator)があなたのトランザクションを処理する可能性を高めるための任意の手数料です。validatorは優先手数料の100%を受け取ります。優先手数料は、トランザクションの計算ユニット(CU)価格とCU制限を調整することで設定できます。(優先手数料の詳細については、優先手数料の使用方法ガイドを参照してください。)
優先手数料は次のように計算されます。
Prioritization fee = CU limit * CU price
優先手数料は、他のトランザクションと比較して、トランザクションの優先度を決定するために使用されます。次の式を使用して計算されます。
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
計算ユニット制限
デフォルトでは、各命令には200,000 CUが割り当てられ、各トランザクションには140万CUが割り当てられます。トランザクションにSetComputeUnitLimit命令を含めることで、これらのデフォルト値を変更できます。
トランザクションに適切なCU制限を計算するには、以下の手順を推奨します。
- トランザクションをシミュレートして、必要なCUユニットを見積もる
- この見積もりに10%の安全マージンを追加する
優先手数料は、トランザクションで要求されたコンピュートユニット制限によって決定され、実際に使用されたコンピュートユニット数ではありません。コンピュートユニット制限を高く設定しすぎたり、デフォルト量を使用したりすると、未使用のコンピュートユニットに対して料金を支払う可能性があります。
コンピュートユニット価格
コンピュートユニット価格は、要求された各CUに対して支払われるマイクロlamportのオプション金額です。CU価格は、バリデーターにトランザクションを優先するよう促すチップと考えることができます。CU価格を設定するには、トランザクションにSetComputeUnitPrice命令を含めます。
トランザクションに最適なCU価格を決定するには、以下の表に記載されているリアルタイムのCU価格推奨を参照してください。
例
以下の例は、Solana SDKを使用してトランザクションにCU制限とCU価格を設定する方法を示しています。
| SDK | ソースコードリファレンス |
|---|---|
@solana/web3.js (Typescript) | ComputeBudgetProgram |
solana-sdk (Rust) | ComputeBudgetInstruction |
const limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,Keypair,Connection,ComputeBudgetProgram,sendAndConfirmTransaction} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = Keypair.generate();const recipient = new Keypair();const airdropSignature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(airdropSignature, "confirmed");// Create compute budget instructionsconst limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: recipient.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});// Add the compute budget and transfer instructions to a new transactionconst transaction = new Transaction().add(limitInstruction).add(priceInstruction).add(transferInstruction);const signature = await sendAndConfirmTransaction(connection, transaction, [sender]);console.log("Transaction Signature:", signature);
Is this page helpful?