Читайте данные из сети 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 описывает момент выполнения
запроса, а 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 является устаревшим полем из упразднённого механизма 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 — это ончейн 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 в том порядке, в котором они
расположены.
Поле data хранит состояние program account загрузчика BPF Upgradeable Loader.
Первый элемент кортежа содержит полные данные аккаунта в кодировке base64.
Второй элемент кортежа определяет кодировку. Здесь 36 байт включают метаданные и
адрес program account данных 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. Для program
account требуется достаточно lamport, чтобы оставаться освобождённым от 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}}
Каждый 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 является устаревшим полем из упразднённого механизма 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, а не полный скомпилированный код
программы.
{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, который
хранит исполняемый код программы.
{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. Значение в
lamport представляет собой rent-exempt баланс 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 — это устаревшее поле из упразднённого механизма 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?