合约结构

Vyper 合约包含在文件中。每个文件包含一个合约。

本节概述了合约中存在的数据类型,并提供指向其他部分的链接,您可以在其中获得更多详细信息。

编译指令

Vyper 支持多种源代码指令来控制编译器模式并帮助构建可重复性。

版本编译指令

版本编译指令确保合约仅由预期编译器版本或版本范围编译。版本字符串使用 NPM 风格的语法。从 v0.4.0 及更高版本开始,版本字符串将使用 PEP440 版本规范 <https://peps.pythonlang.cn/pep-0440/#version-specifiers>_

从 0.3.10 开始,推荐的指定版本编译指令的方式如下所示

#pragma version ^0.3.0

以下声明等效,并且在 0.3.10 之前,是指定编译器版本的唯一支持方法

# @version ^0.3.0

在以上示例中,合约仅与 Vyper 版本 0.3.x 兼容。

优化模式

优化模式可以是 "none""codesize""gas"(默认)。例如,将以下行添加到合约中将导致它尝试优化代码大小

#pragma optimize codesize

优化模式也可以作为编译器选项设置,这在 编译器优化模式 中有说明。如果编译器选项与源代码编译指令冲突,则会引发异常,并且编译将不会继续。

EVM 版本

EVM 版本可以通过 evm-version 编译指令设置,这在 设置目标 EVM 版本 中有说明。

状态变量

状态变量是永久存储在合约存储中的值。它们在任何函数体之外声明,并且最初包含其类型的 默认值

storedData: int128

状态变量通过 self 对象访问。

self.storedData = 123

有关更多信息,请参阅有关 类型作用域和声明 的文档。

函数

函数是合约中可执行的代码单元。

@external
def bid():
    ...

函数可以根据其 可见性 在内部或外部调用。函数可以接受输入参数并返回变量,以便在它们之间传递值。

有关更多信息,请参阅 函数 文档。

事件

事件为 EVM 的日志记录功能提供接口。事件可以与特殊索引的数据结构一起记录,这些数据结构允许客户端(包括轻客户端)有效地搜索它们。

event Payment:
    amount: int128
    sender: indexed(address)

total_paid: int128

@external
@payable
def pay():
    self.total_paid += msg.value
    log Payment(msg.value, msg.sender)

有关更多信息,请参阅 事件 文档。

接口

接口是一组用于启用智能合约之间调用的函数定义。合约接口定义了该合约的所有对外可用的函数。通过导入接口,您的合约现在知道如何在其他合约中调用这些函数。

接口可以通过内联定义或从单独的文件导入到合约中。

interface FooBar:
    def calculate() -> uint256: view
    def test1(): nonpayable
from foo import FooBar

定义后,可以使用接口对给定地址进行外部调用

@external
def test(some_address: address):
    FooBar(some_address).calculate()

有关更多信息,请参阅 接口 文档。

结构体

结构体是一种自定义定义的类型,允许您将多个变量组合在一起

struct MyStruct:
    value1: int128
    value2: decimal

有关更多信息,请参阅 结构体 文档。