Зчитуйте дані з мережі Solana, отримуючи різні акаунти. Цей посібник пояснює структуру акаунтів Solana. Кожен акаунт Solana має унікальну адресу, яка використовується для пошуку даних акаунту в мережі. Акаунти Solana містять або дані стану, або виконувану програму.
Отримання рахунку гаманця
Акаунт гаманця — це акаунт, яким володіє System Program. Акаунти гаманців використовуються переважно для зберігання SOL та підписання транзакцій. Коли SOL відправляється на нову адресу вперше, системний акаунт створюється автоматично.
Наведений нижче приклад створює Kit-клієнт, генерує новий підписувач, запитує SOL для поповнення нової адреси та отримує дані акаунту з RPC API клієнта.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop());const signer = await generateKeyPairSigner();console.log(`Address: ${signer.address}`);// Funding an address with SOL automatically creates an accountawait client.airdrop(signer.address, lamports(1_000_000_000n));const accountInfo = await client.rpc.getAccountInfo(signer.address).send();console.log(accountInfo);
Коли ви отримуєте акаунт гаманця за допомогою getAccountInfo(), Kit повертає
RPC-відповідь, показану у прикладі виведення праворуч.
Відповідь має два поля верхнього рівня: context описує момент зчитування, a
value містить поля акаунту, повернені RPC-методом.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Поле context показує slot, використаний для зчитування акаунту, та версію RPC
API, яка обслужила відповідь. Повторне зчитування може повернути інший slot або
версію API.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Поле value містить стан акаунту, повернений RPC-методом. Наступні кроки
докладно розглядають поля всередині value у тому порядку, в якому вони
з'являються.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Поле lamports містить баланс SOL облікового запису, виміряний у
lamports — найменшій одиниці SOL.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Поле data містить дані облікового запису, збережені у вигляді байтів. RPC
повертає дані облікового запису як кортеж: рядок закодованих даних, за яким
слідує кодування. Для гаманцевих облікових записів рядок закодованих даних
порожній, оскільки обліковий запис зберігає 0 байтів даних.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Поле owner показує програму, якій належить обліковий запис. Для гаманців
власником завжди є System Program з адресою 11111111111111111111111111111111.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Поле executable вказує, чи є адреса облікового запису викликуваною. true
означає, що адреса представляє програму, яка може обробляти інструкції. false
означає, що обліковий запис зберігає стан, наприклад баланс гаманця або дані
облікового запису, і не викликається як програма. Гаманцеві облікові записи
використовують false.
Поле rentEpoch є застарілим полем із deprecated-механізму rent. Це поле досі
повертається для зворотної сумісності.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Поле space показує кількість байтів, що містяться у полі data. Поле space
повертається разом із відповіддю на запит облікового запису, але не є частиною
типу даних облікового запису.
Для прикладу гаманцевого облікового запису поле space дорівнює 0, оскільки
поле data містить 0 байтів даних.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Отримання Token Program
Наведений нижче приклад отримує Token Program, щоб продемонструвати різницю між гаманцями та обліковими записами програм. Token Program визначає інструкції для роботи з токенами, наприклад для їх створення та переказу. Програми викликаються для обробки інструкцій. Стан програми, наприклад дані токенів і баланси, зберігається в окремих облікових записах, що належать програмі.
Адреса Token Program — це onchain program account. Для простоти можна вважати адресу програми самою програмою, адже саме ця адреса використовується для її виклику. Для програм із підтримкою оновлень program account зберігає метадані та посилається на окремий programdata account, у якому зберігається розгорнутий виконуваний код. Ви можете переглянути вихідний код Token Program та program account у Solana Explorer.
import { address, createClient, fetchJsonParsedAccount } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const tokenProgramAddress = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await client.rpc.getAccountInfo(tokenProgramAddress, {encoding: "base64"}).send();console.log(accountInfo);const parsedAccount = await fetchJsonParsedAccount(client.rpc,tokenProgramAddress);console.log(parsedAccount);
Token Program — це виконуваний program account. Програми мають ті самі базові поля, що й усі облікові записи, але з ключовими відмінностями.
У прикладі Token Program використовується кодування base64 для повернення
необроблених даних program account.
Наступні кроки описують поля всередині value у порядку їх появи.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Поле data зберігає стан program account завантажувача BPF Upgradeable Loader.
Перший елемент кортежу містить повні дані облікового запису, закодовані у
форматі base64. Другий елемент кортежу визначає кодування. У цьому випадку 36
байт містять метадані та адресу programdata account.
Для програм із підтримкою оновлень стан program account вказує на окремий programdata account, у якому зберігається виконуваний код програми.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Поле executable має значення true, що вказує на те, що адресу цього акаунту
можна викликати як програму.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Поле lamports містить баланс SOL, що зберігається на program account. Для
звільнення від rent program account потрібно мати достатньо lamport.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Кожен program account належить
програмі-завантажувачу.
Для Token Program account значенням owner є BPF Upgradeable Loader.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Поле rentEpoch є застарілим полем із deprecated механізму rent. Це поле досі
повертається для забезпечення зворотної сумісності.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Поле space відображає повний розмір даних program account у байтах. Значення
space становить лише 36 байти, оскільки program account зберігає метадані
завантажувача та адресу ProgramData account, а не повний скомпільований код
програми.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Попередня відповідь повернула поле data program account у вигляді кортежу
base64. Розібрана відповідь десеріалізує ці байти в іменовані поля об'єкта
data. Поле programData містить адресу ProgramData account, де зберігається
виконуваний код програми.
{executable: true,lamports: 43712780n,programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",space: 36n,address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",data: {programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }},exists: true}
Отримання mint account
mint account — це акаунт, яким володіє Token Program і який зберігає глобальні метадані для певного токена. mint account зберігає загальну пропозицію токена, кількість десяткових знаків, повноваження на карбування та повноваження на заморожування. Адреса mint account унікально ідентифікує токен у мережі Solana.
Наведений нижче приклад отримує mint account USD Coin, щоб продемонструвати, як стан програми зберігається в окремому акаунті. Точні баланси та значення пропозиції можуть відрізнятися залежно від slot, з якого зчитує ваш RPC-вузол.
import { address, createClient } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const accountInfo = await client.rpc.getAccountInfo(mintAddress, {encoding: "base64"}).send();console.log(accountInfo);
mint account зберігають стан, а не виконуваний код. mint account належать Token Program, яка містить інструкції, що визначають порядок створення та оновлення mint account.
Наступні кроки описують поля всередині value у тому порядку, в якому вони
з'являються.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Поле data містить серіалізований стан акаунта Mint. Перший елемент кортежу
містить повні 82 байти даних акаунта, закодовані у форматі base64. Другий
елемент кортежу визначає кодування.
Щоб зчитати дані з mint account, необхідно десеріалізувати поле data у тип
даних Mint, що показано в наступному прикладі.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Поле executable вказує, чи може акаунт бути викликаний як програма. mint
account зберігають стан, тому поле executable має значення false.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Поле lamports містить баланс SOL, що зберігається на mint account. Значення у
lamports — це баланс, що звільняє mint account від орендної плати, а не обсяг
пропозиції токена.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
mint account належить
Token Program. Поле data mint
account може бути змінене лише інструкціями Token Program.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Поле rentEpoch є застарілим полем із deprecated механізму rent. Це поле досі
повертається для зворотної сумісності.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Поле space показує, що mint account містить 82 байти даних.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Десеріалізація mint account
Дані акаунту зберігаються у полі data у серіалізованому форматі. Щоб отримати
ці дані у вигляді полів, таких як supply або decimals, необхідно
десеріалізувати поле data у тип акаунту, визначений програмою-власником.
Більшість програм Solana надають клієнтські бібліотеки з допоміжними функціями
для цього кроку. Ці допоміжні функції повертають структуровані дані акаунту, що
спрощує роботу з результатом.
Наприклад, бібліотека @solana-program/token включає функцію
fetchMint() для отримання mint account і десеріалізації
поля data mint account у тип даних
Mint,
визначений Token Program.
import { address, createClient } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";import { fetchMint } from "@solana-program/token";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const mint = await fetchMint(client.rpc, mintAddress);console.log(mint);
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>,}
Функція fetchMint() отримує mint account і десеріалізує поле data mint
account у тип акаунту Mint.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Ви можете переглянути повністю десеріалізовані дані mint account у Solana Explorer.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле address містить адресу mint account.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле data містить десеріалізований стан акаунта Mint. Вкладені поля у data
походять від типу акаунта Mint Token Program.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле data.mintAuthority показує єдиний акаунт, який може створювати нові
одиниці токена.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле supply показує загальну кількість токенів, які було випущено. Значення
пропозиції вимірюється в найменших одиницях токена. Щоб отримати загальну
пропозицію у стандартних одиницях, скоригуйте значення поля supply на
decimals.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле decimals показує кількість десяткових знаків для токена.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле isInitialized вказує, чи було ініціалізовано mint account. Поле
isInitialized є перевіркою безпеки, яка використовується в Token Program.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле data.freezeAuthority містить акаунт із повноваженнями заморожувати token
accounts. token account — це окремий
акаунт, що зберігає одиниці токена для власника. Якщо заморожено, token account
не може переказувати або спалювати свій баланс токенів.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле executable має значення false. mint account USDC зберігає стан токена,
тому mint account USDC не може бути викликаний як програма.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле lamports містить баланс SOL, що зберігається на mint account. Значення
lamports — це баланс звільнення від орендної плати mint account, а не обсяг
токенів в обігу.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле programAddress показує програму, якій належить mint account. Для USDC
такою програмою є Token Program. Лише програма, якій належить акаунт, може
змінювати його поле data через розгорнуті інструкції програми.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Поле space показує розмір вихідних даних mint account у байтах. Базовий акаунт
Mint Token Program займає 82 байти.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Серіалізований та десеріалізований вивід
Обидва приклади зчитують один і той самий mint account USDC. У першому випадку
поле data залишається серіалізованим. Щоб прочитати вміст mint account,
потрібно декодувати ці дані як тип акаунта, визначений програмою-власником. Для
mint account Token Program визначає тип Mint, показаний праворуч.
До декодування поле data містить серіалізовані дані
облікового запису.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Після декодування даних як Mint, поле data містить
іменовані поля облікового запису.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Is this page helpful?