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

使用ethers库调用NFT合约mintToken方法时出现`sending a transaction requires a signer`错误的解决方案咨询

解决ethers.js中铸造NFT时的"sendTransaction requires a signer"错误

这个报错其实很好理解——你现在的tokenContract是用provider实例化的,而provider只能用来执行只读操作(比如查询NFT余额、合约信息),像铸造NFT这种需要修改链上状态的写操作,必须要有签名者(signer)来签署交易,不然节点不知道这笔交易是哪个账户发起的,也没法验证合法性。

具体修复步骤:

把你的tokenContract初始化代码,从使用provider改成使用signer就行。因为signer继承了provider的所有功能,既能读也能写,完全满足需求。

修改你的Initial方法里的这一行:

// 原来的代码(仅支持只读操作)
this.tokenContract = new ethers.Contract(config.contractConfig.nftAddress, NFT.abi, provider);

// 修改后的代码(支持读写操作)
this.tokenContract = new ethers.Contract(config.contractConfig.nftAddress, NFT.abi, signer);

为什么这样能解决问题?

当你调用合约的mintToken方法时,ethers.js会自动尝试发送一笔交易到链上。如果合约实例是用provider创建的,它没有签名交易的权限,就会抛出你看到的那个错误。而用signer创建的合约实例,会使用你从provider.getSigner()拿到的账户(在Ganache环境里就是默认的第一个测试账户)来签署交易,这样节点就能正常处理这笔铸造请求了。

另外可以确认下,你的signer是有效的——在本地Ganache环境下,provider.getSigner()默认会返回第一个测试账户,只要你的Ganache节点正常运行,这个签名者就是可用的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:07:28