关键词:Solana Web3.js 2.0、TypeScript SDK、性能优化、交易发送、迁移指南、最佳实践
Solana Web3.js 2.0 带着 10 倍加速的加密操作、零依赖的 tree-shaking 与 完全重写的类型系统 重磅来袭——它将如何重塑你的开发体验?本文用 15 分钟带你完成 从旧版本迁移、构建链上转账示例,再到掌握 优先费用与计算单位调优 的完整流程,让你立即在新 SDK 中飞驰!
全新特性速览
1. 速度飞起:本地加密 API 加持
在 Node.js 与新版本浏览器中,密钥对生成、签名、验证 均调用原生加密接口,性能直接 提升 10 倍,让高并发场景下的 UX 不再卡顿。
2. 体积瘦身:零依赖 + tree-shaking
不再有笨重的 Buffer polyfill,也无外部依赖。配合现代打包工具的 tree-shaking,仅 打包用到的函数,主网 DApp 常见打包范围可减少 30–70%。
3. 极致灵活:树形组合,按需拼装
- 自定义 RPC 节点、签名器、网络传输层
- 所有高频方法(发交易、空投、拉取账户信息)均以 工厂函数 提供,可按需求注入参数
迁移前:我应该现在上车吗?
| 场景 | 建议 |
|---|---|
| 全新项目 | 直接 2.0 —— 配套工具链均已更新。 |
| 基于 Anchor | 建议 等待官方适配,或使用 Codama 自助生成客户端(工作量略高)。 |
| 旧版本在跑线上应用 | 并行运行 A/B,顺利过渡后再全量切换,可减少风险。 |
从 v1 到 v2 的 4 大关键改变
| v1.x 写法 | v2.0 等价写法 | 备注 |
|---|---|---|
Keypair.generate() | await generateKeyPairSigner() | 异步、全 camelCase |
new PublicKey("...") | address("...") | 不再存在 PublicKey 类 |
secretKey | privateKey | 统一命名符合 JS 习惯 |
SOL 金额 1e9 | 1_000_000_000n | 原生 bigint,更安全 |
贴士:迁移脚本最稳妥的方法是跑一遍 ts-morph AST 扫描,自动替换函数签名后,再配合单元测试锁定行为。
用 Web3.js 2.0 发送第一笔转账
以下示例展示 从创建交易到链上确认 的完整流程,涵盖两条近年来 显著提高打包率 的优化:优先费用 & 计算单位。
环境准备
npm init -y
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("目标公钥Base58");
const source = await createKeyPairSignerFromBytes(
getBase58Encoder().encode("你的私钥Base58")
);步骤 2:创建 RPC 连接
const rpcUrl = `https://mainnet.helius-rpc.com/?api-key=<your>`;
const wsUrl = `wss://mainnet.helius-rpc.com/?api-key=<your>`;
const rpc = createSolanaRpc(rpcUrl);
const sub = createSolanaRpcSubscriptions(wsUrl);
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });👉 这里直接跳转至 Solana 交互型沙箱,在线跑一遍上述代码
步骤 3:拉取最新区块哈希 & 构建指令
import { lamports, getTransferSolInstruction } from "@solana-program/system";
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
const ix = getTransferSolInstruction({
amount: lamports(1_000_000n), // 转 0.001 SOL
destination: dest,
source,
});步骤 4:组装交易
import { pipe, createTransactionMessage, /*...*/ } from "@solana/web3.js";
let message = pipe(
createTransactionMessage({ version: 0 }),
m => setTransactionMessageFeePayer(source.address, m),
m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),
m => appendTransactionMessageInstruction(ix, m),
);步骤 5:估算优先费用 & 计算单位
- 把未优化的交易先序列化成 Base64
- 调 Helius 优先费用 API,拿到
priorityFeeEstimate - 调
getComputeUnitEstimateForTransactionMessage得到 计算单位上限
➜ 预留 10% 缓冲,最小 1000 CU
const priorityFee = await fetchPriorityFee(message); // 自定义封装
const cuLimit = await estimateComputeUnit(message); // ↑同上步骤 6:重建并附加优化指令
import { getSetComputeUnitPriceInstruction, getSetComputeUnitLimitInstruction } from "@solana-program/compute-budget";
const ixSetPrice = getSetComputeUnitPriceInstruction({ microLamports: priorityFee });
const ixSetLimit = getSetComputeUnitLimitInstruction({ units: cuLimit });
message = appendTransactionMessageInstructions([ixSetPrice, ixSetLimit], message);步骤 7:签名 + 发送 + 确认
const tx = await signTransactionMessageWithSigners(message);
await sendAndConfirm(tx, {
commitment: "confirmed",
maxRetries: 0n, // 交给 RPC 本地重试
skipPreflight: true, // 节省时间
});
console.log("交易哈希:", getSignatureFromTransaction(tx));运行:npx esrun src/index.ts
常见问题 FAQ
Q1:旧代码必须全部重写的场景有哪些?
A:对加密操作较多的应用(高频签、代理钱包)会挣到显著提升;前端展示层几乎零改动就能跑。
Q2:为什么我的打包体积没减少?
A:请确保打包工具 开启 tree-shaking,并在 tsconfig.json 里设置 "moduleResolution": "bundler",避免把 dev 辅助代码带进生产。
Q3:优先费用如何防止“灯票”被插队?
A:设置 priorityLevel: "High" 是安全的普遍做法;在行情剧烈时可以按需调 VeryHigh,但配合 15%-20% CU 缓冲更保险。
Q4:v2 版本的密钥存储兼容硬件钱包吗?
A:同样基于 Solana Ledger App 签名流程,只要使用 @solana/wallet-adapter-*,升级后不需重录 Seed Phrase。
Q5:官方何时停止维护 v1?
A:目前计划维护到 2025 年 Q4,但新特性与漏洞修复大都只在 v2 更新。
Q6:有没有引导项目 Template?
A:社区已提供 pnpm-create-solana-dapp(Next.js + Vite + Expo 三选一),一条命令即可自动生成 Web3.js 2.0 项目骨架。
进阶:性能 & 可读性双管齐下
- 自定义 RPC
读写分离:把写交易走 Helius,读账户信息走亏本少但很多 APC 的免费公链 RPC,省钱又提升并发。 - 粒化计算单位
为每个指令估算 CU,汇总后统一 ceil,可防止低 CU 导致的多余重试。 - 脚本化迁移
见开源仓库web3-v2-migrate,自动重写:
npx sol-migrate --input ./src --dry-run结语
Web3.js 2.0 不仅让 Solana DApp 跑得更快、更小、更稳,还打开了可插拔的模块化大门。今天就上手实践:拆掉旧依赖、换下新工厂函数、跑一遍全文代码,并把迁移经验写进团队的 README。
下一轮牛市中的 极致用户体验,就从这段精简代码开始。