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

Считывайте данные из сети 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 — это устаревшее поле от старого механизма rent. (Оставлено для обратной совместимости.)

Поле space показывает количество байт в поле data. Это не поле самого типа аккаунта, а дополнительное поле в ответе.

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

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

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

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

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

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

Поле rentEpoch — это устаревшее поле от старого механизма rent. (Оставлено для обратной совместимости.)

Поле 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. Вы можете просмотреть этот программный аккаунт в Solana Explorer.

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

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

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

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

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

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

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

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

Каждый program account принадлежит своему загрузчику программ. В этом примере 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.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 authority, общее предложение, количество знаков после запятой.

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

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

Аккаунты 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 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() для десериализации поля mint аккаунта data в тип данных 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.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 account.

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

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

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

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

Поле freezeAuthority показывает аккаунт с правом заморозки token accounts. Замороженный token account не может переводить или сжигать токены, которые он содержит.

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

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

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

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

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

Поле freezeAuthority показывает аккаунт с правом заморозки token accounts. Замороженный token account не может переводить или сжигать токены, которые он содержит.

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

Содержание

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