问题概述

以太坊系列(ETH&ETC)在发送交易有三个对应的RPC接口,分别是eth_sendTransaction、eth_sendRawTransaction和personal_sendTransaction。这三个接口发送(或构造发送内容时)都需要一个参数nonce。官方文档对此参数的解释是:整数类型,允许使用相同随机数覆盖自己发送的处于pending状态的交易。

官网解释

仅从官网的解释,我们无法获取到更多的有效的信息。但在真实生成中我们会发现如果传错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。其他状态大家可以自行验证。

小密圈(知识星球)

个人小密圈已经创建。最近正在致力于区块链各类数字货币节点使用相关工作,在小密圈中会持续分享实践中遇到的各种常见的问题及解决方案、疑难杂症和各种坑。同时会回答大家一些常见的技术问题。刚刚创建,优惠加入中。希望大家多多支持。

以太坊实战之《如何正确处理nonce》相关推荐

  1. JAVA使用web3j开发以太坊实战案例

    JAVA使用web3j开发以太坊实战案例 必读 1.前言 2.基础(必看) 3.web3j引入 4.创建账户(离线创建) 5.geth节点搭建.基本使用及一般问题 6.常量类 后面内容都要用到(必备! ...

  2. js 文件不让通过地址访问_区块链与以太坊实战(5):访问以太坊节点的N中方式...

    ---------支持作者请转发本文-----------本文主要介绍用web3.js访问以太坊节点的几种方式,主要包括HTTP和Web两种访问方式.1. 什么是Web3.jsWeb3.js是一套用J ...

  3. 【系列】区块链与以太坊实战(1)-基础知识

    请扫描本文结尾的二维码关注我的微信公众号,或在微信搜索 极客起源 即可关注,每个工作日都有文章更新. 李宁老师的区块链与以太坊系列文章开张了,本系列文章将全面阐述区块链与以太坊的基本概念以及核心技术, ...

  4. linux attach 指令,以太坊实战-attach命令详解

    在前面的实战教程中我们经常提到attach这个命令,今天就针对此命令做更深一步的介绍. 官方对此参数的解释如下:attach Start an interactive JavaScript envir ...

  5. 以太坊中的nonce

    以太坊创建每个账户时初始nonce=0,以后每次交易nonce+1,防止以太坊中的replay attack. 参考:https://www.bilibili.com/video/BV1Vt411X7 ...

  6. 以太坊智能合约预言机

    2019独角兽企业重金招聘Python工程师标准>>> 什么是预言机(oracle)?和以太坊智能合约开发是什么关系?在区块链去中心化的条件下如何实现预言机?面对这些疑惑首先来了解下 ...

  7. 如何用树莓派和PHP开发一个比特币和以太坊交易机器人

    我最近得到了Raspberry Pi Zero Wifi,我告诉你这个东西是改变游戏规则的.我之前使用过RasPis,但由于该设备的占地面积小得多,耗电少,价格便宜且无线上网,因此非常适合低端或物联网 ...

  8. 关于以太坊智能合约在项目实战过程中的设计及经验总结(1)

    此文已由作者苏州授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 1.智能合约的概述 近几年,区块链概念的大风吹遍了全球各地,有的人觉得这是一个大风口,有的人觉得他是个泡沫.众所 ...

  9. 区块链实践(一) 以太坊网络+geth搭建私有网络实战

    一.以太网网络  理解以太坊 PrivateNetwork 先要理解以太坊的两种官方网络, 目前以太坊官方提供了两种网 生产环境网络 测试网络 TestNet **  1 以太坊生产网络 以太坊的生产 ...

  10. 以太坊交易Nonce设置

    1 什么是nonce? 以太坊中的nonce有两个意义: 1.工作量证明:为了证明工作量的无意义的值,这是采矿的本质,这个值将决定采矿的难度, 2.账户的随机数:在一个账户中的防止多重交易的用途.例如 ...

最新文章

  1. C++内存模型和原子类型操作
  2. CentOS 7 下使用yum安装MySQL5.7.20 最简单 图文详解
  3. git 添加用户名和邮箱_Git实用教程(二) | Git简介及安装详解
  4. Kubernetes详解(二十五)——Deployment控制器扩容
  5. 事务、事务的隔离级别、一致性
  6. Inverting the Generator of a GAN 生成器反向
  7. hexo d上传报错鉴权失败
  8. 第13期-在线的文章摘要生成器, 自己写了一个支持中文的
  9. 浅析 微信公共平台消息 开发原理
  10. 大数据在职研究生哪个好_在职研究生大数据专业怎么样?
  11. 3个步骤+1个模型,原来「数据分析」才是「增长黑客」的核心技能!
  12. 教师资格考试科目二 word Exele ppt 应用
  13. 如何恢复手机删除数据文件
  14. 【unity 3d】--- 瞄准镜效果
  15. MATLAB - contour函数
  16. 数字孪生开发平台 数字孪生开发成本 数字孪生开发平台cortona3d
  17. 华为云区块链BCS笔记
  18. 【案例实践】植被参数遥感反演与数据同化系列
  19. 用python进行数据分析:杂乱字符串的处理
  20. springboot租房管理系统源码分享

热门文章

  1. 苹果x和xs买哪个好_苹果12和12pro哪个值得买_苹果12和12pro哪个好
  2. 2021-04-29 Mac有效阻止应用联网 - 免费的第三方软件
  3. 记录一下unity 加载外部视频
  4. 如何使用 React Native 构建信用卡扫描仪
  5. TIPS-国库信息处理系统
  6. ppt科研绘图之通过vba一键导出pdf
  7. 【DB2】查询上月末、上年末、上年同期等信息
  8. 蓝牙加密方案,蓝牙方案,蓝牙usbkey,蓝牙key,蓝牙U盾,蓝牙智能卡(公交卡等CPU卡),蓝牙身份认证产品分享,蓝牙公交卡,蓝牙会员卡
  9. 熊克斐:技术夜未眠 从码畜到CTO
  10. 丢花娟(约瑟夫环问题)