Hardhat中ethers.getSigners返回签名者数组长度仅为1如何解决?
Hardhat 中
ethers.getSigners() 仅返回1个签名者问题排查 复现代码
import { ethers } from "hardhat"; // ...其他逻辑 const [owner, user1, user2, user3] = await ethers.getSigners(); console.log(user1, user2, user3); // 控制台输出三个undefined
问题产生原因
- 本地Hardhat网络账户配置错误
Hardhat内置临时开发网络默认会生成10个预置测试ETH的签名账户,但如果手动修改了hardhat.config.js中网络配置的accounts字段,比如将账户生成数量count设为1,或者仅传入1个私钥到账户数组,getSigners()就只会返回配置对应数量的签名者。
典型错误配置示例:// hardhat.config.js 错误配置 module.exports = { networks: { hardhat: { accounts: { count: 1 // 仅配置生成1个测试账户 } } } } - 连接自定义外部网络时节点账户不足
如果测试时指定了连接外部网络(比如自建Ganache节点、公链测试网节点),且对应网络配置中仅导入了1个账户私钥,或节点本身仅加载了1个可用签名账户,方法就只会返回这1个可用签名者。 - 依赖版本不兼容
部分旧版本的hardhat-ethers插件存在签名者拉取逻辑bug,在特定配置场景下无法正确加载Hardhat内置的默认测试账户列表。
可行解决方案
- 先确认签名者实际返回数量,明确问题边界:
const allSigners = await ethers.getSigners(); console.log("当前环境可用签名者总数量:", allSigners.length); - 修正本地Hardhat网络配置
检查hardhat.config.js中的hardhat网络配置,要么删除自定义的accounts字段恢复默认配置(默认生成10个测试账户),要么将count参数调整为测试需要的数值(比如需要4个账户就设为≥4);如果是手动传入私钥的场景,补全测试需要的对应数量的账户私钥即可。
参考配置示例:// hardhat.config.js 正确配置 module.exports = { solidity: "0.8.20", networks: { hardhat: { accounts: { count: 10, balance: "10000000000000000000000" // 每个测试账户预置10000ETH } } } }; - 补全外部网络账户配置
如果测试时指定了--network参数连接外部节点,找到对应网络的配置项,把测试需要用到的账户私钥添加到accounts数组中即可。 - 修复依赖版本问题
如果确认配置无误但问题仍存在,执行命令安装稳定兼容版本的相关依赖:
安装完成后清空缓存重新运行测试:npm install --save-dev hardhat @nomicfoundation/hardhat-ethers ethersnpx hardhat clean npx hardhat test
注意:执行测试命令时如果携带了
--network 网络名参数,getSigners()不会加载Hardhat内置的临时测试账户,只会返回对应网络配置中声明的账户列表。
内容的提问来源于stack exchange,提问作者Alex Jin
相关产品推荐
相关产品推荐

