在构建支付流程之前,你需要先连接到 Solana,并了解如何查询网络数据。本指南将介绍基础内容:如何建立连接,以及如何使用你在支付场景中需要的 RPC 方法,配合 @solana/kit TypeScript SDK 和 Solana CLI。此外,我们还会介绍如何使用 Solana Explorer 手动验证支付、检查账户和排查问题。
连接 Solana
Solana 的 RPC API 是以编程方式与网络交互的主要方式。你的 RPC URL 实际上就是你访问网络的 API 密钥。
请勿在生产环境中使用公共 RPC
公共端点(api.mainnet-beta.solana.com,api.devnet.solana.com)
有速率限制,没有 SLA,不适合用于生产支付流程。请使用 RPC
provider 获取专属的私有 RPC 端点以部署生产环境。
在开发和测试阶段,你可以使用有速率限制的公共端点。
创建 RPC 客户端以与网络交互:
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.mainnet-beta.solana.com");
开发时建议使用 devnet(https://api.devnet.solana.com)或本地 validator,例如
Surfpool。
常用 RPC 方法
Solana 的 JSON-RPC API 提供了查询网络的方法。以下是你在支付流程中最常用的方法。
获取账户信息
Solana 上所有账户都可以通过其公钥进行寻址。使用
getAccountInfo
RPC 方法可以获取任意账户的信息。getAccountInfo 方法会返回一个 AccountInfo
对象,其中包含账户的公钥、SOL 余额、数据和其他元数据。
data 字段是账户数据的 base64 编码字符串。你可以使用 getBase64Codec
方法(来自 @solana/kit
包)将其解码为字节,然后再用对应的编解码器(如果已知)将其解码为可读对象,例如
getTokenCodec 用于 token account 的数据。
const accountInfo = await rpc.getAccountInfo(address("7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV"), {encoding: "base64"}).send();const dataBytes = getBase64Codec().encode(accountInfo.value.data);const parsedTokenData = getTokenCodec().decode(dataBytes);console.log(parsedTokenData);
获取 Token 余额
使用 getTokenAccountBalance
RPC 方法检查 token account 的余额:
const balance = await rpc.getTokenAccountBalance(tokenAccountAddress).send();console.log(balance.value.uiAmount); // Human-readable (e.g., 100.50)console.log(balance.value.amount); // Base units (e.g., "100500000")
构建交易
每笔交易都需要一个最新的 blockhash 以确保其有效(且不是过期的)。在创建支付交易前,使用
getLatestBlockhash
RPC 方法获取一个 blockhash:
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
Blockhash 大约每 60 秒过期一次。请在签名和发送前立即获取最新的 blockhash。
检查交易状态
使用 getSignatureStatuses
RPC 方法验证交易是否已结算:
const status = await rpc.getSignatureStatuses([signature]).send();const result = status.value[0];// result.confirmationStatus: "processed" | "confirmed" | "finalized"
获取交易详情
使用 getTransaction
RPC 方法获取已确认交易的完整详情:
const transaction = await rpc.getTransaction(signature, { maxSupportedTransactionVersion: 0 }).send();
交易历史
使用 getSignaturesForAddress
RPC 方法获取某地址的近期交易:
const signatures = await rpc.getSignaturesForAddress(walletAddress, { limit: 10 }).send();
如需全面的支付监控,请参阅 接受支付,其中涵盖了 webhook 和实时交易检测。
探索公开数据
Solana 的公开账本意味着每一笔交易、token account 和铸造信息都可以完全审计。区块浏览器让你无需编写代码即可手动验证支付、检查账户和排查问题。
你可以查询的内容:
- 验证支付是否结算
- 查看 token account 余额
- 调试失败的交易
- 查询铸造详情(供应量、小数位、权限)
常用区块浏览器: Solana Explorer、SolanaFM、Solscan、Orb
示例链接:
- USDC Token Mint — USDC 的供应、市场、持有者和交易
- USDC Token Transfer — USDC 支付交易详情
- USDG Token Account — 用户的 USDG 余额和交易历史
Is this page helpful?