从网络读取数据

本节将探讨如何通过获取不同账户来从 Solana 网络读取数据,以了解 Solana 账户的结构。

在 Solana 上,所有数据都存在于“账户”中。您可以将 Solana 上的数据视为一个公共数据库,其中只有一个“账户”表,每个条目都是一个具有相同基础 账户类型的账户。

账户账户

Solana 上的账户可以存储“状态”或“可执行”程序。每个账户都有一个“地址”(公钥),作为其唯一的 ID,用于定位其对应的链上数据。

Solana 账户包含以下内容:

  • 状态:用于读取和持久化的数据。例如,关于代币的信息、用户数据或程序中定义的其他数据。
  • 可执行程序:包含 Solana 程序实际代码的账户。这些账户存储用户可以调用的指令。

程序代码和程序状态的分离是 Solana 账户模型的一个关键特性。有关更多详细信息,请参阅 Solana 账户模型页面。

获取钱包账户

此示例演示如何:

  1. 生成一个新的密钥对(公钥/私钥对)。
  2. 请求 SOL 空投以为新地址提供资金。
  3. 检索已资助地址的账户数据。

在 Solana 上,为新地址提供 SOL 资金会自动创建一个由系统程序拥有的账户。所有“钱包”账户只是由系统程序拥有的账户,这些账户持有 SOL 并可以签署交易。

Fetch Account
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`Public Key: ${keypair.publicKey}`);
const connection = new Connection("http://localhost:8899", "confirmed");
// Funding an address with SOL automatically creates an account
const signature = await connection.requestAirdrop(
keypair.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
const accountInfo = await connection.getAccountInfo(keypair.publicKey);
console.log(JSON.stringify(accountInfo, null, 2));

获取 Token 程序

此示例获取 Token 程序以演示钱包账户和程序账户之间的区别。

Fetch Program Account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
const accountInfo = await connection.getAccountInfo(address);

获取 Mint 账户

此示例获取 USD Coin (USDC) 的 Mint 账户,以展示 Solana 上的程序如何在独立账户中存储状态。

Mint 账户是由 Token Program 拥有的账户。它存储特定代币的全局元数据,包括总供应量、小数位数,以及被授权铸造或冻结代币的账户。Mint 账户的地址在 Solana 网络上唯一标识一个代币。

Fetch Program Account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await connection.getAccountInfo(address);

反序列化 Mint 账户

Solana 账户的 data 字段包含原始字节数据。要有意义地解释这些数据,您必须将其反序列化为由拥有该账户的程序定义的适当数据类型。

大多数 Solana 程序提供了带有辅助函数的客户端库,这些函数抽象了反序列化过程。它们将原始账户字节数据转换为结构化数据类型,从而更容易处理账户数据。

例如, @solana/spl-token 包含 getMint() 函数,用于帮助将 Mint account 的 data 字段反序列化为 Mint 数据类型。

Deserialize Mint Account Data
import { PublicKey, Connection } from "@solana/web3.js";
import { getMint } from "@solana/spl-token";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mintData = await getMint(connection, address, "confirmed");

Is this page helpful?

Table of Contents

Edit Page