Alquiler y Exención de Alquiler
Las cuentas de Solana deben tener suficientes lamports para estar exentas de alquiler - un depósito único basado en el tamaño de los datos. Sin él, las cuentas no pueden persistir en la cadena.
Receta
solana rent 200const rent = await rpc.getMinimumBalanceForRentExemption(200n).send();Cuándo recurrir a esto:
- Dimensionamiento de las transferencias
initdel pagador en programas Anchor - Estimación del coste de incorporación de usuarios (cuántas cuentas crear)
- Cierre de cuentas para recuperar el alquiler
- Presupuesto del tesoro del protocolo para subsidios de creación de cuentas
Ejemplo de Trabajo
use anchor_lang::prelude::*;
#[derive(Accounts)]
pub struct InitConfig<'info> {
#[account(
init,
payer = payer,
space = 8 + Config::INIT_SPACE,
)]
pub config: Account<'info, Config>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
#[derive(InitSpace)]
pub struct Config {
pub admin: Pubkey,
pub fee_bps: u16,
}import { createSolanaRpc } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const space = 8 + 32 + 2; // discriminador + campos
const minBalance = await rpc.getMinimumBalanceForRentExemption(BigInt(space)).send();
console.log("Mínimo exento de alquiler:", minBalance, "lamports");Lo que esto demuestra:
- Las transferencias
initmueven al menos el mínimo exento de alquiler del pagador a la nueva cuenta - El cálculo del espacio debe incluir el discriminador de 8 bytes de Anchor
- RPC devuelve la cantidad exacta de lamports para cualquier tamaño de bytes
Inmersión Profunda
Cómo Funciona
- El alquiler es una función del tamaño de los datos y una tasa anual de lamports por byte en toda la red
- Exento de alquiler significa mantener ~2 años de alquiler por adelantado - la cuenta nunca paga alquiler recurrente
- Los lamports permanecen en el saldo de la cuenta - recuperables al cerrar
- El Programa del Sistema aplica el saldo mínimo en la asignación
Tamaños Típicos
| Tipo de Cuenta | Bytes | Alquiler Aprox. (lamports) |
|---|---|---|
| Billetera Vacía | 0 | ~890,880 |
| Cuenta Token SPL | 165 | ~2,039,280 |
| Estructura pequeña de Anchor | 8 + 40 | ~1,500,000+ |
Los valores exactos cambian con los parámetros del clúster - siempre consulta RPC.
Trampas Comunes
spaceinsuficiente en Anchor -initfalla o trunca datos. Solución: usa la derivaciónInitSpaceo el cálculo manual con longitudes máximas de cadena/vector.- Olvidar el discriminador en
space- diferencia de 8 bytes. Solución: siempre añade 8 para cuentas Anchor. - Asumir que el alquiler es un cargo recurrente - las cuentas exentas de alquiler pagan una vez. Solución: financia hasta el mínimo al crear; sin facturación recurrente.
- No recuperar el alquiler al cerrar - fondos del usuario bloqueados para siempre. Solución: implementa la restricción
close. - Valores de alquiler codificados - los parámetros del clúster pueden cambiar. Solución: consulta
getMinimumBalanceForRentExemptionen los clientes.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
CLI solana rent | Estimaciones rápidas en terminal | Lógica de programa en cadena |
| Consulta de alquiler RPC | Visualización dinámica de costes en UI del cliente | Dentro de BPF (usa sysvar o buffer fijo) |
| Compresión de estado | Millones de registros pequeños | Estado mutable en caliente |
Preguntas Frecuentes
¿Qué es la exención de alquiler?
Financiar una cuenta con suficientes lamports para cubrir ~2 años de alquiler de almacenamiento por adelantado. La cuenta persiste entonces sin cargos de alquiler recurrentes.
¿Cómo calculo el alquiler para una cuenta Anchor?
space = 8 + sizeof campos serializados (con longitudes máximas para String/Vec). Consulta RPC para lamports exactos.
¿Puedo recuperar el alquiler?
Sí. Cierra la cuenta y los lamports se devuelven a un destino que especifiques.
¿Qué sucede si el saldo cae por debajo del exento de alquiler?
El comportamiento heredado podía realizar una recolección de basura; la práctica moderna requiere exención de alquiler en la creación. Las inicializaciones con fondos insuficientes fallan.
¿Un tamaño de datos mayor siempre significa más alquiler?
Sí. El alquiler escala linealmente con el tamaño de los datos en bytes.
¿Quién paga el alquiler al crear la cuenta?
El firmante payer en init - típicamente el usuario o el tesoro del protocolo.
¿El bytecode del programa está sujeto a alquiler?
Sí. Los programas desplegados retienen lamports para el tamaño de su cuenta de datos del programa.
¿Cómo afecta `realloc` al alquiler?
El crecimiento de datos puede requerir lamports adicionales transferidos para mantener la exención de alquiler.
¿Qué es el sysvar de alquiler?
El sysvar Rent contiene los parámetros de cálculo. Raramente se lee directamente en programas modernos.
¿Debería subsidiar la creación de cuentas de usuario?
Patrón de UX común para ATAs y PDAs. Presupuesta el tesoro en consecuencia.
¿El alquiler de devnet coincide con el de mainnet?
Misma fórmula; las cantidades son idénticas para el mismo tamaño de datos.
¿Puede el cálculo del alquiler diferir según el tipo de cuenta?
No. Solo el tamaño de los datos y los parámetros de alquiler del clúster importan.
Relacionado
- Creación y Cierre de Cuentas - recuperar alquiler
- Anatomía de la Cuenta - campo de lamports
- Cuentas de Datos y Diseño - dimensionamiento de diseños
Versiones de Stack: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.