1

我不明白如何准备交易、签署交易然后使用 INFURA 发送。我希望我发布的 NodeJS 代码有问题。谁能帮我解决这个问题?

注意:我可以在我的智能合约上发送交易,但 EVM 会恢复执行。

智能合约(Solidity)的一部分(我要调用的函数):

function testFunction() public pure returns (string memory) {
    return "testSuccess";
}

NodeJS中使用的函数:

      const printRequestTransaction = async (gcodeHash) => {

    log(`Preparing a transaction to register that the gcode has been sent`.yellow);


    // With every new transaction send using a specific wallet address, it needed to increase a nonce which is tied to the sender wallet
    let nonce = await web3.eth.getTransactionCount(web3.eth.defaultAccount);

    // Fetch the current transaction gas prices from https://ethgasstation.info/
    let gasPrices = await getCurrentGasPrices();

    // Build a new transaction object and sign it locally
    let details = {
        "to": process.env.SMART_CONTRACT_ADDRESS,
        //"value": web3.utils.toHex(web3.utils.toWei(amountToSend.toString(), 'ether')),
        "gas": 210000,
        "gasPrice": gasPrices.low * 1000000000, // converts the gwei price to wei
        "nonce": nonce,
        //"data": gcodeHash,
        "function": "testFunction",
        "chainId": 3 // EIP 155 chainId - mainnet: 1, ropsten: 3, rinkeby: 4 (https://ethereum.stackexchange.com/questions/17051/how-to-select-a-network-id-or-is-there-a-list-of-network-ids/17101#17101)
    };
    const transaction = new EthereumTx(details);

    // This is where the transaction is authorized on Local PC behalf. The private key is what unlocks Local PC wallet.
    transaction.sign(Buffer.from(process.env.WALLET_PRIVATE_KEY, 'hex'));

    // Compress the transaction info down into a transportable object
    const serializedTransaction = transaction.serialize();

    // The Web3 library is able to automatically determine the "from" address based on Local PC private key

    // Submit the raw transaction details to the provider configured above (INFURA)

    const transactionHash = await web3.eth.sendSignedTransaction('0x' + serializedTransaction.toString('hex')).then(function (receipt) {
        log(`result of the invokation: ${receipt})`.red);
        return receipt.transactionHash;
    }).catch((err) => {
        log(`error occurred: ${err})`.red);
    });

    //const transactionHash = "exampleHash";
    _transactionHash = transactionHash;

    // Now it is known the transaction ID, so let's build the public Etherscan url where the transaction details can be viewed.
    const url = `https://ropsten.etherscan.io/tx/${transactionHash}`;
    log(url.cyan);
    log(`Note: please allow for 30 seconds before transaction appears on Etherscan`.yellow)
};

输出:

error occurred: Error: Transaction has been reverted by the EVM: { "blockHash": "0x6205c1b8ce2fde3693e85843dce684ff11472e9df01fd850bc99e5771b3262d5", "blockNumber": 5024524, "contractAddress": null, "cumulativeGasUsed": "0x50170f", "from": "0x8882528C7104e146E0500203C353C09922575385", “gasUsed”:“0x5236”,“logs”:[],“logsBloom”:“0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "status": "0x0", "to": "0x1732089F6F6EeFA942871707c5AE1909B60774EB", "transactionHash": "0xf748c9a6bdb19e776db4d8a9802d2bf5f8b588158da387029529249aca00a499", "事务索引": 1 })

我想特别注意let details = {...};我不太确定它是否正确的对象,对此我有点困惑。

4

0 回答 0