- 使用
@external
修饰符和def __init__
来定义,注意init
前后分别是 2 条下划线 - 修饰符
@payable
可选,只要作用用于部署时接收 ETH 和节省 gas - 可以接受参数,用于设置合约的初始状态。
owner: public(address)
@payable
@external
def __init__(_owner: address):
self.owner = _owner
- 常用于设置合约拥有者、初始化状态变量等。
- 可以包含任何逻辑,但需确保操作安全,因为它在合约生命周期中仅执行一次。
- 不要在构造函数中进行复杂的计算或可能失败的操作,以避免部署失败。
- 确保所有重要的初始状态都在构造函数中正确设置。
在 Vyper 中,__default__
函数是一种特殊的函数,如果没有其他函数与给定的函数标识符匹配(或者根本没有提供任何函数,例如通过某人发送 ETH),则在调用合约时执行该默认函数。它与 Solidity
中的 fallback
函数具有相同的构造。
该函数始终命名为 __default__
。必须使用装饰器 @external
。它不能有任何输入参数。如果该函数存在装饰器 @payable
,则每当合约发送以太币(无数据)时,该函数就会执行。这就是为什么默认函数不能接受参数——以太坊不区分将以太发送到合约或用户地址。
# @version 0.3.9
"""
@title Simple Proxy
@author 0x77
"""
event Received:
_sender: indexed(address)
_amount: indexed(uint256)
_data: Bytes[1024]
implementation: public(address)
@payable
@external
def __init__(_implementation: address):
self.implementation = _implementation
@payable
@external
def __default__() -> Bytes[255]:
if len(msg.data) == 0:
log Received(msg.sender, msg.value, b"")
return b""
response: Bytes[255] = raw_call(
self.implementation,
msg.data,
max_outsize=255,
value=msg.value,
is_delegate_call=True
)
assert len(response) != 0, "CALL FAIL"
return response