首页 > 区块链博客 > 【区块链课堂】第31课:以太坊nonce详解

【区块链课堂】第31课:以太坊nonce详解

2018-05-23 19:31:00 阅读量:

全文摘要:

本文由币车HIT(biche.yaofache.com)大V养成计划支持在我们发布eth智能合约后希望可以同时转账多笔代币,又不希望将群发币写入智能合约,所以只能手动写web3脚本交易,当我们测试geth接口在一个交易失败问题后,之后的交易都将阻塞,也无法看到pendding状态,最终他们将被取消,最后发现

本文由币车HIT(biche.yaofache.com)大V养成计划支持

在我们发布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。

无法解决的问题:

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

下面推荐一个内容激励平台(正在内测中)

【币车】一个通过发文章点赞就能赚钱的区块链应用!

现在注册即送50000枚HIT,邀请好友还有大额奖励。快来注册,早期红利等你拿!

-------------

链接:https://www.yaofache.com/bus/?i=CWkMW9

-------------

注册邀请码(必填) CWkMW9

来源:币乎


上一篇:以始为终:从公众号到币乎
下一篇:逆市暴涨:今天大盘又跌了?可就是有暴涨了106%的,成交量还不小呢!

微信

微信

微信

微信