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

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

Запрос аккаунта кошелька

Кошелёк — это аккаунт, принадлежащий Системной программе. Кошельки в основном используются для хранения SOL и подписания транзакций. Когда SOL впервые отправляется на новый адрес, системный аккаунт создаётся автоматически.

Пример ниже генерирует новую ключевую пару, запрашивает 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.

Когда вы запрашиваете аккаунт кошелька, ответ включает поля, показанные в примере вывода справа.

Поле data содержит данные аккаунта, хранящиеся в виде байтов. Для аккаунтов кошельков это поле пустое (0 байтов).

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

Поле lamports содержит баланс SOL аккаунта в лампортах.

Поле owner показывает программу, которой принадлежит аккаунт. Для кошельков владельцем всегда является System Program с адресом 11111111111111111111111111111111.

Поле rentEpoch является устаревшим полем от механизма аренды, который больше не используется. (Это поле включено для обеспечения обратной совместимости.)

Поле space показывает количество байтов, содержащихся в поле data. Это не является полем в типе аккаунта самом по себе, но включено в ответ.

В этом примере поле space равно 0, потому что поле data содержит 0 байтов данных.

Когда вы запрашиваете аккаунт кошелька, ответ включает поля, показанные в примере вывода справа.

Поле data содержит данные аккаунта, хранящиеся в виде байтов. Для аккаунтов кошельков это поле пустое (0 байтов).

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

Поле lamports содержит баланс SOL аккаунта в лампортах.

Поле owner показывает программу, которой принадлежит аккаунт. Для кошельков владельцем всегда является System Program с адресом 11111111111111111111111111111111.

Поле rentEpoch является устаревшим полем от механизма аренды, который больше не используется. (Это поле включено для обеспечения обратной совместимости.)

Поле space показывает количество байтов, содержащихся в поле data. Это не является полем в типе аккаунта самом по себе, но включено в ответ.

В этом примере поле 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 — это исполняемый программный аккаунт. Программы имеют те же основные поля, что и все аккаунты, но с ключевыми отличиями.

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

Поле data хранит исполняемый код программы.

Каждый аккаунт программы принадлежит своей программе загрузчику. В этом примере owner — это программа BPFLoader2.

Token Program — это исполняемый программный аккаунт. Программы имеют те же основные поля, что и все аккаунты, но с ключевыми отличиями.

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

Поле data хранит исполняемый код программы.

Каждый аккаунт программы принадлежит своей программе загрузчику. В этом примере 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 — это аккаунт, принадлежащий Token Program, который хранит глобальные метаданные для определённого токена. Это включает общий объём выпуска, количество десятичных знаков и аккаунты, которые имеют право выпускать или замораживать токены. Адрес аккаунта mint уникально идентифицирует токен в сети Solana.

Пример ниже получает аккаунт USD Coin Mint, чтобы продемонстрировать, как состояние программы хранится в отдельном аккаунте.

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 хранят состояние, а не исполняемый код. Они принадлежат Token Program, который включает инструкции, определяющие, как создавать и обновлять аккаунты mint.

Поле data аккаунта mint хранит состояние, а не исполняемый код, поэтому поле executable имеет значение false.

Token Program определяет тип данных Mint, который хранится в поле data.

Поле data содержит сериализованное состояние аккаунта Mint, такое как полномочия mint, общий объём выпуска, количество десятичных знаков.

Чтобы прочитать данные из аккаунта mint, необходимо десериализовать поле data в тип данных Mint, который показан в следующем примере.

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

Аккаунты 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 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/spl-token включает функцию getMint(), которая помогает десериализовать поле data аккаунта mint в тип данных Mint, определённый Token Program.

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.

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.

Поле mintAuthority показывает единственный аккаунт, который может создавать новые единицы токена.

Поле supply показывает общее количество токенов, которые были выпущены. Это значение измеряется в наименьшей единице токена. Чтобы получить общее предложение в стандартных единицах, скорректируйте значение поля supply с учетом поля decimals.

Поле decimals показывает количество десятичных знаков для токена.

Поле isInitialized указывает, был ли аккаунт mint инициализирован. Это поле используется в качестве проверки безопасности в Token Program.

Поле freezeAuthority показывает аккаунт с полномочиями замораживать токен-аккаунты. Замороженный токен-аккаунт не может передавать или сжигать содержащиеся в нем токены.

Поле tlvData содержит дополнительные данные для Token Extensions и требует дополнительной десериализации. Это поле актуально только для аккаунтов, созданных Token Extension Program (Token2022).

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

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.

Поле 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?

Содержание

Редактировать страницу
Чтение из сети | Solana