Al asignar espacio de almacenamiento, el pagador debe abonar un cierto número de SOL por cada byte asignado.
Solana llama a esto la “renta”. Este nombre es un poco engañoso porque implica que se requiere una recarga mensual, pero no siempre es el caso. Una vez que se paga la renta, no se necesitan más pagos, incluso después de que pasen los dos años. Cuando se pagan dos años de renta, la cuenta se considera “exenta de renta”.
El nombre proviene de que originalmente Solana cobraba a las cuentas en función de los bytes por año. Si solo pagabas la renta suficiente para medio año, tu cuenta se borraba después de seis meses. Si pagabas dos años de renta por adelantado, la cuenta quedaba “exenta de renta”. La cuenta nunca más tendría que pagar renta. Hoy en día, es obligatorio que todas las cuentas estén exentas de renta; no puedes pagar menos de 2 años de renta.
Aunque la renta se calcula “por byte”, las cuentas sin datos (cero bytes) no son gratuitas; Solana todavía tiene que indexarlas y almacenar metadatos sobre ellas.
Cuando se inicializan las cuentas, la cantidad de renta necesaria se calcula en segundo plano; no es necesario calcular la renta explícitamente.
Sin embargo, es conveniente poder anticipar cuánto costará el almacenamiento para poder diseñar tu aplicación adecuadamente.
Si deseas una estimación rápida, ejecutar solana rent <number of bytes> en la línea de comandos te dará una respuesta rápida:

Como se mencionó anteriormente, asignar cero bytes no es gratuito:

