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

如何为合约B获取签名者?调用时遇签名缺失错误

问题解决:调用合约B函数时的签名者参数问题

当你调用合约的写函数(修改链上状态的函数)时,必须由拥有私钥的外部账户(EOA)发起交易并签名,因此getContractAt的第三个参数需要传入ethers.js的Signer实例,而非你之前尝试的几种错误对象。

错误原因分析

  • 若不传签名者,getContractAt返回的是只读合约实例,仅能调用view/pure类型的函数,调用写函数就会触发sending a transaction requires a signer错误。
  • 你之前的尝试问题:
    1. deployer是Hardhat的部署工具类(Deployer对象),并非ethers的Signer实例,无法用于签名交易。
    2. owner本身是正确的Signer,如果之前调用失败,可能是代码中未正确等待异步操作,或者该账户没有足够的Gas。
    3. 用bAddress获取签名者完全错误——合约账户没有私钥,无法作为签名者发起交易,只有外部账户(EOA)才有对应的Signer。

正确的参数传入方式

方式1:使用getSigners()获取的外部账户签名者

const [owner] = await hre.ethers.getSigners();
// 传入owner这个Signer实例
let b = await hre.ethers.getContractAt("contracts/B.sol:B", bAddress, owner);

方式2:使用deployer关联的wallet(因为deployer是通过new Deployer(hre, wallet)创建的,wallet本身就是Signer)

// 传入deployer.wallet这个Signer实例
let b = await hre.ethers.getContractAt("contracts/B.sol:B", bAddress, deployer.wallet);

验证

传入正确的Signer实例后,调用合约B的写函数时,就会自动以该签名者的身份发起交易,不会再出现签名者缺失的错误。

内容的提问来源于stack exchange,提问作者redfallenstar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:36:59