Чтение из сети

Читайте данные из сети 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 описывает момент выполнения запроса, а 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 является устаревшим полем из упразднённого механизма 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 описывает момент выполнения запроса, а 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 является устаревшим полем из упразднённого механизма 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 — это ончейн 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 в том порядке, в котором они расположены.

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

Каждый 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 является устаревшим полем из упразднённого механизма 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, а не полный скомпилированный код программы.

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, который хранит исполняемый код программы.

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 байт включают метаданные и адрес program account данных programdata account.

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

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

Поле lamports содержит баланс SOL, хранящийся на program account. Для program account требуется достаточно lamport, чтобы оставаться освобождённым от rent.

Каждый program account принадлежит программе-загрузчику. Для Token Program account значение owner — это BPF Upgradeable Loader.

Поле rentEpoch является устаревшим полем из упразднённого механизма rent. Это поле по-прежнему возвращается для обратной совместимости.

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

В предыдущем ответе поле data program account было возвращено в виде base64-кортежа. Разобранный ответ десериализует эти байты в именованные поля объекта data. Поле programData содержит адрес аккаунта ProgramData, который хранит исполняемый код программы.

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. Значение в lamport представляет собой rent-exempt баланс 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 — это устаревшее поле из упразднённого механизма 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. Значение в lamport представляет собой rent-exempt баланс mint account, а не предложение токена.

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

Поле rentEpoch — это устаревшее поле из упразднённого механизма 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?

Содержание

Редактировать страницу