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