从源代码分析以太坊replacement transaction underpriced异常

合约错误:org.web3j.protocol.exceptions.TransactionException:Error processing request:unknown transaction 在执行一个 ERC20 智能合约的transfer调用时发生的org.web3j的一个交易错误: org.web3j.protocol.exceptions.TransactionException: Error processing request: unknown transaction。 Credentials credentials = null; try {... 阅读详情

项目中有使用到以太坊转账功能,在有一天以态坊网络堵塞,转帐报了replacement transaction underpriced异常,根据这个异常关键词搜索以态坊源码,发现是这里报错的。

func (pool *TxPool) add(tx *types.Transaction, local bool) (replaced bool, err error) {
//---------省去前面的代码------------------------
   from, _ := types.Sender(pool.signer, tx) // already validated
   if list := pool.pending[from]; list != nil && list.Overlaps(tx) {
      // Nonce already pending, check if required price bump is met
      inserted, old := list.Add(tx, pool.config.PriceBump)
      if !inserted {
         pendingDiscardMeter.Mark(1)
         return false, ErrReplaceUnderpriced          //这里抛异常了
      }
      // New transaction is better, replace old one
      if old != nil {
         pool.all.Remove(old.Hash())
         pool.priced.Removed(1)
         pendingReplaceMeter.Mark(1)
      }
//------------省略后面的代码-------------------

   }
}
func (l *txList) Add(tx *types.Transaction, priceBump uint64) (bool, *types.Transaction) {
   // If there's an older better transaction, abort
   old := l.txs.Get(tx.Nonce())
   if old != nil {
      threshold := new(big.Int).Div(new(big.Int).Mul(old.GasPrice(), big.NewInt(100+int64(priceBump))), big.NewInt(100))
      // Have to ensure that the new gas price is higher than the old gas
      // price as well as checking the percentage threshold to ensure that
      // this is accurate for low (Wei-level) gas price replacements
//pending队列已经有相同nonce值的交易,且新旧两条交易的nonce相同或者新交易的值小于threshold值
      if old.GasPrice().Cmp(tx.GasPrice()) >= 0 || threshold.Cmp(tx.GasPrice()) > 0 {
         return false, nil
      }
   }
   // Otherwise overwrite the old transaction with the current one
   l.txs.Put(tx)
   if cost := tx.Cost(); l.costcap.Cmp(cost) < 0 {
      l.costcap = cost
   }
   if gas := tx.Gas(); l.gascap < gas {
      l.gascap = gas
   }
   return true, old
}

pending队列已经有相同nonce值的交易,且新旧两条交易的nonce相同或者新交易的值小于threshold值,这是报错的原因,但由于gas的费用是通过自动计算的,所以原因还是在nonce值上,再看下发送交易的代码,是没有传nonce值进去,结点收到交易消息后,判断如果传入参数nonce值为空就从已有pending队列里获取相同的nonce,nonce值只有等到区块打包时,把交易消息持久化到stateDB时才有+1变化。
//以下是获取默认nonce的代码
 

// setDefaults is a helper function that fills in default values for unspecified tx fields.
func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error {
   //省去前面代码
   if args.Nonce == nil {
      nonce, err := b.GetPoolNonce(ctx, args.From)
      if err != nil {
         return err
      }
      args.Nonce = (*hexutil.Uint64)(&nonce)
   }
   //省去后面代码
}

//以下是执行交易时打包入块的代码

// TransitionDb will transition the state by applying the current message and
// returning the result including the used gas. It returns an error if failed.
// An error indicates a consensus issue.
func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bool, err error) {

   //省略前面的代码	
   if contractCreation {
      ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, st.value)
   } else {
      // Increment the nonce for the next transaction
      st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)  //这里才+1
      ret, st.gas, vmerr = evm.Call(sender, st.to(), st.data, st.gas, st.value)
   }
   //省略后面的代码
}

要解决这个问题有两种方式:
1、    调用方维护nonce值,自己每次创建交易的nonce值都变化并且传入交易参数
2、    在上条交易费用的基础上再加多点gas

