关键词:Solana 钱包、Phantom、钱包适配器、Web3 前端、交易签名、Devnet、React 钱包连接、DApp 交互实践
速读摘要
- 钱包 负责存储私钥与签名交易
- 硬件钱包 独立设备,难被木马窃取
- 软件钱包 插件或 App,亲切易用
- Solana 生态用神级 钱包适配器库,一行代码适配多款插件
- 本教程提供完整 React + Next.js 实操,让你在 15 秒内调通“一键 Ping 交易”
什么是 Solana 钱包?
在前两课我们学到了“密钥对”是由公钥与私钥组成的。公钥可公开,私钥必须保护——这正是“钱包”存在的意义。它将私钥加密保存在 硬件设备 或 软件应用 里,不让网页直接接触,却把签名功能交给网站调用。
两大形态,轻松选对
| 类型 | 优点 | 适用场景 |
|---|---|---|
| 硬件钱包 | 断网存储,防木马 | 大额资产长期持有 |
| 软件钱包 | 浏览器插件,随点随签 | 日常交互、低门槛测试 |
在 Solana 开发中,大多数实验都从 浏览器扩展 的软件钱包开始,例如 Phantom、Solflare,只需装插件即可连 Devnet,气体免费。
为什么选择 Phantom?
Phantom 凭借 一键连接 Meta UX、支持手机扫码、iOS/Android 双端 的优势,目前拥有超 200 万月活。网站只要接入 Solana Wallet Adapter,就能无缝支持 Phantom,以及后续所有兼容“钱包标准”的前辈。
Solana Wallet Adapter 全景速览
- @solana/wallet-adapter-base
提供核心WalletAdapter类型与事件系统 - @solana/wallet-adapter-react
React Hooks:useWallet、useConnection - @solana/wallet-adapter-react-ui
拿来即用的 UI 组件:WalletMultiButton、WalletModal
一条命令安装全家桶:
npm install @solana/wallet-adapter-base \
@solana/wallet-adapter-react \
@solana/wallet-adapter-react-ui如果你一心宠 Phantom,还可以:
npm install @solana/wallet-adapter-phantomReact 项目实战:一步步搭起钱包连接
本次实验目标:
让用户用 Phantom 连接按钮,一键向 Solana Devnet 的 Ping 合约发出交易,并在浏览器实时看「签到次数」增长。
第 1 步:前置准备
- 安装 Phantom 插件并切到 Devnet
打开设置 → Developer Settings → Testnet Mode - 克隆起始代码
git clone https://github.com/Unboxed-Software/solana-ping-frontend.git
cd solana-ping-frontend
git checkout starter
npm install
npm run dev启动后你会看到一个空壳页面,右上角还是「Connect」占位按钮。
第 2 步:添加 Wallet Context
新建 components/WalletContextProvider.tsx:
import { FC, ReactNode } from 'react';
import {
ConnectionProvider,
WalletProvider,
} from '@solana/wallet-adapter-react';
import { WalletModalProvider } from '@solana/wallet-adapter-react-ui';
import { clusterApiUrl } from '@solana/web3.js';
import { useMemo } from 'react';
require('@solana/wallet-adapter-react-ui/styles.css');
const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
const endpoint = clusterApiUrl('devnet');
const wallets = useMemo(() => [], []);
return (
<ConnectionProvider endpoint={endpoint}>
<WalletProvider wallets={wallets} autoConnect>
<WalletModalProvider>{children}</WalletModalProvider>
</WalletProvider>
</ConnectionProvider>
);
};
export default WalletContextProvider;接着在 pages/index.tsx 中包裹整个应用:
import WalletContextProvider from '../components/WalletContextProvider';
// ...
<WalletContextProvider>
<AppBar />
<PingButton />
</WalletContextProvider>第 3 步:左上角“万能按钮”升级
打开 components/AppBar.tsx,替换旧的占位按钮:
import { WalletMultiButton } from '@solana/wallet-adapter-react-ui';
// ...
<WalletMultiButton />按钮会根据连接状态自动在「Select Wallet」/「已连接地址」/「Disconnect」之间变换,简直不要太香!
第 4 步:让“Ping” 按钮真正工作
编辑 components/PingButton.tsx,按下方顺序完成:
取出连接与钱包钩子:
const { connection } = useConnection(); const { publicKey, sendTransaction } = useWallet();定义相关公钥:
const programId = new web3.PublicKey('ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa'); const dataAccount = new web3.PublicKey('Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod');创建并发送交易:
const onClick = async () => { if (!publicKey || !connection) return; const tx = new web3.Transaction(); const ix = new web3.TransactionInstruction({ keys: [{ pubkey: dataAccount, isSigner: false, isWritable: true }], programId, }); tx.add(ix); const sig = await sendTransaction(tx, connection); console.log('TX:', sig); };
刷新页面、连接钱包、点击「Ping!」,Phantom 会弹出“此页面请求签名交易”。用户确认即可广播,开发者控制台会打印交易号 sig,可直接黏贴到 Solana Explorer 追踪。
示例迭代:让体验更丝滑
- 余额实时刷新:
connection.onAccountChange监听数据账户,每变更一次即刷新计数 - 加载动效:在交易广播期间显示 spinner,提升耐心值
- 结果页跳转:交易哈希直接链到
https://explorer.solana.com/tx/{sig}?cluster=devnet
用户交互图:
常见问答 FAQ
Q1:为什么我的 Phantom 找不到按钮?
94% 童鞋忘记切到 Devnet。进 Phantom → 设置 → Developer Settings → Testnet Mode。保存即可刷新网页识别。
Q2:交易发到主网会扣真实 SOL 吗?
不会,本教程全程 Devnet,相当于做实验。真的要刷测试币,访问官方 Devnet Faucet。
Q3:能否同时支持多款钱包?
当然。只需在 useMemo(() => [], []) 中注入多个适配器列表,Wallet Adapter 会自动弹出选择器。
Q4:如何避免私钥泄露?
永远不要把私钥明文放入前端;Wallet Adapter 在用户界面里签名,前端只拿到 publicKey 和 sendTransaction,私钥全程不触网。
Q5:交易老卡在 pending?
Devnet 偶尔拥堵。把 RPC URL 换成自建 Quicknode、Helius 或 Alchemy 节点,可提升稳定性。
挑战任务:独立实现「打赏 0.1 SOL」DApp
- 从 GitHub 拉取项目:
solana-send-sol-frontend starter 完成以下功能:
- 显示用户地址与余额
- 表单输入目标地址 + 金额,点击发送后弹出签名
- 交易成功后给出区块链浏览器查询按钮
- 参考提交时的完整答案亦可:
https://github.com/Unboxed-Software/solana-send-sol-frontend/tree/main
小结与下一步
至此你已掌握:
• Solana 钱包的工作机制
• Phantom 钱包与 Solana Wallet Adapter 的配合
• React 前端如何安全地“只签名、不触钥”
下一步不妨深入研究 Anchor 框架 或 hackathon 中的 游戏化 NFT,让你的 Web3 技能继续长在风口上。祝正式上线主网时 Gas 免费、手续费低到天荒地老!