👛 第05课:钱包与账户——你的Web3身份

区块链基础 阶段一 ✅ 验证通过

🎯 学习目标:理解加密钱包的核心原理(密钥管理而非存储资产),掌握MetaMask使用、EIP-1193 Provider、助记词安全、EIP-712类型化签名。

📖 一、钱包的本质

钱包 ≠ 存钱的地方。钱包 = 密钥管理器。

你的ETH不"存储在"钱包里,而是存储在区块链上。钱包保管的是私钥——证明你有权支配链上资产的凭证。

🔑 核心原则:
Not your keys, not your coins——不掌控私钥,就不真正拥有资产
• 私钥 = 资产的绝对控制权
• 助记词 = 私钥的人类可读备份
• 一旦泄露,资产瞬间归零,不可逆!

📖 二、钱包分类

钱包分类 ┌─────────────────────────────────────────────────┐ │ 加密钱包 │ ├──────────────────────┬──────────────────────────┤ │ 热钱包 (Hot) │ 冷钱包 (Cold) │ │ ┌───────────────┐ │ ┌────────────────────┐ │ │ │ 浏览器扩展 │ │ │ 硬件钱包 │ │ │ │ MetaMask │ │ │ Ledger Nano S/X │ │ │ │ Rabby │ │ │ Trezor One/T │ │ │ │ Coinbase │ │ │ │ │ │ ├───────────────┤ │ │ 特点: │ │ │ │ 移动端 │ │ │ • 私钥永不触网 │ │ │ │ Trust Wallet │ │ │ • 离线签名 │ │ │ │ Rainbow │ │ │ • 最高安全级别 │ │ │ │ TokenPocket │ │ │ • 适合大额存储 │ │ │ ├───────────────┤ │ └────────────────────┘ │ │ │ 桌面端 │ │ │ │ │ Phantom │ │ ┌────────────────────┐ │ │ │ Exodus │ │ │ 纸钱包 │ │ │ └───────────────┘ │ │ 打印私钥/助记词 │ │ │ │ │ 物理隔离 │ │ │ 特点: │ └────────────────────┘ │ │ • 便捷,随时交易 │ │ │ • 联网,安全风险高 │ │ │ • 适合日常使用 │ │ └──────────────────────┴──────────────────────────┘

2.1 托管 vs 非托管

维度托管钱包非托管钱包
私钥控制平台持有用户持有
代表交易所(Binance/Coinbase)MetaMask/Ledger
恢复方式联系客服/邮箱助记词
安全模型信任平台信任自己
风险平台跑路/被黑助记词泄露/丢失
FTX事件(2022年11月):交易所挪用用户资产导致破产,数十亿美元无法追回。这就是"Not your keys, not your coins"最惨痛的教训。

📖 三、MetaMask深度解析

3.1 MetaMask架构

MetaMask 架构 ┌───────────────────────────────────────────┐ │ DApp (网页应用) │ │ 调用 window.ethereum (EIP-1193) │ └──────────────────┬────────────────────────┘ │ Provider Interface ┌──────────────────▼────────────────────────┐ │ MetaMask 扩展 │ │ ┌─────────────────────────────────────┐ │ │ │ Keyring Controller │ │ │ │ • 管理HD密钥树 (BIP-44) │ │ │ │ • 加密存储私钥 (srp加密) │ │ │ │ • 签名请求审批 │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ Provider Engine │ │ │ │ • eth_sendTransaction │ │ │ │ • eth_signTypedData (EIP-712) │ │ │ │ • eth_accounts / eth_chainId │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ Network Controller │ │ │ │ • RPC连接管理 │ │ │ │ • 链切换 (wallet_switchEthereumChain)│ │ │ └─────────────────────────────────────┘ │ └──────────────────┬────────────────────────┘ │ JSON-RPC ┌──────────────────▼────────────────────────┐ │ 以太坊节点 (RPC) │ └───────────────────────────────────────────┘

💻 四、代码实战:DApp与钱包交互


<!-- 核心JavaScript逻辑 -->

// 1. 检测钱包是否已安装
function checkWallet() {
  if (typeof window.ethereum !== 'undefined') {
    console.log('✅ MetaMask已安装');
    return true;
  }
  console.log('❌ 请安装MetaMask');
  return false;
}

// 2. 连接钱包 (EIP-1193)
async function connectWallet() {
  try {
    const accounts = await window.ethereum.request({
      method: 'eth_requestAccounts'
    });
    console.log(`✅ 已连接: ${accounts[0]}`);
    return accounts[0];
  } catch (err) {
    if (err.code === 4001) {
      console.log('❌ 用户拒绝了连接请求');
    }
  }
}

// 3. 获取余额
async function getBalance(address) {
  const balanceHex = await window.ethereum.request({
    method: 'eth_getBalance',
    params: [address, 'latest']
  });
  const balanceWei = BigInt(balanceHex);
  const balanceEth = Number(balanceWei) / 1e18;
  console.log(`💰 余额: ${balanceEth.toFixed(4)} ETH`);
  return balanceEth;
}

