我目前正在尝试为我的Typescript / Node Project实施以太坊节点连接。
我与" Infura"节点服务器,我需要在本地签署我的交易。 好吧,无论如何。我使用npm包" ethereumjs-tx"来签署我的交易。一切看起来都很棒。 当我使用" sendRawTransaction"从web3我的回复是一个tx-id,这意味着我的交易应该已经在Blockchain中。嗯......它不是
我的签名交易功能如下。
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");
}
&#13;
&#34; signTransactionLocally&#34;中使用的函数:
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);
}
&#13;
运行我的代码如下:
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);
});
&#13;
因为sendRawTransaction导致控制台日志: [节点]交易Done =&gt; 0xc1520ebfe0a225e6971e81953221c60ac1bfcd528e2cc17080b3f9b357003e34
一切都应该是好的。有没有人有同样的问题? 我希望有人可以帮助我。祝你有愉快的一天!
答案 0 :(得分:0)
无数次处理这些问题后;我很确定您发送的 nonce 太高了。
在这种情况下,该节点仍将向您返回交易哈希,但您的交易将保留在节点队列中,并且不会进入内存池或传播到其他节点, UNTIL ,您可以填补现时的空白。
您可以尝试以下方法:
使用getTransactionCount(address,'pending')-包括作为int节点queue&内存池的tx。但是这种方法不可靠,并且无法处理并发请求,因为节点在任何给定时间都需要时间来评估正确的数量。
保留自己的计数器,而不必依赖节点(除非您检测到一些严重的错误)。
对于更严重的项目,请使用锁来将计数器/每个地址保留在数据库级别,以处理并发,确保为每个请求给出正确的随机数。
欢呼