资讯专栏INFORMATION COLUMN

以太坊nonce详解

luxixing / 2454人阅读

摘要:实际验证发现交易中有一个要求导致两个错误要求以太坊要求一个账户的每笔交易有一个连续的计数。

在我们发布eth智能合约后希望可以同时转账多笔代币,又不希望将群发币写入智能合约,所以只能手动写web3脚本交易,当我们测试geth接口在一个交易失败问题后,之后的交易都将阻塞,也无法看到pendding状态,最终他们将被取消。最后发现交易设置了相同nonce。

什么是nonce?

nonce有两个意义在以太坊官方:
1.工作量证明:为了证明工作量的无意义的值,这是采矿的本质,这个值将决定采矿的难度,
2.账户的随机数:在一个账户中的防止多重交易的用途。例如一个交易从A到B 20个币,可能从A到B发送多次。

实际验证发现交易中nonce有一个要求导致两个错误

要求:
以太坊要求一个账户的每笔交易有一个连续的计数。每个节点将根据计数顺序严格执行来自一个用户的交易。
错误:
重复的计数:如果我们发送一笔交易设置一个等于或者小于121的计数交易,节点将拒绝它。
间隔:如果我们发送一个新的交易123或者更高,交易将不被执行直到间隔交易成功,也就是122成功执行。

获取nonce方法,以太坊交易流程,txpool的概念

如之前提到的,我们因为发送交易设置相同的nonce,导致了重复计数错误,为了解释原因让我们先了解以太坊交易流程和pending状态:

以太坊交易过程

用户将一笔交易发送到一个以太坊节点

这个以太坊节点将交易转发给其它挖矿的节点

挖矿的节点收到交易后将交易放入txpool(交易池)

所有挖矿节点都在txpool中选择gas价高者,做成交易块,然后运算块的hash

若干个节点中的一个幸运儿运算出来hash,并交该块广播给其它节点验证

其它节点验证通过,在txpool中删除上链交易

交易的pending状态:当一笔交易已经被转发到大多数的挖矿节点的txpool时候
获取当前nonce方法web3.eth.getTransactionCount: 获取已完成区块中的该账号最后的nonce
结论:所以错误原因已经浮出水面了,如果有处于pending中的交易正在挖矿节点的txpool中,web3.eth.getTransactionCount只能获取成功区块的最后nonce而不能获取txpool的最后的nonce,所以当使用getTransactionCount方法将导致发送同样的nonce号给挖矿节点。这时已经已在节点中的大于或者等于该nonce的交易将被取消。

可能的解决办法:

在循环发送交易时候累加nonce,在自己服务其记录发送到多少nonce

通过getBlockByNumber获得正在pending的块,便利所有交易,找到合适的nonce,运算量较大

增强自己以太坊节点查找整个txpool而不是pending block,有一个github的话题在谈论这个问题,并有一个非标准的api parity_nextNonce,也有正在讨论重新定义pendding对另外几个JSON-rpc方法,也包括txpool。

无法解决问题

中间如果有交易失败无法监控,因为只有补全间隔才能继续交易。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24081.html

相关文章

  • 以太基础概念详解

    摘要:主要讲解以太坊中的一些基本元素,如区块账户状态交易费用等。所以它表示的是整个以太坊系统所有账户当前的状态。账户以太坊中有两种账户外部拥有账户,一般指自然人拥有的账户。总结以上就是以太坊里的一些基础元素,没有讲到复杂的交易执行等,后续再写。 本文不讲区块链,也就意味着你有一些区块链的基本认知。主要讲解以太坊中的一些基本元素,如:区块、账户、状态、交易、费用等。因这些概念之间相互紧密联系,...

    pingink 评论0 收藏0
  • 如何理解比特币和区块链?

    摘要:比特币区块链无疑是当今业界的最热门的。目前,每个成功的矿工获得可能每年更换一次或通过比特币社区决策作为成功向区块链添加一块交易的奖励。填写其他详细信息,例如比特币金额和可选说明。 比特币区块链无疑是当今业界的最热门的。通过这篇博客,我将尽力向大家介绍加密货币比特币的概念,以及它如何创造我们称之为区块链的革命性技术。 这个问题经常引起混淆。这篇文章可以快速解释和清理这方面的混乱! 什么是...

    Kosmos 评论0 收藏0
  • 以太源码分析:共识(3)Ethash

    摘要:在中,该随机数称为,它需要满足一个公式其中,去除区块头中生成的哈希值,见。固定值,生成的哈希值的最大取值。哈希值满足条件的概率是,矿工需要进行次的判断,才有可能找到一个符合条件的,当前以太坊难度为。 前言 Ethash实现了PoW,PoW的精妙在于通过一个随机数确定,矿工确实做了大量的工作,并且是没有办法作弊的。接下来将介绍: Ethash的挖矿本质。 Ethash是如何挖矿的。 如...

    huashiou 评论0 收藏0
  • Python以太区块链交互将数据存入数据库

    摘要:是一个用于连接以太坊区块链的库。网络执行以太坊协议,该协议定义节点彼此之间的交互规则及网络上的智能合约。数据库设计下一步是设计数据库。 关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀。因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物。今天我们将观察该生物,并与其进行交互然后将有关它的所有数据收集到一...

    dreambei 评论0 收藏0
  • Python以太区块链交互将数据存入数据库

    摘要:是一个用于连接以太坊区块链的库。网络执行以太坊协议,该协议定义节点彼此之间的交互规则及网络上的智能合约。数据库设计下一步是设计数据库。 关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀。因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物。今天我们将观察该生物,并与其进行交互然后将有关它的所有数据收集到一...

    melody_lql 评论0 收藏0

发表评论

0条评论

luxixing

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<