Web3js
錯誤:返回錯誤:未知帳戶 - Web3 是合約函式呼叫的 msg.sender
我試圖從該契約中呼叫函式 getRewards(): https ://polygonscan.com/address/0x4AB071C42C28c4858C4BAc171F06b13586b20F30#code
這個函式使用 msg.sender 給我的賬戶獎勵。我需要做的是消息發送者。
這是我目前的程式碼:
Web3 = require('web3') const fs = require('fs'); const web3 = new Web3("https://polygon-rpc.com") const contractAddress = "0x4AB071C42C28c4858C4BAc171F06b13586b20F30" const contractJson = fs.readFileSync('./abi.json') const abi = JSON.parse(contractJson) const mSandMaticContract = new web3.eth.Contract(abi, contractAddress) asyncCall() async function asyncCall() { await mSandMaticContract.methods.getReward().send({ from: '0x560CC2be59c5deF53431783C3583B8f9F63b7793' }) }
也許這已經是正確的,但我得到了錯誤:
錯誤:返回錯誤:未知帳戶
知道如何解決嗎?
我想我需要從一個帳戶而不是我的公鑰添加,所以我嘗試了:
web3.eth.accounts.privateKeyToAccount('PRIVATE_KEY');
但是如果我嘗試使用
var accounts = await web3.eth.getAccounts() console.log(accounts[0])
或者
console.log(await web3.eth.accounts[0])
我只是得到貝克“未定義”。
解決方案是,在發送之前簽署交易,我們可以通過以下程式碼使用任何方法執行此操作:
encoded = mSandMaticContract.methods.getReward().encodeABI() var block = await web3.eth.getBlock("latest"); var gasLimit = Math.round(block.gasLimit / block.transactions.length); var tx = { gas: gasLimit, to: publicKey, data: encoded } web3.eth.accounts.signTransaction(tx, privateKey).then(signed => { web3.eth.sendSignedTransaction(signed.rawTransaction).on('receipt', console.log) })
您可以在發送交易之前添加此行
web3.eth.accounts.wallet.add(privateKey);