Hedera 上几乎相同的交易中“gasUsed”值存在巨大差异 - 为什么?

2024-03-13

我注意到所使用的气体量之间存在差异 通过交易几乎是相同的:

我正在调用智能合约, 连续两次使用相同的参数, 两者之间的唯一区别 是我正在设置gasLimit到精确值 由返回eth_estimateGas在第一个中, 我正在设置gasLimit to eth_estimateGas * 1.1在第二个中。

    // with exact estimated amount of gas
    const estimatedGas2 = (await expendGasSc.estimateGas.updateState(1_000_000_123n)).toBigInt();
    console.log('estimatedGas2', estimatedGas2);
    const gasLimit2 = estimatedGas2 * 1n;
    console.log('gasLimit2', gasLimit2);
    const txResponse2 = await (await expendGasSc
        .updateState(
            1_000_000_123n,
            { gasLimit: gasLimit2 },
        ))
        .wait();
    const gasUsed2 = txResponse2.gasUsed.toBigInt();
    console.log('gasUsed2', gasUsed2);

    // with 110%  of estimated amount of gas
    const estimatedGas3 = (await expendGasSc.estimateGas.updateState(1_000_000_123n)).toBigInt();
    console.log('estimatedGas3', estimatedGas3);
    const gasLimit3 = estimatedGas3 * 11n / 10n;
    console.log('gasLimit3', gasLimit3);
    const txResponse3 = await (await expendGasSc
        .updateState(
            1_000_000_123n,
            { gasLimit: gasLimit3 },
        ))
        .wait();
    const gasUsed3 = txResponse3.gasUsed.toBigInt();
    console.log('gasUsed3', gasUsed3);

这是输出,显示:

  • when gasLimit设置为 400,000,gasUsed是 320,000
  • when gasLimit设置为 440,000,gasUsed是 352,000
estimatedGas2 400000n
gasLimit2 400000n
gasUsed2 320000n
estimatedGas3 400000n
gasLimit3 440000n
gasUsed3 352000n

为什么第二次调用会额外消耗 32,000 的 Gas? (我预计gasUsed两种情况下的值相同。)


这是智能合约:

// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.18;

contract ExpendSomeGasDemo {
    uint256 public state;

    function updateState(
        uint256 newState
    )
        public
        returns (uint256 updatedState)
    {
        state = newState;
        updatedState = newState;
    }
}

请注意,该合约部署在 Hedera 测试网上:0x9C58D0159495F7a8853A24574f2B8F348a72424c https://hashscan.io/testnet/contract/0.0.4616849

请注意,上面的 Javascript 示例使用 ethers.js。


这是因为:HIP-185: https://github.com/hashgraph/hedera-improvement-proposal/blob/master/HIP/hip-185.md智能合约服务基于气体的节流 ​

为了确保交易能够正确执行,通常设置比执行消耗的更高的 Gas 预留。 在以太坊主网中,整个预订在执行之前都会从帐户中扣除,然后未使用的预订部分将被退回。 然而,以太坊主网利用内存池并在块生产时进行交易排序,这使得块限制仅基于已使用的气体而不是保留的气体。 ​ 本质上gasLimit指的是“更高的汽油保留”, 和gasUsed是指“执行所消耗的”gas。 在以太坊中,计算很简单: ​

gasUsed = gasConsumed

​ 换句话说,gasLimit is not一个因素。

然而,在 Hedera,这是不可能的, 由于 Hedera 的共识节点不使用交易池, 然后随后对区块内的交易进行排序。 事实上,Hedera 甚至没有区块的概念 在其共识节点内, 并且仅在其归档节点(镜像节点)中添加此概念 - 看HIP-415:块介绍 https://hips.hedera.com/hip/hip-415.

因此 Hedera 需要一个替代机制到以太坊的 使其能够限制天然气的过度保留。 它是通过抑制激励来做到这一点的: ​

为了防止智能合约服务的过度预订,相对于预订返还的 Gas 将被限制为最多预订金额的 20%。 从不同的角度来看,基于预订向用户收取的最低 Gas 费将至少为预订的 80%。 这将激励交易提交者获得实际使用的 Gas 量的 25% 以内,以免因未使用的预留而被收取费用。 ​ 所以计算为gasUsed在 常春藤 是: ​

