Чтение из сети
Считывайте данные из сети Solana, запрашивая различные аккаунты. Этот раздел поможет вам понять структуру Solana аккаунтов. Каждый аккаунт Solana имеет уникальный адрес, который используется для поиска соответствующих данных в блокчейне. Аккаунты содержат либо данные состояния, либо исполняемую программу.
Запрос аккаунта кошелька
Кошелёк — это аккаунт, принадлежащий Системной программе. Кошельки в основном используются для хранения SOL и подписания транзакций. Когда SOL впервые отправляется на новый адрес, системный аккаунт создаётся автоматически.
Пример ниже генерирует новую ключевую пару, запрашивает SOL для финансирования нового публичного адреса и извлекает данные аккаунта для вновь профинансированного кошелька.
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));
Когда вы запрашиваете аккаунт кошелька, ответ включает поля, показанные в примере вывода справа.
Поле data содержит данные аккаунта, хранящиеся в виде байтов. Для аккаунтов
кошельков это поле пустое (0 байтов).
Поле executable указывает, содержит ли поле data исполняемый код программы.
Для аккаунтов кошельков это поле равно false.
Поле lamports содержит баланс SOL аккаунта в
лампортах.
Поле owner показывает программу, которой принадлежит аккаунт. Для кошельков
владельцем всегда является System Program с адресом
11111111111111111111111111111111.
Поле rentEpoch является устаревшим полем от механизма аренды, который больше
не используется. (Это поле включено для обеспечения обратной совместимости.)
Поле space показывает количество байтов, содержащихся в поле data. Это не
является полем в типе аккаунта самом по
себе, но включено в ответ.
В этом примере поле space равно 0, потому что поле data содержит 0 байтов
данных.
Получение Token Program
Пример ниже получает Token Program, чтобы продемонстрировать разницу между кошельковыми и программными аккаунтами. Программный аккаунт хранит скомпилированный байт-код исходного кода Token Program source code. Вы можете просмотреть этот программный аккаунт в Solana Explorer.
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);
Token Program — это исполняемый программный аккаунт. Программы имеют те же основные поля, что и все аккаунты, но с ключевыми отличиями.
Поле executable установлено в true, что указывает на то, что поле data
аккаунта содержит исполняемый код.
Поле data хранит исполняемый код программы.
Каждый аккаунт программы принадлежит своей
программе загрузчику. В этом примере
owner — это программа BPFLoader2.
Получение аккаунта mint
Аккаунт mint — это аккаунт, принадлежащий Token Program, который хранит глобальные метаданные для определённого токена. Это включает общий объём выпуска, количество десятичных знаков и аккаунты, которые имеют право выпускать или замораживать токены. Адрес аккаунта mint уникально идентифицирует токен в сети Solana.
Пример ниже получает аккаунт USD Coin Mint, чтобы продемонстрировать, как состояние программы хранится в отдельном аккаунте.
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);
Аккаунты mint хранят состояние, а не исполняемый код. Они принадлежат Token Program, который включает инструкции, определяющие, как создавать и обновлять аккаунты mint.
Поле data аккаунта mint хранит состояние, а не исполняемый код, поэтому поле
executable имеет значение false.
Token Program определяет тип данных Mint, который хранится в поле data.
Поле data содержит сериализованное состояние аккаунта Mint, такое как
полномочия mint, общий объём выпуска, количество десятичных знаков.
Чтобы прочитать данные из аккаунта mint, необходимо десериализовать поле data
в тип данных Mint, который показан в
следующем примере.
Аккаунт mint принадлежит
Token Program. Это означает, что
его поле data может быть изменено только инструкциями Token Program.
Десериализация аккаунта mint
Прежде чем необработанные байты в поле data аккаунта могут быть
интерпретированы осмысленно, их необходимо десериализовать. Соответствующий тип
данных определяется программой, которой принадлежит аккаунт. Большинство
программ Solana предоставляют клиентские библиотеки с вспомогательными
функциями, которые упрощают процесс десериализации. Эти функции преобразуют
необработанные байты аккаунта в структурированные типы данных, что облегчает
работу с данными аккаунта.
Например, библиотека @solana/spl-token включает функцию
getMint(), которая помогает десериализовать поле data
аккаунта mint в тип данных
Mint,
определённый 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>,}
Функция getMint() десериализует поле data аккаунта mint в тип данных
аккаунта Mint.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Вы можете просмотреть полностью десериализованные данные аккаунта mint на Solana Explorer.
Поле address содержит адрес аккаунта mint.
Поле mintAuthority показывает единственный аккаунт, который может создавать
новые единицы токена.
Поле supply показывает общее количество токенов, которые были выпущены. Это
значение измеряется в наименьшей единице токена. Чтобы получить общее
предложение в стандартных единицах, скорректируйте значение поля supply с
учетом поля decimals.
Поле decimals показывает количество десятичных знаков для токена.
Поле isInitialized указывает, был ли аккаунт mint инициализирован. Это поле
используется в качестве проверки безопасности в Token Program.
Поле freezeAuthority показывает аккаунт с полномочиями замораживать
токен-аккаунты. Замороженный токен-аккаунт не может передавать или сжигать
содержащиеся в нем токены.
Поле tlvData содержит дополнительные данные для Token Extensions и требует
дополнительной десериализации. Это поле актуально только для аккаунтов,
созданных Token Extension Program (Token2022).
Is this page helpful?