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 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. Solo las cuentas que pertenecen al System Program pueden pagar tarifas de transacción. 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 la unidad de cómputo (computation unit) (CU) de la transacción y el límite de CU. (Consulta la guía 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 = Micro-lamports por unidad de cómputo × Límite de unidades 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:
Micro-lamports por unidad de cómputo = Tarifa de priorización / Límite de unidades de cómputo
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 de 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
SetComputeUnitPrice
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?