Читання з мережі

Читайте дані з мережі Solana, отримуючи різні рахунки. Цей розділ допоможе вам зрозуміти структуру рахунків Solana. Кожен рахунок Solana має унікальну адресу, яка використовується для пошуку відповідних даних у блокчейні. Рахунки містять або дані стану, або виконувану програму.

Отримання рахунку гаманця

Гаманець — це рахунок, яким володіє System Program. Гаманці переважно використовуються для зберігання 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. Це не є полем у самому типі Account, але включено у відповідь.

У цьому прикладі поле space дорівнює 0, оскільки поле data містить 0 байтів даних.

Коли ви отримуєте рахунок гаманця, відповідь включає поля, показані в прикладі виводу праворуч.

Поле data містить дані рахунку, збережені у вигляді байтів. Для рахунків гаманців це поле порожнє (0 байтів).

Поле executable вказує, чи містить поле data рахунку виконуваний програмний код. Для рахунків гаманців це поле має значення false.

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

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

Поле rentEpoch є застарілим полем із застарілого механізму rent. (Це поле включено для зворотної сумісності.)

Поле 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. Ви можете переглянути цей програмний акаунт у 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 є виконуваним program account. Програми мають ті самі базові поля, що й усі акаунти, але з ключовими відмінностями.

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

Поле executable встановлено на true, що вказує на те, що поле data облікового запису містить виконуваний код.

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

Поле data зберігає виконуваний код програми.

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

Кожен 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
}

Token Program є виконуваним program account. Програми мають ті самі базові поля, що й усі акаунти, але з ключовими відмінностями.

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

Mint account є обліковим записом, яким володіє Token Program і який зберігає глобальні метадані для конкретного токена. Це включає загальну пропозицію, кількість десяткових знаків та облікові записи, які мають право випускати або заморожувати токени. Адреса mint account унікально ідентифікує токен у мережі Solana.

Приклад нижче отримує mint account USD Coin, щоб продемонструвати, як стан програми зберігається в окремому обліковому записі.

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 accounts зберігають стан, а не виконуваний код. Вони належать Token Program, який включає інструкції, що визначають, як створювати та оновлювати mint accounts.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Поле data облікового запису mint зберігає стан, а не виконуваний код, тому поле executable має значення false.

Token Program визначає тип даних Mint, який зберігається в полі data.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Поле data містить серіалізований стан облікового запису Mint, такий як орган випуску (mint authority), загальна пропозиція, кількість десяткових знаків.

Щоб прочитати дані з облікового запису Mint, ви повинні десеріалізувати поле data у тип даних Mint, що показано в наступному прикладі.

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

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

Поле 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(), яка допомагає десеріалізувати поле 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 показує обліковий запис з правами заморожувати token account. Заморожений token account не може переказувати або спалювати токени, які він містить.

Поле tlvData містить додаткові дані для Token Extensions і потребує подальшої десеріалізації. Це поле актуальне лише для облікових записів, створених Програмою Token Extensions (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 показує обліковий запис з правами заморожувати token account. Заморожений token account не може переказувати або спалювати токени, які він містить.

Поле tlvData містить додаткові дані для Token Extensions і потребує подальшої десеріалізації. Це поле актуальне лише для облікових записів, створених Програмою Token Extensions (Token2022).

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

Is this page helpful?

Зміст

Редагувати сторінку

Керується

© 2025 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку