关键词:Solana web3.js、SOL 余额、链上转账、链上合约交互、实时账户监听
想让前端页面“活”起来,一键查询 SOL 余额、实现秒级链上转账、甚至与自定义合约交互?Solana web3.js 就是一把趁手利器。本文用最简洁易懂的中文示范核心操作,直接切中开发者日常工作痛点,复制-粘贴即可跑通。
环境准备:一行命令装好 Solana web3.js
打开终端,进入项目根目录,执行:
npm install @solana/web3.js仅需 3 秒完成,无需额外依赖。
快速上手:4 个场景一次搞定
场景 1:查询账户 SOL 余额
链接 Solana 公链网络,用 devnet 免费用例:
import { Connection, clusterApiUrl, Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js';
const connect = new Connection(clusterApiUrl('devnet'));
const secretKey = Uint8Array.from([...]); // 请用自己私钥替换
const payer = Keypair.fromSecretKey(secretKey);
const balance = await connect.getBalance(payer.publicKey);
console.log('余额:', balance / LAMPORTS_PER_SOL, 'SOL');关键概念LAMPORTS_PER_SOL等于 10⁹,也就是 10 亿个 lamports 兑换 1 个 SOL。
场景 2:发送 SOL 轻松转账
一笔交易由多条指令组成。转账只需要一条 SystemProgram.transfer 指令:
import { SystemProgram, PublicKey, TransactionMessage, VersionedTransaction } from '@solana/web3.js';
const toPubkey = new PublicKey('B2V5kYvGyBGyoYvFJzYJh8ighH2Hn6FdM8xxgqMq9cbK');
const transferIx = SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey,
lamports: 10_000_000 // 0.01 SOL
});
const { blockhash } = await connect.getLatestBlockhash();
const messageV0 = new TransactionMessage({
payerKey: payer.publicKey,
recentBlockhash: blockhash,
instructions: [transferIx]
}).compileToV0Message();
const tx = new VersionedTransaction(messageV0);
tx.sign([payer]);
const txid = await connect.sendTransaction(tx);
console.log('交易哈希:', txid);Solana 推荐所有新项目使用 VersionedTransaction,老 API Transaction 已逐步废弃。
场景 3:与链上合约交互
这里示范调用一个极简 Hello World 程序(已部署于 devnet 的 4eFvSUYCLMwVCx1aWyuCYf3mKo3UPgA4gNVAWViRVhk1)。理解逻辑后即可替换为任何形式化合约。
import { TransactionInstruction } from '@solana/web3.js';
const data = Buffer.from([0]); // 合约参数
const keys = [
{ pubkey: payer.publicKey, isSigner: false, isWritable: false }
];
const ix = new TransactionInstruction({
programId: new PublicKey('4eFvSUYCLMwVCx1aWyuCYf3mKo3UPgA4gNVAWViRVhk1'),
keys,
data
});
const messageV0 = new TransactionMessage({
payerKey: payer.publicKey,
recentBlockhash: (await connect.getLatestBlockhash()).blockhash,
instructions: [ix]
}).compileToV0Message();
const tx = new VersionedTransaction(messageV0);
tx.sign([payer]);
const txid = await connect.sendTransaction(tx);
console.log('交互 txid:', txid);场景 4:实时监控账户变动
监听功能依赖 Solana WebSocket,推荐用免费的 QuikNode devnet 节点:
const wsUrl = 'wss://docs-demo.solana-devnet.quiknode.pro/';
const wsConnect = new Connection(clusterApiUrl('devnet'), { wsEndpoint: wsUrl });
wsConnect.onAccountChange(
payer.publicKey,
(updatedAccountInfo, context) => {
console.log('账户变动:', updatedAccountInfo);
},
'confirmed'
);使用该监听器即可实时捕捉余额变化、NFT 转移或任何 SPL 资产新增事件。
常见疑问解答 FAQ
Q1:devnet 与 mainnet-beta 有什么差别?
A:devnet 完全免费,用于开发与测试;mainnet-beta 才是真正的资金网络,必须按需购买 RPC 节点配额并保管好私钥。
Q2:把私钥写在代码里安全吗?
A:绝对不安全!生产环境建议配合 .env 文件 + 构建加密层,或使用钱包适配器让用户手动签名。
Q3:报错 insufficient funds for instruction 怎么办?
A:devnet 余额不足时,打开 官方水龙头 领取免费 SOL 即可。
Q4:为什么推荐 VersionedTransaction 而非 Transaction?
A:VersionedTransaction 支持地址表(Address Lookup Table),可显著降低链上占用的字节空间,费用更低,未来兼容性更好。
Q5:监听太多账户会占内存吗?
A:每个 WebSocket 连接占用极少量内存,但建议定期清理未使用的监听器,避免前端页面泄漏。
Q6:IDE 提示 Buffer 未定义?
A:浏览器端需先 npm i buffer 并手动 window.Buffer = Buffer。Node.js 环境则无需额外处理。
进阶思路:让代码更安全、更专业
- 钱包适配器集成
将私钥从代码后端迁移到前端 Phantom、Solflare 等钱包插件,提高用户信任度。 - 批量转账优化
多个收款地址可使用 Versioned Transaction + Address Lookup Table,把十几个指令合并到一笔交易中,节省链上费用。 - 错误重试机制
Solana 高并发时可能出现blockhash not found,可包装sendTransaction并在 30 秒内自动重试,提高成功率。 - 监听增强
不必仅用onAccountChange,也可监听SignatureResult或日志onLogs,构建更精细的数据看板。
结语
4 段代码、10 分钟,你就掌握了「查询-转账-合约交互-实时监控」4 大高频需求。无论是 DeFi 应用、GameFi 礼包空投,还是 NFT 二级市场实时订单撮合,Solana web3.js 都能替你跑在毫秒级确认的高性能轨道上。现在就拉下示例仓库,动手让你的 dApp 抢先一步上线!