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

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

Отримання рахунку гаманця

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

Наведений нижче приклад створює Kit-клієнт, генерує новий підписувач, запитує SOL для поповнення нової адреси та отримує дані акаунту з RPC API клієнта.

Fetch account
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 account
await client.airdrop(signer.address, lamports(1_000_000_000n));
const accountInfo = await client.rpc.getAccountInfo(signer.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Коли ви отримуєте акаунт гаманця за допомогою getAccountInfo(), Kit повертає RPC-відповідь, показану у прикладі виведення праворуч.

Відповідь має два поля верхнього рівня: context описує момент зчитування, a value містить поля акаунту, повернені RPC-методом.

Example output
{
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.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Поле value містить стан акаунту, повернений RPC-методом. Наступні кроки докладно розглядають поля всередині value у тому порядку, в якому вони з'являються.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Поле lamports містить баланс SOL облікового запису, виміряний у lamports — найменшій одиниці SOL.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

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

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Поле owner показує програму, якій належить обліковий запис. Для гаманців власником завжди є System Program з адресою 11111111111111111111111111111111.

Example output
{
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. Це поле досі повертається для зворотної сумісності.

Example output
{
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 байтів даних.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Коли ви отримуєте акаунт гаманця за допомогою getAccountInfo(), Kit повертає RPC-відповідь, показану у прикладі виведення праворуч.

Відповідь має два поля верхнього рівня: context описує момент зчитування, a value містить поля акаунту, повернені RPC-методом.

Поле context показує slot, використаний для зчитування акаунту, та версію RPC API, яка обслужила відповідь. Повторне зчитування може повернути інший slot або версію API.

Поле value містить стан акаунту, повернений RPC-методом. Наступні кроки докладно розглядають поля всередині value у тому порядку, в якому вони з'являються.

Поле lamports містить баланс SOL облікового запису, виміряний у lamports — найменшій одиниці SOL.

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

Поле owner показує програму, якій належить обліковий запис. Для гаманців власником завжди є System Program з адресою 11111111111111111111111111111111.

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

Поле rentEpoch є застарілим полем із deprecated-механізму rent. Це поле досі повертається для зворотної сумісності.

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

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

Example output
{
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.

Fetch program account
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);
Console
Click to execute the code.

Token Program — це виконуваний program account. Програми мають ті самі базові поля, що й усі облікові записи, але з ключовими відмінностями.

У прикладі Token Program використовується кодування base64 для повернення необроблених даних program account.

Наступні кроки описують поля всередині value у порядку їх появи.

Token program 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 завантажувача BPF Upgradeable Loader. Перший елемент кортежу містить повні дані облікового запису, закодовані у форматі base64. Другий елемент кортежу визначає кодування. У цьому випадку 36 байт містять метадані та адресу programdata account.

Для програм із підтримкою оновлень стан program account вказує на окремий programdata account, у якому зберігається виконуваний код програми.

Token program 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, що вказує на те, що адресу цього акаунту можна викликати як програму.

Token program 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
}
}

Поле lamports містить баланс SOL, що зберігається на program account. Для звільнення від rent program account потрібно мати достатньо lamport.

Token program 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
}
}

Кожен program account належить програмі-завантажувачу. Для Token Program account значенням owner є BPF Upgradeable Loader.

Token program 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
}
}

Поле rentEpoch є застарілим полем із deprecated механізму rent. Це поле досі повертається для забезпечення зворотної сумісності.

Token program 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
}
}

Поле space відображає повний розмір даних program account у байтах. Значення space становить лише 36 байти, оскільки program account зберігає метадані завантажувача та адресу ProgramData account, а не повний скомпільований код програми.

Token program 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, де зберігається виконуваний код програми.

Parsed Token program account
{
executable: true,
lamports: 43712780n,
programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",
space: 36n,
address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
data: {
programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",
parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }
},
exists: true
}

Token Program — це виконуваний program account. Програми мають ті самі базові поля, що й усі облікові записи, але з ключовими відмінностями.

У прикладі Token Program використовується кодування base64 для повернення необроблених даних program account.

Наступні кроки описують поля всередині value у порядку їх появи.

