能否讲解Solidity中ENUM、EMIT、EVENT概念及对应代码用法?
Solidity 中 ENUM、EVENT、EMIT 语法含义与用法说明
1. ENUM(枚举类型)
ENUM是Solidity提供的自定义值类型,用来定义一组有限的、固定的命名常量,通常用来表示业务中的状态集合,避免用无意义的数字表示状态,大幅提升代码可读性。
结合你提供的示例代码说明:
enum Status{ Vacant, Occupied } Status currentStatus;
- 上面第一行代码定义了名为
Status的枚举,内置两个可选状态:Vacant:表示空置状态,底层默认对应整数值0Occupied:表示已占用状态,底层默认对应整数值1
- 第二行代码声明了
Status类型的状态变量currentStatus,它的默认初始值是枚举的第一个元素,也就是Vacant
枚举类型可以和整数互相显式转换,也可以直接用比较运算符判断状态,比如if(currentStatus == Status.Vacant)即可快速校验当前是否为空置状态。枚举底层默认是uint8类型,最多支持256个成员。
2. EVENT(事件)
EVENT是Solidity内置的链上日志机制,用来实现合约和链下应用的低成本通信。合约触发事件时,事件的参数会作为日志存储在区块链交易的收据中,链下程序可以监听这些事件,无需主动轮询合约就能实时感知合约的状态变化。
结合示例代码说明:
event Occupy(address _occupant, uint _value);
这行代码定义了名为Occupy的事件,它携带两个参数:
_occupant:地址类型,用来记录占用资源的用户钱包地址_value:无符号整数类型,用来记录本次占用行为支付的金额
事件参数可以添加indexed修饰符,添加后链下程序可以按这个参数值过滤查询事件日志,单个事件最多支持3个indexed参数。
3. EMIT(事件触发关键字)
EMIT是专门用来触发已定义EVENT的关键字,只有通过emit调用事件,对应的日志才会被写入链上的交易收据中。
结合你的示例场景,典型的使用代码如下:
function occupy() public payable { // 校验当前状态为空置才能调用 require(currentStatus == Status.Vacant, "Already occupied"); // 修改状态为已占用 currentStatus = Status.Occupied; // 触发已定义的Occupy事件,传入调用者地址和支付的金额 emit Occupy(msg.sender, msg.value); }
当用户调用上述方法支付以太币完成占用操作时,链下的业务平台只要监听Occupy事件,就能实时拿到最新的占用者地址、支付金额等信息,比主动查询合约状态的成本低很多。
内容的提问来源于stack exchange,提问作者Ebube Davies
相关产品推荐
相关产品推荐

