昨天在检查新上线的系统时发现了大量的 replacement transaction underpriced 错误。google了一下,ETH这个错误的意思是gas price太低了,主要可能性是nonce重复了,一个新增交易于是变成了一个更新交易,而更新交易需要比老交易更高的gas price,但在私链上通常一个固定的操作gas price都是一致的。
但nonce为什么会重复呢?

nonce, err := client.PendingNonceAt(context.Background(), myaddress)

查了文档,PendingNoceAt它是根据当前的链的高度和用户地址来生成的,换句话说,同一个用户多个交易试图打包在同一个区块中,PendingNonceAt就会重复。
再看一下更详细的日志,马上就明白了错误出现的原因。大概是前端有bug,它在发起一个建立用户的操作时,在毫秒级重复发起了几次,所以,只有第一次成功,后面全部失败,不过这个失败在功能上是无所谓的,只是重复的操作失败了。
一下理解了另一个系统的同样的问题,当时一直找不到答案,就是在一个批量的链操作时,如果超过了10次/秒,就会随机性的出现失败,为解决问题我只能把它强行限制在5次/秒。 现在知道了,那是因为链的性能,在高于10次每秒时,就会出现几个交易打包在了一个区块中引发nonce问题。

err.jpg

标签: none

添加新评论