Чтение из сети

В этом разделе рассматривается, как считывать данные из сети Solana, получая различные аккаунты, чтобы понять структуру аккаунта в Solana.

В Solana все данные хранятся в "аккаунтах". Вы можете представить данные в Solana как публичную базу данных с одной таблицей "Аккаунты", где каждая запись — это аккаунт с одинаковым базовым типом аккаунта.

Base Account Type
#[derive(PartialEq, Eq, Clone, Default)]
pub struct Account {
/// lamports in the account
pub 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 rent
pub rent_epoch: Epoch,
}

АккаунтыАккаунты

Аккаунты в Solana могут хранить "состояние" или "исполняемые" программы. Каждый аккаунт имеет "адрес" (публичный ключ), который служит его уникальным идентификатором для поиска соответствующих данных в блокчейне.

Аккаунты в Solana содержат либо:

  • Состояние: Данные, предназначенные для чтения и сохранения. Например, информация о токенах, данные пользователей или другие данные, определенные в программе.
  • Исполняемые программы: Аккаунты, содержащие фактический код программ Solana. Эти аккаунты хранят инструкции, которые пользователи могут вызывать.

Это разделение кода программы и состояния программы является ключевой особенностью модели аккаунтов Solana. Для получения дополнительной информации обратитесь к странице Модель аккаунтов Solana.

Получение аккаунта кошелька

Этот пример демонстрирует, как:

  1. Сгенерировать новую пару ключей (публичный/приватный ключ).
  2. Запросить airdrop SOL для финансирования нового адреса.
  3. Получить данные аккаунта для профинансированного адреса.

В Solana финансирование нового адреса с помощью SOL автоматически создает аккаунт, принадлежащий System Program. Все "кошельковые" аккаунты — это просто аккаунты, принадлежащие System Program, которые хранят SOL и могут подписывать транзакции.

Fetch Account
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 account
const 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));
Console
Click to execute the code.

«Кошелёк» в 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 байтов данных.

«Кошелёк» в 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 байтов данных.

Example Output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

Получение Token Program

Этот пример получает Token Program, чтобы продемонстрировать разницу между кошельками и программными аккаунтами.

Программный аккаунт хранит скомпилированный байт-код исходного кода Token Program source code. Вы можете просмотреть этот программный аккаунт в Solana Explorer.

Fetch Program Account
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);
Console
Click to execute the code.

Token Program — это исполняемый программный аккаунт в Solana. Как и кошельки, программы имеют ту же базовую структуру данных аккаунта, но с ключевыми отличиями в полях.

Поле executable установлено в значение true, что указывает на то, что поле data этого аккаунта содержит исполняемый программный код.

Для программных аккаунтов поле data хранит исполняемый код программы. В отличие от этого, у кошельковых аккаунтов поле данных пустое.

Когда вы развертываете программу Solana, исполняемый код программы сохраняется в поле data аккаунта.

Исполняемые программные аккаунты также имеют программу, назначенную как owner аккаунта.

Все программные аккаунты принадлежат программе Loader, которая является категорией встроенных программ, владеющих исполняемыми программными аккаунтами в Solana.

Для Token Program owner является программой BPFLoader2.

Token Program — это исполняемый программный аккаунт в Solana. Как и кошельки, программы имеют ту же базовую структуру данных аккаунта, но с ключевыми отличиями в полях.

Поле executable установлено в значение true, что указывает на то, что поле data этого аккаунта содержит исполняемый программный код.

Для программных аккаунтов поле data хранит исполняемый код программы. В отличие от этого, у кошельковых аккаунтов поле данных пустое.

Когда вы развертываете программу Solana, исполняемый код программы сохраняется в поле data аккаунта.

Исполняемые программные аккаунты также имеют программу, назначенную как owner аккаунта.

Все программные аккаунты принадлежат программе Loader, которая является категорией встроенных программ, владеющих исполняемыми программными аккаунтами в Solana.

Для Token Program owner является программой BPFLoader2.

Token Program Account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

Получение аккаунта Mint

В этом примере извлекается аккаунт Mint для USD Coin (USDC), чтобы показать, как программы на Solana хранят состояние в отдельных аккаунтах.

Mint аккаунт — это аккаунт, принадлежащий Token Program. Он хранит глобальные метаданные для определенного токена, включая общий объем выпуска, количество десятичных знаков и аккаунты, уполномоченные выпускать или замораживать токены. Адрес аккаунта Mint уникально идентифицирует токен в сети Solana.

Fetch Program Account
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);
Console
Click to execute the code.

Ключевой момент в этом примере заключается в том, что аккаунт 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 хранит состояние, а не исполняемый код.

Аккаунты 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 Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Десериализация аккаунта Mint

Поле data аккаунта Solana содержит необработанные байты. Чтобы интерпретировать эти данные осмысленно, необходимо десериализовать их в соответствующий тип данных, определённый программой, которая владеет аккаунтом.

Большинство программ Solana предоставляют клиентские библиотеки с вспомогательными функциями, которые упрощают процесс десериализации. Эти функции преобразуют необработанные байты аккаунта в структурированные типы данных, что облегчает работу с данными аккаунта.

Например, @solana/spl-token включает функцию getMint(), которая помогает десериализовать поле data аккаунта Mint в тип данных Mint.

Deserialize Mint Account Data
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");
Console
Click to execute the code.
Mint Account Type
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 initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

Функция getMint() десериализует поле data аккаунта mint в тип данных Mint, определённый Token Program.

Mint Account
{
"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).

Функция getMint() десериализует поле data аккаунта mint в тип данных Mint, определённый Token Program.

Mint Account
{
"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).

Deserialized Mint Data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

Содержание

Редактировать страницу