Skip to content

事件

Solidity 智能合约中,事件是一个重要的特性,可以用于在合约中触发事件通知,使外部应用程序监听到一些操作的变化或状态变更。

事件通常用于与外部系统的协调,同时还可以用于跟踪某些状态变化或错误发生。

一个事件通常有一个名称和一组参数,事件的参数定义了事件中要传递的数据类型。

语法

Solidity 中,我们可以使用event关键字来定义事件,例如:

solidity
event NewUser(address indexed userAddress, string name);

这个事件名为 NewUser,有两个参数:一个是地址类型的 userAddress,另一个是字符串类型的 name

userAddress 参数被索引为了允许外部应用程序更快地搜索该事件。

我们可以在合约中使用 emit 关键字来发出事件,例如:

solidity
function addUser(string calldata name) external {
    // 添加一个用户到系统中
    // ...
    emit NewUser(msg.sender, name);
}

在这个合约中,当有人调用 addUser() 方法时,以合约调用者的地址和传入的用户名作为参数,发出 NewUser 事件。

示例

以下是一个简单的 Solidity 合约,它展示了一个事件在 Solidity 中是如何定义和使用的:

solidity
pragma solidity ^0.8.0;

contract MyContract {
    event NewUser(address indexed userAddress, string name);
    
    function addUser(string calldata name) external {
        // 添加一个用户到系统中
        // ...
        emit NewUser(msg.sender, name);
    }
}

在上面的合约中,我们定义了一个名为 NewUser 的事件,它接受一个地址参数(用于索引)和一个字符串参数(用户名称)。

addUser() 函数中,我们使用 emit 关键字来发出 NewUser 事件,以便当有新用户添加到合约时通知外部应用程序。

请注意,Solidity 不支持直接在本地运行事件,因此对事件进行测试需要使用truffle 或其他类似的测试框架。