Skip to content

ETH #4:回顾与实战

理论学完了,来动手实践。本节将前面的知识串联起来,通过代码实现和安全案例加深理解。


学习目标

  1. 用代码实现助记词生成和 HD 钱包派生
  2. 用代码构建和发送 EVM 交易
  3. 学会使用 Etherscan 浏览器
  4. 理解"地址投毒"攻击的原理

实践内容

助记词与 HD 钱包

使用 ethers.js 实现:

javascript
const { ethers } = require('ethers');

// 生成随机助记词
const mnemonic = ethers.Wallet.createRandom().mnemonic;
console.log('助记词:', mnemonic.phrase);

// 从助记词派生钱包
const hdNode = ethers.utils.HDNode.fromMnemonic(mnemonic.phrase);

// 派生第 0 个地址 (m/44'/60'/0'/0/0)
const wallet0 = hdNode.derivePath("m/44'/60'/0'/0/0");
console.log('地址 0:', wallet0.address);
console.log('私钥 0:', wallet0.privateKey);

// 派生第 1 个地址
const wallet1 = hdNode.derivePath("m/44'/60'/0'/0/1");
console.log('地址 1:', wallet1.address);

构建和发送交易

javascript
const provider = new ethers.providers.JsonRpcProvider('RPC_URL');
const wallet = new ethers.Wallet('PRIVATE_KEY', provider);

const tx = {
  to: '0x接收地址',
  value: ethers.utils.parseEther('0.01'),
  gasLimit: 21000,
};

const receipt = await wallet.sendTransaction(tx);
console.log('交易哈希:', receipt.hash);

Etherscan 浏览器使用

Etherscan 上可以查询:

  • 交易详情:Gas 使用、状态、输入数据
  • 账户信息:余额、交易历史、代币持仓
  • 合约信息:源码、ABI、读/写方法
  • 代币转账:ERC-20/721/1155 转账记录

安全案例:1155 WBTC 地址投毒攻击

攻击原理

graph TB
    A["1️⃣ 攻击者监控链上交易"] --> B["2️⃣ 发现 Alice 经常转账给<br/>Bob: 0xd9A1...b045"]
    B --> C["3️⃣ 生成首尾相似地址<br/>伪Bob: 0xd9A1...b045<br/>(中间不同)"]
    C --> D["4️⃣ 从伪Bob向 Alice 发送<br/>0 金额转账"]
    D --> E["5️⃣ Alice 交易历史中<br/>出现伪Bob地址"]
    E --> F["6️⃣ Alice 复制地址时<br/>误复制伪Bob地址"]
    F --> G["💀 资金转入攻击者地址"]

    style G fill:#ffcdd2

攻击要点

  • 攻击者通过 GPU 暴力碰撞,生成首尾字符与目标地址相同的地址
  • 利用零金额转账(0 value transfer)在受害者的交易历史中"投毒"
  • 用户习惯从交易历史中复制地址,很容易被骗

防护建议

  • 永远不要从交易历史中复制地址
  • 使用地址簿功能保存常用地址
  • 转账前仔细核对地址的每一个字符

相关资源