Читайте дані з мережі 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.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}
Кожен обліковий запис програми належить своїй
програмі-завантажувачу. У цьому прикладі
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.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 account зберігає стан, а не виконуваний код, тому поле
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 account, потрібно десеріалізувати поле data у тип
даних Mint, що показано в наступному прикладі.
{"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.
{"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.
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");
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 account у тип облікового
запису 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 account.
Поле mintAuthority показує єдиний обліковий запис, який може створювати нові
одиниці токена.
Поле supply показує загальну кількість токенів, які було випущено. Це значення
вимірюється в найменшій одиниці токена. Щоб отримати загальну пропозицію в
стандартних одиницях, скоригуйте значення поля supply на decimals.
Поле decimals показує кількість десяткових знаків для токена.
Поле isInitialized вказує, чи було ініціалізовано mint account. Це поле є
перевіркою безпеки, що використовується в Token Program.
Поле freezeAuthority показує обліковий запис з повноваженнями заморожувати
token accounts. Заморожений token account не може передавати або спалювати
токен, який він містить.
Поле tlvData містить додаткові дані для Token Extensions і потребує подальшої
десеріалізації. Це поле актуальне лише для облікових записів, створених
Token Extension Program (Token2022).
Is this page helpful?