前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >以太坊实战-再谈nonce使用陷阱

以太坊实战-再谈nonce使用陷阱

作者头像
程序新视界
发布2018-01-14 08:51:12
3.2K0
发布2018-01-14 08:51:12
举报
文章被收录于专栏:丑胖侠丑胖侠丑胖侠

《以太坊实战之如何正确处理nonce》一文中我们介绍了nonce的基本概念和使用方法。也提到了它能够覆盖之前交易的特异功能。但是那只是nonce的冰山一角。今天再给大家分享在热点账户下nonce会出现的问题。

热点账户

所谓的热点账户就是频繁被使用的账户,在以太坊中比如交易所的统一出币账户,在短时间内频繁发起交易的账户,均可被称作热点账户。

replacement transaction underpriced异常

如果系统中的热点账户或普通账户发起交易时出现error: replacement transaction underpriced异常,那么就需要考虑nonce使用是否正确。

引起此异常原因主要是当一个账户发起一笔交易,假设使用nonce为1,交易已经发送至节点中,但由于手续费不高或网络拥堵或nonce值过高,此交易处于queued中迟迟未被打包。

同时此地址再发起一笔交易,如果通过eth_getTransactionCount获取的nonce值与上一个nonce值相同,用同样的nonce值再发出交易时,如果手续费高于原来的交易,那么第一笔交易将会被覆盖,如果手续费低于原来的交易就会发生上面的异常。

通常发生此异常意味着:

  • 你的Ethereum客户端中已经有一币处于pending状态的交易。
  • 新的一笔交易拥有pending状态交易相同的nonce值。
  • 新的交易的gas price太小,无法覆盖pending状态的交易。

通常情况下,覆盖掉一笔处于pending状态的交易gas price需要高于原交易的110%。

解决方案

针对此问题在不同的使用场景下有不同的解决方案。

依赖钱包

如果该热点账户的私钥信息等都存放在Ethereum客户端中,那么在发送交易的时候不传递nonce值,Ethereum客户端会帮你处理好此nonce值的排序。

当然,此方案有两个弊端。第一个是安全性无法保障(未进行冷热账户分离),第二,在热点账户下如果想覆盖掉一笔交易,需要先查询一下该交易的信息,从中获取nonce值。

自行管理nonce

自行管理nonce适用于冷热账户模式,也就是适用sendRawTransaction发送已经签名好的交易时,此时nonce值已经存在于交易中,并且已经被签名。

这种模式下,需要在业务系统中维护nonce的自增序列,适用一个nonce之后,在业务系统中对nonce进行加一处理。

此种方案也有限制条件。第一,由于nonce统一进行维护,那么这个地址必须是内部地址,而且发起交易必须通过统一维护的nonce作为出口,否则在其他地方发起交易,原有维护的nonce将会出现混乱。第二,一旦已经发出的交易发生异常,异常交易的nonce未被使用,那么异常交易的nonce需要重新被使用之后它后面的nonce才会生效。

总结

nonce的使用有很多坑需要踩,大家在具体实践过程中一旦发现问题需要及时查找原因,防止大面积的问题发生,导致整个系统的账务或资金的错乱。

更多资讯

**获取更多资讯,请关注微信公众号:程序新视界。或加入QQ技术交流群:659809063。

本人诚接以太坊相关研发及技术支持,如有需要请联系QQ:541075754。非诚勿扰。**

这里写图片描述
这里写图片描述

更多交流技术资讯请扫码加入知识星球(小密圈)

这里写图片描述
这里写图片描述

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 热点账户
  • replacement transaction underpriced异常
  • 解决方案
    • 依赖钱包
      • 自行管理nonce
      • 总结
      • 更多资讯
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档