Читання з мережі
Читайте дані з мережі Solana, отримуючи різні рахунки. Цей розділ допоможе вам зрозуміти структуру рахунків Solana. Кожен рахунок Solana має унікальну адресу, яка використовується для пошуку відповідних даних у блокчейні. Рахунки містять або дані стану, або виконувану програму.
Отримання рахунку гаманця
Гаманець — це рахунок, яким володіє System Program. Гаманці переважно використовуються для зберігання SOL та підписання транзакцій. Коли SOL вперше надсилається на нову адресу, системний рахунок створюється автоматично.
Приклад нижче генерує нову пару ключів, запитує SOL для фінансування нової адреси публічного ключа та отримує дані рахунку для щойно профінансованого гаманця.
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 accountconst 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));
Коли ви отримуєте рахунок гаманця, відповідь включає поля, показані в прикладі виводу праворуч.
Поле data містить дані рахунку, збережені у вигляді байтів. Для рахунків
гаманців це поле порожнє (0 байтів).
Поле executable вказує, чи містить поле data рахунку виконуваний програмний
код. Для рахунків гаманців це поле має значення false.
Поле lamports містить баланс SOL рахунку в
лампортах.
Поле owner показує програму, якій належить акаунт. Для гаманців власником
завжди є System Program з адресою 11111111111111111111111111111111.
Поле rentEpoch є застарілим полем із застарілого механізму rent. (Це поле
включено для зворотної сумісності.)
Поле space показує кількість байтів, що містяться в полі data. Це не є полем
у самому типі Account, але включено у
відповідь.
У цьому прикладі поле space дорівнює 0, оскільки поле data містить 0 байтів
даних.
Отримання Token Program
Приклад нижче отримує Token Program, щоб продемонструвати різницю між акаунтами гаманців та програмними акаунтами. Програмний акаунт зберігає скомпільований байткод вихідного коду Token Program. Ви можете переглянути цей програмний акаунт у Solana Explorer.
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);
Token Program є виконуваним 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
облікового запису містить виконуваний код.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Поле data зберігає виконуваний код програми.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Кожен program account належить своїй
програмі-завантажувачу. У цьому прикладі
owner є програмою BPFLoader2.
{"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, щоб продемонструвати, як стан програми зберігається в окремому обліковому записі.
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);
Mint accounts зберігають стан, а не виконуваний код. Вони належать Token Program, який включає інструкції, що визначають, як створювати та оновлювати mint accounts.
{"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.
{"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, що показано в
наступному прикладі.
{"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.
{"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.
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");
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 initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
Функція getMint() десеріалізує поле data облікового запису mint у тип
облікового запису Mint.
{"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).
Is this page helpful?