Поле data зберігає стан program account завантажувача BPF Upgradeable Loader. Перший елемент кортежу містить повні дані облікового запису, закодовані у форматі base64. Другий елемент кортежу визначає кодування. У цьому випадку 36 байт містять метадані та адресу programdata account.

Для програм із підтримкою оновлень стан program account вказує на окремий programdata account, у якому зберігається виконуваний код програми.

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

Поле lamports містить баланс SOL, що зберігається на program account. Для звільнення від rent program account потрібно мати достатньо lamport.

Кожен program account належить програмі-завантажувачу. Для Token Program account значенням owner є BPF Upgradeable Loader.

Поле rentEpoch є застарілим полем із deprecated механізму rent. Це поле досі повертається для забезпечення зворотної сумісності.

Поле space відображає повний розмір даних program account у байтах. Значення space становить лише 36 байти, оскільки program account зберігає метадані завантажувача та адресу ProgramData account, а не повний скомпільований код програми.

Попередня відповідь повернула поле data program account у вигляді кортежу base64. Розібрана відповідь десеріалізує ці байти в іменовані поля об'єкта data. Поле programData містить адресу ProgramData account, де зберігається виконуваний код програми.

Token program 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
}
}

Отримання mint account

mint account — це акаунт, яким володіє Token Program і який зберігає глобальні метадані для певного токена. mint account зберігає загальну пропозицію токена, кількість десяткових знаків, повноваження на карбування та повноваження на заморожування. Адреса mint account унікально ідентифікує токен у мережі Solana.

Наведений нижче приклад отримує mint account USD Coin, щоб продемонструвати, як стан програми зберігається в окремому акаунті. Точні баланси та значення пропозиції можуть відрізнятися залежно від slot, з якого зчитує ваш RPC-вузол.

Fetch mint account
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);
Console
Click to execute the code.

mint account зберігають стан, а не виконуваний код. mint account належать Token Program, яка містить інструкції, що визначають порядок створення та оновлення mint account.

Наступні кроки описують поля всередині value у тому порядку, в якому вони з'являються.

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
}
}

Поле data містить серіалізований стан акаунта Mint. Перший елемент кортежу містить повні 82 байти даних акаунта, закодовані у форматі base64. Другий елемент кортежу визначає кодування.

Щоб зчитати дані з mint account, необхідно десеріалізувати поле data у тип даних Mint, що показано в наступному прикладі.

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
}
}

Поле executable вказує, чи може акаунт бути викликаний як програма. mint account зберігають стан, тому поле executable має значення false.

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
}
}

Поле lamports містить баланс SOL, що зберігається на mint account. Значення у lamports — це баланс, що звільняє mint account від орендної плати, а не обсяг пропозиції токена.

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.

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
}
}

Поле rentEpoch є застарілим полем із deprecated механізму rent. Це поле досі повертається для зворотної сумісності.

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
}
}

Поле space показує, що mint account містить 82 байти даних.

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

Наступні кроки описують поля всередині value у тому порядку, в якому вони з'являються.

Поле data містить серіалізований стан акаунта Mint. Перший елемент кортежу містить повні 82 байти даних акаунта, закодовані у форматі base64. Другий елемент кортежу визначає кодування.

Щоб зчитати дані з mint account, необхідно десеріалізувати поле data у тип даних Mint, що показано в наступному прикладі.

Поле executable вказує, чи може акаунт бути викликаний як програма. mint account зберігають стан, тому поле executable має значення false.

Поле lamports містить баланс SOL, що зберігається на mint account. Значення у lamports — це баланс, що звільняє mint account від орендної плати, а не обсяг пропозиції токена.

mint account належить Token Program. Поле data mint account може бути змінене лише інструкціями Token Program.

Поле rentEpoch є застарілим полем із deprecated механізму rent. Це поле досі повертається для зворотної сумісності.

Поле space показує, що mint account містить 82 байти даних.

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

Дані акаунту зберігаються у полі data у серіалізованому форматі. Щоб отримати ці дані у вигляді полів, таких як supply або decimals, необхідно десеріалізувати поле data у тип акаунту, визначений програмою-власником. Більшість програм Solana надають клієнтські бібліотеки з допоміжними функціями для цього кроку. Ці допоміжні функції повертають структуровані дані акаунту, що спрощує роботу з результатом.

