Считывайте данные из сети 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 — это устаревшее поле от старого механизма rent. (Оставлено для
обратной совместимости.)
Поле space показывает количество байт в поле data. Это не поле самого
типа аккаунта, а дополнительное поле в
ответе.
В этом примере поле space равно 0, потому что поле data содержит 0 байт
данных.
Получение Token Program
Пример ниже получает Token Program, чтобы продемонстрировать разницу между кошельками и программными аккаунтами. Программный аккаунт хранит скомпилированный байт-код исходного кода Token Program. Вы можете просмотреть этот программный аккаунт в Solana Explorer.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet.solana.com","confirmed");const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await connection.getAccountInfo(address);
Token Program — это исполняемый программный аккаунт. Программы имеют те же основные поля, что и все аккаунты, но с ключевыми отличиями.
Поле executable установлено в true, что означает, что поле data аккаунта
содержит исполняемый код.
Поле data хранит исполняемый код программы.
Каждый program account принадлежит своему
загрузчику программ. В этом примере
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.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
authority, общее предложение, количество знаков после запятой.
Чтобы прочитать данные из mint аккаунта, необходимо десериализовать поле data
в тип данных Mint, который показан в
следующем примере.
Mint аккаунт принадлежит
Token Program. Это означает, что
его поле data может быть изменено только инструкциями Token Program.
Десериализация аккаунта mint
Прежде чем необработанные байты в поле data аккаунта можно будет
интерпретировать осмысленно, их необходимо десериализовать. Соответствующий тип
данных определяется программой, которой принадлежит аккаунт. Большинство
программ Solana предоставляют клиентские библиотеки с вспомогательными
функциями, которые упрощают процесс десериализации. Эти функции преобразуют
необработанные байты аккаунта в структурированные типы данных, что облегчает
работу с данными аккаунта.
Например, библиотека @solana/spl-token включает функцию
getMint() для десериализации поля mint аккаунта data в
тип данных
Mint,
определённый Token Program.
import { PublicKey, Connection } from "@solana/web3.js";import { getMint } from "@solana/spl-token";const connection = new Connection("https://api.mainnet.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 account.
Поле mintAuthority показывает единственный аккаунт, который может создавать
новые единицы token.
Поле supply показывает общее количество токенов, которые были выпущены. Это
значение измеряется в наименьших единицах токена. Чтобы получить общее
предложение в стандартных единицах, скорректируйте значение поля supply с
учетом decimals.
Поле decimals показывает количество знаков после запятой для токена.
Поле isInitialized указывает, был ли mint account инициализирован. Это поле
служит проверкой безопасности в Token Program.
Поле freezeAuthority показывает аккаунт с правом заморозки token accounts.
Замороженный token account не может переводить или сжигать токены, которые он
содержит.
Поле tlvData содержит дополнительные данные для Token Extensions и требует
дополнительной десериализации. Это поле актуально только для аккаунтов,
созданных с помощью Token Extension Program
(Token2022).
Is this page helpful?