Solidity中的事件(Event)的结构与用法
event的简单例子
在Solidity中,事件(Event)是一种特殊的结构,用于记录区块链上的活动,类似于日志记录。事件可以被合约内的函数触发,并且可以被外部监听者(例如用户界面或后端服务)监听。事件的主要用途是提供一种方式,让外部系统能够接收到合约内部状态变化的通知。
事件的使用通常包括两个步骤:
- 声明:在合约中声明一个或多个事件。
- 触发:在合约的函数中使用
emit
关键字来触发事件。
以下是事件声明和触发的一个简单示例:
// 声明事件
event PasswordSet(address indexed user, string password);
// 触发事件的函数
function setPassword(string memory newPass) public {
require(msg.sender == s_owner, "Only owner can set password");
s_password = newPass;
emit PasswordSet(msg.sender, newPass); // 触发事件
}
在这个示例中,PasswordSet
事件有两个参数:一个是address
类型的user
,被标记为indexed
,表示可以被索引;另一个是string
类型的password
,没有被索引。当setPassword
函数被调用且条件满足时,会触发PasswordSet
事件,并将调用者地址和新密码作为参数传递。
在Solidity中,事件的参数可以被标记为indexed
或非索引(non-indexed)。这两种参数的主要区别在于它们如何被存储和查询:
被索引的参数(Indexed Parameters)
- 存储方式:被索引的参数的哈希值被存储在区块的日志主题(Topics)中。由于主题的数量限制为4个(前三个为索引参数,第四个可以是任意类型),因此只有前三个参数可以被标记为索引。
- 查询效率:由于索引参数的哈希值被存储在日志主题中,它们可以被非常快速地查询。这意味着你可以使用这些参数的值来过滤事件,而无需遍历所有的日志条目。
- 使用场景: