使用 Solana Web3.js 2.0 SDK 构建应用程序的完整指南

·

2025 年 2 月,Anza Labs 正式发布了 Solana Web3.js 2.0 SDK。这一划时代版本全面拥抱现代 JavaScript 生态,带来本地 bigint、零外部依赖、可树摇(tree-shakable)等特性,提升开发效率 10 倍。下面让我们用一次真实的链上转账示例,手把手实践迁移与开发的完整链路。


为什么选择 Solana Web3.js 2.0?

  1. 极致性能:本地加密 API 把密钥生成、签名、验证速度推进到亚毫秒级。
  2. 极致精简:零依赖的可树摇构建,促使 dApp 体积下降 80%+。
  3. 极致灵活:支持自定义 RPC 实例、网络传输层、交易确认器等;配合 Codama 可自动生成链上程序 TypeScript 客户端。

此外,新版 SDK 全面使用原生 bigintUint8Array,彻底告别外部 BigNumber 依赖,显著提升浏览器与服务器端一致性。


谁应该立即升级?

场景建议
新开发的 Web / 移动端 Solana 项目建议直接使用 Web3.js 2.0
依赖 Anchor 框架等待官方支持,或选用 Codama 生成 TypeScript 客户端

👉 点击探索 Codama 快速上手秘籍


v1 → v2 迁移速查表

v1 写法v2 写法
Keypair.generate()generateKeyPairSigner()
new PublicKey("...")address("...")
amount: 1 * LAMPORTS_PER_SOLamount: 1_000_000_000n
Transaction/VersionedTransactioncreateTransactionMessage({ version: 0 })
单例 sendAndConfirmTransaction()工厂模式 sendAndConfirmTransactionFactory()({ ... })

🚩 三相变化一眼看懂


实战: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 倍,体验真正去中心化的未来!