教程区块链区块链技术ch1717.2 连接 Solana 钱包:安装、创建、连接与多签

本页目录

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 SOL

17.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(0,6)...{wallet?.slice(0, 6)}...{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

评论加载中…

发表评论

0/2000