Lectura desde la red

Esta sección explora cómo leer datos de la red de Solana mediante la obtención de diferentes cuentas para entender la estructura de una cuenta de Solana.

En Solana, todos los datos existen en "cuentas". Puedes pensar en los datos en Solana como una base de datos pública con una única tabla "Cuentas", donde cada entrada es una cuenta con el mismo tipo base de Cuenta (Account).

Base Account Type
#[derive(PartialEq, Eq, Clone, Default)]
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// this account's data contains a loaded program (and is now read-only)
pub executable: bool,
/// the epoch at which this account will next owe rent
pub rent_epoch: Epoch,
}

CuentasCuentas

Las cuentas en Solana pueden almacenar "estado" o programas "ejecutables". Cada cuenta tiene una "dirección" (clave pública) que sirve como su ID único utilizado para localizar sus datos correspondientes en la cadena.

Las cuentas de Solana contienen:

  • Estado: Datos que están destinados a ser leídos y persistidos. Por ejemplo, información sobre tokens, datos de usuario u otros datos definidos dentro de un programa.
  • Programas ejecutables: Cuentas que contienen el código real de los programas de Solana. Estas cuentas almacenan instrucciones que los usuarios pueden invocar.

Esta separación entre el código del programa y el estado del programa es una característica clave del Modelo de Cuenta de Solana. Para más detalles, consulta la página del Modelo de Cuenta de Solana.

Obtener una cuenta de billetera

Este ejemplo demuestra cómo:

  1. Generar un nuevo keypair (par de claves pública/privada).
  2. Solicitar un airdrop de SOL para financiar la nueva dirección.
  3. Recuperar los datos de la cuenta para la dirección financiada.

En Solana, financiar una nueva dirección con SOL crea automáticamente una cuenta propiedad del System Program. Todas las cuentas de "billetera" son simplemente cuentas propiedad del System Program que contienen SOL y pueden firmar transacciones.

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.

Una "cartera" en Solana es una cuenta propiedad del Programa del Sistema, que es uno de los programas integrados de Solana. Las cuentas de cartera se utilizan principalmente para almacenar SOL (registrado en el campo lamports) y para firmar transacciones.

Cuando consultas una cuenta de cartera, la respuesta incluye los campos mostrados en el ejemplo de salida.

El campo data contiene los datos de la cuenta almacenados como bytes.

Para las cuentas de cartera, este campo está vacío (0 bytes). Otras cuentas utilizan este campo para almacenar el estado del programa o código de programa ejecutable.

El campo executable indica si el campo data de la cuenta contiene código de programa ejecutable.

Para carteras y cuentas que almacenan el estado del programa, este campo es false.

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

Los lamports son la unidad más pequeña de SOL. 1 SOL = 1.000.000.000 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.

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 obsoleto donde las cuentas pagaban "rent" (en lamports) para mantener sus datos en la red.

Este campo actualmente no se utiliza, pero 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 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
}

Una "cartera" en Solana es una cuenta propiedad del Programa del Sistema, que es uno de los programas integrados de Solana. Las cuentas de cartera se utilizan principalmente para almacenar SOL (registrado en el campo lamports) y para firmar transacciones.

Cuando consultas una cuenta de cartera, la respuesta incluye los campos mostrados en el ejemplo de salida.

El campo data contiene los datos de la cuenta almacenados como bytes.

Para las cuentas de cartera, este campo está vacío (0 bytes). Otras cuentas utilizan este campo para almacenar el estado del programa o código de programa ejecutable.

El campo executable indica si el campo data de la cuenta contiene código de programa ejecutable.

Para carteras y cuentas que almacenan el estado del programa, este campo es false.

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

Los lamports son la unidad más pequeña de SOL. 1 SOL = 1.000.000.000 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 obsoleto donde las cuentas pagaban "rent" (en lamports) para mantener sus datos en la red.

Este campo actualmente no se utiliza, pero se incluye por compatibilidad con versiones anteriores.

El campo space muestra el número de bytes 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

Este ejemplo obtiene el Token Program para demostrar la diferencia entre cuentas de cartera y 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 en Solana. Al igual que las cuentas de cartera, los programas tienen la misma estructura de datos subyacente Account, pero con diferencias clave en sus campos.

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