web3.py报错 web3.py ValueError: {'code': -32000, 'message': 'transaction underpriced'} 调高gas即可 pancakeswap2_txn = contract.functions.swapExactETHForTokens( 0, # set to 0, or specify minimum amount of tokeny you want to receive - consider decimals!!! [spend,tokenTo 阅读详情

相关推荐

红外回充方案之红外接收和发射/附源码(1)

本文介绍了基于NEC协议的红外回充方案实现,重点讲解了红外收发原理和GD32F330单片机的接收端实现。文章首先说明采用38kHz载波和一体化红外接收管的设计优势,能有效抗环境光干扰。接着详细解析NEC协议格式,包括9ms起始信号、地址码、命令码及其反码校验机制,并给出逻辑1和0的调制方式。在接收端实现上,展示了GD32F330定时器输入捕获配置代码,通过双边沿触发测量脉冲宽度进行解码。文章还提供了状态机设计思路和数据结构,为低成本机器人红外回充方案提供了完整的技术实现方案。

m0_59406757的博客 1240

解决replacement transaction underpriced以太坊交易异常

  replacement transaction underpriced异常 问题概述 以太坊系列(ETH&amp;ETC)在发送交易有三个对应的RPC接口,分别是ethsendTransaction、ethsendRawTransaction和personal_sendTransaction。这三个接口发送(或构造发送内容时)都需要一个参数nonce。官方文档对此参数的解释是:整数类型,...

4万+

【机器人】机械臂控制入门技术栈分享

机械臂控制入门技术栈分享1.前言2.机器人控制入门技术栈2.1.空间描述和变化2.2.运动学分析2.3.动力学建模2.4.控制入门学习3.进阶部分3.1.机器人参数辨识3.2.非线性控制3.3.现代机器人描述方法:指数坐标4.总结 1.前言 今天看到优快云上有个分享个人技术栈的活动,虽然我不是一个正规的程序员,也不搞前端、后端这些,但我一直在优快云上通过写博客对我的学习进行总结,于是我突发奇想,不如我也写一下我的个人技术栈,针对机械臂控制入门的,因为我水平也不高,所以本文内容也许不够饱满,也不够准确,但

要恰饭得嘛 5858

通过修改mateMask的nonce值修复replacement transaction underpriced的问题

mateMask钱包设置

gambool的博客 2174

ruoyi-vue-pro集成magic-api(图文代码)

原先写过简单的集成:了解 magic-api的基本用法 附实战代码 magic-api相关文档推荐阅读:接口鉴权 相关的Java代码推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全) 【Java项目】实战CRUD的功能整理(持续更新)

码农研究僧的博客 7万+

FPGA电路设计1——芯片原理图和封装制作流程

本文详细介绍了FPGA电路板设计的学习过程,以Xilinx Kintex-7系列FPGA为例。主要内容包括:1)从官网下载芯片引脚分配文件的方法;2)原理图库绘制流程,重点讲解Bank划分(配置Bank、HR/HP IO Bank、高速收发器Bank)及利用Excel预处理数据;3)使用Altium Designer的Symbol Wizard工具实现引脚自动化导入;4)原理图设计要点,包括电源系统设计(多电压需求与上电时序)、配置电路(JTAG/Flash接口)和时钟设计。

在读研究生,FPGA电路设计与功能开发。 1385

Remix 部署合约正常,MetaMask异常 transaction underpriced

这里有一点的就是我的合约比较长gas费比较大已经超过300W了。尝试修改红框内的参数都没用,还是同样报错。还是相同合约,点击确认之后,报出异常。但是改为metaMask 报出异常。修改这个两个值,按找自己的需求。1.remix部署合约正常。在确认交易这里,点击这个。

weixin_43622809的博客 817

Proxmox(pve)集群(4)存储(1)配置分布式存储ceph

它使用一种称为CRUSH(Controlled Replication Under Scalable Hashing)算法的数据分布算法来将数据均匀地分布在多个存储节点上,并确保数据的冗余和容错。它负责管理数据的分布、冗余和自动修复。PVE支持本地存储、LVM、NFS、iSCSI、CephFS、RBD、ZFS等存储方式,我这里使用两种存储方式,一种是通过ceph实现分布式存储,一种是通过truenas实现集中式存储。自我管理和自动恢复:Ceph具有自我管理的特性,可以动态地调整和优化存储集群的配置。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2627

以太坊交易异常 replacement transaction underpriced

在以太坊交易中,在使用同一个地址连续发送交易时,每笔交易往往不可能立即到账, 当前交易还未到账的情况下,下一笔交易无论是通过eth.getTransactionCount()获取nonce值来设置,还是由节点自动从区块中查询,都会获得和前一笔交易同样的nonce值,这时节点就会报错Error: replacement transaction underpriced。应等待上一次交易成功时再执行下一...

qq_31953961的博客 3068

第9章:Embedding、Pooling 与检索增强基础

本文介绍了律师事务所如何利用vLLM构建法律文档RAG系统,解决传统关键词检索在语义匹配上的不足。主要内容包括: 项目背景:传统Elasticsearch检索在法律术语上的低准确率问题,及多模型维护的复杂性; 技术方案:采用vLLM统一支持生成和向量化能力,通过语义向量检索提升相关性; 关键实现: 用vLLM的Embedding端点处理文档向量化 构建包含离线索引和在线检索的完整RAG流程 采用余弦相似度进行语义匹配 实践建议:切片大小选择、向量归一化处理、不同场景下的数据库选型等。

davidwang456的专栏 60

Node-RED教程(二):Node-RED的面板的操作

Node-RED系列(二):Node-RED的面板的操作 要使用Node-RED去搭建一个物联网平台,链接设备,设备通信,就必须要先熟悉Node-RED的这种面板,对于一个新的项目,在动手做之前一点想对这个的技术的文档有足够的了解做起来才能游刃有余。本期我给大家介绍一下Node-RED的各种面板,熟悉这些面板后,在后续的搭建Iot服务中,会举重若轻,同时该系列的文档,难度会逐步加深,知道了本章解释的名称后对后续文章的理解有很大帮助。 面板1:默认节点选项列表 安装Node-RED后默认的节点分为这5大类

