如何检查“nonce”号码是不是已被占用?
Posted
技术标签:
【中文标题】如何检查“nonce”号码是不是已被占用?【英文标题】:How to check if a "nonce" number is already taken?如何检查“nonce”号码是否已被占用? 【发布时间】:2021-11-04 19:48:23 【问题描述】:我有一个 API 端点,它以严格的顺序创建和发送一些事务。因为我不等待这些事务的结果,所以我为每个事务指定了一个随机数,以便以正确的顺序执行它们。
此端点是使用 AWS Lambda 函数构建的。因此,如果我有许多并发请求,则 lambda 会以并发模式运行。在这种情况下,多个并发实例可以获得相同的随机数(我使用eth.getTransactionCount
方法来获取最新的事务计数)并发送一些具有相同随机数的事务。因此,我收到错误,因为它没有创建新事务,而是尝试替换现有事务。
基本上,我需要一种方法来检查在发送交易之前是否已经使用了一个随机数,或者以某种方式保留一个随机数(甚至可能吗?)。
【问题讨论】:
【参考方案1】:web3 getTransactionCount() 只返回已挖掘的交易数量,但目前无法使用 web3 返回最高的待处理 nonce(针对地址)。
因此,您需要将待处理的 nonce 存储在单独的数据库中(例如 Redis)。每次 Lambda 运行都需要访问该数据库以获得最高的未决随机数,计算它将使用的随机数(可能只是 +1),并将此数字存储到数据库中,以便其他实例不能再使用它。
请注意,建议实施锁定(Redis、DynamoDB)以防止多个应用实例访问数据库并同时声明相同的值。
【讨论】:
如果我错了,请纠正我,但您似乎可以通过添加“待处理”块标记作为第二个参数来检查待处理块,例如getTransactionCount(address, "pending")
。但是,这不会使 RPC 调用更可靠(即仍然需要在本地跟踪 nonce)。
@jake 这是一个很好的观察。而且我不确定,所以我只是用发件人address 对其进行了测试,该发件人目前似乎有一个待处理的transaction...但是pending
值不返回 的总和”已开采 + 待处理” 传出交易(在本例中为 4;3 已开采且 1 个待处理)。它仍然只返回在“待处理”区块(在本例中为 3)时挖掘 传出交易的数量。
感谢您的澄清。我认为这是一个重要的消歧义——我们在这里讨论的实际上有两种不同的待处理(待处理块与待处理 tx)。既然说的是后者,那么这个答案确实是正确的。【参考方案2】:
基本上,我需要一种方法来检查在发送交易之前是否已经使用了一个随机数,或者以某种方式保留一个随机数(甚至可能吗?)。
你不应该。
相反,您应该在提供原子计数器和多个读取器和写入器的内部数据库(SQL 等)中管理 nonce。只有在 1)您的系统出现故障 2)您需要手动重置它时,您才依赖提供的网络随机数。
Here is an example code for Web3.py and SQLAlchemy.
【讨论】:
以上是关于如何检查“nonce”号码是不是已被占用?的主要内容,如果未能解决你的问题,请参考以下文章