环境变量和常量

环境变量

环境变量始终存在于命名空间中,主要用于提供有关区块链或当前交易的信息。

区块和交易属性

名称

类型

block.coinbase

address

当前区块矿工的地址

block.difficulty

uint256

当前区块难度

block.prevrandao

uint256

由信标链提供的当前随机数信标

block.number

uint256

当前区块编号

block.prevhash

bytes32

等效于 blockhash(block.number - 1)

block.timestamp

uint256

当前区块纪元时间戳

chain.id

uint256

链 ID

msg.data

Bytes

消息数据

msg.gas

uint256

剩余 gas

msg.sender

address

消息发送者(当前调用)

msg.value

uint256

与消息一起发送的 wei 数量

tx.origin

address

交易发送者(完整调用链)

tx.gasprice

uint256

当前交易的 gas 价格(以 wei 为单位)

注意

block.prevrandaoblock.difficulty 的别名。由于 block.difficulty 根据 EIP-4399 在“合并” (巴黎硬分叉) 后被认为已弃用,我们建议使用 block.prevrandao

注意

msg.data 需要使用 slice 来显式提取 calldata 的一部分。如果提取的部分超出 calldata 的边界,这将引发异常。可以使用 len 检查 msg.data 的大小。

self 变量

self 是一个环境变量,用于在合约内部引用合约。除了普通的 address 成员之外,self 允许您读取和写入状态变量,并调用合约内的私有函数。

名称

类型

self

address

当前合约的地址

self.balance

uint256

当前合约的余额

访问状态变量

self 用于访问合约的 状态变量,如以下示例所示

state_var: uint256

@external
def set_var(value: uint256) -> bool:
    self.state_var = value
    return True

@external
@view
def get_var() -> uint256:
    return self.state_var

调用内部函数

self 也用于调用合约内的 内部函数

@internal
def _times_two(amount: uint256) -> uint256:
    return amount * 2

@external
def calculate(amount: uint256) -> uint256:
    return self._times_two(amount)

自定义常量

自定义常量可以在 Vyper 中的全局级别定义。要定义常量,请使用 constant 关键字。

TOTAL_SUPPLY: constant(uint256) = 10000000
total_supply: public(uint256)

@external
def __init__():
    self.total_supply = TOTAL_SUPPLY