跳至主要内容
此页面是从英文翻译而来的。请注意,与原始页面相比,可能会出现错误或差异。真实的文档来源应始终是英文版本。

断言

像每个程序一样,可能会出现错误,并且必须验证用户输入。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");