知无涯 1万+

replacement transaction underpriced异常

replacement transaction underpriced异常 问题概述 以太坊系列(ETH&amp;ETC)在发送交易有三个对应的RPC接口,分别是ethsendTransaction、ethsendRawTransaction和personal_sendTransaction。这三个接口发送(或构造发送内容时)都需要一个参数nonce。官方文档对此参数的解释是:整数类型,允许使用相...

boss2967的博客 2994

【DEIM创新改进】全网首发、独家特征融合创新改进篇 | CVPR2025 | 引入RLAB残差线性注意力特征融合块,有效融合并强调多尺度特征,有效减少信息丢失,助力DEIM目标检测有效涨点

本文提出了一种改进DEIM网络模型的新方法RLAB(残差线性注意力特征融合模块),用于医学图像生物标志物分割。RLAB模块通过多尺度残差精炼和注意力机制,有效整合编码器跳跃连接与解码器特征图,提升特征对齐和关键区域关注能力。实验表明,该方法在MoNuSeg、DSB等四个医学图像数据集上显著优于现有方法,最高提升4.03%的绝对性能。文章详细介绍了RLAB的网络结构、核心代码实现方式,并提供了将模块集成到DEIM模型的具体步骤。

Ai缝合怪、助力小伙伴高效发论文 349

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

转自: https://www.choupangxia.com/topic/detail/47 在《以太坊实战之如何正确处理nonce》一文中我们介绍了nonce的基本概念和使用方法。也提到了它能够覆盖之前交易的特异功能。但是那只是nonce的冰山一角。今天再给大家分享在热点账户下nonce会出现的问题。 热点账户 所谓的热点账户就是频繁被使用的账户,在以太坊中比如交易所的统一出币账户,在短...

bjzhaoxiao的专栏 393

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

批量交易 nonce重复

以太坊所有的交易需要对每次交易都按顺序记录,nonce值就是这个顺序,nonce 是交易原始地址的属性。它不存储在以太坊区块链上,而是通过计算从一个地址发送的交易数量来计。 每发送一笔交易,nonce自动加1,当我们批量发送交易的时候,会出现replacement transactionunder priced 这个问题 ,原因是nonce重复 解决方法:自己去维护一个nonce 1.首先先去查看一下当前的nonce web3.eth.getTransactionCount(addre...

m0_48158888的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

关于以太坊的nonce值

为了防止交易重播,ETH(ETC)节点要求每笔交易必须有一个nonce数值。每一个账户从同一个节点发起交易时,这个nonce值从0开始计数,发送一笔nonce对应加1。当前面的nonce处理完成之后才会处理后面的nonce。注意这里的前提条件是相同的地址在相同的节点发送交易。以下是nonce使用的几条规则:● 当nonce太小(小于之前已经有交易使用的nonce值),交易会被直接拒绝。● 当non...

老杨QQ122209017的博客 6601

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

以太坊geth+web3.py在windows下实践教程与问题总结

以太坊Geth和Web3.py区块链在windows上的实验教程与问题汇总

biao169的博客 1242

Error processing transaction request: replacement transaction underpriced

有人遇到过这个问题吗,做以太坊交互的时候,使用web3j连接本地的服务器正常,但是连接远程的阿里云服务器总是报上面的错误,该怎么解决呀。

kay 3337

关于cannot estimate gas; transaction may fail or may require manual gas limit错误的排查

今天在hardhat环境中使用etherjs调用智能合约出现了cannot estimate gas;transaction may fail or may require manual gas limit这样的错误排查了一天,这里记录一下排查的步骤。网络环境是georli测试网在网上搜索关键字很多人说是手续费的设置问题。于是增加了gasLimit和gasPrices的配置。没有报错,看似问题是解决了!但是通过返回的交易hash,在etherscan上找不到这笔交易!好像这笔交易丢失了一样!

gambool的博客 5657

区块链 之 以太坊的那些坑

作者:邹祁峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.youkuaiyun.com/qifengzou 日期:2018.04.04 转载请注明来自"祁峰"的优快云博客 使用以太坊的过程中遇到不少坑,团队成员花了不少时间去研究才找到其中的真正原因.希望此篇能为各位在学习以太坊的过程中少走一些弯路. 主题 描述 ...

做事先做人! 1万+

以太坊交易Nonce设置

1 什么是nonce?以太坊中的nonce有两个意义:1.工作量证明:为了证明工作量的无意义的值,这是采矿的本质,这个值将决定采矿的难度,2.账户的随机数:在一个账户中的防止多重交易的用途。例如一个交易从A到B 20个币,可能从A到B发送多次。为了防止交易的重播攻击,每笔交易必须有一个nonce随机数,针对每一个账户nonce都是从0开始,当nonce为0的交易处理完之后,才会处理nonce为1的...

6096
上一篇: 基于比原链开发Dapp(一)-架构设计
下一篇: 乌镇世界区块链大会回顾:从Defi到MOV
ChainCode
ChainCode 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄11年 115粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值