在 Solidity 中,事件(Event)是合约与区块链外部的接口。事件可以用来记录合约的状态变化,或者触发合约外部的响应。事件在合约中被触发,然后被区块链记录在交易日志中。

以下是一个简单的 Solidity 事件的例子:

event Sent(address from, address to, uint amount);

在这个例子中,Sent 是事件名,address from, address to, uint amount 是事件参数。

以下是 Solidity 事件的一些重要特性:

  1. 触发事件:事件可以在合约函数中使用 emit 关键字来触发。例如,emit Sent(msg.sender, receiver, amount); 就会触发一个 Sent 事件。
  2. 事件参数:事件可以有参数,参数可以是任何 Solidity 数据类型。事件参数可以被标记为 indexed,最多可以有三个 indexed 参数。indexed 参数可以用来过滤事件日志。
  3. 事件日志:触发的事件会被记录在区块链的交易日志中。事件日志是永久存储在区块链上的,可以通过事件名和 indexed 参数来检索。
  4. 监听事件:合约外部可以监听事件。例如,前端应用可以监听合约事件来更新用户界面,或者其他合约可以监听事件来触发自己的逻辑。
  5. 匿名事件:事件可以被标记为 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 类型的 myStructid 参数被标记为 indexed ,这意味着我们可以通过 id 来过滤 MyEvent 事件的日志。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特