断言
像每个程序一样,可能会出现错误,并且必须验证用户输入。Solidity 提供了几种验证用户输入的方法, 并确保合同状况符合预期.
恢复状态
断言是一种检查条件是否为真的方法,如果不是,则事务将失败。交易时 失败,事务中发生的所有状态更改都将被回滚。这意味着,任何改动都是 持久的数据/表将被恢复,就好像事务从未发生过一样。
在 Solidity 中,你可以使用导致合约失败并恢复状态 revert
函数。
if(1 != 1) revert();
那个 revert
函数将导致事务失败,并恢复状态。也可能需要 string
消息作为参数,
这将作为错误抛出。
if(1 != 1) revert("1 should equal 1");
验证条件
通常需要验证用户输入,或者智能合约的内部状态符合预期。
function addId(uint32 id) public {
require(id > 0, "id must be greater than 0");
}
那个 require
函数将检查第一个参数是否为真,如果不是,它将恢复状态并抛出
第二个参数中提供的消息。
你应该使用 require
尽早履行职责。如果失败,它会将所有未使用的气体送回给
用户。
防止灾难性故障
通常,您希望确保合同按预期运作,并且没有出现任何意想不到的情况。 这可以基于用户输入,也可以基于各种调用,最终导致合约以非同寻常的方式使用 专为使用而设计。
对于这些情况,最好使用 assert
函数。这样做的原因是 assert
函数将
消耗分配给交易的所有气体。
通常,如果您的合约达到了原本不打算达到的状态,则合同中存在错误或恶意合约 演员正试图利用这份合同。因为后一种情况是可能的,所以我们希望尽可能多地使用汽油 来自攻击者,以使他们的攻击尽可能昂贵。
assert(funds > 0, "you shouldn't be doing this Bob");