简体   繁体   中英

Web3 - Sending a transaction results in “invalid sender”

I'm attempting to call a function on my smart contract (Ropsten) using web3 via an Infura node. I've created a test account in Metmask and have exported the account address and private key. The details look correct, however I am getting the error {"code":-32000,"message":"invalid sender"} . I'm guessing this is a problem with the signing of the transaction?

Here's my code

 const Web3 = require('web3'); const Tx = require('ethereumjs-tx').Transaction; const fs = require('fs'); const pk = Buffer.from('PRIVATE KEY FROM METAMASK', 'hex') const sourceAccount = 'ACCOUNT ADDRESS FROM METAMASK' const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/v3/API_KEY")); const consumerAddress = '0xc36577aa0171f649be6bd7205148ed83c07198ee'; web3.eth.defaultAccount = sourceAccount; //Get Consumer contract instance const consumerAbi = JSON.parse(fs.readFileSync('rental-contract-abi.json', 'utf8')); let consumerContract = new web3.eth.Contract(consumerAbi, consumerAddress); const myData = consumerContract.methods.checkDate("e716efba3b404da98e28faaa2939c0fd","2019-06-04","AU-NSW").encodeABI(); web3.eth.getTransactionCount(sourceAccount, (err, txCount) => { // Build the transaction const txObject = { nonce: web3.utils.toHex(txCount), to: consumerAddress, from: sourceAccount, chainId: 3, value: web3.utils.toHex(web3.utils.toWei('0', 'ether')), gasLimit: web3.utils.toHex(2100000), gasPrice: web3.utils.toHex(web3.utils.toWei('6', 'gwei')), data: myData } // Sign the transaction const tx = new Tx(txObject); tx.sign(pk); const feeCost = tx.getUpfrontCost() console.log('Total Amount of ETH needed:' + web3.utils.fromWei(feeCost.toString(), 'ether')) console.log('---Serialized TX----') console.log(tx.serialize().toString('hex')) console.log('--------------------') const serializedTx = tx.serialize(); const raw = '0x' + serializedTx.toString('hex'); // Broadcast the transaction const transaction = web3.eth.sendSignedTransaction(raw, (err, tx) => { console.log(tx); console.log(err); }); }); 

You need to add network information while signing the transaction. Refer to latest web3 docs. Change signing transaction code to :

const tx = new Tx(txObject,{'chain':'ropsten'});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM