如何在Hardhat中创建并使用1000个钱包签名者测试智能合约?
在Hardhat中创建并为1000个随机钱包充值ETH的方案
1. 生成1000个随机钱包
在测试文件里,用ethers的Wallet.createRandom()批量生成钱包,同时连接到Hardhat的provider,方便后续交互:
const { ethers } = require("hardhat"); describe("目标合约测试", function () { let testWallets = []; const WALLET_TOTAL = 1000; const ETH_AMOUNT = ethers.utils.parseEther("1"); // 每个钱包分配1ETH before(async function () { // 循环生成随机钱包并连接provider for (let i = 0; i < WALLET_TOTAL; i++) { const wallet = ethers.Wallet.createRandom(); testWallets.push(wallet.connect(ethers.provider)); } });
2. 从默认签名者批量转ETH
Hardhat默认提供的第一个签名者持有大量ETH,用它给新生成的钱包批量转账,用Promise.all并行处理提升效率:
before(async function () { // ... 上面的生成钱包代码 // 获取第一个默认签名者 const [defaultSigner] = await ethers.getSigners(); // 批量发起转账交易 const transferTasks = testWallets.map(wallet => { return defaultSigner.sendTransaction({ to: wallet.address, value: ETH_AMOUNT }); }); await Promise.all(transferTasks); console.log(`已完成${WALLET_TOTAL}个钱包的ETH充值`); });
3. 使用充值后的钱包交互合约
现在这些钱包已经有可用ETH了,直接用它们连接合约执行交易即可:
it("验证1000个钱包与合约交互", async function () { // 部署目标合约 const TargetContract = await ethers.getContractFactory("TargetContract"); const targetContract = await TargetContract.deploy(); await targetContract.deployed(); // 让每个测试钱包调用合约方法(替换成你的合约逻辑) const interactionTasks = testWallets.map(async (wallet) => { await targetContract.connect(wallet).yourMethod(); }); await Promise.all(interactionTasks); // 这里添加你的断言逻辑,比如检查合约状态变化 }); });
实用提示
- 如果遇到交易超时,可在
hardhat.config.js中调高blockGasLimit参数,比如设为30000000; - 若需要固定钱包集合(每次测试用同一批),可以把生成的私钥保存到本地文件,测试时用
new ethers.Wallet(privateKey, provider)加载; - 批量转账也可以用自定义合约实现单次交易多地址转账,进一步提升效率,但测试环境下
Promise.all基本够用。
内容的提问来源于stack exchange,提问作者Esai
相关产品推荐
相关产品推荐

