通过 Infura 的 Web3 SendSignedTransaction 未出现在 Etherscan 交易列表中

Posted

技术标签:

【中文标题】通过 Infura 的 Web3 SendSignedTransaction 未出现在 Etherscan 交易列表中【英文标题】:Web3 SendSignedTransaction through Infura doesn't appear in the Etherscan transactions list 【发布时间】:2021-10-14 07:12:58 【问题描述】:

概览

大家好,我既不是开发人员也不是程序员,但我已经启动了这个 Udacity 区块链纳米学位项目,并开始编写一些区块链应用程序。

从课程开始,我开始编写一个简单的程序,将一些以太币从一个 Metamask 帐户发送到另一个帐户,两个帐户都在同一个测试网 (Rinkeby) 中。

这是我目前使用的程序:

带有 Rinkeby 测试网中 2 个帐户的元掩码。 Web3 版本 1.5.1 ethereumjs-tx 版本 2.1.2 Infura Rinkeby 端点

问题

问题是课程已经过时,他们的大部分代码都不再工作了。所以,在 Web3 网站(链接:https://web3js.readthedocs.io/en/v1.4.0/index.html)搜索了 3 天后,我开始实现我的代码,我设法编写了您可以在 sn-p 中看到的代码。

我的代码没有抛出任何错误,当我检查交易数量(包括待处理的交易)时,每次运行我的代码时,交易数量都会不断增加。但是,当我查看 Rinkeby Etherscan 网站(链接:https://rinkeby.etherscan.io/)时,在交易列表中找不到交易(已完成、待处理、失败、传出和传入交易)。

问题

我的代码有什么问题?我该如何解决它/他们? 如何计算 GasPrice 以及如何确定 GasLimit?我只想进行一笔交易以发送 X 数量的以太币而没有数据。 我尝试使用与 Metamask 相同的 GasPrice 和 GasLimit,但它向我抛出错误“Intrinsic gas too low”。为什么会这样?因为,我在 Metamask 中使用这些值没有任何问题,并且从我的一个 metamask 帐户向另一个帐户发送一些以太币的交易不到 3 分钟就完成了(我从 Metamask 插件发送了交易)。 链条的分叉与这个问题有关系吗?如果是这样,我如何在 Metamask 中检查我的两个帐户的正确分叉?

注意

我通过代码共享 senderAccount 的私钥,因为这两个帐户仅用于在 Rinkeby 测试网中测试此特定代码。我不打算将它们用作钱包。

代码

// STEP 1: LOADING DEPENDENCIES
const Web3 = require('web3');
const web3 = new Web3('https://rinkeby.infura.io/v3/4fa53ccf01504cc69f0dcbdfdaa38acf');
const Transaction = require('ethereumjs-tx').Transaction;

async function sendTransaction() 
    // STEP 2: INSTANCIATING ADDRESSES
    const sendingAddress = '0x5Be6e93fE99374E506F4e3803e91EbDFe35D6A39';
    const receivingAddress = '0x24620ddf8474c89C0Fc0c916acBcF4029C4eB47F';

    // STEP 3: CONSTRUCTING THE TRANSACTION
    const rawTx = 
        from        :   web3.utils.toHex(sendingAddress),
        to          :   web3.utils.toHex(receivingAddress),
        value       :   web3.utils.toHex(900000000000000),
        gasPrice    :   web3.utils.toHex(1000000000),
        gasLimit    :   web3.utils.toHex(210000),
        data        :   web3.utils.toHex(''),
        nonce       :   web3.utils.toHex(await web3.eth.getTransactionCount(sendingAddress, 'pending')),
    ;

    // STEP 4: GENERATING PRIVATE KEY FROM PRIVATE KEY OF ACCOUNT
    const privateKey = Buffer.from('e603c35185142cc8779c47f9c88a81a52446aaa1398286abf3340178aee11c36', 'hex');

    // STEP 5: INITIALIZATING THE TRANSACTION
    const tx = new Transaction(rawTx,  chain: 'rinkeby', hardfork: 'istanbul' );

    // STEP 6: SIGN TRANSACTION
    tx.sign(privateKey);

    // STEP 7: SERIALIZE TRANSACTION
    const serializedTx = tx.serialize();
    web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('receipt', console.log);

    // BONUS: CHECKING NUMBER OF TRANSACTIONS
    console.log(await web3.eth.getTransactionCount(sendingAddress, 'pending'));


sendTransaction();

【问题讨论】:

【参考方案1】:

好的,我发现代码不完整,我需要实现更多的东西。这是已完成且 100% 工作的代码。

// THIS IS THE LEGACY FORM TO SEND TRANSACTIONS
// Loading dependencies
const fs = require( 'fs' ).promises;
const Web3 = require( 'web3' );
const HDWalletProvider = require( '@truffle/hdwallet-provider' );
const  mnemonicGenerate  = require( '@polkadot/util-crypto' );
const Transaction = require('ethereumjs-tx').Transaction;
const Common = require('ethereumjs-common').default;

async function main ()   
    // Infura rinkeby's url
    const infuraRinkeby = INFURA_HTTPS;

    // Generating bip39 mnemonic
    // const mnemonic = mnemonicGenerate();
    // save the mnemonic in a JSON file in your project directory
    // console.log(mnemonic);

    // Loading previously generated mnemonic
    const mnemonic = ( JSON.parse( await fs.readFile(
                       "FILE_WITH_MNEMONIC.json" ,
                       "utf8" 
                      ) ) ).mnemonic;

    // Generating provider
    const provider = new HDWalletProvider( mnemonic , infuraRinkeby );
    const web3 = new Web3( provider );

    // Declaring rinkeby testnet
    const chain = new Common( 'rinkeby' , 'istanbul' );

    // Getting sending and receiving addresses
    //YOU CAN CHANGE 0 TO SELECT OTHER ADDRESSES
    const sendingAddress = ( await web3.eth.getAccounts() )[0]; 
    const receivingAddress = "DESTINATION_ADDRESS";

    // Getting the private key for the account
    const preKey = ( provider.wallets )[ sendingAddress.toLowerCase() ]
                   .privateKey.toString( 'hex' );
    const privateKey = Buffer.from( preKey , 'hex' );

    // Constructing the raw transaction
    const rawTx = 
        from        :   web3.utils.toHex( sendingAddress ),
        to          :   web3.utils.toHex( receivingAddress ),
        gasPrice    :   web3.utils.toHex( web3.utils.toWei( '1' , 'gwei' ) ),
        gasLimit    :   web3.utils.toHex( 200000 ),
        value       :   web3.utils.toHex( web3.utils.toWei( '0.25' , 'ether' ) ),
        data        :   web3.utils.toHex( 'Hello World!' ),
        nonce       :   web3.utils.toHex( await web3.eth.getTransactionCount( 
                                          sendingAddress ,
                                          'pending'
                                         ) ),
    ;

    // Creating a new transaction
    const tx = new Transaction( rawTx ,  common : chain  );

    // Signing the transaction
    tx.sign( privateKey );

    // Sending transaction
    await web3.eth.sendSignedTransaction( '0x' + tx.serialize().toString( 'hex' ) )
    .on( 'receipt', function( receipt ) 
        console.log( receipt );
    )
    .on( 'error' , function( error ) 
        console.error( error );
    );   
;

main();

【讨论】:

以上是关于通过 Infura 的 Web3 SendSignedTransaction 未出现在 Etherscan 交易列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 web3 连接到受保护的 infura 项目?

web3.eth.getAccounts 不适用于 infura

调用 web3.js,连接 infura 节点进行合约转账

使用 web3.py 和 infura.io 监听 Uniswap 合约事件

Web3 开发者平台 Infura 的用户数突破 35 万!

Web3 开发者平台 Infura 的用户数突破 35 万!