gasUsed = max(gasConsumed, gasLimit * 0.8)

​ 换句话说,gasLimit is一个因素, 当您指定的气体消耗量超过实际消耗的气体量时。 ​ 这就是您获得额外 32,000 的方法gasUsed当您指定额外的 40,000 时gasLimit.

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

Hedera 上几乎相同的交易中“gasUsed”值存在巨大差异 - 为什么? 的相关文章

  • 调用另一个合约中的函数 - Solidity

    我需要使用 Truffle 调用另一个合约中的函数 这是我的合同样本 类别 sol contract Category notice Check if category exists function isCategoryExists ui
  • go-zero开发入门之网关往rpc服务传递数据1

    go zero 的网关往 rpc 服务传递数据时 可以使用 headers 但需要注意前缀规则 否则会发现数据传递不过去 或者对方取不到数据 go zero 的网关对服务的调用使用了第三方库 grpcurl 入口函数为 InvokeRPC
  • 我如何利用 ZeroMQ 编写自己的 Protocol Buffers RPC 实现

    根据 下的 Google Protocol Buffers 文档定义服务 https developers google com protocol buffers docs proto3 services 他们说 也可以将协议缓冲区与您自己
  • 使用 ZeroMQ 的 C++ RPC 框架

    我需要使用 ZeroMQ 推拉套接字模式用 C 编写客户端 服务器应用程序 客户端必须对服务器接口中指定的函数进行 RPC 调用 我想知道是否有一个开源且商业可用的库 框架主要用于此目的 主要是 C 我做了一些谷歌搜索 似乎有一些用 pyt
  • GWT RPC - 每个应用程序多个 RPC 服务

    我目前正在使用一个具有大型 RPC 服务的 GWT 应用程序 它有 100 多个方法 所有方法都做不同的事情 如果我将其拆分为多个 RPC 服务 我会获得什么样的性能优势 障碍 我相信我必须为每一个创建一个新的 servlet 所以我的主要
  • 哪种 rpc/消息传递框架最适合这种情况?

    用例 一个 Java 进程与一个或两个 C 进程 始终在同一台机器上 需要双向 二进制 非持久通信 其中一个 C 进程负责实例化其他进程 我环顾四周 看到了 XML JSON RPC Protocol Buffers Thrift zero
  • 序列化和封送处理有什么区别?

    我知道就几种分布式技术 例如 RPC 而言 使用了术语 编组 但不明白它与序列化有何不同 它们不是都将对象转换为一系列位吗 Related 什么是序列化 https stackoverflow com questions 633402 wh
  • Solidity如何使用元组(嵌套abi)进行函数签名?

    struct Test uint ui string s function test Test t public emit Log t ui t s 我对ABI有一些了解 我使用实验性 ABIEncoderV2 选项签订了这份合同 总之 这
  • 如何将struct从合约A传递到合约B?最佳实践

    我发现这样 当创建一个具有结构的通用接口时 然后合约A和B继承该具有结构的接口 但我想知道是否还有其他方法 是否存在可以更新具有结构的合约的情况 pragma experimental ABIEncoderV2 pragma solidit
  • Solidity:ParserError:预期的编译指示、导入指令或合约/接口/库定义

    当我编写简单合约时 我也遇到了最新的 solc 0 5 2 版本 和 0 4 25 的错误 我尝试过以下步骤 已卸载的 Solc npm uninstall solc 安装的目标版本 npm install save 电子邮件受保护 cdn
  • 在 Java 中伪造堆栈跟踪

    当您在 Java 中使用 RMI 时 异常的远程堆栈跟踪将在您收到异常时添加到前面 有点像这样 ERROR Client received error when doing stuff myapp FooBarException bla a
  • 了解 XDR 规范以创建 *.x 文件

    我浏览了互联网上的几个网站 实际上想知道我们如何在规范中编写规范 x文件以生成等效函数 通常 您可以从 x 文件生成三 组 代码 消息 xdr 编码器 解码器函数 客户端存根和服务器存根 当然 您也可以手动完成 但要做到正确的工作量太大 使
  • Solidity 中的状态变量是什么?

    我读过一些关于storage memory and view pure 但我并不完全理解它们 我有以下代码 contract struct Random uint32 state uint8 i function main pure int
  • 如何获取交易结果和状态

    我正在尝试使用以太坊区块链和 Solidity 合约 我目前正在部署合约并对其执行一些操作 但我想知道如何获取特定交易的一些 反馈 回调 返回 例如 有没有办法将事务的状态设置为 0 错误 并仍然获取事件 if id length lt 0
  • 远程过程调用认证

    我正在使用远程过程调用 RPC 在本地计算机上通信数据 我的要求是使用 RPC 在两个处理之间通信数据 但服务器应该通过某种方式对客户端进行身份验证 我遇到了 RpcBindingSetAuthInfo 它设置身份验证和授权信息 第四个参数
  • ERC721:转账调用者不是所有者也不是批准的

    我有一个 nftToken 合约 可以将代币铸造到 msg sender 然后我在市场合约中有一个函数 可以将 nft 从所有者转移到市场合约 但是 我收到一条错误消息 ERC721 转账调用者不是所有者也不是批准的 这是我的 nftCon
  • 通过python3计算uniswap 3.0池(对)地址

    我遇到了一个关于如何计算的问题 新的 uniswap 版本 3 池 早期版本称为pair 地址基于1 https github com Uniswap v3 sdk blob aeb1b09 src utils computePoolAdd
  • 微服务之间的通信

    假设您有微服务 A B 和 C 它们当前都通过 HTTP 进行通信 假设服务 A 向服务 B 发送请求 服务 B 得到响应 然后 该响应中返回的数据必须发送到服务 C 进行一些处理 然后最终返回到服务 A 服务 A 现在可以在网页上显示结果
  • 同步 gRPC 客户端同步/异步服务器

    我只是好奇 异步 gRPC 服务器是否支持多个客户端的连接 如果不是 异步的可以吗 以及异步服务器 同步客户端的组合 甚至可能吗 是的 同步 gRPC 支持开箱即用的多个连接客户端 我亲自测试了多达 2000 个同时连接的客户端到一个用 G
  • 类型错误:无法读取未定义的属性“长度” - 使用安全帽部署时

    我在尝试在安全帽开发链上部署模拟合约时收到以下错误 我正在关注 使用 JavaScript 学习区块链 Solidity 和全栈 Web3 开发 Patrick Collins 在 FreeCodeCamp YT 频道上的 32 小时课程

