青岛福林小学以太坊实战之《如何正确处理nonce》-程序新视界
发布时间: 2016-11-09 浏览: 363
以太坊实战之《如何正确处理nonce》-程序新视界王妃要改嫁
问题概述
以太坊系列(ETH&ETC)在发送交易有三个对应的RPC接口,分别是ethsendTransaction、ethsendRawTransaction和personal_sendTransaction。这三个接口发送(或构造发送内容时)都需要一个参数nonce青岛福林小学。官方文档对此参数的解释是:整数类型,允许使用相同随机数覆盖自己发送的处于pending状态的交易不知火明乃 。官网解释
仅从官网的解释,我们无法获取到更多的有效的信息东方三侠2。但在真实生成中我们会发现如果传错nonce字段值,通过RPC接口调用发送的交易很大可能将不会被确认。如果通过console命令来操作一般不会出现此问题,因为节点已经帮我们处理了。问题追踪
如果继续追踪问题,会发现nonce传递错误的交易可以通过eth_getTransaction查询得到相关信息,但是它的blocknumber始终未null,也就说这边交易始终未被确认。如果是在dev模式下,应该是很快就会被确认的。更进一步,通过txpool.content命令,会发现那笔交易一直处于queued队列中,而未被消费。原因解析
为了防止交易重播假如爱有来生,ETH(ETC)节点要求每笔交易必须有一个nonce数值。每一个账户从同一个节点发起交易时,这个nonce值从0开始计数,发送一笔nonce对应加1夜深人静造句。当前面的nonce处理完成之后才会处理后面的nonce。注意这里的前提条件是相同的地址在相同的节点发送交易陕西软考网。以下是nonce使用的几条规则:● 当nonce太小(小于之前已经有交易使用的nonce值),迈克尔奥赫交易会被直接拒绝顺之旅相爱太难。● 当nonce太大,交易会一直处于队列之中,这也就是导致我们上面描述的问题的原因;● 当发送一个比较大的nonce值,然后补齐开始nonce到那个值之间的nonce代嫁丫鬟,那么交易依旧可以被执行罗美慧。● 当交易处于queue中时停止geth客户端,那么交易queue中的交易会被清除掉。获取nonce值
经过上面的解释追踪,我们已经了解到了nonce的基本使用规则苍穹印。那么丰臣遗梦,在实际应该用中我们如何保障nonce值的可靠性呢?这里有两个思路安瑟十三 ,第一个思路就是由业务系统维护nonce值的递增。如果交易发送就出现问题升龙玺园,那么该地址下一笔交易继续使用这个nonce进行发送交易。第二个思路就是使用现有的api查询当前地址已经发送交易的nonce值,然后对其加1,再发送交易。对应的API接口为:eth_getTransactionCount,此方法由两个参数,第一个参数为需要查询nonce的地址杨科璋,第二个参数为block的状态:latest、earliest和pending。一般情况使用pending就可以查询获得最新已使用的nonce。其他状态大家可以自行验证。小密圈(知识星球)
个人小密圈已经创建。最近正在致力于区块链各类数字货币节点使用相关工作虺文忠,在小密圈中会持续分享实践中遇到的各种常见的问题及解决方案、疑难杂症和各种坑非仙勿扰 。同时会回答大家一些常见的技术问题。刚刚创建,优惠加入中。希望大家多多支持。
问题概述
以太坊系列(ETH&ETC)在发送交易有三个对应的RPC接口,分别是ethsendTransaction、ethsendRawTransaction和personal_sendTransaction。这三个接口发送(或构造发送内容时)都需要一个参数nonce青岛福林小学。官方文档对此参数的解释是:整数类型,允许使用相同随机数覆盖自己发送的处于pending状态的交易不知火明乃 。官网解释
仅从官网的解释,我们无法获取到更多的有效的信息东方三侠2。但在真实生成中我们会发现如果传错nonce字段值,通过RPC接口调用发送的交易很大可能将不会被确认。如果通过console命令来操作一般不会出现此问题,因为节点已经帮我们处理了。问题追踪
如果继续追踪问题,会发现nonce传递错误的交易可以通过eth_getTransaction查询得到相关信息,但是它的blocknumber始终未null,也就说这边交易始终未被确认。如果是在dev模式下,应该是很快就会被确认的。更进一步,通过txpool.content命令,会发现那笔交易一直处于queued队列中,而未被消费。原因解析
为了防止交易重播假如爱有来生,ETH(ETC)节点要求每笔交易必须有一个nonce数值。每一个账户从同一个节点发起交易时,这个nonce值从0开始计数,发送一笔nonce对应加1夜深人静造句。当前面的nonce处理完成之后才会处理后面的nonce。注意这里的前提条件是相同的地址在相同的节点发送交易陕西软考网。以下是nonce使用的几条规则:● 当nonce太小(小于之前已经有交易使用的nonce值),迈克尔奥赫交易会被直接拒绝顺之旅相爱太难。● 当nonce太大,交易会一直处于队列之中,这也就是导致我们上面描述的问题的原因;● 当发送一个比较大的nonce值,然后补齐开始nonce到那个值之间的nonce代嫁丫鬟,那么交易依旧可以被执行罗美慧。● 当交易处于queue中时停止geth客户端,那么交易queue中的交易会被清除掉。获取nonce值
经过上面的解释追踪,我们已经了解到了nonce的基本使用规则苍穹印。那么丰臣遗梦,在实际应该用中我们如何保障nonce值的可靠性呢?这里有两个思路安瑟十三 ,第一个思路就是由业务系统维护nonce值的递增。如果交易发送就出现问题升龙玺园,那么该地址下一笔交易继续使用这个nonce进行发送交易。第二个思路就是使用现有的api查询当前地址已经发送交易的nonce值,然后对其加1,再发送交易。对应的API接口为:eth_getTransactionCount,此方法由两个参数,第一个参数为需要查询nonce的地址杨科璋,第二个参数为block的状态:latest、earliest和pending。一般情况使用pending就可以查询获得最新已使用的nonce。其他状态大家可以自行验证。小密圈(知识星球)
个人小密圈已经创建。最近正在致力于区块链各类数字货币节点使用相关工作虺文忠,在小密圈中会持续分享实践中遇到的各种常见的问题及解决方案、疑难杂症和各种坑非仙勿扰 。同时会回答大家一些常见的技术问题。刚刚创建,优惠加入中。希望大家多多支持。
- 文章归档
-
- 2020年11月 (60)
- 2020年10月 (312)
- 2020年9月 (304)
- 2020年8月 (315)
- 2020年7月 (314)
- 2020年6月 (292)
- 2020年5月 (316)
- 2020年4月 (303)
- 2020年3月 (312)
- 2020年2月 (282)
- 2020年1月 (312)
- 2019年12月 (312)
- 2019年11月 (196)
- 2019年10月 (240)
- 2019年9月 (292)
- 2019年8月 (221)
- 2019年7月 (90)
- 2019年6月 (98)
- 2019年5月 (102)
- 2019年4月 (1607)
- 2019年3月 (2200)
- 2019年2月 (359)
- 2019年1月 (382)
- 2018年12月 (213)
- 2018年11月 (299)
- 2018年10月 (300)
- 2018年9月 (302)
- 2018年8月 (302)
- 2018年7月 (312)
- 2018年6月 (301)
- 2018年5月 (313)
- 2018年4月 (305)
- 2018年3月 (315)
- 2018年2月 (287)
- 2018年1月 (303)
- 2017年12月 (312)
- 2017年11月 (297)
- 2017年10月 (306)
- 2017年9月 (311)
- 2017年8月 (309)
- 2017年7月 (164)
- 2017年6月 (86)
- 2017年5月 (105)
- 2017年4月 (105)
- 2017年3月 (101)
- 2017年2月 (93)
- 2017年1月 (88)
- 2016年12月 (92)
- 2016年11月 (92)
- 2016年10月 (94)
- 2016年9月 (93)
- 2016年8月 (86)
- 2016年7月 (92)
- 2016年6月 (87)
- 2016年5月 (91)
- 2016年4月 (101)
- 2016年3月 (102)
- 2016年2月 (92)
- 2016年1月 (93)
- 2015年12月 (95)
- 2015年11月 (90)
- 2015年10月 (97)
- 2015年9月 (100)
- 2015年8月 (91)
- 2015年7月 (95)
- 2015年6月 (86)
- 2015年5月 (98)
- 2015年4月 (96)
- 2015年3月 (94)
- 2015年2月 (85)
- 2015年1月 (94)
- 2014年12月 (87)
- 2014年11月 (79)
- 2014年10月 (104)
- 2014年9月 (90)
- 2014年8月 (83)
- 2014年7月 (99)
- 2014年6月 (87)
- 2014年5月 (94)
- 2014年4月 (74)