2025 年 2 月,Anza Labs 正式发布了 Solana Web3.js 2.0 SDK。这一划时代版本全面拥抱现代 JavaScript 生态,带来本地 bigint、零外部依赖、可树摇(tree-shakable)等特性,提升开发效率 10 倍。下面让我们用一次真实的链上转账示例,手把手实践迁移与开发的完整链路。
为什么选择 Solana Web3.js 2.0?
- 极致性能:本地加密 API 把密钥生成、签名、验证速度推进到亚毫秒级。
- 极致精简:零依赖的可树摇构建,促使 dApp 体积下降 80%+。
- 极致灵活:支持自定义 RPC 实例、网络传输层、交易确认器等;配合 Codama 可自动生成链上程序 TypeScript 客户端。
此外,新版 SDK 全面使用原生 bigint 与 Uint8Array,彻底告别外部 BigNumber 依赖,显著提升浏览器与服务器端一致性。
谁应该立即升级?
| 场景 | 建议 |
|---|---|
| 新开发的 Web / 移动端 Solana 项目 | 建议直接使用 Web3.js 2.0 |
| 依赖 Anchor 框架 | 等待官方支持,或选用 Codama 生成 TypeScript 客户端 |
v1 → v2 迁移速查表
| v1 写法 | v2 写法 |
|---|---|
Keypair.generate() | generateKeyPairSigner() |
new PublicKey("...") | address("...") |
amount: 1 * LAMPORTS_PER_SOL | amount: 1_000_000_000n |
Transaction/VersionedTransaction | createTransactionMessage({ version: 0 }) |
单例 sendAndConfirmTransaction() | 工厂模式 sendAndConfirmTransactionFactory()({ ... }) |
🚩 三相变化一眼看懂
- 密钥:统一使用
KeyPairSigner,字段名改为 camelCasekeyPair。 - 地址:统一用字符串表示的
"address",无需实例化对象。 - 金额:世界通用原生
BigInt,后缀带n即可。
实战:5 分钟完成一次链上转账
起步:准备开发环境
npm init -y
mkdir src && touch src/index.ts
npm install @solana/web3.js@2 \
@solana-program/system \
@solana-program/compute-budget \
esrun步骤 1:生成地址与密钥
import { address, createKeyPairSignerFromBytes, getBase58Encoder } from "@solana/web3.js";
const dest = address("GvvrKbKGkKKQLYTxkrBQJPsmLQhFoEqJQqexHissGEoT");
const secretKey = "5MaiiCavH..."; // 你自己的 base58 私钥
const source = await createKeyPairSignerFromBytes(
getBase58Encoder().encode(secretKey)
);步骤 2:直连 Helius RPC & WebSocket
import { createSolanaRpc, createSolanaRpcSubscriptions, sendAndConfirmTransactionFactory } from "@solana/web3.js";
const rpc = createSolanaRpc("https://mainnet.helius-rpc.com?api-key=YOUR_KEY");
const wss = createSolanaRpcSubscriptions("wss://mainnet.helius-rpc.com?api-key=YOUR_KEY");
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions: wss });步骤 3:组装转账指令
import { getTransferSolInstruction } from "@solana-program/system";
import { lamports, createTransactionMessage, pipe, setTransactionMessageFeePayer, setTransactionMessageLifetimeUsingBlockhash, appendTransactionMessageInstruction } from "@solana/web3.js";
const { value: recent } = await rpc.getLatestBlockhash().send();
const instruction = getTransferSolInstruction({
amount: lamports(1000000n), // 0.001 SOL
destination: dest,
source,
});
const txMsg = pipe(
createTransactionMessage({ version: 0 }),
m => setTransactionMessageFeePayer(source.address, m),
m => setTransactionMessageLifetimeUsingBlockhash(recent, m),
m => appendTransactionMessageInstruction(instruction, m)
);步骤 4:动态估算优先费 & 计算单元
import { signTransactionMessageWithSigners, getBase64EncodedWireTransaction } from "@solana/web3.js";
import { getComputeUnitEstimateForTransactionMessageFactory, getSetComputeUnitPriceInstruction, getSetComputeUnitLimitInstruction } from "@solana-program/compute-budget";
// 签名一次,便于序列化后询价
let signed = await signTransactionMessageWithSigners(txMsg);
const base64Tx = getBase64EncodedWireTransaction(signed);
const { result } = await fetch(rpc("getPriorityFeeEstimate"), {
method: "POST",
body: JSON.stringify({
transaction: base64Tx,
options: { priorityLevel: "High" }
}),
}).then(r => r.json());
const priorityFee = result.priorityFeeEstimate;估算计算单元并设置:
const cuEstimateFac = getComputeUnitEstimateForTransactionMessageFactory({ rpc });
let cu = await cuEstimateFac(txMsg);
const units = Math.max(1000, Math.ceil(cu * 1.1));步骤 5:重建并再次签名
const { value: finalBlock } = await rpc.getLatestBlockhash().send();
const finalMsg = pipe(
txMsg,
m => appendTransactionMessageInstructions([
getSetComputeUnitPriceInstruction({ microLamports: priorityFee }),
getSetComputeUnitLimitInstruction({ units }),
], m),
m => setTransactionMessageLifetimeUsingBlockhash(finalBlock, m)
);
signed = await signTransactionMessageWithSigners(finalMsg);步骤 6:发送 & 确认
await sendAndConfirm(signed, {
commitment: "confirmed",
maxRetries: 0n,
skipPreflight: true
});
console.log("Transfer confirmed:", signed.signatures[0]);👉 一步生成专属 Solana 客户端签名工具,体验 2.0 极速构建
常见问题 (FAQ)
Q1:v2 较 v1 具体体积缩小了多少?
相比 v1 全量引用 >350 kB,v2 使用按需引入后,转帐示例仅 35 kB,降幅 80% 以上。
Q2:不使用 Helius RPC 可以吗?
完全可以。只要替换为自己的 RPC 端点即可,createSolanaRpc("YOUR_RPC")。
Q3:估算计算单元失败怎么办?
设置兜底值 1000 计算单元即可;对于复杂指令,先在小网络 Devnet 测试。
Q4:Anchor 何时官方支持 v2?
社区预计 2025 年第二季度发布;期间可用 Codama 生成独立 TS 客户端。
Q5:浏览器可以直接使用吗?
可以,2.0 纯 ES 模块,配合 Vite、webpack 5 等均可树摇。
小结
Solana Web3.js 2.0 SDK 用 “现代 JS + 零依赖 + 极致性能” 为开发者打开了全新的应用范式。从链上转账到高并发 DeFi 程序,你只需轻量引入、动态估算、安全签名,即可在全端环境(Node / 浏览器 / React Native)中极速达成。立即动手,把你的下一个 dApp 性能提升 10 倍,体验真正去中心化的未来!