// 4. 发送交易
async function sendTransaction(to, valueInEth) {
  const accounts = await window.ethereum.request({
    method: 'eth_requestAccounts'
  });
  const valueHex = '0x' + (BigInt(Math.floor(valueInEth * 1e18))).toString(16);

  const txHash = await window.ethereum.request({
    method: 'eth_sendTransaction',
    params: [{
      from: accounts[0],
      to: to,
      value: valueHex,
      gasLimit: '0x5208', // 21000
    }]
  });
  console.log(`📤 交易已发送: ${txHash}`);
  return txHash;
}

// 5. EIP-712 类型化签名
async function signTypedData(from) {
  const domain = {
    name: 'MyDApp',
    version: '1',
    chainId: 1,
    verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
  };
  const types = {
    'Permit': [
      { name: 'owner', type: 'address' },
      { name: 'spender', type: 'address' },
      { name: 'value', type: 'uint256' },
      { name: 'nonce', type: 'uint256' },
      { name: 'deadline', type: 'uint256' },
    ]
  };
  const value = {
    owner: from,
    spender: '0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18',
    value: 1000000,
    nonce: 0,
    deadline: Math.floor(Date.now() / 1000) + 3600,
  };

  const signature = await window.ethereum.request({
    method: 'eth_signTypedData_v4',
    params: [from, JSON.stringify({ domain, types, primaryType: 'Permit', message: value })],
  });
  console.log(`✍️ 签名: ${signature}`);
  return signature;
}

// 6. 监听账户和网络变化
window.ethereum.on('accountsChanged', (accounts) => {
  console.log(`🔄 账户切换: ${accounts[0]}`);
});
window.ethereum.on('chainChanged', (chainId) => {
  console.log(`🔗 网络切换: ${chainId}`);
  window.location.reload(); // 建议刷新
});

📖 五、助记词安全最佳实践

🔒 安全铁律

  1. 永远不要在线输入助记词(任何网页/APP都不行)
  2. 永远不要截图或拍照助记词
  3. 永远不要在聊天工具中发送助记词
  4. 助记词写在纸上/金属板上,存放在安全位置
  5. 多份备份,分别存放在不同安全地点
  6. 考虑使用Shamir's Secret Sharing分片存储

5.1 社工攻击类型

攻击类型手法防范
钓鱼网站仿冒MetaMask/AirDrop页面验证URL,用书签
客服诈骗假客服索要助记词"验证"真客服永不索要助记词
空投骗局假代币空投引诱交互不随意approve未知合约
恶意NFT发送含恶意数据的NFT不打开未知NFT元数据
冰钓鱼交易中替换目标地址仔细核对地址全称

📖 六、多签钱包与社交恢复

6.1 Gnosis Safe (现Safe)

多签原理:M-of-N签名,需要N个持钥者中至少M个同意才能执行交易。

示例:3/5多签——5个签名者中需3个确认
• 适合:DAO金库、团队资金管理
• 安全:单人密钥泄露不会导致资产损失
• 地址:链上合约地址,非EOA

6.2 ERC-4337 账户抽象

账户抽象 (ERC-4337) 传统模型: 账户抽象: EOA → 验证(签名) Smart Account → 验证(自定义逻辑) │ 问题: 支持的验证方式: • 只支持ECDSA签名 • 多签验证 • 无法批量交易 • 社交恢复 • 无法自动化 • Passkey/FaceID • Gas必须用ETH • 会话密钥 • 批量交易 解决: • 代付Gas(用ERC-20) Bundler + Paymaster • 自动化策略 ┌──────────────────┐ │ UserOperation │ ← 用户的意图(非原始交易) │ Bundler │ ← 打包UserOp提交链上 │ Paymaster │ ← 代付Gas的赞助者 │ EntryPoint │ ← 链上验证执行入口 └──────────────────┘

📝 七、练习题

1. 加密钱包的核心功能是什么? 2. FTX事件的核心教训是什么? 3. ERC-4337账户抽象解决了什么问题? 4. 助记词泄露后应该怎么办? 5. EIP-712类型化签名相比个人签名的优势?

🔧 八、动手实验

实验1:安装MetaMask并连接测试网

  1. 在Chrome安装MetaMask扩展
  2. 创建钱包,安全保存助记词
  3. 切换到Sepolia测试网
  4. 从水龙头获取测试ETH: sepoliafaucet.com
  5. 在Etherscan Sepolia上查看你的地址

实验2:构建钱包连接页面

  1. 创建一个HTML页面,包含"连接钱包"按钮
  2. 实现connectWallet/getBalance功能
  3. 显示当前地址和余额
  4. 添加网络切换和账户变更监听

🏆 成就解锁

👛

钱包守护者

你已掌握Web3身份系统——从密钥管理到钱包交互到安全防护!
钱包是通往Web3世界的门户,保护好它就是保护你的数字主权。

✅ MetaMask使用 ✅ EIP-1193交互 ✅ 助记词安全 ✅ 账户抽象

📋 课程目录