我在Node.JS dApp的服务器端的Rinkeby网络上遇到间歇性的“置换交易价格低估”错误。我在estimateGas()
调用返回给我的交易send()调用中使用了确切的估计汽油量。在我的通话选项中,我同时添加了一个gas
和gasLimit
字段,以确保estimateGas()
对象中options
返回的估计气体值的安全。有人知道如何解决这个问题吗?
关于一个无关的问题。令我沮丧的是,仅通过Metamask向Rinkeby网络提交事务大约需要16到30秒。请注意,我的意思是从Metamask扩展弹出到我的客户端代码重新获得控制的时间。我不是谈论网络确认/挖掘交易所需的时间。话虽如此,我开始怀疑在挖掘交易之前Metamask是否不会将控制权还给您。是这样吗?
这是我用来将交易发送给Rinkeby(或我正在测试的任何网络)的代码的代码片段:
contractMethodToCall.estimateGas(
{ from: publicAddr, gasPrice: 20000000000, gas: 1500000})
.then(function(estimatedGas) {
if (estimatedGas <= 0)
throw new Error("The estimated gas for the transaction is zero.");
const rawTx = {
nonce: fromNonce,
gasPrice: gasPriceGwei,
// Use the estimated gas.
gasLimit: estimatedGas,
// Adding both gas and gasLimit just in case.
gas: estimatedGas,
to: contractAddr,
value: '0x00',
data: encodedAbiForCall
}
let tx = new Tx(rawTx);
// Sign the transaction using our server private key in Buffer format.
tx.sign(privateKeyBuffer);
let serializedTx = '0x' + tx.serialize().toString('hex');
return web3.eth.sendSignedTransaction(serializedTx);
});
答案 0 :(得分:3)
听起来您是从评论中找到问题的原因。但是,为使看到相同问题的其他人更清楚,该错误不仅是由于重复的随机数。如果提交的交易具有已在另一项未决交易中使用的随机数,并且汽油价格与该未决交易相同(或小于),则将发生此错误。
如果您使用更高的汽油价格,则可以使用同一随机数提交交易。矿工将始终选择价格较高的交易来处理待处理的工作,因此这是取消待处理的交易或重新提交因汽油价格低而被忽略的交易的一种方法。