请求修复调用智能合约vote方法时出现的ethers.js报错:Uncaught (in promise) Error: sending a transaction requires a signer
问题修复方案:发送交易缺少签名者(Signer)
嘿,我一看这个错误就知道问题出在哪啦!这个报错Uncaught (in promise) Error: sending a transaction requires a signer说得很明白——你调用的vote方法是会修改链上状态的写操作,但你的合约实例是用provider创建的,而provider只能用来调用只读的视图方法,没法签名和发送交易。
问题根源
你已经正确获取了signer = provider.getSigner(0),但创建合约实例的时候,最后一个参数传的还是provider,而不是signer。ethers.js要求,执行写操作的合约实例必须绑定签名者,这样才能对交易进行签名并广播到链上。
修复后的完整代码
function vote(){ provider = new ethers.providers.Web3Provider(window.ethereum); signer = provider.getSigner(0); // 关键修改:把最后一个参数从provider换成signer const contract = new ethers.Contract("0xF1bFB2277C269DC90D8726DDf60A680aeffA2AbF", abi, signer); console.log("workin"); var propval = document.getElementById("select").value; var castvote = contract.vote(propval); castvote.then(function(transaction){ // 修复了未定义的transaction变量,用回调返回的交易对象 document.getElementById("mp").innerHTML = `投票交易已提交,哈希:${transaction.hash}`; }).catch(function(error){ // 新增错误处理,方便排查后续问题 console.error("投票操作失败:", error); document.getElementById("mp").innerHTML = `投票失败:${error.message}`; }) }
额外注意事项
- 确保用户在调用这个函数前已经连接了钱包(比如MetaMask),否则
getSigner(0)会抛出找不到账户的错误 - 永远记得给Promise添加
catch处理,避免出现未捕获的Promise错误 - 如果你只是要调用合约的只读方法(比如查询投票结果),用
provider创建合约实例是没问题的,但写操作一定要用signer
内容的提问来源于stack exchange,提问作者Rajendra Bisoi
相关产品推荐
相关产品推荐

