Ethers使用InfuraProvider调用getSigner报不支持签名错误如何解决
报错原因
InfuraProvider属于纯RPC节点提供商,仅提供以太坊网络的数据查询、已签名交易的广播能力,本身不存储任何用户私钥。而getSigner方法要求Provider持有对应账户的私钥才能生成可签名的Signer对象,因此该操作本身就不被纯RPC Provider支持。
修复方案
你需要自行导入钱包的私钥/助记词生成Signer,再将InfuraProvider关联到该Signer上即可,具体修改如下:
- 先在你的
.env文件中新增私钥配置(绝对不要硬编码私钥到代码中):
PRIVATE_KEY=你的以太坊钱包私钥
- 修改报错行的代码,将原来的
provider.getSigner()替换为用私钥生成绑定Provider的Signer:
// 用私钥生成签名器并关联InfuraProvider const signer = new ethers.Wallet(process.env.PRIVATE_KEY, provider);
如果使用助记词导入钱包,可替换为如下写法:
// 助记词同样存储在.env中,不要硬编码 const signer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC).connect(provider);
额外注意事项
- 请确保
.env文件已加入.gitignore,避免私钥/助记词泄露导致资产损失 - 你当前使用的Rinkeby测试网已停止服务,建议替换为Sepolia或Goerli测试网
- 请确认对应钱包地址在测试网持有足够的原生代币支付交易Gas费
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

