从网络读取数据
本节将探讨如何通过获取不同账户来从 Solana 网络读取数据,以了解 Solana 账户的结构。
在 Solana 上,所有数据都存在于“账户”中。您可以将 Solana 上的数据视为一个公共数据库,其中只有一个“账户”表,每个条目都是一个具有相同基础 账户类型的账户。
账户
Solana 上的账户可以存储“状态”或“可执行”程序。每个账户都有一个“地址”(公钥),作为其唯一的 ID,用于定位其对应的链上数据。
Solana 账户包含以下内容:
- 状态:用于读取和持久化的数据。例如,关于代币的信息、用户数据或程序中定义的其他数据。
- 可执行程序:包含 Solana 程序实际代码的账户。这些账户存储用户可以调用的指令。
程序代码和程序状态的分离是 Solana 账户模型的一个关键特性。有关更多详细信息,请参阅 Solana 账户模型页面。
获取钱包账户
此示例演示如何:
- 生成一个新的密钥对(公钥/私钥对)。
- 请求 SOL 空投以为新地址提供资金。
- 检索已资助地址的账户数据。
在 Solana 上,为新地址提供 SOL 资金会自动创建一个由系统程序拥有的账户。所有“钱包”账户只是由系统程序拥有的账户,这些账户持有 SOL 并可以签署交易。
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 accountconst 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 程序以演示钱包账户和程序账户之间的区别。
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 网络上唯一标识一个代币。
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
数据类型。
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?