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.
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));
Cuando obtienes una cuenta de billetera, la respuesta incluye los campos mostrados en el ejemplo de salida a la derecha.
{"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).
{"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.
{"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.
{"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.
{"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.)
{"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.
{"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.
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. Los programas tienen los mismos campos subyacentes que todas las cuentas, pero con diferencias clave.
{"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.
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.
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);
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.
{"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.
{"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.
{"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.
{"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.
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 cuenta Mint.
{"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).
Is this page helpful?