Читання з мережі
Цей розділ розглядає, як читати дані з мережі Solana шляхом отримання різних рахунків для розуміння структури рахунку Solana.
У Solana всі дані існують в "accounts". Можна уявити дані в Solana як публічну базу даних з єдиною таблицею "Accounts", де кожен запис — це рахунок з однаковим базовим типом Account.
#[derive(PartialEq, Eq, Clone, Default)]pub struct Account {/// lamports in the accountpub 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 rentpub rent_epoch: Epoch,}
Рахунки
Рахунки в Solana можуть зберігати "стан" або "виконувані" програми. Кожен рахунок має "адресу" (публічний ключ), яка служить його унікальним ідентифікатором для пошуку відповідних даних у блокчейні.
Рахунки Solana містять:
- Стан: Дані, які призначені для читання та зберігання. Наприклад, інформація про токени, дані користувача або інші дані, визначені в програмі.
- Виконувані програми: Рахунки, що містять фактичний код програм Solana. Ці рахунки зберігають інструкції, які користувачі можуть викликати.
Це розділення програмного коду та стану програми є ключовою особливістю моделі рахунків Solana. Для отримання додаткової інформації зверніться до сторінки Модель рахунків Solana.
Отримання рахунку гаманця
Цей приклад демонструє, як:
- Згенерувати нову пару ключів (пару публічного/приватного ключа).
- Запросити аirdrop SOL для фінансування нової адреси.
- Отримати дані рахунку для профінансованої адреси.
У Solana фінансування нової адреси за допомогою SOL автоматично створює рахунок, яким володіє System Program. Усі рахунки "гаманців" — це просто рахунки, якими володіє System Program, що містять 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));
"Гаманець" у Solana — це обліковий запис, яким володіє
Системна програма,
одна з вбудованих програм Solana. Облікові записи гаманців в основному
використовуються для зберігання SOL (відстежується в полі lamports
) та для
підписання транзакцій.
Коли ви отримуєте обліковий запис гаманця, відповідь включає поля, показані в прикладі виводу.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Поле data
містить дані облікового запису, збережені у вигляді байтів.
Для облікових записів гаманців це поле порожнє (0 байтів). Інші облікові записи використовують це поле для зберігання або стану програми, або виконуваного програмного коду.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Поле executable
вказує, чи містить поле data
облікового запису виконуваний
програмний код.
Для гаманців та облікових записів, що зберігають стан програми, це поле має
значення false
.
{"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.
{"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 байтів
даних.
Отримання 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 є виконуваним обліковим записом програми в Solana. Як і облікові записи гаманців, програми мають ту саму базову структуру даних Account, але з ключовими відмінностями в їхніх полях.
Поле executable
встановлено як true
, що вказує на те, що поле data
цього
облікового запису містить виконуваний програмний код.
Для програмних облікових записів поле data
зберігає виконуваний код програми.
На відміну від цього, гаманці мають порожнє поле даних.
Коли ви розгортаєте програму Solana, виконуваний код програми зберігається в
полі data
облікового запису.
Виконувані програмні облікові записи також мають програму, призначену як owner
облікового запису.
Усі програмні облікові записи належать програмі Loader, яка є категорією вбудованих програм, що володіють виконуваними програмними обліковими записами в Solana.
Для Token Program, owner
є програма BPFLoader2.
Отримання mint account
Цей приклад отримує mint account USD Coin (USDC), щоб показати, як програми в Solana зберігають стан в окремих облікових записах.
Mint account — це обліковий запис, яким володіє Token Program. Він зберігає глобальні метадані для конкретного токена, включаючи загальну пропозицію, кількість десяткових знаків та облікові записи, уповноважені випускати або заморожувати токени. Адреса mint account унікально ідентифікує токен у мережі Solana.
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 зберігає стан, а не виконуваний код.
Облікові записи 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
Поле data
облікового запису Solana містить необроблені байти. Щоб змістовно
інтерпретувати ці дані, ви повинні десеріалізувати їх у відповідний тип даних,
визначений програмою, яка володіє обліковим записом.
Більшість програм Solana надають клієнтські бібліотеки з допоміжними функціями, які абстрагують процес десеріалізації. Ці функції перетворюють необроблені байти облікового запису в структуровані типи даних, полегшуючи роботу з даними облікового запису.
Наприклад, @solana/spl-token
включає функцію
getMint()
, яка допомагає десеріалізувати поле data
облікового запису Mint у тип даних
Mint.
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,
визначений Token Program.
{"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).
Is this page helpful?