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

Читайте дані з мережі 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.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
}

Кожен обліковий запис програми належить своїй програмі-завантажувачу. У цьому прикладі 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 зберігає виконуваний код програми.

Кожен обліковий запис програми належить своїй програмі-завантажувачу. У цьому прикладі 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.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 account зберігає стан, а не виконуваний код, тому поле 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 account, потрібно десеріалізувати поле 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 account належить 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 account зберігає стан, а не виконуваний код, тому поле executable має значення false.

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

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

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

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

Поле supply показує загальну кількість токенів, які було випущено. Це значення вимірюється в найменшій одиниці токена. Щоб отримати загальну пропозицію в стандартних одиницях, скоригуйте значення поля supply на decimals.

Поле decimals показує кількість десяткових знаків для токена.

Поле isInitialized вказує, чи було ініціалізовано mint account. Це поле є перевіркою безпеки, що використовується в Token Program.

Поле freezeAuthority показує обліковий запис з повноваженнями заморожувати token accounts. Заморожений token account не може передавати або спалювати токен, який він містить.

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

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

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

Зміст

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

Керується

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