他们说assert主要是为了使用代码分析器来检测我们合约中的逻辑错误,但为什么它也会消耗**剩余的gas?难道我们不能使用一个新的关键字,它做同样的事情(就像require),但不消耗剩余的气体?
assert
require
**是不是应该尽可能少地消耗汽油?**Solidity不应该对它的功能做一些改变吗?
我只是不明白它的目的(因为每个答案都只是指定assert用于检查永远为真的东西,而require用于检查用户的输入;但这不是我的答案)。
bprjcwpo1#
在Solidity中,使用assert消耗所有gas通常不是推荐的做法,因为它可能会导致意外行为,甚至导致拒绝服务攻击。然而,这里有一个例子,说明如何使用assert来防止执行超过合约中的某个点:”
pragma solidity ^0.8.0; contract MyContract { uint public totalSupply; mapping(address => uint) public balances; function mint(uint amount) public { totalSupply += amount; balances[msg.sender] += amount; assert(totalSupply >= amount); } }
”在本例中,mint函数用于创建新令牌,并将其添加到发起事务的用户的总供应量和余额中。assert语句用于通过检查新的总供应量是否大于或等于添加的金额来确保totalSupply变量不溢出。如果assert语句失败,事务将被恢复,事务消耗的所有gas都将丢失。然而,在某些情况下,这可能是一种期望的行为,例如防止创建会导致totalSupply变量溢出的新令牌。值得注意的是,虽然assert可以以这种方式使用,但通常建议使用require语句,因为它们提供了更多信息的错误消息,并且只消耗执行语句所需的gas,而不是事务中所有剩余的gas。
1条答案
按热度按时间bprjcwpo1#
在Solidity中,使用assert消耗所有gas通常不是推荐的做法,因为它可能会导致意外行为,甚至导致拒绝服务攻击。然而,这里有一个例子,说明如何使用assert来防止执行超过合约中的某个点:
”
”
在本例中,mint函数用于创建新令牌,并将其添加到发起事务的用户的总供应量和余额中。assert语句用于通过检查新的总供应量是否大于或等于添加的金额来确保totalSupply变量不溢出。
如果assert语句失败,事务将被恢复,事务消耗的所有gas都将丢失。然而,在某些情况下,这可能是一种期望的行为,例如防止创建会导致totalSupply变量溢出的新令牌。
值得注意的是,虽然assert可以以这种方式使用,但通常建议使用require语句,因为它们提供了更多信息的错误消息,并且只消耗执行语句所需的gas,而不是事务中所有剩余的gas。