取引手数料
すべてのSolanaトランザクションには、バリデーターがトランザクションを処理するための基本手数料(SOL)が必要です。また、現在のリーダー(バリデーター)があなたのトランザクションを処理する可能性を高めるために、オプションの優先手数料を支払うこともできます。
重要ポイント
- トランザクションの基本手数料は、トランザクション上の署名1つにつき5000 lamportです。
- 優先手数料(オプション)は、現在のリーダーがあなたのトランザクションを処理する可能性を高めるためにバリデーターに支払う追加手数料です。
- 優先手数料は:**(コンピュートユニット上限 × コンピュートユニット価格)**で計算されます。
- コンピュートユニット上限は、トランザクションが使用できる最大コンピュートユニット数です。
- コンピュートユニット価格は、マイクロlamport単位のコンピュートユニットあたりの価格です。
- 1,000,000マイクロlamport = 1 lamport
- トランザクション手数料の支払者は、System Programが所有するアカウントでなければなりません。
基本トランザクション手数料
基本手数料はトランザクションを送信するためのコストです。トランザクションに含まれる署名1つにつき5000 lamportのコストがかかります。
基本手数料はトランザクション手数料支払者のアカウントから差し引かれます。手数料支払者はトランザクションの最初の署名者です。手数料支払者はSystem Programが所有するアカウントでなければなりません。
優先手数料
優先手数料は、現在のリーダーがあなたのトランザクションを処理する可能性を高めるために支払うオプションの手数料です。
- SIMD-0096: トランザクションを処理するvalidatorは優先手数料の100%を受け取ります。
コンピュートユニットと制限
トランザクションが処理される際、コンピュートユニット(CU)で測定される計算リソースを使用します。各instructionsはトランザクションのコンピュートユニット予算から差し引かれます。
- 最大制限:トランザクションは最大で140万コンピュートユニットまで使用できます。
- デフォルト制限:デフォルトでは、各instructionsは最大20万コンピュートユニットまで使用できます。
- カスタム制限:トランザクションに
SetComputeUnitLimit
instructionsを含めることで、特定のコンピュートユニット制限をリクエストできます。
コンピュートユニットの使用に関する詳細:
コンピュートユニットの使用に関する詳細は最適なコンピュートをリクエストする方法ガイドをご覧ください。
コンピュートユニット価格
コンピュートユニット価格は、リクエストした各コンピュートユニットに対して支払うマイクロlamport単位のオプション金額です。この価格はトランザクションの優先順位付け手数料を計算するために使用されます。
現在のコンピュートユニット価格に関するリアルタイムの推奨事項を得るには、以下のリソースを使用してください:
優先手数料の詳細については優先手数料の使用方法ガイドをご覧ください。
優先順位付け手数料の計算
優先順位付け手数料は次のように計算されます:
優先順位付け手数料 = コンピュートユニット制限 × コンピュートユニット価格
優先手数料を設定する推奨アプローチは、まずトランザクションをシミュレーションして必要なコンピュートユニットを見積もることです。次に、この見積もりに10%の安全マージンを追加し、その結果の値をCompute Unit Limit
として使用します。
トランザクション優先度は、他のトランザクションと比較してどのように優先順位付けされるかを決定し、以下の計算式を使用して算出されます:
優先度 = ((コンピュートユニット上限 * コンピュートユニット価格) + 基本手数料) / (1 + コンピュートユニット上限 + 署名CUs + 書き込みロックCUs)
トランザクションのコンピュートユニット上限と価格を設定するには、以下のinstructionsを使用してください:
SetComputeUnitLimit
特定のユニット上限を設定します。SetComputeUnitPrice
コンピュートユニットあたりの価格を定義します。
これらのinstructionsを提供しない場合、トランザクションはデフォルトのコンピュートユニット上限を使用し、コンピュートユニット価格は0(優先度手数料なし)となります。
優先度手数料は、実際に使用されるコンピュートユニットではなく、トランザクションに対して要求するコンピュートユニット上限に依存します。コンピュートユニット上限を高く設定しすぎたり、デフォルト量を使用したりすると、未使用のコンピュートユニットに対して支払いが発生する可能性があります。
例
以下の例は、トランザクションのコンピュートユニット上限と価格を設定する方法を示しています。
SDK | ソースコード参照 |
---|---|
solana-sdk (Rust) | ComputeBudgetInstruction |
@solana/web3.js (Typescript) | ComputeBudgetProgram |
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?