Solana 第2周:从终端日志到实时浏览器仪表盘
Source: Dev.to
公共数据库
在开始之前,我以为区块链数据会晦涩且难以获取。实际上,Solana 更像是一个全球分布的公共数据库。在传统应用中,你的数据隐藏在由后端服务器管理的私有 SQL 或 NoSQL 数据库中。而在 Solana 上,一切都是 账户,且账户默认是公开的;任何拥有 RPC 连接的人都可以随时读取账户的状态。
终端 vs. 浏览器
我的一周工作像是上下半场的比赛:在终端里操作,在浏览器里构建。
终端
- 使用 Solana CLI 的简单命令(如
solana balance)检查地址余额。 - 记录原始交易数据,以实时查看 SOL 的流动。
浏览器
- 将余额获取迁移到使用
@solana/web3.js库的 JavaScript 前端。 - 建立到集群的
Connection,并使用getBalance以编程方式获取数据。
import { Connection, clusterApiUrl, LAMPORTS_PER_SOL } from '@solana/web3.js';
const connection = new Connection(clusterApiUrl('devnet'));
const publicKey = /* your public key */;
async function getSolBalance() {
const lamports = await connection.getBalance(publicKey);
const sol = lamports / LAMPORTS_PER_SOL;
console.log(`Balance: ${sol} SOL`);
}
获取余额
Solana 并不以 “1 SOL” 的形式存储余额。它使用 Lamports,即 SOL 的最小单位(1 SOL = 10⁹ Lamports)。要显示用户的实际余额,需要将结果除以 LAMPORTS_PER_SOL 常量:
SOL = Lamports / 10^9
账户历史
读取交易是一个两步过程:
- 使用
getSignaturesForAddress获取签名(交易 ID)。 - 使用
getParsedTransaction获取交易详情。
内置的限制每次请求只能返回 1,000 条签名,因此需要使用 before 参数进行分页,以获取完整历史。
// Step 1: Get signatures
const signatures = await connection.getSignaturesForAddress(publicKey, { limit: 1000 });
// Step 2: Get transaction details
const transactions = await Promise.all(
signatures.map(sig => connection.getParsedTransaction(sig.signature))
);
Devnet 与 Mainnet‑beta 对比
| 功能 | Devnet | Mainnet‑beta |
|---|---|---|
| SOL 价值 | $0(免费空投) | 实际市场价值 |
| 速率限制 | 对测试宽松 | 公共节点上限制严格 |
| 用途 | 测试与演示 | 生产应用 |
关键要点: 公共端点会被强力限流,常返回 429 Too Many Requests 错误。
收获
- 提交级别 – 在 “processed” 交易的速度与 “finalized” 交易的确定性之间取得平衡仍是学习曲线。
- 速率限制 – 在 Mainnet‑beta 上,尤其是共享 RPC 节点,预计会有更严格的限制。
下一步
下周我将深入 程序(Programs),探索如何向链上写入数据。
如果你也在走同样的道路,欢迎联系!