node.js - 发送交易结果为 "invalid sender"

标签 node.js ethereum web3js metamask

我正在尝试通过 Infura Node 使用 web3 调用我的智能合约 (Ropsten) 上的函数。我在 Metmask 中创建了一个测试帐户,并导出了帐户地址和私钥。详细信息看起来正确,但我收到错误 {"code":-32000,"message":"invalid sender"}。我猜这是交易签名的问题?

这是我的代码

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);
    });
});

最佳答案

您需要在签署交易时添加网络信息。请参阅最新的 web3 文档。将签名交易代码更改为:

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

关于node.js - 发送交易结果为 "invalid sender",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56537431/

相关文章:

javascript - 如何使用 web3js 创建公钥和私钥?

javascript - 如何修复 MetaMask 无法获取错误?

javascript - Web3 1.1.0 的问题

arrays - 如何在nodejs中使用mongoose将值推送到特定的数组索引?

javascript - 向这个 Express.js 模型类添加一个数组属性

javascript - 使用 web3 将奇怪的 wei 转换为以太币

javascript - 如何使用松露测试代码来读取公共(public)变量?

node.js - Mongoose withTransaction 仅部分执行

node.js - Mongoose – 将对象相互链接而不重复

next.js - 在 NextJS 应用程序中导入 web3 时出现 Netlify 构建错误 - 'Error: Can' t 解析 'electron' ...'