Para las cuentas de programa, el campo data almacena el código ejecutable del programa. En contraste, las cuentas de billetera tienen un campo de datos vacío.

Cuando implementas un programa en Solana, el código ejecutable del programa se almacena en el campo data de una cuenta.

Las cuentas de programa ejecutables también tienen un programa designado como el owner de la cuenta.

Todas las cuentas de programa son propiedad de un programa Loader, que es una categoría de programas integrados que poseen cuentas de programa ejecutables en Solana.

Para el Token Program, el owner es el programa BPFLoader2.

El Token Program es una cuenta de programa ejecutable en Solana. Al igual que las cuentas de cartera, los programas tienen la misma estructura de datos subyacente Account, pero con diferencias clave en sus campos.

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

Para las cuentas de programa, el campo data almacena el código ejecutable del programa. En contraste, las cuentas de billetera tienen un campo de datos vacío.

Cuando implementas un programa en Solana, el código ejecutable del programa se almacena en el campo data de una cuenta.

Las cuentas de programa ejecutables también tienen un programa designado como el owner de la cuenta.

Todas las cuentas de programa son propiedad de un programa Loader, que es una categoría de programas integrados que poseen cuentas de programa ejecutables en Solana.

Para el Token Program, 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

Este ejemplo obtiene la mint account de USD Coin (USDC) para mostrar cómo los programas en Solana almacenan el estado en cuentas separadas.

Una cuenta Mint es una cuenta que pertenece al Token Program. Almacena metadatos globales para un token específico, incluyendo el suministro total, el número de decimales y las cuentas 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.

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.

El punto clave a destacar en este ejemplo es que la cuenta Mint almacena estado, no código ejecutable.

Las cuentas Mint son propiedad del Token Program, que incluye instrucciones que definen cómo crear y actualizar las cuentas Mint.

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

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

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

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, el número de decimales.

Para leer de una cuenta Mint, debes deserializar el campo data en el tipo de datos Mint. Esto se cubre en el siguiente paso.

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

El Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) es propietario de la cuenta mint.

Esto significa que el campo data de la cuenta mint solo puede ser modificado por las instrucciones definidas en el Token Program.

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

El punto clave a destacar en este ejemplo es que la cuenta Mint almacena estado, no código ejecutable.

Las cuentas Mint son propiedad del Token Program, que incluye instrucciones que definen cómo crear y actualizar las cuentas Mint.

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

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

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

Para leer de una cuenta Mint, debes deserializar el campo data en el tipo de datos Mint. Esto se cubre en el siguiente paso.

El Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) es propietario de la cuenta mint.

Esto significa que el campo data de la cuenta mint solo puede ser modificado por las instrucciones definidas en el 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

El campo data de una cuenta Solana contiene bytes sin procesar. Para interpretar estos datos de manera significativa, debes deserializarlos en el tipo de datos apropiado 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, @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.

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 datos Mint definido por el Token Program.

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.

La dirección de la cuenta mint se utiliza para identificar el token en la red Solana.

El campo mintAuthority muestra la autoridad que puede acuñar nuevos tokens.

Esta es la única cuenta que puede crear nuevas unidades del token.

El campo supply muestra el número total de tokens que se han acuñado.

Este valor está 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 autoridad permitida para congelar cuentas de token.

Una cuenta de token que está congelada no puede transferir ni quemar el token en la cuenta.

El campo tlvData contiene datos adicionales para Token Extensions (requiere deserialización adicional).

Este campo solo es relevante para cuentas creadas por el Token Extensions Program (Token2022).

La función getMint() deserializa el campo data de una cuenta mint en el tipo de datos Mint definido por el Token Program.

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.

La dirección de la cuenta mint se utiliza para identificar el token en la red Solana.

El campo mintAuthority muestra la autoridad que puede acuñar nuevos tokens.

Esta es la única cuenta que puede crear nuevas unidades del token.

El campo supply muestra el número total de tokens que se han acuñado.

Este valor está 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 autoridad permitida para congelar cuentas de token.

Una cuenta de token que está congelada no puede transferir ni quemar el token en la cuenta.

El campo tlvData contiene datos adicionales para Token Extensions (requiere deserialización adicional).

Este campo solo es relevante para cuentas creadas por el Token Extensions 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