语句

Vyper 的语句在语法上类似于 Python,但有一些显著的例外。

控制流

break

break 语句终止最近的封闭 for 循环。

for i in [1, 2, 3, 4, 5]:
    if i == a:
        break

在上面的示例中,如果 i == a,则 for 循环终止。

continue

continue 语句开始最近的封闭 for 循环的下一个循环。

for i in [1, 2, 3, 4, 5]:
    if i != a:
        continue
    ...

在上面的示例中,每当 i != a 时,for 循环立即开始下一个循环。

pass

pass 是一个空操作——当它被执行时,什么也不会发生。当语法上需要一个语句,但不需要执行任何代码时,它可以用作占位符。

# this function does nothing (yet!)

@external
def foo():
    pass

return

return 退出当前函数调用,并以表达式列表(或 None)作为返回值。

return RETURN_VALUE

如果函数没有返回值类型,则可以省略 return 语句,否则,函数必须以 return 语句结束,或者以其他终止操作结束,例如 raise

return 语句之后,不允许存在其他不可到达的语句。

事件日志

log

log 语句用于记录事件。

log MyEvent(...)

该事件必须事先声明。

有关事件的更多信息,请参见 事件日志

断言和异常

Vyper 使用状态回滚异常来处理错误。异常触发 REVERT 操作码(0xFD),并提供提供的理由作为错误消息。当抛出异常时,代码停止运行,合约的状态回滚到交易发生前的状态,剩余的 gas 返回给交易的发送者。当子调用中发生异常时,它会自动“冒泡”起来(即异常被重新抛出)。

如果理由字符串设置为 UNREACHABLE,则使用 INVALID 操作码(0xFE)而不是 REVERT。在这种情况下,回滚的调用不会收到 gas 退款。这不是一般使用情况下推荐的做法,但它可用于与使用 INVALID 操作码进行动态分析的各种工具进行互操作。

raise

raise 语句触发异常并回滚当前调用。

raise "something went wrong"

错误字符串不是必需的。如果提供了它,它将限制为 1024 字节。

assert

assert 语句对给定条件进行断言。如果条件评估为假,则交易将回滚。

assert x > 5, "value too low"

错误字符串不是必需的。如果提供了它,它将限制为 1024 字节。

此方法的行为等效于

if not cond:
    raise "reason"