随机推荐

  • TypeScript - 扩展标准库 Math 的类型定义

    我想使用 javascript 库 种子随机 js https github com davidbau seedrandom 在 TypeScript 项目中 尚无法弄清楚如何为此库编写类型定义 该库使用附加方法扩展了标准 javascri
  • 使用下载管理器下载后安装 apk 并退出应用程序

    我已经创建了一个 Android 应用程序 如果有任何新版本发布 它将从服务器自动开始使用内置的 下载管理器 下载 为了在完成下载后自动安装 我创建了一个广播接收器来通知下载已完成并完成 然后我开始安装它 在我停留在应用程序中时它工作正常并
  • 函数重载的用途/优点是什么?

    函数重载的用途 优点是什么 IMO 主要的好处是方法 函数命名的一致性 这些方法 函数在逻辑上执行非常相似的任务 并且在接受不同的参数方面略有不同 这允许在多个实现中重复使用相同的方法名称 例如过载 好 function Person Fi
  • RxJS:如何让一个观察者处理多个可观察对象?

    我正在使用一个调用我实现的函数的框架 我希望这个函数的参数转换为可观察的 并通过一系列观察者发送 我以为我可以为此使用一个主题 但它的行为并不像我预期的那样 为了澄清一下 我有类似以下代码的内容 我想Option 1下面的方法可行 但到目前
  • 使用缓存存储 API 保存自定义响应

    我在用着缓存存储 https developer mozilla org en US docs Web API Cache构建渐进式 Web 应用程序 PWA 我需要一个自定义对象put https developer mozilla or
  • jquery 插件:使用 live() 的工具提示插件

    我需要一个依赖于 live 方法而不是普通的 hoever 和 mousemove 的工具提示插件 只是创建了我自己的插件monnaTip http gadelkareem com 2010 02 25 jquery plugin monn
  • 无论如何,是否可以将 firebase 存储用于 flutter 桌面?

    我正在尝试构建一个跨平台应用程序 我使用 firebase 作为数据库 无论如何要使用 firebase 存储用于 flutter 桌面吗 Windows 目前不支持运行使用 Firebase Realtime Database for W
  • YepNope 和 LabJS 的替代品 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想通过资源加载器加载 javascript 和 css 文件 我最初使用 LabJs 但我发现 Ye
  • 获取文本视图和图像视图相对于屏幕顶部的结束位置

    我有一个位图 它下面是一条时间线 作为一个例子 考虑右侧的布局FIGURE https stackoverflow com questions 17103026 canvas containing bitmap size proper ad
  • LLVM 的 amd64 输出中向量的对齐

    我正在尝试通过 LLVM 在结构内部使用向量 我的结构有以下 C 定义 struct Foo uint32 t len uint32 t data 32 attribute aligned 16 下面是一些 LLVM 代码 用于将 42 添
  • 如何检查三元运算符中未定义的变量?

    我对三元运算有疑问 let a undefined Defined Definitely Undefined b abc Defined Definitely Undefined ReferenceError c abc undefined
  • 编码 UI:通过 CSS 选择器查找元素

    我正在尝试为页面构建一个工具 以便我们可以针对它编写测试 我希望能够做的是使用 CSS 选择器来查找给定的一个或多个元素 而不是手动修改 SearchProperties 或 FilterProperties 对于 Web 测试 CSS 选
  • 使用 C# 进行声音合成

    C 是否有可能生成声音 我的意思不仅仅是发出蜂鸣声或打开并播放波形文件 我的意思是使用不同类型的波 正弦波 锯齿波等 及其选项 频率 幅度等 构建信号 查看NAudio https github com naudio NAudio在 Git
  • SQL 列中的 XML:无法调用 nvarchar(max) 上的方法

    我有一个 sql 查询 该查询在我的列名上出现错误 提示 无法调用 nvarchar max 上的方法 SELECT LEARNER COURSE XML TEST XML EX Query declare namespace x http
  • 按 Javascript 数组中出现的次数(计数)排序

    我是 Jquery 和 Javascript 的新手 有人可以帮我根据数组中出现的次数 计数 进行 Jquery 排序吗 我尝试了各种排序方法 但没有一个有效 我有一个 Javascript 数组 它是 allTypesArray 4 4
  • 自定义SeekBar的矩形边缘[重复]

    这个问题在这里已经有答案了 我已经定制了SeekBar用一个分层绘制 drawable工作正常 但是用作背景的drawable在角处变成圆角 两个角 这里只显示右端 当拇指移动到最左边时 左角也变圆 注意 原始图像是矩形的 我怎样才能把它变
  • 在 iOS 中测量/计算距离

    我需要计算 iOS 中两点之间的距离 我可以保证至少有一部iPhone 4 所以相机的图像质量应该很好 这个想法是使用图片计算到某个点的距离 有一个名为 easyMeasure 的应用程序 它完全可以满足我的需要 我对毕达哥拉斯很满意 但这
  • 将简单的服务器代码部署到 Heroku

    我最近访问了 heroku com 网站并尝试在那里部署我的第一个 Java 程序 实际上我使用他们的 Java 部署教程有了一个良好的开端 并且运行正常 现在我有一个需要在那里部署的服务器代码 我尝试遵循该示例 但我有一些问题 例如 1
  • 邮递员 - 为每个请求覆盖用户代理

    我有一个网站 只有在基本身份验证登录后才能访问 您可以使用特定的用户代理绕过它 有没有办法始终将新请求的用户代理设置为某个值 目前它被硬编码为PostmanRuntime 7 29 0 目前 我总是为每个请求手动设置它 但这会减慢工作流程
  • Hedera 上几乎相同的交易中“gasUsed”值存在巨大差异 - 为什么?

    我注意到所使用的气体量之间存在差异 通过交易几乎是相同的 我正在调用智能合约 连续两次使用相同的参数 两者之间的唯一区别 是我正在设置gasLimit到精确值 由返回eth estimateGas在第一个中 我正在设置gasLimit to