Conceptos básicos del modelo de cuentas
10 ejemplos para empezar con el modelo de cuentas de Solana: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con el modelo de cuentas de Solana: 7 básicos y 3 intermedios.
solana config set --url devnet
npm install @solana/kit@7.0.0 @coral-xyz/anchor@0.32.1Anchor 0.32.1 / anchor-lang 0.32.1 para los ejemplos en cadena. La semántica del validador Agave 4.1.1 se aplica en todo momento.
Cada cuenta expone los mismos cinco campos principales a través de RPC.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const { value } = await rpc.getAccountInfo(address("TU_PUBKEY"), { encoding: "base64" }).send();
console.log({
lamports: value?.lamports,
owner: value?.owner,
executable: value?.executable,
dataLength: value?.data.length,
rentEpoch: value?.rentEpoch,
});lamports es el saldo de SOL; owner es el programa permitido para escribir dataexecutable: true significa que la cuenta es un programa desplegadonull: aún no existe ninguna cuentaRelacionado: Anatomía de la cuenta - desglose campo por campo
El tamaño de los datos de la cuenta determina el depósito exento de alquiler.
solana rent 165Relacionado: Alquiler y exención de alquiler - detalles del cálculo
El campo owner determina quién puede escribir datos.
const SYSTEM_PROGRAM = "11111111111111111111111111111111";
const TOKEN_PROGRAM = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
// Propiedad del sistema: solo el Programa del Sistema puede mutar (por ejemplo, cuentas de billetera)
// Propiedad del token: el programa SPL Token gestiona los datos de la cuenta de tokeninitRelacionado: Cuentas del sistema frente a cuentas de programas
La creación de cuentas asigna espacio y transfiere la propiedad.
solana create-account --help
# Normalmente se hace a través de la inicialización del programa o comandos de asignación de la CLI// Anchor maneja esto a través de #[account(init, payer = ..., space = N)]space es el tamaño del búfer de datos en bytesRelacionado: Creación y cierre de cuentas
Los programas almacenan el estado de la aplicación en cuentas separadas.
#[account]
pub struct Counter {
pub count: u64,
}
#[derive(Accounts)]
pub struct Increment<'info> {
#[account(mut)]
pub counter: Account<'info, Counter>,
}Counter contiene datos; la binaria del programa contiene la lógicaAccount<'info, Counter> deserializa el búfer de bytes a través de BorshRelacionado: Estado propiedad del programa
Solo el programa propietario puede escribir; tu programa debe validar los firmantes.
#[derive(Accounts)]
pub struct Update<'info> {
#[account(mut, has_one = authority)]
pub data: Account<'info, MyData>,
pub authority: Signer<'info>,
}has_one = authority verifica que una pubkey almacenada coincida con el firmanteRelacionado: Propiedad y permisos de cuenta
Dimensiona el búfer de datos antes de init.
#[account]
pub struct Profile {
pub authority: Pubkey, // 32
pub name: String, // 4 + longitud
}
// espacio = 8 (discriminador) + 32 + (4 + 32) para la longitud máxima del nombreString y Vec necesitan un prefijo de longitud de 4 bytes más el tamaño máximo del contenidoRelacionado: Cuentas de datos y diseño
Los PDA son cuentas sin clave privada, propiedad de tu programa.
#[derive(Accounts)]
pub struct InitVault<'info> {
#[account(
init,
seeds = [b"vault", user.key().as_ref()],
bump,
payer = user,
space = 8 + 8,
)]
pub vault: Account<'info, Vault>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}bump se almacena para evitar recalcular el bump canónicoseeds y bumpRelacionado: Estado propiedad del programa
El cierre devuelve lamports a una cuenta de destino.
#[derive(Accounts)]
pub struct CloseAccount<'info> {
#[account(mut, close = receiver)]
pub data: Account<'info, MyData>,
#[account(mut)]
pub receiver: SystemAccount<'info>,
}close transfiere todos los lamports a receiverRelacionado: Creación y cierre de cuentas
Decodificar el estado en cadena desde un cliente.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const account = await rpc
.getAccountInfo(address("COUNTER_ACCOUNT_PUBKEY"), { encoding: "base64" })
.send();
if (account.value) {
const data = Buffer.from(account.value.data[0], "base64");
const discriminator = data.subarray(0, 8);
const count = data.readBigUInt64LE(8);
console.log("Count:", count);
}Relacionado: Cuentas de datos y diseño
Versiones de la pila: Esta página se escribió 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.
Revisado por Chris St. John·Última actualización: 16 jul 2026