如何在Hardhat中获取配置账户的签名者?相关疑问解析
问题解答
1. 如何获取仅包含配置账户的签名者列表?
有两种实用方法:
方法一:直接从私钥创建签名者
在测试代码中读取环境变量里的私钥,用ethers.js的Wallet类直接生成对应签名者,示例代码:
const { ethers } = require("hardhat"); // 读取配置的私钥 const targetPrivateKeys = [ process.env.PRIVATE_KEY, process.env.DEFAULT_MEMBER_PRIVATE_KEY, process.env.TEST_MEMBER_PRIVATE_KEY ]; // 生成签名者列表并关联当前provider const targetSigners = targetPrivateKeys.map(key => new ethers.Wallet(key, ethers.provider));
方法二:给测试网络配置指定账户
修改hardhat.config.js,给默认的hardhat测试网络添加accounts配置,这样测试时ethers.getSigners()就会返回这些账户:
require('dotenv').config(); module.exports = { solidity: "0.8.10", networks: { hardhat: { // 配置测试网络使用指定私钥,可自定义初始余额 accounts: [ process.env.PRIVATE_KEY, process.env.DEFAULT_MEMBER_PRIVATE_KEY, process.env.TEST_MEMBER_PRIVATE_KEY ].map(key => ({ privateKey: key, balance: "100000000000000000000" })) }, goerli: { url: `https://goerli.infura.io/v3/${process.env.INFURA_API_KEY}`, accounts: [process.env.PRIVATE_KEY, process.env.DEFAULT_MEMBER_PRIVATE_KEY, process.env.TEST_MEMBER_PRIVATE_KEY] }, sepolia: { url: `https://sepolia.infura.io/v3/${process.env.INFURA_API_KEY}`, accounts: [process.env.PRIVATE_KEY, process.env.DEFAULT_MEMBER_PRIVATE_KEY, process.env.TEST_MEMBER_PRIVATE_KEY] } }, etherscan: { apiKey: process.env.ETHERSCAN_API_KEY, }, };
之后运行测试,ethers.getSigners()就会返回你配置的这几个账户对应的签名者。
2. ethers.getSigners()返回的签名者究竟是什么?
ethers.getSigners()返回的是当前Hardhat会话所连接网络的可用于签名交易的钱包实例列表,具体规则:
- 使用默认
hardhat测试网络(本地测试默认):返回10个Hardhat自动生成的测试账户,每个初始有100ETH余额,和你配置的goerli/sepolia网络账户无关; - 连接goerli/sepolia等真实网络(通过
--network参数指定):返回对应网络配置中accounts数组里私钥对应的钱包实例; - 本质上,它是当前网络配置定义(或默认生成)的具备签名能力的账户集合,每个实例可用于发送交易、签名消息等操作。
内容的提问来源于stack exchange,提问作者Ivan Voras
相关产品推荐
相关产品推荐

