Send Raw Transaction Ethereum infura nodejs npm

我的梦境 提交于 2020-01-14 10:42:49

问题


I'm currently trying to implement an ethereum Node Connection to my Typescript/ Node Project.

I'm connection to the "Infura" node server where i need to sign my transaction locally. Well, anyway. I'm signing my transaction using the npm package "ethereumjs-tx" and everything looks great. When i'm using "sendRawTransaction" from web3 my response is an tx-id which means my transaction should be allready in the Blockchain. Well... it isn't

My sign Transaction Function is below.

private signTransactionLocally(amountInWei: number, to: string, privateKey: string = <PRIVATE_KEY>, wallet: string = <MY_WALLET>) {
        const pKeyBuffer = Buffer.from(privateKey, "hex");

        const txParams = {
            nonce: this.getNonce(true,wallet),
            //gas: this.getGasPrice(true),
            gasLimit: this.getGasLimit2(true),
            to: to,
            value: amountInWei,
            data: '0x000000000000000000000000000000000000000000000000000000000000000000000000',
            chainId: "0x1"
        };

        // console.log(JSON.stringify(txParams));
        const tx = new this.ethereumTx(txParams);
        tx.sign(pKeyBuffer);
        return tx.serialize().toString("hex");

    }

Used Functions in "signTransactionLocally" :

    private getGasLimit2(hex: boolean = false) {
        const latestGasLimit = this.web3.eth.getBlock("latest").gasLimit;
        return hex ? this.toHex(latestGasLimit) : latestGasLimit;
    }
    
        private getNonce(hex:boolean = false, wallet: string = "0x60a22659E0939a061a7C9288265357f5d26Cf98a") {
        return hex ? this.toHex(this.eth().getTransactionCount(wallet)) : this.eth().getTransactionCount(wallet);
    }

Running my code looks like following:

this.dumpInformations();
const signedTransaction = this.signTransactionLocally(this.toHex((this.getMaxAmountToSend(false, "0x60a22659E0939a061a7C9288265357f5d26Cf98a") / 3 )), "0x38bc48f1d19fdf7c8094a4e40334250ce1c1dc66" );
        console.log(signedTransaction);
        
this.web3.eth.sendRawTransaction("0x" + signedTransaction, function(err: any, res: any) {
            if (err)
                console.log(err);
            else
                console.log("transaction Done=>" + res);
        });

since sendRawTransaction results in console log: [Node] transaction Done=>0xc1520ebfe0a225e6971e81953221c60ac1bfcd528e2cc17080b3f9b357003e34

everything should be allright.

Has anybody had the same problem? i Hope that someone could help me. Have a nice day!


回答1:


After dealing with these issues countless times; i'm pretty sure you are sending a nonce too high.

In these cases, the node will still return you a transaction hash, but your transaction will remain in the nodes queue and not enter the memory pool or be propagated to other nodes, UNTIL, you fill in the nonce gaps.

You could try the following :

  • Use getTransactionCount(address, 'pending') - to include the txs that are int nodes queue & memory pool . But this method unreliable and won't deal with concurrent requests as the node needs time to assess the correct amount at any given time.

  • Keep your own counter, without relying on the node (unless you detect some serious errors).

  • For more serious projects, persist your counter / per address at the level of the database with locks to handle concurrency, making sure you give out correct nonces to each request.

Cheers



来源:https://stackoverflow.com/questions/44763816/send-raw-transaction-ethereum-infura-nodejs-npm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!