Tarifas de transacción
Cada transacción de Solana requiere una tarifa de transacción, pagada en SOL. Las tarifas de transacción se dividen en dos partes: la tarifa base y la tarifa de priorización. La tarifa base compensa a los validadores por procesar la transacción. La tarifa de priorización es una tarifa opcional para aumentar la probabilidad de que el líder actual procese tu transacción.
Tarifa base
Cada transacción cuesta 5000 lamports por firma incluida. Esta tarifa es pagada por el primer firmante de la transacción y debe ser pagada por una cuenta propiedad del System Program. La tarifa base se divide de la siguiente manera:
- 50% quemado: La mitad es quemada (retirada de la oferta circulante de SOL).
- 50% distribuido: La mitad es pagada al validator que procesó la transacción.
Tarifa de priorización
Una tarifa de priorización es una tarifa opcional utilizada para aumentar la probabilidad de que el líder actual (validator) procese tu transacción. El validator recibe el 100% de la tarifa de prioridad. Las tarifas de priorización pueden establecerse ajustando el precio de unidad de cómputo (CU) y el límite de CU de la transacción. (Consulta la Guía de cómo usar tarifas de prioridad para más detalles sobre las tarifas de priorización.)
La tarifa de priorización se calcula de la siguiente manera:
Tarifa de priorización = Límite de unidades de cómputo × Precio de unidad de cómputo
La tarifa de priorización se utiliza para determinar la prioridad de tu transacción, en relación con otras transacciones. Se calcula utilizando la siguiente fórmula:
Prioridad de la transacción = Tarifa de priorización / Tamaño de la transacción
Límite de unidades de cómputo
Por
defecto,
a cada instrucción se le asignan
200,000 CUs
y a cada transacción se le asignan
1.4 millones de CUs.
Puedes cambiar estos valores predeterminados incluyendo una instrucción
SetComputeUnitLimit
en tu transacción.
Para calcular el límite de CU apropiado para tu transacción, recomendamos los siguientes pasos:
- Estima las unidades CU requeridas simulando la transacción
- Añade un margen de seguridad del 10% a esta estimación
La tarifa de prioridad está determinada por el límite de unidades de cómputo solicitado en la transacción, no por el número real de unidades de cómputo utilizadas. Si estableces un límite de unidades de cómputo demasiado alto o usas la cantidad predeterminada, podrías pagar por unidades de cómputo no utilizadas.
Precio de unidad de cómputo
El precio de unidad de cómputo es una cantidad opcional de micro-lamports pagada por cada CU solicitada. Puedes pensar en el precio de CU como una propina para animar al validator a priorizar tu transacción. Para establecer el precio de CU, incluye una instrucción ComputeBudgetInstruction::set_compute_unit_price en tu transacción.
El precio de CU predeterminado es 0, lo que significa que la tarifa de priorización predeterminada también es 0.
Para ayudarte a determinar el mejor precio de CU para tu transacción, consulta la recomendación de precio de CU en tiempo real proporcionada en la tabla a continuación.
Proveedor | API de tarifa de prioridad |
---|---|
Helius | Documentación |
QuickNode | Documentación |
Triton | Documentación |
Ejemplo
Los ejemplos a continuación muestran cómo establecer el límite de CU y el precio de CU en una transacción usando los SDK de Solana.
SDK | Referencia del código fuente |
---|---|
@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?