Web3js

錯誤:返回錯誤:未知帳戶 - Web3 是合約函式呼叫的 msg.sender

  • April 12, 2022

我試圖從該契約中呼叫函式 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);

引用自:https://ethereum.stackexchange.com/questions/125864