Uncaught (in promise) Error: sending a transaction requires a signer

Uncaught (in promise) Error: sending a transaction requires a signer

嘿,我收到了这个错误

                                      `Uncaught (in promise) Error: sending a transaction requires a signer (operation="sendTransaction", code=UNSUPPORTED_OPERATION, version=contracts/5.2.0)
at Logger.makeError (ethers-5.2.umd.min.js:1:59669)
at Logger.throwError (ethers-5.2.umd.min.js:1:59874)
at Contract.<anonymous> (ethers-5.2.umd.min.js:1:312289)
at step (ethers-5.2.umd.min.js:1:305047)
at Object.next (ethers-5.2.umd.min.js:1:304307)
at ethers-5.2.umd.min.js:1:303953
at new Promise (<anonymous>)
at __awaiter (ethers-5.2.umd.min.js:1:303591)
at Contract.<anonymous> (ethers-5.2.umd.min.js:1:312138)
at vote (index.html:338:34)`

关于这个代码

function vote(){ provider = new ethers.providers.Web3Provider(window.ethereum); signer = provider.getSigner(0); const contract = new ethers.Contract("0xF1bFB2277C269DC90D8726DDf60A680aeffA2AbF", abi, provider); console.log("workin"); var propval = document.getElementById("select").value; var castvote = contract.vote(propval); castvote.then(function(){ document.getElementById("mp").innerHTML = transaction; }) }

谁能帮我解决这个问题

在ethers.js中,提供商允许您从区块链查询数据。它们代表您连接到区块链的方式。使用它们,您只能调用合同的视图方法并从这些合同中获取数据。

签名者是提供者,但可以访问以太坊帐户。因此,他们可以签署修改区块链状态的交易(您在区块链上存储或更改信息的交易)。

当你实例化你的合同时,你传递的是提供者而不是签名者。所以,在这个契约上,你应该只能调用视图方法。因为投票方法修改了区块链上的状态,所以你得到了你得到的错误。

要解决此问题,您需要做的唯一更改是在合同实例中传递签名者而不是您的提供者:

const contract = new ethers.Contract("0xF1bFB2277C269DC90D8726DDf60A680aeffA2AbF", abi, signer);