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

《以太坊实战之如何正确处理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。非诚勿扰。**

这里写图片描述

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

这里写图片描述

原文链接:http://mp.weixin.qq.com/s/hTFBTc2ZqwUoPrboFtmj5Q

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安智客

简明介绍比特币钱包及其安全性

前两天介绍了TEE与区块链、比特币钱包的一些东西!也许不是很明白比特币钱包这个东西,(本文来自于知乎内容、整理、编辑) TEE与比特币硬件钱包应用之Ledger...

23690
来自专栏区块链入门

【链安科技】Token合约F_E漏洞

有相关安全公司风险监控平台于今日发现,ERC20代币合约F_E由于业务逻辑实现漏洞,任何人都可以随意转出他人账户中的Token。并且该Token已经上线交易所,...

10010
来自专栏华仔的技术笔记

数字货币钱包原理的理解

钱包是作为提供用户界面的应用程序。 钱包控制用户访问权限,管理密钥和地址,跟踪余额以及创建和签署交易。更为狭义的是,从程序员的角度来看,“钱包”是指用于存储和管...

52850
来自专栏CSDN技术头条

用不到50行的Python代码构建最小的区块链

本文用不到50行的 Python 代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理。

75170
来自专栏区块链大本营

产品揭秘 | 同时支持多条公链的节点钱包是这样做出来的

在区块链的世界,钱包是一个重要的入口,它的核心用途是存放数字资产和进行转账交易。通常是通过私钥+密码的方式保护资产的安全,如果私钥丢失,便会造成数字资产的丢失,...

10610
来自专栏极客编程

一个比特币交易流程是如何完成的 原

作为加密货币用户,你需要熟悉交易雏形——为了你对这种不断发展的创新有信心,以及作为理解新兴多签名交易和合约的基础,这两者都将在本系列的后期进行探讨。这不是纯技术...

1.1K40
来自专栏申龙斌的程序人生

SC(SiaCoin)取出到钱包的图解教程

友情提醒:云币中的SC钱包仍在维护中,暂时还不能取现,先做好准备吧。 中国各大数字货币交易平台将在9月底关闭,为此需要将数字货币提取到自己的钱包中,这是区块链世...

594110
来自专栏liuchengxu

IOTA 交易,确认和共识

与区块链技术不同,IOTA 并不是一条有着时间序列概念,每个区块前后相连的链,链中的每个块包含一些交易。在 IOTA 中,每笔交易都可以其他交易连接(所谓连接,...

17210
来自专栏智能合约

以太坊智能合约开发第二篇:理解以太坊相关概念

28460
来自专栏区块链大本营

大年初二已憋不住想写代码的心!来来来教你仅用15分钟在以太坊编写一个区块链Web应用

33670

扫码关注云+社区

领取腾讯云代金券