理论学完了,来动手实践。本节将前面的知识串联起来,通过代码实现和安全案例加深理解。
使用 ethers.js 实现:
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);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 上可以查询:
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