以太坊随机数管理。错误随机数太低

Posted

技术标签:

【中文标题】以太坊随机数管理。错误随机数太低【英文标题】:Ethereum Nonce Management. error nonce too low 【发布时间】:2019-10-22 19:37:32 【问题描述】:

我使用 web3 和供应商主网。我按合同进行了 2 笔交易。首先是批准方法,另一笔交易是多转账。我将第二个签名存储在数据库中。如果第一笔交易成功,我发送第二笔交易/。第二笔交易几乎总是错误随机数太低`。我该如何解决这个问题

【问题讨论】:

【参考方案1】:

对于正确随机数管理,您有 2 个选项:

使用 web3.eth.getTransactionCount(ethAddress) 请求您的地址的交易数量已确认,增加、发送和等待收据处理下一个。如果您需要高吞吐量并且依赖特定节点可用和同步,这将非常慢。

您在数据库级别维护自己的本地计数器持久化。使用数据库的访问来处理可能的并发请求并每次都返回正确的值。您确实希望将此计数器保留在内存中,因为如果您的应用程序崩溃或重新启动,它们将会丢失。这是非常有效的,因为您不需要节点,并且您可以发送尽可能多的交易。如果出现问题...(随机数太低)重置为 web3.eth.getTransactionCount(ethAddress) 的值。

重要提示:您可能想知道为什么不使用 web3.eth.getTransactionCount(ethAddress, 'pending')。这是因为“待处理”选项使调用不可靠,因为节点很难在队列和内存池中拥有准确数量的事务。

为了更好地了解节点如何看待您的消息的 nonce。在这里检查这个答案:https://ethereum.stackexchange.com/questions/2808/what-happens-when-a-transaction-nonce-is-too-high/2809#2809

还有这个:Send Raw Transaction Ethereum infura nodejs npm

【讨论】:

【参考方案2】:

据我了解,这里可能有两个问题(解决方案); 1) 您可能必须手动增加 nonce 以进行多传输操作的 gas 估计。 2)这些天有些服务器非常慢,所以你要么在执行第二个事务之前获取第一个事务的 transactionReceipt(poll) 以确保它已被挖掘。这样,您可能会获得第二次交易的正确随机数。但是,如果您懒惰地这样做,这只是两个事务之间的合理延迟。

【讨论】:

看,例如:我有 2 个签名,随机数 6 和 7。我将第一个签名发送到节点并等待挖掘。如果它被开采,我会发送第二个签名。没关系。但是在交易之间,如果有人从这个钱包进行交易,那么这个交易也需要随机数 7。出来我有 2 笔相同的交易,因此我收到错误 nonce too low

以上是关于以太坊随机数管理。错误随机数太低的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在以太坊中生成多个随机数?

轻松通关以太坊--初识以太坊

以太坊何时会切换到权益证明?

以太坊 比特币 nounce有什么不同

Web3 ReactNative 错误此浏览器不支持安全随机数生成

Celo生态图