语言基础Vyper 中文文档
合约结构
理解 pragma、导入、状态变量、函数、事件和接口的组织方式。
Vyper 的一个重要特点是“文件结构即语义结构”。一份合约文件通常只描述一个合约, 并把版本约束、导入、状态、函数和事件都放在清晰可扫描的位置。
Pragma 与编译指令
把 pragma 放在最前面,是一个很好的习惯。
常见指令包括:
vyper
#pragma version ^0.4.0
#pragma optimize gas
#pragma evm-version pragueversion控制编译器版本范围,帮助复现实验结果。optimize决定更偏向 gas 还是 codesize。evm-version把产物对齐到目标链的分叉规则。
如果你在源码里写了 pragma,同时又在 CLI 里传了冲突参数,编译会直接报错,而不是帮你“猜”最终意图。
导入与搜索路径
Vyper 支持 import 和 from ... import 两种形式:
vyper
import ownable
import my_package.foo as helper
from . import math_utils
from ..interfaces import IERC20搜索导入文件时,编译器会先从当前合约所在目录开始,再看命令行传入的搜索路径。
如果你用 CLI 编译复杂项目,通常会显式传 -p:
bash
vyper -p contracts contracts/Vault.vy状态与函数
状态变量定义在函数外部:
vyper
owner: address
stored_value: uint256在函数内部通过 self 访问:
vyper
@external
def set_value(next_value: uint256):
self.stored_value = next_valueVyper 不鼓励把逻辑拆散到太多隐式层级里,所以大多数行为最终都会落在可直接阅读的函数体中。
事件与接口
事件写法非常直接:
vyper
event Payment:
amount: uint256
sender: indexed(address)
@external
@payable
def pay():
log Payment(msg.value, msg.sender)接口既可以单独放在 .vyi 文件,也可以通过模块和接口导入获得:
vyper
from .interfaces import IERC20
@external
def sweep(token: IERC20, to: address, amount: uint256):
extcall token.transfer(to, amount)阅读建议
当你审一份 Vyper 合约时,先看 pragma,再看 import,然后从状态变量扫到外部函数。 这种顺序通常能最快让你建立“这份合约控制了什么状态、暴露了什么能力”的整体图景。
本页目录