Nonce 管理
在Conflux中,每个账户都有一个nonce值,表示该账户执行的交易序号。 可以使用RPC方法cfx_getNextNonce
获取此值。 交易中的nonce字段用于指定执行顺序,较低的nonce值表示较早地执行。 通常情况下,可以直接将这个值作为下一次交易的nonce。
然而,在网络交易量高(拥堵)或需要快速提交交易的情况下,获取nonce值变得更为复杂。 本文将详细解释nonce更新机制以及如何在特殊情况下管理交易的nonce 。
Nonce机制
这里是一些nonce机制的细节:
- 在区块链上,交易的执行顺序是按照账户的nonce值从小到大的顺序执行的。
- Nonce 的初始值是 0,每执行一次交易,nonce 就增加 1。
- Nonce 不能重复使用。
- Nonce 不能跳过:假设一个账户的当前 nonce 是 n。 如果交易的nonce值为m,且m > n, 那么该交易不会被执行 直到所有nonce < m的交易都被执行。
- 通过
cfx_sendRawTransaction
方法发送交易后, 不会立即执行。 你必须等待矿工先打包它。 一旦打包,它将延迟 5 个 epoch 执行。 交易执行后,账户的 nonce 将增加一。
Nonce 使用不当引起的问题
用户在发送交易时设置 nonce 不正确可能会导致交易失败或在交易池中卡住,无法被打包和执行。 以下是一些常见的错误消息及其相应的解决方案。
由于nonce值过时而被丢弃
如果新发送的交易的nonce小于账户的当前nonce,则该交易将被拒绝,并返回如下的错误消息:
"\"Transaction 0x0101010110 is discarded due to a too stale nonce\""
此错误表示使用的nonce 值已经过时或已被重新使用,需要更新到最新的nonce值。
交易的nonce与交易池中的交易相同
如果交易已发送到交易池但尚未执行,再发送具有相同nonce的交易将导致如下错误消息,比如:
"Tx with the same nonce already inserted. To replace it, you need to specify a gas price > {}""
在这种情况下,你应该等待交易池中的交易被执行。 如果想替换交易池中的交易,则需要设置更高的燃气价格并重新发送。
有时,错误消息也可能是:
"\"tx already exist\""
处理方式与上面相同。
由于nonce值过大而被丢弃
如果交易的nonce值过大,比用户当前nonce值大2000以上,将返回如下错误消息:
"\"Transaction 0x0101010101010101 is discarded due to in too distant future\""
解决方案: 发送交易时使用正确的nonce值。
除了nonce配置错误导致交易失败外,还会有一些其他情况。 欲了解更多详情,请参阅发送交易错误。