gpt4 book ai didi

blockchain - assert 和 require 的区别

转载 作者:行者123 更新时间:2023-12-05 08:29:20 25 4
gpt4 key购买 nike

你好,我最近刚开始从 Udemy 学习 Solidity,虽然在几乎完成类(class)后我还没有理解 assert 和 require 之间的区别。当不满足要求时,它们不是都破坏了功能吗?在合约内的 gas 优化方面,一个比另一个有优势吗?

最佳答案

from docs

The assert function creates an error of type Panic(uint256)

Assert should only be used to test for internal errors, and to checkinvariants. Properly functioning code should never create a Panic, noteven on invalid external input. If this happens, then there is a bugin your contract which you should fix. Language analysis tools canevaluate your contract to identify the conditions and function callswhich will cause a Panic.

Require: Similar to assert, this is used for checking conditions andthrows an exception if the condition is not met. The difference isthat require is used for validating inputs, return values, or calls toexternal contracts. The method also results in reverting back to theoriginal state. It can also take an optional parameter to provide acustom error message.

require() 情况:

• 检查用户输入。例如,如果余额大于 0

• 检查来自外部合约的响应,例如“require (external.send(金额))”

• 检查状态更新前的条件

• 尽早使用 require 函数,因为在失败的情况下,require 只会返回未使用的 gas。因此,如果您在 require 之前实现了一些消耗 gas 的逻辑,那么如果 require 语句失败,您将不会获得在 require 之前编写的逻辑所消耗的 gas

在以下情况下使用 assert():

断言被使用验证函数的内部局部状态。当你认为当前状态有可能变得不一致。这意味着您的代码有错误。您不能将自定义错误消息传递给 assert unlike require

  • 检查上溢/下溢。在 solidity ^8.0.0 编译器自动检查之后。
  • 检查不变值
  • 修改后查看契约(Contract)状态
  • 避免不可能的情况

为了更好地理解使用 assert 的好处,您可以阅读:Why assertion is used on this Smart Contract?

关于blockchain - assert 和 require 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71502322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com