以太坊nonce详解

2023-11-09

1. nonce 是什么?

A scalar value equal to the number of transactions sent from this address or, in the case of accounts with associated code, the number of contract-creations made by this account. – 以太坊黄皮书

以太坊所有的交易都是基于 account ,不同于基于 utxo 的比特币,因此需要对每次交易都按顺序记录,nonce值就是这个顺序,nonce 是交易原始地址的属性。它不存储在以太坊区块链上,而是通过计算从一个地址发送的交易数量来计。

nonce +1

每发起一笔交易,nonce就会加一。对于发起的解释:

  • 1.外部账户(EOA)每发送一笔交易;
  • 2.合约账户(Contract Wallet) 每创建一个合约

而转入交易、合约调用其他合约等属于内部调用,因此 nonce 值不变。

作用 1:交易顺序

假设您要发送两个值为 1 和 4 ETH 的交易,并希望它们被顺序打包。发送一笔交易后,你继续发送第二笔交易。

现在如果没有随机数,矿工将不可能知道您维护交易顺序的意图。

如果您的第一笔交易(1 ETH)的 nonce 为0(假设是新帐户),那么 4 ETH交易的 nonce 为 1。矿工即可按照 nonce 的顺序打包交易。

作用 2:防止重放攻击

假如转账时,没有 nonce,参数如下:

{ 
    "gasPrice":"10000000000", 
    "to":"0xf4587a39edbb10b32952bcd656ba489f1a857450,
    " value":" 10000000000000000000“, // 10 ETH
    " data":"",
    " v,r,s":"您的ECDSA签名的某些字节"
}

交易被序列化后(交易字符串转换为byte),例如:

25de0d5a1693d4e45ce0305d42774b5bf73cbd9e14230194c35545e0f01ee45ce0305d42774b5bf73cbd9e0d5a1693d4e45ce0305d427

该交易被打包后,对方将收到 10 ETH,但是任何人都可以看到这笔交易,然后复制粘贴,重复提交给以太坊的网络,耗尽你的余额,也就是所谓的重放攻击。

如果有交易中包含 nonce,则同一 nonce 的交易只能被打包一次。

2.如何使用 nonce?

