EVM 上的 Panic 与 Error:开发者的朋友与敌人

  • prady
  • 更新于 2024-10-13 15:54
  • 阅读 288

“Error”指的是合约遇到无法处理的问题的情况。这可能是由于无效输入、意外状态或合约未设计处理的其他问题导致的。“Panic”指的是EVM遇到无法处理的问题的情况。

让我们来谈谈 Panic 和 Error。

Image

“Error”指的是合约遇到无法处理的问题的情况。这可能是由于无效输入、意外状态或合约未设计处理的其他问题导致的。

“Panic”指的是 EVM 遇到无法处理的问题的情况。这可能是由于未处理的异常、gas不足的情况或 EVM 未设计处理的其他问题导致的。(例如,如果你进行除以零或取模零的操作)

“Error”和“Panic”之间的一个关键区别在于,“Error”是合约预期要处理的情况,而“Panic”则是合约不太可能处理的情况。

当合约遇到“Error”时,它使用“REVERT”操作码来停止执行并撤销对合约状态所做的任何更改。这使得合约能够优雅地处理意外情况并返回到已知的稳定状态。

当 EVM 遇到“严重错误(Panic)”时,它会停止所有执行并撤销对合约状态的所有更改。这是为了防止 EVM 进入未知或不稳定状态的最后手段。

正常运行的代码不应产生 Panic,即使在无效的外部输入情况下也不应如此。如果发生这种情况,那么你的合约中存在一个需要修复的 bug。

Solidity 支持两种错误处理的错误签名,Error(string)Panic(uint256),以简化开发者的工作。

在以下情况下,编译器会生成 Error(string) 异常(或不带数据的异常):

Image

“Panic(uint)”使用特定的错误代码来区分触发 panic 的某些情况。这是当前的错误代码列表(将来可能会扩展):

Image

但存在一些模棱两可的情况,可能导致 Error 或 Panic。

Image

我在 Remix 中制作了两个简单的合约,以检查它在字节码级别的编译方式以及 Solidity 如何发挥其魔力。

Image

在合约的 OPCODE 视图中,首先是“Errors”,你会在此字节码中找到以下内容。“PUSH32 08c379a0...”是“Error(string)”的函数签名。

Image

ERRORS OPCODE 视图

同样,在第二个合约 Errors2 的 Opcode 视图中,你会发现“PUSH32 4e487b71...”是“Panic(unit)”的函数签名。

Image

ERRORS2 OPCODE 视图

这表明 Solidity 在字节码中引入这些签名以便在错误数据时进行回滚。

附加内容:你可以在 Solidity 中处理包括外部合约调用或合约创建的错误情况。

Image

希望你喜欢 Panic。🏴‍☠️

感谢阅读 prady 的 Substack!免费订阅以接收新文章并支持我的工作。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
prady
prady
Security Researcher who likes to play with EVM!