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

请求修复调用智能合约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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:27:39