【问题标题】:Why would create2 revert?为什么 create2 会还原?
【发布时间】:2022-10-23 13:39:43
【问题描述】:

我正在调试 Polygon 上的还原事务,这就是我拥有的所有信息:https://mumbai.polygonscan.com/tx/0xfa86dc4957e3a3da9298b7672b11a20ebe921854fa494dc073920c067c1e693f#internal

如果我没看错的话,似乎是在说 CREATE2 已恢复。但是CREATE2 可以恢复的一些原因是什么?我知道如果地址中已经存在某些东西,它会恢复,但这里不是这种情况,你可以从这里看到:https://mumbai.polygonscan.com/address/0x6bb03ca906c0372f384b845bd5ce9ca4327ffbe6

【问题讨论】:

    标签: ethereum solidity polygon


    【解决方案1】:

    链接交易对部署在0x1079b7398b6efd9845c4db079e6fac8d21cf67b3 的合约进行消息调用(也称为内部交易)。

    然后这个0x1079b7... 合约尝试在地址0x6bb03ca906c0372f384b845bd5ce9ca4327ffbe6 上部署一个新合约,你可以在Tenderly debugger 中看到新合约的字节码。

    据我所知,create2 可以恢复有 3 个原因:

    • 没有足够的气体来执行部署

      • 在这种情况下不是问题。根据调试器,还剩下大约 900 万个气体单位,而部署只需要大约 100 万个气体单位。
    • 部署合约以解决已经部署了另一个合约实例的位置。

      • 因为您可以使用create2 预先确定合约地址,所以可能会发生这种情况。但是在这种情况下也不是,0x6bb03c... 地址是空的,没有部署合约。
    • 所以我们在执行构造函数的过程中留下了未捕获的异常。

      pragma solidity ^0.8;
      
      contract MyContract {
           constructor() {
               require(false);
           }
      }
      

      像这样的代码使部署失败并有效地导致create2 代码恢复。

      不幸的是,如果没有新的合约源代码,很难说出构造函数还原的确切原因。无论是意外的长度还是构造函数的输入参数、逻辑错误、尝试调用不存在的合约,还是其他任何事情。

    【讨论】:

    • 嗨彼得,感谢您的回复。所以0x1079b7 合约是this one,而SimpleWalletthis one。正如你所看到的,构造函数几乎什么都不做,所以我不清楚它为什么会恢复。
    • 实际上,我可能使用您之前发送的 Tenderly 链接找到了真正的问题。所以实际上并不是CREATE2 正在恢复——我读错了Polygonscan。显然,仅仅因为内部事务旁边有一个红色标记并不意味着内部事务本身正在恢复。
    【解决方案2】:

    事实证明,我误读了 Polygonscan,并且仅仅因为内部事务旁边有一个红色标记并不意味着它是内部事务本身恢复了;这意味着整个交易都恢复了。无论如何,使用 Tenderly 调试器帮助我确定了真正的错误。

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 2016-04-30
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      相关资源
      最近更新 更多