下图为交易被打包的过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fDRviZ3B-1624539141545)(https://z3.ax1x.com/2021/06/24/RQ3MUs.png)]

以太坊内部有 txpool,即存放交易的池子。钱包或节点发生的交易会被加入到交易池里,在打包区块的时候,就从这个池子里提取,区块产生之后,共识区块,交易上链。所以交易会有 pending 的状态,或者被交易池丢弃。

发起转账或者创建合约的时候,通过 web3 从以太坊网络查询当前的 nonce 值,使用此值作为当前交易的 nonce 值,发送到以太坊网络即可。

发送交易 eth_sendTransaction

Creates new message call transaction or a contract creation, if the data field contains code.

需要传参数 nonce,官方文档对于 nonce 的说明

nonce: QUANTITY - (optional) Integer of a nonce. This allows to overwrite your own pending transactions that use the same nonce.

获取 nonce 获取 nonce

参数:

params: [
   address,
   QUANTITY  // latest, pending
]

demo


//请求:
curl -s -H Content-Type:application/json -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xf4587a39edbb10b32952bcd656ba489f1a857450","pending"],"id":1}' http://127.0.0.1:8545

//返回:
{"jsonrpc":"2.0","id":1,"result":"0x351"}

//参数解释
第一个参数为需检查余额的地址
第二个参数为整数区块号,或者是字符串“latest","earliest"以及"pending"指代某个特殊的区块。
(latest:最新被挖矿的区块  earliest:最早区块  pending:挂起状态/交易 )

结果:

image

实际账户有 849 笔转出交易,最后一笔交易的 nonce 是 848。请注意 nonce 计数从 0 开始,所以如果你想继续发送交易,则直接使用 5 作为下一笔交易的 nonce 。

如果有处于 pending 状态的交易,即矿工未打包的交易,此时去读取 nonce,需要更换参数为 pending,否则将不能获得正确计数。没有区块确认数的交易可以被 ‘取消’ 或者被加速。

如果交易被打包,即非 pending 状态,则是不可逆的,就无法取消啦!

3.加速和取消以太坊的交易

Integer of a nonce. This allows to overwrite your own pending transactions that use the same nonce

基于 nonce 的特性,自增和唯一性,使用相同的 nonce 重新发起交易即可实现加速。

加速以太坊交易案例

  1. 假设有笔交易 A:gas price = 5,nonce = 1 ,由于 gas price 太低,广播后,交易一直处于 pending 状态。
  2. 创建交易 B,调整 gas price 为更合理的水平,例如 10、20 ,nonce = 1 ,再次发布交易。矿工就会选择 price 更高的交易 A 打包。
  3. 此时在矿工的交易池端,B 交易被打包了,矿工会检查 A 交易,发现 nonce 已经存在了,认为 A 是不合理的交易,则会自动丢弃该交易

取消交易

  1. 基于加速交易的案例。
  2. 创建交易 B,设置 value =0 ,收款方=发送方,设置更高的 gas price ,广播交易
  3. 原来的交易被丢弃了,新交易会被矿工打包,不会丢失任何资金。但是你还是需要为 B 交易付出矿工费

具体加速和取消以太坊交易的处理方式可参考:https://blog.csdn.net/cljdsc/article/details/116275499

4.异常处理

replacement transaction underpriced

原因

  1. 帐户中有待处理的待处理 pending 交易;
  2. 新交易和 pending 的交易 nonce 相同;
  3. 新交易的 gas price 更低,无法替换待处理的交易

image

5. nonce 使用的几条规则

  1. 当nonce太小(小于当前的nonce值),交易会被直接拒绝,Transactions with too low a nonce get immediately rejected;(nonce too low)
  2. 当 nonce 太大,大于当前 nonce,交易会一直处于队列之中,Transactions with too high a nonce get placed in the transaction pool queue;(nonce too high)
  3. 当发送一个比较大的nonce值,然后补齐开始 nonce 到那个值之间的nonce,那么交易依旧可以被执行,If transactions with nonces that fill the gap between the last valid nonce and the too high nonce are sent and the nonce sequence is complete, all the transactions in the sequence will get processed and mined.
  4. 交易队列只保存最多64个从同一个账户发出的交易,也就是说,如果要批量转账,同一节点不要发出超过64笔交易。 The transaction pool queue will only hold a maximum of 64 transactions with the same From:address with nonces out of sequence.
  5. 当某节点 queue 中还有交易,但此时停止 geth 客户端,queue 中的交易会被清除掉,When the geth instances are shut down and restarted, transactions in the transaction pool queue disappear.
  6. 当前 nonce 合适,但是账户余额不足时,会被以太坊拒绝;

6.参考资料

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太坊nonce详解 的相关文章

  • 测试中

    root ubu blockchain2 ll total 44 drwx 5 root root 4096 Aug 4 09 48 drwxr xr x 23 root root 4096 Jul 26 11 26 rw r r 1 ro
  • 以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(三)

    在以太坊Dapp终极教程 如何构建一个完整的全栈去中心化应用 一 中 我们已经完成了一切所需的设置 在以太坊Dapp终极教程 如何构建一个完整的全栈去中心化应用 二 中 让我们通过列出将在选举中运行的候选人来继续构建智能合约并完成客户端程序
  • 以太坊的企业系统集成

    最流行的开源Java集成库 Apache Camel现在支持以太坊的JSON RPC API 以太坊生态系统 以太坊是一个开源 公共 区块链平台 用于运行智能合约 它提供了一个去中心化的图灵完备虚拟机 可以执行脚本和加密货币 用于补偿参与者
  • 以太坊json rpc

    Contents Hash List JSON RPC support HEX value encoding The default block parameter Curl Examples Explained JSON RPC meth
  • geth web3提供的接口

    admin datadir ethcluster 779977 data 01 nodeInfo enode enode ca624860483a9f749676491bbf5b11cc7ded0a89f5c9f522767ebea0195
  • 笔记:以太坊geth客户端命令及参数

    geth命令的参数 nodiscover 使用此选项可确保未手动添加您的人员无法发现您的节点 否则 如果您的节点具有相同的创世纪文件和网络ID 则可能无意中将您的节点添加到陌生人的区块链中 maxpeers 0 如果您不希望任何其他人连接到
  • 以太坊源码学习(一)

    转载自 https blog csdn net karizhang article details 79110981 背景 geth源码一直在不断增加 优化 发展到现在已经非常庞大 第一次看geth源码 会有不小的难度 虽然如此 还是可以从
  • 认识一下以太坊、EOS和Hyperledger等不同的区块链

    不同的区块链智能合约和区块链技术现在风靡一时 越来越多的人出于某种原因试图进入这个神奇的世界 如果你是这项技术的新手并正在寻找基于区块链的开发平台的快速入门 那么本指南非常适合你 我们将重点关注和比较的平台是 Ethereum EOS Hy
  • 不要再在以太坊和Metamask开发web时使用密码

    我在ConsenSys为各种客户构建了大量的概念证明 通常他们想要利用以太坊区块链来解决某些业务用例 奇怪的是 这些系统通常设计有标准的网络登录 即用户名和密码 我总是问自己为什么我还在这样做设计 毕竟 这是今天以太网目前可以解决每个烦人的
  • 使用Go语言和以太坊智能合约交互

    尽管最近遇到了些麻烦 但以太坊仍然是区块链领域内智能合约的最大参与者 这似乎不会很快改变 在我看来 技术本身具有很大的潜力 是从学术的角度看很有意思 但正如上面提到的问题和之前的许多问题是区块链技术方面的 智能合约 特别是具有Solidit
  • 如何在私有链实现分叉

    待更新 比特币源码 https blog csdn net g2com
  • 在一台电脑上用不同端口同步以太坊区块链节点

    首先要获取第一个节点的信息 在第一个节点的控制台中输入 gt admin nodeInfo enode 将输出的结果用鼠标操作复制 然后在第二个节点的JS控制台中添加第一个节点为静态节点 输入 gt admin addPeer 例如admi
  • 以太坊智能合约各方法对应的签名编码

    erc20智能合约常见方法对应的签名编码 常见例如交易 transfer address uint256 编码为 web3 sha3 transfer address uint256 substring 0 10 gt 0xa9059cbb
  • 区块链技术实战学习路线图

    请大家前往深入浅出区块链主站 获取最新内容 本章的文章越来越多 本文是一个索引帖 方便找到自己感兴趣的文章 你也可以使用左侧的分类 标签及搜索功能 有新文章时会更新本文 建议大家加入收藏夹中 如果你觉得本站不错 欢迎你转发给朋友 引言 给迷
  • 以太坊构建DApps系列教程(一):应用程序规则和区块链设置

    这将是一个如何使用以太坊区块链构建去中心化应用程序DApps的系列教程 第一篇教程重点介绍应用程序的规则和功能以及设置私有区块链 展示在使用或不使用DAO和应用程序的情况下如何构建自己自定义的以太坊代币 我们要构建3件事 自定义代币 使用代
  • 以太坊区块链学习之在私链上部署合约

    上一篇博客介绍了如何搭建私链并在私链上创建账户 挖矿 查看余额 本篇将介绍在私链上部署合约并与之交互 本篇开发环境为MacOS 10 12 建议读者使用macOS系统或者Ubuntu系统 第一步 进入geth客户端 启动私链 进入geth客
  • 初识区块链

    这篇博客主要从社会和经济层面来直白的向大家讲述区块链是什么 比特币是什么 分享的内容仅限于自己的理解 里面会存在本人的观点 但是希望读者能有自己的独立看法 审慎的阅读本文 甚至能考虑到我的认知不足导致的偏差 不为任何投资电子货币者提供意见
  • 将随机数添加到脚本标签

    我想向动态构造的脚本标记添加一个随机数 下面的代码不会向生成的脚本标签添加任何随机数 有人知道如何添加随机数吗 var wss document createElement script wss nonce random string ws
  • 我可以使用模型绑定验证 HTTP 请求签名令牌和随机数吗?

    我正在使用 ASP NET MVC 设置一个端点 可以向该端点发出操作和检索数据的请求 基本上是一个 API 我使用 2 legged OAuth 模型来验证请求是否使用密钥和签名方法以及随机数表进行签名 以防止劫持 由于模型绑定在 ASP
  • 如何使用salsa20计数器随机数?

    我不确定我是否做对了 消息计数器可以用作 代替随机数 我的意思是这样的消息 标头 2 字节 计数器 8字节 正文 n 字节加密 HMAC SHA1 计数器 1 63位 0 可以吗 我知道我不应该两次使用相同的密钥和相同的随机数 当新的连接启

随机推荐

  • C语言 json parser - JSMN

    项目地址 GitHub zserge jsmn Jsmn is a world fastest JSON parser tokenizer This is the official repo replacing the old one at
  • python总结——对象

    目录 一 对象的知识 二 对象在内存的存储 一 对象的知识 1 python中 一切皆对象 每个对象有 标识 地址 类型 数据类型 值组成 2 对象的本质 一个内存块 拥有特定的值 支持特定类型的相关操作 3 对象存储在堆 变量存储在栈 变
  • Servlet+JDBC实战开发书店项目讲解第三篇:商品查询实现

    Servlet JDBC实战开发书店项目讲解第三篇 商品查询实现 本篇博客将介绍如何在Servlet JDBC实战开发书店项目中实现商品查询功能 我们将从设计数据库表结构和实体类开始 一步一步详细讲解代码实现过程 包括前端页面的设计和后端S
  • 使用 MCGS 脚本实现开机页面倒数三秒跳转功能

    创建窗口及组件 新建两个窗口 窗口0 与窗口1 其中 窗口0为欢迎界面 窗口1为跳转后界面 在窗口0界面中 添加一个输入框 以方便观看数据的计时情况 实际工程中 是插入图片 以显示欢迎界面 在窗口1 中 添加文本 跳转成功 创建变量 在实时
  • 【 VScode上配置c++编译环境出现报错】

    VScode上配置c 编译环境出现报错 在写好launch json代码 tasks json代码 c cpp properties json代码之后 点击运行第一个 HelloWorld cpp 代码 却出现 No such file o
  • Maven高级

    回顾 1 文件上传 fileupload MultipartFile 将上传的文件保存到硬盘上 获取文件名 2 restful url书写的一种风格 http localhost user 1 springmvc支持restful Post
  • 最小二乘法的拟合原理

    一 最小二乘法的拟合原理 根据 数学指南 书中的解释 图2 数学指南 中对最小二乘法的解释 上面这段话 枯燥且无趣 大家不用厌恶 数学向来这个样子 现在 我们来慢慢认识上面这段话的意思 这句话的意思是说 拟合有两个前提 1 要有N个不同的点
  • 机械手臂c语言如何编程,一种串联机械手臂的示教编程方法

    一种串联机械手臂的示教编程方法 技术领域 0001 本发明涉及一种串联机械手臂的示教编程方法 具体的说是通过体感设备和数据手套检测人的手臂的姿态变化 并且通过计算转换为机器人手臂关节角度的变化 并保存关节角度 完成示教编程 属于机器人及控制
  • idea的使用技巧

    idea的使用技巧 一 断点调试 1 源断点 要输出每一次的参数信息 System out print不应该使用它 它是一个同步方法 是线程安全 过多时会挤占线程 占用资源 内部实现 public void println int x sy
  • java word转pdf

    这里找了三种比较简单的工具 poi jacob和aspose poi 注意 版本不太高 版本太高有报错 依赖
  • axios 使用总结

    功能简介 axios是第三方封装库 作用是在框架中使用数据请求 安装 npm install axios S 在Vue 项目文件中的main js 文件 定义axios请求类的全局引用 核心代码如下 特点 1 它在浏览器中创建的是浏览器对象
  • IDEA查看某个类的某个方法或该类在哪里被调用或引用

    1 方法的话鼠标定位到该方法名 右键Find Usages 或直接快捷键 Alt F7 这样的话就会显示 2 类的话 也是定位到文件夹下的Java类文件 或者定位到 public class 类名这里 右键Find Usages
  • keil勾选Use MicroLIB 的作用

    MicroLib是一个针对用C编写的基于ARM的嵌入式应用程序的高度优化的库 与包含在ARM编译器工具链中的标准C库相比 MicroLib提供了许多嵌入式系统所需的代码大小的显著优势 下图对使用标准库和使用微库代码大小进行了对比 Micro
  • 联想原装系统OEM系统联想出厂系统联想原装系统 Lenovo ThinkPad ThinkBook拯救者出厂预装系统原厂系统

    系统镜像是在联想服务器下载 百分百的出厂预装正版系统 驱动完善 自带预装Office 自带一键恢复 联网即可激活系统 根据个人电脑配对的型号配置下载恢复 安装完恢复隐藏分区 带一键还原功能 和出厂时的系统状态一致 文件地址https pan
  • python好用的第三方库_如何学习使用第三方库

    如何学习使用第三方模块 得益于python强大的开源社区 我们在使用python开发项目时 可以几乎可以做到全程拿来主义 需要什么 就百度好了 总会有人已经实现了你需要的功能模块 你所需要做的仅仅是使用pip命令安装他们 虽然你不必重复造轮
  • 改变金融贷款市场营销方式 ---- 运营商大数据精准获客

    与传统的企业网络营销相比 最常见的是网络推广和硬广告推广 一些企业无法找到可靠准确的数据来源 也无法找到一些未知的总数据 这些数据大多存在持续时间长 准确性差的缺点 企业在将这些数据信息应用于商品在线营销时往往会遇到不足 在当前的数据和信息
  • 搜索引擎的小技巧:site,+,- 等指令的使用

    1 把搜索范围限定在网页标题中 intitle 网页标题通常是对网页内容提纲挈领式的归纳 把查询内容范围限定在网页标题中 有时能获得良好的效果 使用的方式 是把查询内容中 特别关键的部分 用 intitle 领起来 例如 找林青霞的写真 就
  • java springboot 项目打包成 exe应用

    前期准备 将项目打成jar包 将jdk目录中的jre和jar包放到同一个目录下 如果没有jre则需要去官网下载一份 地址 https www oracle com java technologies javase javase8u211 l
  • netty的介绍和架构设计

    转自尚硅谷 黑马和各位大神的文章 netty是什么 Netty 是一个异步的 基于事件驱动的网络应用框架 用于快速开发可维护 高性能的网络服务器和客户端 Netty 高性能架构设计 线程模型基本介绍 不同的线程模式 对程序的性能有很大影响
  • 以太坊nonce详解

    文章目录 1 nonce 是什么 2 如何使用 nonce 3 加速和取消以太坊的交易 4 异常处理 5 nonce 使用的几条规则 6 参考资料 1 nonce 是什么 A scalar value equal to the number