以太坊交易中的nonce

以太坊交易中的nonce

最近在做交易方面的一些事,在讨论时发现了一个没有注意过的细节。以前只重点关注了nonce不能比当前小,目的是为了双花,在分析的博客里也说明过。但是没有想过这个需要是连续的,不过后来一经分析确实也是如此。

举一个简单的例子 ,直接上来就给一个极限值,下来所有的交易基本都完成不了了。

当然,这是做为远端帐户(签名交易)的要求,本地的帐户由于帐户解锁后,由以太坊的状态来控制,所以是没有这个现象的。而这次恰恰是远端帐户发送批量交易。那么这个nonce到底需要什么样的条件呢?

查找了一些资料,总结如下:

  1. 首先看官网咋说的:是一个整数类型,可以使用相同的随机数来覆盖自己已经发送的但是处于pending状态的交易(这个很有用,可以处理异常情况下的交易清除)。当然,这有个前提,必须gas price高于原交易的110%。
  2. Nonce小于当前使用的nonce值,交易会被拒绝。
  3. Nonce太大,交易会进入queue队列,直到新交易到来,可以连续排序后,转为pending(或者说补齐当中差的值),否则,退出或者一定条件最终被抛弃。
  4. 可以通过eth_getTransactionCount查看当前nonce,其有两个参数,第一个参数为需要查询nonce的地址,第二个参数为block的状态:latest、earliest和pending。一般情况使用pending就可以查询当前最新已使用的nonce。其他状态类似。
  5. 交易队列单帐户单次最多64个交易。批量转帐,最好控制节奏。
  6. 合约账户每创建一个合约nonce加一。而合约调用其他合约属于内部调用,因此nonce值不变。

总结:

从上面可以看出,noncer值应当保持连续,不允许出现空穴。

如果nonce不对,会有什么情况发生呢,对外面的操作者来看:

可能抛出replacement transaction underpriced异常。这个异常通常有以下几个原因引起:

  1. txpool中有一笔pending状态交易
  2. 新交易拥有与其相同的nonce。
  3. 交的交易gas price太小,无法覆盖 pending状态交易。

那怎么办呢?前面说了,提高gas price的值。

纸上学来终是浅,绝知此事要躬行。古人诚不我欺。

猜你喜欢

转载自blog.csdn.net/fpcc/article/details/81256611