Tipos de cuentas

Resumen

Las cuentas de programa contienen código ejecutable sBPF. Las cuentas de datos almacenan estado, propiedad de los programas. Las cuentas del sistema son propiedad del System Program. Los sysvars proporcionan estado del clúster accesible en direcciones predefinidas.

El campo executable determina la categoría de una cuenta:

Esta separación del código del estado mutable significa que un programa se despliega una vez y puede gestionar cualquier número de cuentas de datos.

Cuentas de programa

Una cuenta de programa almacena código ejecutable. Cada cuenta de programa es propiedad de un programa cargador. Cuando un programa se despliega, el runtime crea una cuenta de programa para contener su bytecode.

Diagrama de una cuenta de programa, sus 4 componentes y su programa cargador.Diagrama de una cuenta de programa, sus 4 componentes y su programa cargador.

Cuentas de datos de programa

Los programas desplegados usando loader-v3 (ver Programas cargadores) no almacenan bytecode ejecutable en su propio campo data. En su lugar, su data apunta a una cuenta de datos de programa separada que contiene el código del programa. (Ver el diagrama a continuación.)

Una cuenta de programa con datos. Los datos apuntan a una cuenta de datos de programa separadaUna cuenta de programa con datos. Los datos apuntan a una cuenta de datos de programa separada

Durante el despliegue o las actualizaciones del programa, se utilizan cuentas de búfer para preparar temporalmente la carga.

El siguiente ejemplo obtiene la cuenta del Token Program. El campo executable es true, confirmando que es una cuenta de programa.

import { Address, generateKeyPairSigner } from "@solana/kit";
import { createClient } from "@solana/kit-client-rpc";
const feePayer = await generateKeyPairSigner();
const client = createClient({
url: "https://api.mainnet.solana.com",
payer: feePayer
});
const programId = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address;
const accountInfo = await client.rpc
.getAccountInfo(programId, { encoding: "base64" })
.send();
console.log(accountInfo);
Console
Click to execute the code.

Cuentas de datos

Las cuentas de datos no contienen código ejecutable. Almacenan el estado definido por el programa.

Cuenta de estado del programa

Los programas almacenan su estado en cuentas de datos. Crear una cuenta de estado del programa implica dos pasos:

  1. Invocar el System Program para crear la cuenta. El System Program transfiere la propiedad al programa especificado.
  2. El programa propietario inicializa el campo data de la cuenta según sus instrucciones.

Diagrama de una cuenta de datos propiedad de una cuenta de programaDiagrama de una cuenta de datos propiedad de una cuenta de programa

El siguiente ejemplo crea y obtiene una mint account de token propiedad del programa Token 2022.

import { generateKeyPairSigner } from "@solana/kit";
import { createLocalClient } from "@solana/kit-client-rpc";
import { systemProgram } from "@solana-program/system";
import {
getInitializeMintInstruction,
getMintSize,
TOKEN_2022_PROGRAM_ADDRESS,
fetchMint
} from "@solana-program/token-2022";
const client = await createLocalClient().use(systemProgram());
// Generate keypair to use as address of mint
const mint = await generateKeyPairSigner();
// Get default mint account size (in bytes), no extensions enabled
const space = BigInt(getMintSize());
// Get minimum balance for rent exemption
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
const transactionSignature = await client.sendTransaction([
client.system.instructions.createAccount({
newAccount: mint,
lamports: rent,
space,
programAddress: TOKEN_2022_PROGRAM_ADDRESS
}),
getInitializeMintInstruction({
mint: mint.address,
decimals: 9,
mintAuthority: client.payer.address
})
]);
console.log("Mint Address:", mint.address);
console.log("Transaction Signature:", transactionSignature.context.signature);
const accountInfo = await client.rpc.getAccountInfo(mint.address).send();
console.log(accountInfo);
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log(mintAccount);
Console
Click to execute the code.

Cuentas del sistema

Las cuentas que permanecen propiedad del System Program después de su creación se llaman cuentas del sistema. Enviar SOL a una nueva dirección por primera vez crea una nueva cuenta en esa dirección propiedad del System Program.

Todas las cuentas de billetera son cuentas del sistema. El pagador de comisiones en una transacción debe ser una cuenta del sistema, porque solo las cuentas propiedad del System Program pueden pagar comisiones de transacción.

Una billetera propiedad del System Program que contiene 1 000 000 lamportsUna billetera propiedad del System Program que contiene 1 000 000 lamports

El siguiente ejemplo genera un nuevo keypair, lo financia con SOL y obtiene la cuenta. El campo owner es 11111111111111111111111111111111 (el System Program).

import { generateKeyPairSigner, lamports } from "@solana/kit";
import { createLocalClient } from "@solana/kit-client-rpc";
const client = await createLocalClient();
// Generate a new keypair
const keypair = await generateKeyPairSigner();
console.log(`Public Key: ${keypair.address}`);
// Funding an address with SOL automatically creates an account
const signature = await client.airdrop(
keypair.address,
lamports(1_000_000_000n)
);
const accountInfo = await client.rpc.getAccountInfo(keypair.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Cuentas sysvar

Las cuentas sysvar son cuentas especiales en direcciones predefinidas que proporcionan acceso de solo lectura a los datos del estado del clúster. Se actualizan dinámicamente cada slot.

SysvarDirecciónPropósito
ClockSysvarC1ock11111111111111111111111111111111Slot actual, epoch y marca de tiempo Unix
EpochScheduleSysvarEpochSchedu1e111111111111111111111111Constantes de programación de epoch establecidas en génesis
EpochRewardsSysvarEpochRewards1111111111111111111111111Estado y progreso de la distribución de recompensas de epoch
RentSysvarRent111111111111111111111111111111111Tasa de rent y umbral de exención
SlotHashesSysvarS1otHashes111111111111111111111111111Hashes más recientes de los bancos padre del slot
StakeHistorySysvarStakeHistory1111111111111111111111111Activaciones y desactivaciones de stake por epoch
LastRestartSlotSysvarLastRestartS1ot1111111111111111111111Último slot de reinicio del clúster
InstructionsSysvar1nstructions1111111111111111111111111Instrucciones serializadas de la transacción actual
SlotHistorySysvarS1otHistory11111111111111111111111111Registro de qué slots se produjeron durante el último epoch

El siguiente ejemplo obtiene y deserializa la cuenta Sysvar Clock.

import { generateKeyPairSigner } from "@solana/kit";
import { createClient } from "@solana/kit-client-rpc";
import { fetchSysvarClock, SYSVAR_CLOCK_ADDRESS } from "@solana/sysvars";
const feePayer = await generateKeyPairSigner();
const client = createClient({
url: "https://api.mainnet.solana.com",
payer: feePayer
});
const accountInfo = await client.rpc
.getAccountInfo(SYSVAR_CLOCK_ADDRESS, { encoding: "base64" })
.send();
console.log(accountInfo);
// Automatically fetch and deserialize the account data
const clock = await fetchSysvarClock(client.rpc);
console.log(clock);
Console
Click to execute the code.

Is this page helpful?

Tabla de Contenidos

Editar Página

Gestionado por

© 2026 Fundación Solana.
Todos los derechos reservados.
Conéctate