从网络读取数据

通过获取不同账户从 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 方法返回的账户字段。

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 字节的数据。

当您使用 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 的 源代码,以及 Solana Explorer 上的 program account。

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 是一个可执行的程序账户。程序与所有账户具有相同的底层字段,但存在一些关键区别。

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 字段存储 BPF 可升级加载器的 program account 状态。第一个元组项包含以 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 字段包含 program account 持有的 SOL 余额。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 可升级加载器。

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

上一个响应以 base64 元组的形式返回了 program account 的 data 字段。解析后的响应将这些字节反序列化为 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 是一个可执行的程序账户。程序与所有账户具有相同的底层字段,但存在一些关键区别。

Token Program 示例使用 base64 编码来返回 program account 的原始数据。

以下步骤按字段在 value 中出现的顺序逐一介绍各字段。

data 字段存储 BPF 可升级加载器的 program account 状态。第一个元组项包含以 base64 编码的完整账户数据,第二个元组项标识编码方式。此处的 36 字节包含元数据和 programdata account 的地址。

对于可升级程序,program account 状态指向独立的 programdata account,该账户存储程序的可执行代码。

executable 字段设置为 true,表示该账户的地址可以作为程序被调用。

lamports 字段包含 program account 持有的 SOL 余额。Program account 需要持有足够的 lamport 以保持免租状态。

每个 program account 都归属于一个 加载器程序。对于Token Program account,owner 是 BPF 可升级加载器。

rentEpoch 字段是已废弃的 rent 机制遗留下来的历史字段,目前仍返回该字段以保持向后兼容性。

space 字段显示 program account 数据的完整字节大小。space 的值仅为 36 字节,因为 program account 存储的是加载器元数据和 programdata account 的地址,而非完整的已编译程序。

上一个响应以 base64 元组的形式返回了 program account 的 data 字段。解析后的响应将这些字节反序列化为 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 网络上唯一标识一个代币。

以下示例通过获取 USD Coin 的 mint account,演示程序状态是如何存储在独立账户中的。确切的余额和供应量数值可能因 RPC 节点读取的 slot 不同而有所差异。

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 拥有,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 账户状态。元组的第一项包含以 base64 编码的完整 82 字节账户数据,第二项标识编码格式。

要读取 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 字段包含 mint account 持有的 SOL 余额。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 拥有。mint account 的 data 字段只能由 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 拥有,Token Program 中包含定义如何创建和更新 mint account 的指令。

以下步骤按字段出现的顺序,逐一介绍 value 中的各个字段。

data 字段包含序列化后的 Mint 账户状态。元组的第一项包含以 base64 编码的完整 82 字节账户数据,第二项标识编码格式。

要读取 mint account 的数据,必须将 data 字段反序列化为 Mint 数据类型,具体方法参见下一个示例

executable 字段表示该账户是否可以作为程序被调用。mint account 存储状态数据,因此 executable 字段的值为 false

lamports 字段包含 mint account 持有的 SOL 余额。lamports 值为 mint account 的免租金余额,而非代币供应量。

mint account 由 Token Program 拥有。mint account 的 data 字段只能由 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 字段中。要将该数据读取为 supplydecimals 等字段,需将 data 字段反序列化为拥有该账户的程序所定义的账户类型。大多数 Solana 程序提供包含辅助函数的客户端库来完成此步骤。这些辅助函数返回结构化的账户数据,使结果更易于使用。

例如,@solana-program/token 库包含 fetchMint() 函数,用于获取 mint account 并将 mint account 的 data 字段反序列化为 Token Program 定义的 Mint 数据类型。

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

您可以在 Solana Explorer 上查看完整反序列化的 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
}

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 中的嵌套字段来自 Token Program 的 Mint 账户类型。

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 字段显示已铸造的代币总量。供应量以代币的最小单位计量。要获取标准单位的总供应量,需根据 decimalssupply 字段的值进行换算。

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 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。USDC mint account 存储代币状态,因此 USDC 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
}

lamports 字段包含 mint account 持有的 SOL 余额。lamport 值是 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 数据的字节大小。Token Program 的基础 Mint 账户为 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 并将 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
}
}

您可以在 Solana Explorer 上查看完整反序列化的 mint account 数据。

address 字段包含 mint account 的地址。

data 字段包含反序列化的 Mint 账户状态。data 中的嵌套字段来自 Token Program 的 Mint 账户类型。

data.mintAuthority 字段显示唯一有权创建该代币新单位的账户。

supply 字段显示已铸造的代币总量。供应量以代币的最小单位计量。要获取标准单位的总供应量,需根据 decimalssupply 字段的值进行换算。

decimals 字段显示该代币的小数位数。

isInitialized 字段表示 mint account 是否已完成初始化。isInitialized 字段是 Token Program 中使用的安全校验项。

data.freezeAuthority 字段显示有权冻结 token account 的账户。token account 是一个独立账户,用于存储某位所有者持有的代币单位。代币账户一旦被冻结,将无法转移或销毁其代币余额。

executable 字段为 false。USDC mint account 存储代币状态,因此 USDC mint account 不能作为程序被调用。

lamports 字段包含 mint account 持有的 SOL 余额。lamport 值是 mint account 的免租金余额,而非代币供应量。

programAddress 字段显示拥有该 mint account 的程序。对于 USDC,拥有该账户的程序是 Token Program。只有拥有某账户的程序,才能通过其已部署的指令修改该账户的 data 字段。

space 字段显示原始 mint account 数据的字节大小。Token Program 的基础 Mint 账户为 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
}

序列化与反序列化输出

两个示例读取的是同一个 USDC mint account。第一个响应保留了 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?

Table of Contents

Edit Page
©️ 2026 Solana 基金会版权所有