如何处理RSK中的“交易随机数过高”错误?
我在 RSK 上部署了一个分散的应用程序,并且已经工作了几个月。使用公共节点一切正常,但很少发生,我们开始收到完全随机的错误:
Unknown Error: {
"jsonrpc": "2.0",
"id": 2978041344968143,
"error": {
"code": -32010,
"message": "transaction nonce too high"
}
}
没有关于“太高”随机数的信息,但有很多关于“太慢”的线程。我正在使用web3.Contract.method.send().
回答
同一地址在交易池中的交易数量是有限制的。
对于 RSK,此限制为4,并TxValidatorNonceRangeValidator
在rskj代码库中定义:
BigInteger maxNumberOfTxsPerAddress = BigInteger.valueOf(4);
请注意,以太坊也有类似的限制,但在geth 中配置的限制是10。因此,如果我们已经发送了 4 个尚未被挖掘的交易,并且在下一个区块被挖掘之前发送了第 5 个交易,则会得到 nonce 太高的错误。如果一个区块被挖出并且假设有所有 4 个交易,那么我们最多可以为下一个区块添加 4 个交易。
解决方法
(1) 从一个地址发送不超过 4 个交易,直到有新区块。
(2) 聚合所有调用,然后使用一次执行它们的合约。在RNS Batch Client 中ExecuteRegistrations可以看到这样的一个例子
。