在 Solidity 中,事件(Event)是合约与区块链外部的接口。事件可以用来记录合约的状态变化,或者触发合约外部的响应。事件在合约中被触发,然后被区块链记录在交易日志中。
以下是一个简单的 Solidity 事件的例子:
event Sent(address from, address to, uint amount);
在这个例子中,Sent
是事件名,address from, address to, uint amount
是事件参数。
以下是 Solidity 事件的一些重要特性:
- 触发事件:事件可以在合约函数中使用
emit
关键字来触发。例如,emit Sent(msg.sender, receiver, amount);
就会触发一个Sent
事件。 - 事件参数:事件可以有参数,参数可以是任何 Solidity 数据类型。事件参数可以被标记为
indexed
,最多可以有三个indexed
参数。indexed
参数可以用来过滤事件日志。 - 事件日志:触发的事件会被记录在区块链的交易日志中。事件日志是永久存储在区块链上的,可以通过事件名和
indexed
参数来检索。 - 监听事件:合约外部可以监听事件。例如,前端应用可以监听合约事件来更新用户界面,或者其他合约可以监听事件来触发自己的逻辑。
- 匿名事件:事件可以被标记为
anonymous
,匿名事件在日志中不会记录事件名。
事件提供了一种有效的方式来记录合约的状态变化,触发合约外部的响应。
在 Solidity 中,事件可以接受任何类型的参数,包括基本类型(如uint, bool, address, bytes等)、复杂类型(如数组和结构体)以及用户定义的类型(如合约和枚举)。但是,需要注意的是,只有基本类型和数组可以被标记为 indexed
。
indexed
是 Solidity 中的一个关键字,用于指定事件参数是否应该被索引。被标记为 indexed
的参数将被单独存储在日志的主题字段中,而非 indexed
的参数将被存储在日志的数据字段中。这使得我们可以通过 indexed
参数来过滤事件日志。
下面的示例展示了在 Solidity 事件中使用不同类型参数的情况:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;
contract MyContract {
struct MyStruct {
uint id;
string name;
}
event MyEvent(
uint indexed id,
bool flag,
address user,
bytes32 data,
uint[] array,
MyStruct myStruct
);
function triggerEvent() public {
MyStruct memory myStruct = MyStruct(1, "Alice");
uint[] memory array = new uint[](2);
array[0] = 1;
array[1] = 2;
emit MyEvent(1, true, msg.sender, "Hello, World!", array, myStruct);
}
}
在这个示例中, MyEvent
事件接受了六个参数:一个 uint
类型的 id
,一个 bool
类型的 flag
,一个 address
类型的 user
,一个 bytes32
类型的 data
,一个 uint
数组 array
,以及一个 MyStruct
类型的 myStruct
。 id
参数被标记为 indexed
,这意味着我们可以通过 id
来过滤 MyEvent
事件的日志。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特