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

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

У Solana всі дані існують в "accounts". Можна уявити дані в Solana як публічну базу даних з єдиною таблицею "Accounts", де кожен запис — це рахунок з однаковим базовим типом Account.

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. Запросити аirdrop 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) та для підписання транзакцій.

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

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

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

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

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

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

Для гаманців та облікових записів, що зберігають стан програми, це поле має значення false.

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

Поле lamports містить баланс SOL облікового запису, виражений у lamport.

Lamport — це найменша одиниця SOL. 1 SOL = 1 000 000 000 lamport.

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

Поле owner показує програму, якій належить обліковий запис.

Для гаманців власником завжди є System Program з адресою 11111111111111111111111111111111.

Поле rentEpoch є застарілим полем від неактуального механізму, де облікові записи сплачували "rent" (у lamports) для зберігання своїх даних у мережі.

Це поле наразі не використовується, але включене для зворотної сумісності.

Поле space показує кількість байтів у полі data. Це не є полем у самому типі Account, але включене у відповідь.

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

"Гаманець" у Solana — це обліковий запис, яким володіє Системна програма, одна з вбудованих програм Solana. Облікові записи гаманців в основному використовуються для зберігання SOL (відстежується в полі lamports) та для підписання транзакцій.

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

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

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

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

Для гаманців та облікових записів, що зберігають стан програми, це поле має значення false.

Поле lamports містить баланс SOL облікового запису, виражений у lamport.

Lamport — це найменша одиниця SOL. 1 SOL = 1 000 000 000 lamport.

Поле owner показує програму, якій належить обліковий запис.

Для гаманців власником завжди є System Program з адресою 11111111111111111111111111111111.

Поле rentEpoch є застарілим полем від неактуального механізму, де облікові записи сплачували "rent" (у lamports) для зберігання своїх даних у мережі.

Це поле наразі не використовується, але включене для зворотної сумісності.

Поле 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 є виконуваним обліковим записом програми в Solana. Як і облікові записи гаманців, програми мають ту саму базову структуру даних Account, але з ключовими відмінностями в їхніх полях.

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

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

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

Виконувані програмні облікові записи також мають програму, призначену як owner облікового запису.

Усі програмні облікові записи належать програмі Loader, яка є категорією вбудованих програм, що володіють виконуваними програмними обліковими записами в Solana.

Для Token Program, owner є програма BPFLoader2.

Token Program є виконуваним обліковим записом програми в Solana. Як і облікові записи гаманців, програми мають ту саму базову структуру даних Account, але з ключовими відмінностями в їхніх полях.

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

Цей приклад отримує mint account USD Coin (USDC), щоб показати, як програми в Solana зберігають стан в окремих облікових записах.

Mint account — це обліковий запис, яким володіє Token Program. Він зберігає глобальні метадані для конкретного токена, включаючи загальну пропозицію, кількість десяткових знаків та облікові записи, уповноважені випускати або заморожувати токени. Адреса mint account унікально ідентифікує токен у мережі 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, такий як authority емісії, загальна пропозиція, кількість десяткових знаків.

Щоб прочитати дані з облікового запису 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, такий як authority емісії, загальна пропозиція, кількість десяткових знаків.

Щоб прочитати дані з облікового запису 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 account. Це поле є перевіркою безпеки, що використовується в Token Program.

Поле freezeAuthority показує авторитет, якому дозволено заморожувати token accounts.

Token account, який заморожено, не може переказувати або спалювати токен на рахунку.

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

Зміст

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