Solana 的 devnet 水龙头每次可获取 5 SOL(测试用),足够开发全过程。
17.2.1 创建钱包
bash
# 生成新密钥对(本地存储)
solana-keygen new --outfile ~/.config/solana/id.json
# 保存助记词!这是恢复唯一路径
# 查看地址
solana address --keypair ~/.config/solna/id.json
# → Fg6...xyz (Base58 编码的公钥)
# 请求测试 SOL
solana airdrop 5 <address> --url devnet
# → 5 SOL 已发送到 devnet 地址
# 查看余额
solana balance <address> --url devnet
# → 5 SOL17.2.2 前端连接 Phantom
typescript
// hooks/useWallet.ts
import { useEffect, useState } from 'react';
interface PhantomWindow extends Window {
phantom?: { solana?: { isPhantom: boolean; connect: () => Promise<{ publicKey: { toString: () => string } }>; disconnect: () => Promise<void> } };
}
export const usePhantom = () => {
const [wallet, setWallet] = useState<string | null>(null);
const [connected, setConnected] = useState(false);
const connect = async () => {
const w = (window as PhantomWindow).phantom?.solana;
if (!w?.isPhantom) {
alert("请安装 Phantom 钱包扩展");
return;
}
const res = await w.connect();
setWallet(res.publicKey.toString());
setConnected(true);
};
const disconnect = async () => {
await (window as PhantomWindow).phantom?.solana?.disconnect();
setWallet(null);
setConnected(false);
};
return { wallet, connected, connect, disconnect };
};组件
tsx
// WalletButton.tsx
export const WalletButton = () => {
const { wallet, connected, connect, disconnect } = usePhantom();
return (
<button
className={connected ? "btn-disconnect" : "btn-connect"}
onClick={connected ? disconnect : connect}
>
{connected ? `断开: {wallet?.slice(-4)}` : "连接 Phantom"}
</button>
);
};17.2.3 多签基础知识
graph TD
Admin[管理员A] --> Multisig[多签程序]
Admin2[管理员B] --> Multisig
Admin3[管理员C] --> Multisig
Multisig --> |需 2/3 签名| Vote[投票操作]
style Multisig fill:#fff3e0
生产级投票系统中,投票结果可能由 2/3 多签管理员确认后执行。
, 前往 → 17.3 投票合约逻辑 |*
评论
0评论加载中…