合约结构¶
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()
有关更多信息,请参阅 接口 文档。