“Error”指的是合约遇到无法处理的问题的情况。这可能是由于无效输入、意外状态或合约未设计处理的其他问题导致的。“Panic”指的是EVM遇到无法处理的问题的情况。
让我们来谈谈 Panic 和 Error。
“Error”指的是合约遇到无法处理的问题的情况。这可能是由于无效输入、意外状态或合约未设计处理的其他问题导致的。
“Panic”指的是 EVM 遇到无法处理的问题的情况。这可能是由于未处理的异常、gas不足的情况或 EVM 未设计处理的其他问题导致的。(例如,如果你进行除以零或取模零的操作)
“Error”和“Panic”之间的一个关键区别在于,“Error”是合约预期要处理的情况,而“Panic”则是合约不太可能处理的情况。
当合约遇到“Error”时,它使用“REVERT”操作码来停止执行并撤销对合约状态所做的任何更改。这使得合约能够优雅地处理意外情况并返回到已知的稳定状态。
当 EVM 遇到“严重错误(Panic)”时,它会停止所有执行并撤销对合约状态的所有更改。这是为了防止 EVM 进入未知或不稳定状态的最后手段。
正常运行的代码不应产生 Panic,即使在无效的外部输入情况下也不应如此。如果发生这种情况,那么你的合约中存在一个需要修复的 bug。
Solidity 支持两种错误处理的错误签名,Error(string)
和 Panic(uint256)
,以简化开发者的工作。
在以下情况下,编译器会生成 Error(string)
异常(或不带数据的异常):
“Panic(uint)”使用特定的错误代码来区分触发 panic 的某些情况。这是当前的错误代码列表(将来可能会扩展):
但存在一些模棱两可的情况,可能导致 Error 或 Panic。
我在 Remix 中制作了两个简单的合约,以检查它在字节码级别的编译方式以及 Solidity 如何发挥其魔力。
在合约的 OPCODE 视图中,首先是“Errors”,你会在此字节码中找到以下内容。“PUSH32 08c379a0...”是“Error(string)”的函数签名。
ERRORS OPCODE 视图
同样,在第二个合约 Errors2 的 Opcode 视图中,你会发现“PUSH32 4e487b71...”是“Panic(unit)”的函数签名。
ERRORS2 OPCODE 视图
这表明 Solidity 在字节码中引入这些签名以便在错误数据时进行回滚。
附加内容:你可以在 Solidity 中处理包括外部合约调用或合约创建的错误情况。
希望你喜欢 Panic。🏴☠️
感谢阅读 prady 的 Substack!免费订阅以接收新文章并支持我的工作。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!