You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:43:53