Veamos cómo se calcula esta tarifa.
El Anchor Rent Module nos proporciona algunas constantes relacionadas con la renta:
ACCOUNT_STORAGE_OVERHEAD: esta constante tiene un valor de 128 (bytes) y, como sugiere el nombre, una cuenta vacía tiene 128 bytes de sobrecarga.DEFAULT_EXEMPTION_THRESHOLD: esta constante tiene un valor de 2.0 (float 64) y se refiere al hecho de que pagar dos años de renta por adelantado hace que la cuenta quede exenta de pagar más renta.DEFAULT_LAMPORTS_PER_BYTE_YEAR: esta constante tiene un valor de 3,480, lo que significa que cada byte requiere 3,480 lamports por año. Dado que estamos obligados a pagar el equivalente a dos años, cada byte nos costará 6,960 lamports.
El siguiente programa en Rust imprime cuánto nos costará una cuenta vacía. Ten en cuenta que el resultado coincide con la captura de pantalla de solana rent 0 de arriba:
use anchor_lang::prelude::*;
use anchor_lang::solana_program::rent as rent_module;
declare_id!("BfMny1VwizQh89rZtikEVSXbNCVYRmi6ah8kzvze5j1S");
#[program]
pub mod rent {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
let cost_of_empty_acc = rent_module::ACCOUNT_STORAGE_OVERHEAD as f64 *
rent_module::DEFAULT_LAMPORTS_PER_BYTE_YEAR as f64 *
rent_module::DEFAULT_EXEMPTION_THRESHOLD;
msg!("cost to create an empty account: {}", cost_of_empty_acc);
// 890880
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize {}
Si queremos calcular cuánto costará una cuenta que no está vacía, simplemente sumamos el número de bytes al costo de una cuenta vacía de la siguiente manera:
use anchor_lang::prelude::*;
use anchor_lang::solana_program::rent as rent_module;
declare_id!("BfMny1VwizQh89rZtikEVSXbNCVYRmi6ah8kzvze5j1S");
#[program]
pub mod rent {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
let cost_of_empty_acc = rent_module::ACCOUNT_STORAGE_OVERHEAD as f64 *
rent_module::DEFAULT_LAMPORTS_PER_BYTE_YEAR as f64 *
rent_module::DEFAULT_EXEMPTION_THRESHOLD;
msg!("cost to create an empty account: {}", cost_of_empty_acc);
// 890,880 lamports
let cost_for_32_bytes = cost_of_empty_acc +
32 as f64 *
rent_module::DEFAULT_LAMPORTS_PER_BYTE_YEAR as f64 *
rent_module::DEFAULT_EXEMPTION_THRESHOLD;
msg!("cost to create a 32 byte account: {}", cost_for_32_bytes);
// 1,113,600 lamports
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize {}
Nuevamente, ten en cuenta que la salida de este programa coincide con la salida en la línea de comandos.
Comparación de los costos de almacenamiento con ETH
Al momento de escribir este artículo, ETH tiene un valor de aproximadamente $2,425. Inicializar una cuenta nueva cuesta 22,100 gas, por lo que podemos calcular que el costo de gas de 32 bytes es de $0.80 asumiendo que los costos de gas son de 15 gwei.
Actualmente, Solana tiene un precio de $90 / SOL, por lo que pagar 1,113,600 lamports para inicializar un almacenamiento de 32 bytes costará $0.10.
Sin embargo, ETH tiene una capitalización de mercado 7.5 veces mayor que SOL, por lo que si SOL tuviera la misma capitalización de mercado que ETH, el precio actual de SOL sería de $675, y el almacenamiento de 32 bytes costaría $0.75.
Solana tiene un modelo de inflación permanente que eventualmente convergerá al 1.5% por año, por lo que esto debería ayudar a reflejar el hecho de que el almacenamiento se vuelve más barato con el tiempo según la Ley de Moore, que establece que la densidad de transistores por el mismo costo se duplica cada 18 meses.
Recuerda, la conversión de bytes a criptomonedas son constantes establecidas en el protocolo que un hard fork podría cambiar en cualquier momento.
Las cuentas con saldos por debajo del umbral de exención de renta de 2 años se reducen hasta que la cuenta es eliminada
Aquí se puede leer un hilo de Reddit bastante gracioso de un usuario que veía cómo su cuenta de billetera se iba “vaciando” lentamente: https://www.reddit.com/r/solana/comments/qwin1h/my_sol_balance_in_the_wallet_is_decreasing/
La razón de esto es que la billetera estaba por debajo del umbral de exención de renta, y el entorno de ejecución de Solana estaba reduciendo lentamente el saldo de la cuenta para pagar la renta.
Si una billetera termina siendo eliminada debido a tener el saldo por debajo del umbral de exención de renta, puede ser “resucitada” enviándole más SOL, pero si había datos almacenados en la cuenta, esos datos se perderán.
Limitaciones de tamaño
Cuando inicializamos una cuenta, no podemos inicializar más de 10,240 bytes de tamaño.
Ejercicio: crea un programa básico de inicialización de almacenamiento y establece space=10241. Esto es 1 byte superior al límite. Deberías ver un error como el siguiente:

Cambiar el tamaño de una cuenta
Si necesitas aumentar el tamaño de la cuenta, podemos usar la macro realloc. Esto puede ser útil si la cuenta está almacenando un vector y necesita más espacio. Un ejemplo está en la función increase_account_size y la estructura de contexto IncreaseAccountSize que incrementa el tamaño en 1,000 bytes (mira el comentario en MAYÚSCULAS en el código a continuación):
use anchor_lang::prelude::*;
use std::mem::size_of;
declare_id!("GLKUcCtHx6nkuDLTz5TNFrR4tt4wDNuk24Aid2GrDLC6");
#[program]
pub mod basic_storage {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
Ok(())
}
pub fn increase_account_size(ctx: Context<IncreaseAccountSize>) -> Result<()> {
Ok(())
}
}
#[derive(Accounts)]
pub struct IncreaseAccountSize<'info> {
#[account(mut,
// ***** 1,000 BYTE INCREMENT IS OVER HERE *****
realloc = size_of::<MyStorage>() + 8 + 1000,
realloc::payer = signer,
realloc::zero = false,
seeds = [],
bump)]
pub my_storage: Account<'info, MyStorage>,
#[account(mut)]
pub signer: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init,
payer = signer,
space=size_of::<MyStorage>() + 8,
seeds = [],
bump)]
pub my_storage: Account<'info, MyStorage>,
#[account(mut)]
pub signer: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct MyStorage {
x: u64,
}
Al aumentar el tamaño de la cuenta, asegúrate de establecer realloc::zero = false (en el código de arriba) si no deseas que los datos de la cuenta se borren. Si deseas que los datos de la cuenta se establezcan en puros ceros, usa realloc::zero = true. No es necesario que cambies la prueba. La macro se encargará de esto por ti de forma oculta.
Ejercicio: Inicializa una cuenta en la prueba y luego llama a la función increase_account_size. Visualiza el tamaño de la cuenta con solana account <addr> en la línea de comandos. Necesitarás hacer esto con el validador local para que la cuenta persista.
Tamaño máximo de cuenta en Solana
El incremento máximo de tamaño de una cuenta por realloc es 10240. El tamaño máximo que puede tener una cuenta en Solana es de 10 MB.
Anticipación del costo de despliegue de un programa
La mayor parte del costo de desplegar un programa en Solana proviene del pago de la renta por almacenar el bytecode. El bytecode se almacena en una cuenta separada de la dirección que devuelve anchor deploy.
La siguiente captura de pantalla muestra cómo obtener esta información:

Un simple programa “hello world” actualmente cuesta un poco más de 2.47 SOL para desplegar. El costo puede reducirse significativamente escribiendo código en Rust puro en lugar de utilizar el framework Anchor, pero no recomendamos hacer eso hasta que comprendas completamente todos los riesgos de seguridad que Anchor elimina por defecto.
Aprende más con RareSkills
Consulta nuestro curso para desarrolladores de Solana para aprender más.
Publicado originalmente el 28 de febrero de 2024