Lectura desde la red

Lee datos de la red de Solana obteniendo diferentes cuentas. Esta sección te ayudará a entender la estructura de las cuentas de Solana. Cada cuenta de Solana tiene una dirección única que se utiliza para localizar sus datos correspondientes en la cadena. Las cuentas contienen datos de estado o un programa ejecutable.

Obtener una cuenta de billetera

Una billetera es una cuenta propiedad del System Program. Las billeteras se utilizan principalmente para almacenar SOL y firmar transacciones. Cuando se envía SOL a una nueva dirección por primera vez, se crea automáticamente una cuenta del sistema.

El ejemplo a continuación genera un nuevo keypair, solicita SOL para financiar la nueva dirección de clave pública, y recupera los datos de la cuenta para la billetera recién financiada.

Fetch account
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`Public Key: ${keypair.publicKey}`);
const connection = new Connection("http://localhost:8899", "confirmed");
// Funding an address with SOL automatically creates an account
const signature = await connection.requestAirdrop(
keypair.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
const accountInfo = await connection.getAccountInfo(keypair.publicKey);
console.log(JSON.stringify(accountInfo, null, 2));
Console
Click to execute the code.

Cuando obtienes una cuenta de billetera, la respuesta incluye los campos mostrados en el ejemplo de salida a la derecha.

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

El campo data contiene los datos de la cuenta almacenados como bytes. Para cuentas de billetera, este campo está vacío (0 bytes).

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

El campo executable indica si el campo data de la cuenta contiene código de programa ejecutable. Para cuentas de billetera este campo es false.

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

El campo lamports contiene el saldo de SOL de la cuenta, en lamports.

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

El campo owner muestra el programa que posee la cuenta. Para las carteras, el propietario siempre es el System Program, con la dirección 11111111111111111111111111111111.

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

El campo rentEpoch es un campo heredado de un mecanismo de rent obsoleto. (Este campo se incluye por compatibilidad con versiones anteriores.)

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

El campo space muestra el número de bytes contenidos en el campo data. Este no es un campo en el tipo Account en sí, pero se incluye en la respuesta.

En este ejemplo, el campo space es 0 porque el campo data contiene 0 bytes de datos.

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

Cuando obtienes una cuenta de billetera, la respuesta incluye los campos mostrados en el ejemplo de salida a la derecha.

El campo data contiene los datos de la cuenta almacenados como bytes. Para cuentas de billetera, este campo está vacío (0 bytes).

El campo executable indica si el campo data de la cuenta contiene código de programa ejecutable. Para cuentas de billetera este campo es false.

El campo lamports contiene el saldo de SOL de la cuenta, en lamports.

El campo owner muestra el programa que posee la cuenta. Para las carteras, el propietario siempre es el System Program, con la dirección 11111111111111111111111111111111.

El campo rentEpoch es un campo heredado de un mecanismo de rent obsoleto. (Este campo se incluye por compatibilidad con versiones anteriores.)

El campo space muestra el número de bytes contenidos en el campo data. Este no es un campo en el tipo Account en sí, pero se incluye en la respuesta.

En este ejemplo, el campo space es 0 porque el campo data contiene 0 bytes de datos.

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

Obtener el Token Program

El ejemplo a continuación obtiene el Token Program para demostrar la diferencia entre las cuentas de cartera y las cuentas de programa. La cuenta del programa almacena el código compilado para el código fuente del Token Program. Puedes ver esta cuenta de programa en el Explorador de Solana.

Fetch program account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

El Token Program es una cuenta de programa ejecutable. Los programas tienen los mismos campos subyacentes que todas las cuentas, pero con diferencias clave.

Token program account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

El campo executable está configurado como true, lo que indica que el campo data de la cuenta contiene código ejecutable.

El campo data almacena el código ejecutable del programa.

Cada program account es propiedad de su programa cargador. En este ejemplo, el owner es el programa BPFLoader2.

El Token Program es una cuenta de programa ejecutable. Los programas tienen los mismos campos subyacentes que todas las cuentas, pero con diferencias clave.

El campo executable está configurado como true, lo que indica que el campo data de la cuenta contiene código ejecutable.

El campo data almacena el código ejecutable del programa.

Cada program account es propiedad de su programa cargador. En este ejemplo, el owner es el programa BPFLoader2.

Token program account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

Obtener una mint account

Una mint account es una cuenta propiedad del Token Program que almacena metadatos globales para un token específico. Esto incluye el suministro total, el número de decimales y las cuentas que están autorizadas para acuñar o congelar tokens. La dirección de la mint account identifica de manera única a un token en la red de Solana.

El ejemplo a continuación obtiene la mint account de USD Coin para demostrar cómo el estado de un programa se almacena en una cuenta separada.

Fetch program account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

Las mint accounts almacenan estado, no código ejecutable. Son propiedad del Token Program, que incluye instrucciones que definen cómo crear y actualizar mint accounts.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

El campo data de la cuenta mint almacena estado, no código ejecutable, por lo que el campo executable es false.

El Token Program define el tipo de datos Mint, que se almacena en el campo data.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

El campo data contiene el estado serializado de la cuenta Mint, como la autoridad de acuñación, el suministro total y el número de decimales.

Para leer desde una cuenta Mint, debes deserializar el campo data en el tipo de datos Mint, que se muestra en el siguiente ejemplo.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

La cuenta mint es propiedad del Token Program. Esto significa que su campo data solo puede ser modificado por las instrucciones del Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Las mint accounts almacenan estado, no código ejecutable. Son propiedad del Token Program, que incluye instrucciones que definen cómo crear y actualizar mint accounts.

El campo data de la cuenta mint almacena estado, no código ejecutable, por lo que el campo executable es false.

El Token Program define el tipo de datos Mint, que se almacena en el campo data.

El campo data contiene el estado serializado de la cuenta Mint, como la autoridad de acuñación, el suministro total y el número de decimales.

Para leer desde una cuenta Mint, debes deserializar el campo data en el tipo de datos Mint, que se muestra en el siguiente ejemplo.

La cuenta mint es propiedad del Token Program. Esto significa que su campo data solo puede ser modificado por las instrucciones del Token Program.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Deserializar cuenta mint

Antes de que los bytes sin procesar en el campo data de una cuenta puedan interpretarse de manera significativa, deben ser deserializados. El tipo de datos apropiado está definido por el programa que posee la cuenta. La mayoría de los programas de Solana proporcionan bibliotecas cliente con funciones auxiliares que abstraen el proceso de deserialización. Estas funciones convierten los bytes sin procesar de la cuenta en tipos de datos estructurados, facilitando el trabajo con los datos de la cuenta.

Por ejemplo, la biblioteca @solana/spl-token incluye la función getMint() para ayudar a deserializar el campo data de una cuenta mint en el tipo de datos Mint definido por el Token Program.

Deserialize mint account data
import { PublicKey, Connection } from "@solana/web3.js";
import { getMint } from "@solana/spl-token";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mintData = await getMint(connection, address, "confirmed");
Console
Click to execute the code.
Mint account type
pub struct Mint {
/// Optional authority used to mint new tokens. The mint authority may only
/// be provided during mint creation. If no mint authority is present
/// then the mint has a fixed supply and no further tokens may be
/// minted.
pub mint_authority: COption<Pubkey>,
/// Total supply of tokens.
pub supply: u64,
/// Number of base 10 digits to the right of the decimal place.
pub decimals: u8,
/// Is `true` if this structure has been initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

La función getMint() deserializa el campo data de una cuenta mint en el tipo de cuenta Mint.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Puedes ver los datos completamente deserializados de la cuenta mint en el Explorador de Solana.

El campo address contiene la dirección de la cuenta mint.

El campo mintAuthority muestra la única cuenta que puede crear nuevas unidades del token.

El campo supply muestra el número total de tokens que han sido acuñados. Este valor se mide en la unidad más pequeña del token. Para obtener el suministro total en unidades estándar, ajusta el valor del campo supply según el decimals.

El campo decimals muestra el número de decimales para el token.

El campo isInitialized indica si la cuenta mint ha sido inicializada. Este campo es una verificación de seguridad utilizada en el Token Program.

El campo freezeAuthority muestra la cuenta con autoridad para congelar token accounts. Un token account congelado no puede transferir ni quemar el token que contiene.

El campo tlvData contiene datos adicionales para Token Extensions y requiere una deserialización adicional. Este campo solo es relevante para cuentas creadas por el Token Extension Program (Token2022).

La función getMint() deserializa el campo data de una cuenta mint en el tipo de cuenta Mint.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Puedes ver los datos completamente deserializados de la cuenta mint en el Explorador de Solana.

El campo address contiene la dirección de la cuenta mint.

El campo mintAuthority muestra la única cuenta que puede crear nuevas unidades del token.

El campo supply muestra el número total de tokens que han sido acuñados. Este valor se mide en la unidad más pequeña del token. Para obtener el suministro total en unidades estándar, ajusta el valor del campo supply según el decimals.

El campo decimals muestra el número de decimales para el token.

El campo isInitialized indica si la cuenta mint ha sido inicializada. Este campo es una verificación de seguridad utilizada en el Token Program.

El campo freezeAuthority muestra la cuenta con autoridad para congelar token accounts. Un token account congelado no puede transferir ni quemar el token que contiene.

El campo tlvData contiene datos adicionales para Token Extensions y requiere una deserialización adicional. Este campo solo es relevante para cuentas creadas por el Token Extension Program (Token2022).

Deserialized mint data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

Tabla de Contenidos

Editar Página

Gestionado por

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