Lectura desde la red

Lee datos de la red Solana obteniendo diferentes cuentas. Esta guía explica la estructura de las cuentas de Solana. Cada cuenta de Solana tiene una dirección única que se utiliza para localizar los datos onchain de la cuenta. Las cuentas de Solana contienen datos de estado o un programa ejecutable.

Obtener una cuenta de billetera

Una cuenta de billetera es una cuenta propiedad del System Program. Las cuentas de billetera 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 crea un cliente Kit, genera un nuevo firmante, solicita SOL para fondear la nueva dirección y recupera los datos de la cuenta desde la API RPC del cliente.

Fetch account
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop());
const signer = await generateKeyPairSigner();
console.log(`Address: ${signer.address}`);
// Funding an address with SOL automatically creates an account
await client.airdrop(signer.address, lamports(1_000_000_000n));
const accountInfo = await client.rpc.getAccountInfo(signer.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Cuando obtienes una cuenta de billetera con getAccountInfo(), Kit devuelve la respuesta RPC que se muestra en el ejemplo de salida a la derecha.

La respuesta tiene dos campos de nivel superior: context describe cuándo se realizó la lectura, e value contiene los campos de la cuenta devueltos por el método RPC.

El campo context muestra el slot utilizado para leer la cuenta y la versión de la API RPC que sirvió la respuesta. Una lectura posterior puede devolver un slot o versión de API diferente.

El campo value contiene el estado de la cuenta devuelto por el método RPC. Los siguientes pasos recorren los campos dentro de value en el orden en que aparecen.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

El campo lamports contiene el saldo de SOL de la cuenta, medido en lamports, la unidad más pequeña de SOL.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

El campo data contiene los datos de la cuenta almacenados como bytes. El RPC devuelve los datos de la cuenta como una tupla: la cadena de datos codificada, seguida de la codificación. Para cuentas de billetera, la cadena de datos codificada está vacía porque la cuenta almacena 0 bytes de datos.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

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

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

El campo executable indica si la dirección de la cuenta es invocable. true significa que la dirección representa un programa que puede procesar instrucciones. false significa que la cuenta almacena estado, como el saldo de una billetera o los datos de la cuenta, y no se invoca como un programa. Las cuentas de billetera usan false.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

El campo rentEpoch es un campo heredado de un mecanismo de rent obsoleto. El campo aún se devuelve por compatibilidad con versiones anteriores.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

El campo space muestra el número de bytes contenidos en el campo data. El campo space se devuelve junto con la respuesta de obtención de cuenta, pero no forma parte del tipo de datos de la cuenta.

Para el ejemplo de cuenta de billetera, el campo space es 0 porque el campo data contiene 0 bytes de datos.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Cuando obtienes una cuenta de billetera con getAccountInfo(), Kit devuelve la respuesta RPC que se muestra en el ejemplo de salida a la derecha.

La respuesta tiene dos campos de nivel superior: context describe cuándo se realizó la lectura, e value contiene los campos de la cuenta devueltos por el método RPC.

El campo context muestra el slot utilizado para leer la cuenta y la versión de la API RPC que sirvió la respuesta. Una lectura posterior puede devolver un slot o versión de API diferente.

El campo value contiene el estado de la cuenta devuelto por el método RPC. Los siguientes pasos recorren los campos dentro de value en el orden en que aparecen.

El campo lamports contiene el saldo de SOL de la cuenta, medido en lamports, la unidad más pequeña de SOL.

El campo data contiene los datos de la cuenta almacenados como bytes. El RPC devuelve los datos de la cuenta como una tupla: la cadena de datos codificada, seguida de la codificación. Para cuentas de billetera, la cadena de datos codificada está vacía porque la cuenta almacena 0 bytes de datos.

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

El campo executable indica si la dirección de la cuenta es invocable. true significa que la dirección representa un programa que puede procesar instrucciones. false significa que la cuenta almacena estado, como el saldo de una billetera o los datos de la cuenta, y no se invoca como un programa. Las cuentas de billetera usan false.

El campo rentEpoch es un campo heredado de un mecanismo de rent obsoleto. El campo aún se devuelve por compatibilidad con versiones anteriores.

El campo space muestra el número de bytes contenidos en el campo data. El campo space se devuelve junto con la respuesta de obtención de cuenta, pero no forma parte del tipo de datos de la cuenta.

Para el ejemplo de cuenta de billetera, el campo space es 0 porque el campo data contiene 0 bytes de datos.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Obtener el Token Program

El siguiente ejemplo obtiene el Token Program para demostrar la diferencia entre cuentas de billetera y cuentas de programa. El Token Program define instrucciones para trabajar con tokens, como crear y transferir tokens. Los programas se invocan para procesar instrucciones. El estado del programa, como los datos de tokens y los saldos, se almacena en cuentas separadas que son propiedad del programa.

La dirección del Token Program es la program account onchain. Para simplificar, puedes pensaren la dirección del programa como el programa en sí, ya que esa es la dirección que se usa para invocarlo. Para programas actualizables, la program account almacena metadatos y apunta a una ProgramData account separada que almacena el código ejecutable desplegado. Puedes ver el código fuente del Token Program aquí y la program account en el Solana Explorer.

Fetch program account
import { address, createClient, fetchJsonParsedAccount } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const tokenProgramAddress = address(
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
);
const accountInfo = await client.rpc
.getAccountInfo(tokenProgramAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
const parsedAccount = await fetchJsonParsedAccount(
client.rpc,
tokenProgramAddress
);
console.log(parsedAccount);
Console
Click to execute the code.

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

El ejemplo del Token Program utiliza la codificación base64 para devolver los datos sin procesar de la program account.

Los siguientes pasos describen los campos dentro de value en el orden en que aparecen.

El campo data almacena el estado de la program account del BPF Upgradeable Loader. El primer elemento de la tupla contiene los datos completos de la cuenta codificados en base64. El segundo elemento de la tupla identifica la codificación. Aquí, los 36 bytes incluyen metadatos y la dirección de la programdata account.

Para los programas actualizables, el estado de la program account apunta a la programdata account separada que almacena el código ejecutable del programa.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

El campo executable está establecido en true, lo que indica que la dirección de la cuenta puede invocarse como un programa.

El campo lamports contiene el saldo en SOL de la program account. Las program accounts necesitan suficientes lamports para permanecer exentas de rent.

Toda program account es propiedad de un programa cargador. En el caso de la cuenta del Token Program, el owner es el BPF Upgradeable Loader.

El campo rentEpoch es un campo heredado de un mecanismo de rent obsoleto. El campo se sigue devolviendo por compatibilidad con versiones anteriores.

El campo space muestra el tamaño total de los datos de la program account en bytes. El valor de space es solo 36 bytes, porque la program account almacena metadatos del cargador y la dirección de la programdata account, no el programa compilado completo.

La respuesta anterior devolvió el campo data de la program account como una tupla en base64. La respuesta analizada deserializa esos bytes en campos con nombre dentro del objeto data. El campo programData contiene la dirección de la programdata account que almacena el código ejecutable del programa.

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

El ejemplo del Token Program utiliza la codificación base64 para devolver los datos sin procesar de la program account.

Los siguientes pasos describen los campos dentro de value en el orden en que aparecen.

El campo data almacena el estado de la program account del BPF Upgradeable Loader. El primer elemento de la tupla contiene los datos completos de la cuenta codificados en base64. El segundo elemento de la tupla identifica la codificación. Aquí, los 36 bytes incluyen metadatos y la dirección de la programdata account.

Para los programas actualizables, el estado de la program account apunta a la programdata account separada que almacena el código ejecutable del programa.

El campo executable está establecido en true, lo que indica que la dirección de la cuenta puede invocarse como un programa.

El campo lamports contiene el saldo en SOL de la program account. Las program accounts necesitan suficientes lamports para permanecer exentas de rent.

Toda program account es propiedad de un programa cargador. En el caso de la cuenta del Token Program, el owner es el BPF Upgradeable Loader.

El campo rentEpoch es un campo heredado de un mecanismo de rent obsoleto. El campo se sigue devolviendo por compatibilidad con versiones anteriores.

El campo space muestra el tamaño total de los datos de la program account en bytes. El valor de space es solo 36 bytes, porque la program account almacena metadatos del cargador y la dirección de la programdata account, no el programa compilado completo.

La respuesta anterior devolvió el campo data de la program account como una tupla en base64. La respuesta analizada deserializa esos bytes en campos con nombre dentro del objeto data. El campo programData contiene la dirección de la programdata account que almacena el código ejecutable del programa.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Obtener un mint account

Un mint account es una cuenta propiedad del Token Program que almacena metadatos globales de un token específico. El mint account almacena el suministro total del token, el número de decimales, la autoridad de acuñación y la autoridad de congelación. La dirección del mint account identifica de forma única un token en la red de Solana.

El ejemplo a continuación obtiene el mint account de USD Coin para demostrar cómo el estado de un programa se almacena en una cuenta separada. Los saldos exactos y los valores de suministro pueden variar según el slot desde el que lea tu nodo RPC.

Fetch mint account
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await client.rpc
.getAccountInfo(mintAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
Console
Click to execute the code.

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

Los siguientes pasos describen los campos dentro de value en el orden en que aparecen los campos.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

El campo data contiene el estado serializado de la cuenta Mint. El primer elemento de la tupla contiene los 82 bytes completos de datos de la cuenta codificados en base64. El segundo elemento de la tupla identifica la codificación.

Para leer desde un mint account, debes deserializar el campo data en el tipo de dato Mint, como se muestra en el siguiente ejemplo.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

El campo executable indica si la cuenta puede invocarse como un programa. Los mint accounts almacenan estado, por lo que el campo executable es false.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

El campo lamports contiene el saldo en SOL que posee el mint account. El valor en lamports es el saldo exento de renta del mint account, no el suministro del token.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

La mint account es propiedad del Token Program. El campo data de la mint account solo puede ser modificado por las instrucciones del Token Program.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

El campo rentEpoch es un campo heredado de un mecanismo de rent obsoleto. El campo se sigue devolviendo por compatibilidad con versiones anteriores.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

El campo space indica que la mint account contiene 82 bytes de datos.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

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

Los siguientes pasos describen los campos dentro de value en el orden en que aparecen los campos.

El campo data contiene el estado serializado de la cuenta Mint. El primer elemento de la tupla contiene los 82 bytes completos de datos de la cuenta codificados en base64. El segundo elemento de la tupla identifica la codificación.

Para leer desde un mint account, debes deserializar el campo data en el tipo de dato Mint, como se muestra en el siguiente ejemplo.

El campo executable indica si la cuenta puede invocarse como un programa. Los mint accounts almacenan estado, por lo que el campo executable es false.

El campo lamports contiene el saldo en SOL que posee el mint account. El valor en lamports es el saldo exento de renta del mint account, no el suministro del token.

La mint account es propiedad del Token Program. El campo data de la mint account solo puede ser modificado por las instrucciones del Token Program.

El campo rentEpoch es un campo heredado de un mecanismo de rent obsoleto. El campo se sigue devolviendo por compatibilidad con versiones anteriores.

El campo space indica que la mint account contiene 82 bytes de datos.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Deserializar la mint account

Los datos de la cuenta se almacenan en el campo data en formato serializado. Para leer esos datos como campos como supply o decimals, deserializa el campo data en el tipo de cuenta definido por el programa propietario. La mayoría de los programas de Solana ofrecen bibliotecas cliente con funciones auxiliares para este paso. Estos helpers devuelven datos de cuenta estructurados, lo que facilita el trabajo con el resultado.

Por ejemplo, la biblioteca @solana-program/token incluye la función fetchMint() para obtener una mint account y deserializar el campo data de la mint account en el tipo de datos Mint definido por el Token Program.

Deserialize mint account data
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
import { fetchMint } from "@solana-program/token";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mint = await fetchMint(client.rpc, mintAddress);
console.log(mint);
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 fetchMint() obtiene una mint account y deserializa el campo data de la mint account en el tipo de cuenta Mint.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

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

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

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

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

El campo data contiene el estado deserializado de la cuenta Mint. Los campos anidados en data provienen del tipo de cuenta Mint del Token Program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

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

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

El campo supply muestra el número total de tokens que han sido acuñados. El valor del suministro 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 por el decimals.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

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

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

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

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

El campo data.freezeAuthority muestra la cuenta con autoridad para congelar token accounts. Una token account es una cuenta separada que almacena unidades de un token para un propietario. Cuando está congelada, una token account no puede transferir ni quemar su saldo de tokens.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

El campo executable es falso. El mint account de USDC almacena el estado del token, por lo que el mint account de USDC no puede invocarse como un programa.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

El campo lamports contiene el saldo en SOL que tiene el mint account. El valor en lamports es el saldo exento de renta del mint account, no el suministro de tokens.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

El campo programAddress muestra el programa que es propietario del mint account. Para USDC, el programa propietario es el Token Program. Solo el programa que posee una cuenta puede modificar su campo data a través de las instrucciones implementadas del programa.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

El campo space muestra el tamaño de los datos originales del mint account en bytes. La cuenta Mint base del Token Program ocupa 82 bytes.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

La función fetchMint() obtiene una mint account y deserializa el campo data de la mint account en el tipo de cuenta Mint.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

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

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

El campo data contiene el estado deserializado de la cuenta Mint. Los campos anidados en data provienen del tipo de cuenta Mint del Token Program.

El campo data.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. El valor del suministro 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 por el decimals.

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

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

El campo data.freezeAuthority muestra la cuenta con autoridad para congelar token accounts. Una token account es una cuenta separada que almacena unidades de un token para un propietario. Cuando está congelada, una token account no puede transferir ni quemar su saldo de tokens.

El campo executable es falso. El mint account de USDC almacena el estado del token, por lo que el mint account de USDC no puede invocarse como un programa.

El campo lamports contiene el saldo en SOL que tiene el mint account. El valor en lamports es el saldo exento de renta del mint account, no el suministro de tokens.

El campo programAddress muestra el programa que es propietario del mint account. Para USDC, el programa propietario es el Token Program. Solo el programa que posee una cuenta puede modificar su campo data a través de las instrucciones implementadas del programa.

El campo space muestra el tamaño de los datos originales del mint account en bytes. La cuenta Mint base del Token Program ocupa 82 bytes.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Salida serializada vs. deserializada

Ambos ejemplos leen el mismo mint account de USDC. La primera respuesta deja el campo data serializado. Para leer el contenido del mint account, decodifica esos datos como el tipo de cuenta definido por el programa propietario. Para un mint account, el Token Program define el tipo Mint que se muestra a la derecha.

Antes de decodificar, el campo data contiene datos de cuenta serializados.

Serialized mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Después de decodificar los datos como Mint, el campo data contiene los campos de cuenta con nombre.

Deserialized mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Is this page helpful?

Tabla de Contenidos

Editar Página