0 votes
1 view
in Blockchain by (7k points)

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 Answer

0 votes
by (14.5k points)

You are facing this issue as you have sent a very high ‘nonce’ value. What’s happening here is your respective node will return a transaction hash but it is not passed on to other nodes or into the memory pool. You need to fill the nonce gaps to make transaction hash propagation to other nodes possible. 

To do that, you can: 

  1. Use getTransactionCount (address, ‘pending’). This will include transactions that are in the nodes queue and memory pool. But this method is unreliable and time-consuming. 

  2. Have a counter and use it for the same purpose without depending on nodes. 

  3. When you get into larger projects, you can implicate counter/address at the database level with locks. This handles concurrency and returns correct nonces to every request.

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...