Наприклад, бібліотека @solana-program/token включає функцію fetchMint() для отримання mint account і десеріалізації поля data mint account у тип даних Mint, визначений Token Program.

Deserialize mint account data
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);
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>,
}

Функція fetchMint() отримує mint account і десеріалізує поле data mint account у тип акаунту Mint.

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 у Solana Explorer.

Decoded 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
}

Поле address містить адресу mint account.

Decoded 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.

Decoded 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.mintAuthority показує єдиний акаунт, який може створювати нові одиниці токена.

Decoded 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
}

Поле supply показує загальну кількість токенів, які було випущено. Значення пропозиції вимірюється в найменших одиницях токена. Щоб отримати загальну пропозицію у стандартних одиницях, скоригуйте значення поля supply на decimals.

Decoded 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
}

Поле decimals показує кількість десяткових знаків для токена.

Decoded 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
}

Поле isInitialized вказує, чи було ініціалізовано mint account. Поле isInitialized є перевіркою безпеки, яка використовується в Token Program.

Decoded 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.freezeAuthority містить акаунт із повноваженнями заморожувати token accounts. token account — це окремий акаунт, що зберігає одиниці токена для власника. Якщо заморожено, token account не може переказувати або спалювати свій баланс токенів.

Decoded 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
}

Поле executable має значення false. mint account USDC зберігає стан токена, тому mint account USDC не може бути викликаний як програма.

Decoded 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
}

Поле lamports містить баланс SOL, що зберігається на mint account. Значення lamports — це баланс звільнення від орендної плати mint account, а не обсяг токенів в обігу.

Decoded 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 через розгорнуті інструкції програми.

Decoded 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
}

Поле space показує розмір вихідних даних mint account у байтах. Базовий акаунт Mint Token Program займає 82 байти.

Decoded 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
}

Функція fetchMint() отримує mint account і десеріалізує поле data mint account у тип акаунту Mint.

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 у Solana Explorer.

Поле address містить адресу mint account.

Поле data містить десеріалізований стан акаунта Mint. Вкладені поля у data походять від типу акаунта Mint Token Program.

Поле data.mintAuthority показує єдиний акаунт, який може створювати нові одиниці токена.

Поле supply показує загальну кількість токенів, які було випущено. Значення пропозиції вимірюється в найменших одиницях токена. Щоб отримати загальну пропозицію у стандартних одиницях, скоригуйте значення поля supply на decimals.

Поле decimals показує кількість десяткових знаків для токена.

Поле isInitialized вказує, чи було ініціалізовано mint account. Поле isInitialized є перевіркою безпеки, яка використовується в Token Program.

Поле data.freezeAuthority містить акаунт із повноваженнями заморожувати token accounts. token account — це окремий акаунт, що зберігає одиниці токена для власника. Якщо заморожено, token account не може переказувати або спалювати свій баланс токенів.

Поле executable має значення false. mint account USDC зберігає стан токена, тому mint account USDC не може бути викликаний як програма.

Поле lamports містить баланс SOL, що зберігається на mint account. Значення lamports — це баланс звільнення від орендної плати mint account, а не обсяг токенів в обігу.

Поле programAddress показує програму, якій належить mint account. Для USDC такою програмою є Token Program. Лише програма, якій належить акаунт, може змінювати його поле data через розгорнуті інструкції програми.

Поле space показує розмір вихідних даних mint account у байтах. Базовий акаунт Mint Token Program займає 82 байти.

Decoded 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
}

Серіалізований та десеріалізований вивід

Обидва приклади зчитують один і той самий mint account USDC. У першому випадку поле data залишається серіалізованим. Щоб прочитати вміст mint account, потрібно декодувати ці дані як тип акаунта, визначений програмою-власником. Для mint account Token Program визначає тип Mint, показаний праворуч.

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

Serialized 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, поле data містить іменовані поля облікового запису.

Deserialized 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
}

Is this page helpful?

Зміст

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