blockchain - 以太坊 - 两个相同的交易,但实际使用的 Gas 不同 - 怎么会?

标签 blockchain ethereum

我有两个相同的交易,在这种情况下发送相同数量的代币,导致实际消耗的气体不同(不是成本,而是显着差异)。

以下是 tx 哈希值:

  • 0x2cbb4b35d87cabe1a7b7bcb562e4e046e9ef0b4b27ac9de99a6a3ebf6d088f89
  • 0x9b1d32a07d0332b55b800c59f860acef8791a7da6be5105ff2d2ed579fecb334

  • 起初我认为数据可能会导致差异(有效载荷中“0”的数量?)或相应区块的挖掘难度差异,但这些似乎都不能证明这种 Gas 使用差距是合理的(如果相关的话)

    有没有人解释为什么会发生这种情况?
    请注意,我有更多这样的交易存在相同的差距。

    天啊!

    更新

    按照下面的 smarx 评论 - 听起来不错,但是,我希望最多有 4 个不同的 Gas 值(如您所提到的 2X2 组合)。实际上,我们有超过 4 种不同的结果。以下是一些交易,以及它们的 Gas 使用值(value):

    22280 0x26c4b28a068e6ec91579c96e32aba449f2ad73168aca51e476a5a84072a620b6
    22344 0x1341a9c4f6641746a50f8d05bb907d16150edf5e313b697908ddf3546e8fb9ae
    22408 0x163eed32fee0f5999505dff804bd047620d0c063e07ad142ba0e257ed30cc4ee
    22472 0xec326e42069efdefc79bd07fa98724ca2ec00432129cc3179e582a0e88af5112
    22536 0xbd06b1722447fa8aaa783717c8237dd8b3934137ac8eabfd20bbdc6d1ec1af50
    22600 0x9c3df4902887c94f9bf7901b8273c8b9da94d36f80801c3c5dbec9b4e7a5d8a8
    36960 0x0ec051a92b1821d264f70b949cae68c2f463ae741330dc6a3a103b2612d1ea1c
    37280 0x233e7c7abbf0e482c4c5b55efb31a7cd3c073ab00d2116fcff171f9e71542c1b
    37344 0x3a93f860418732e76ca5941d7f9e6f0ec78df19905b8303ea520cea0994168aa
    37408 0x6ce02124e33088fa7d13bfe2802039afecd78ba10e0a46598dea577c2ea61f27
    37472 0x1f5be1f26f97f74aeb06d156d2221854597673640bc3c38690191501d2cd8f71
    37536 0xd0edcfe4c179294bffca80f812a4a827a560294a1d944ac77adb9b8a0b22aa60
    37600 0x2d7eca881486d69968eb3ab1f16850c0cd497003d06a2ea61efaeed6467f9a6a
    52280 0x77d607600bf0110785cd08de78399d61c369274baa3a180841bc0d1f015f328d
    52344 0xa0a3f46e35abe608c27cec2cc188beddabad724ea6362a4584e9325a5cd9d276
    52408 0x41c63e00b4e58ce2292a17216e7dc2554733feb70d2a0fe9c505689ef1dd50a3
    52472 0x4ed5e9366948a23340b7f572dc69da5b0525cc4f7b5d0ddd83945ef4cdbaf05c
    52536 0x40b33b7f9bc08171b1b2f54241db6f58ae72bd89c9b9d7650ba3ca5174144dcd

    最佳答案

    只是一个猜测,但很有可能:
    transfer函数对存储进行两次写入:

  • 更新from的余额地址。
  • 更新to的余额地址。

  • 根据先前的值和新的值,写入存储具有不同的 gas 成本。

    我的猜测是,在第一笔交易中,to地址的初始余额为零,而 from地址在交易后仍然有一些代币。将存储中的零值更改为非零值需要 20,000 gas,因此这是更新 to 的成本地址。将一个非零值更改为另一个非零值的 gas 成本为 5,000 gas,因此这是更新 from 的成本。地址。两个商店指令的总成本:25,000。

    我的猜测是在第二笔交易中,to地址有一个正的初始余额增加,而from的余额地址被交易完全耗尽。更新 to地址花费 5,000 gas(将一个非零值更改为另一个非零值)。更新 from地址涉及将非零值更改为零,您将获得天然气退款。成本是 5,000 gas,但在交易结束时会返还 15,000 gas。这是 -10,000 的净成本,因此两条存储指令的总成本为 -5,000。

    25,000和-5,000相差30,​​000,也就是两笔交易的gas差。

    关于blockchain - 以太坊 - 两个相同的交易,但实际使用的 Gas 不同 - 怎么会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52071967/

    相关文章:

    blockchain - 从外部合约调用时,solidity 合约状态变量值显示奇怪

    blockchain - 安装启动端口 mv : cannot move './starport' to '/usr/local/bin/starport' : Permission denied

    blockchain - 如何在 hyperledger 锯齿波中查询特定资源的交易

    ethereum - 混音 |无法连接到 Web3 提供程序

    npm - typechain --target ethers-v5 不被识别为内部命令

    bitcoin - 区 block 链是去中心化数据库吗?

    python - 如何将 JSON 树结构转换/转换为 Merkle 树

    go - 链代码示例中没有可构建的 Go 源文件错误

    go - 如何使用 Golang 正确发送 RPC 调用以获取智能合约所有者?

    blockchain - Solidity 中合约地址变量会消耗多少状态字节?