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).
#[derive(PartialEq, Eq, Clone, Default)]pub struct Account {/// lamports in the accountpub 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 rentpub rent_epoch: Epoch,}
Cuentas
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:
- Generar un nuevo keypair (par de claves pública/privada).
- Solicitar un airdrop de SOL para financiar la nueva dirección.
- 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.
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 accountconst 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));
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
.
{"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.
{"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.
{"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.
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);
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.
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.
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);
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.
{"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.
{"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.
{"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.
{"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.
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");
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 initializedpub 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.
{"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).
Is this page helpful?