Solidity 之事件 (events) 篇
Solidity 的事件 (events) 是在 EVM(虚拟机) 上的 logging 性能的抽象化实现。利用能够订阅并且监听客户端的 RPC 调用。
事件和日志对 ETH 来说十分的重要, 因为它们能够减少智能合约和用户之间的交互。事件不便了 EVM 上 logging 性能的应用。
事件上的参数被存储到交易的日志中,这是 ETH 链上的一种非凡的数据格式。
在 solidity 中的事件是什么?
在传统的 web 开发当中,服务端的返回通过回调的形式下发给前端。在 ETH 中,当一笔交易被提交之后,智能合约能够触发事件并且在链上记录日志,之后前端就能够根底解决前面的内容了。
怎么样来应用事件?
事件有 3 中次要的应用场景
- 智能合约给用户的返回值
- 异样触发
- 更便宜的数据存储
在 solidity 中如何定义事件?
- 事件在函数内部定义
- 事件名必须和函数名称有所辨别
- 事件名称必须是大写
- 为了缩小混同事件名称至多得 2 个字母和函数名称不一样
如何来应用事件
在函数外部通过 emit 关键词,前面跟上事件的名称和事件所需的参数(如果有的话)。
事件被存储到什么中央
在 ETH 链上,每笔交易都附上了收据,收据上又蕴含了 0 条或者多条的日志。日志内容展示了智能合约中触发的事件的后果。
所以正因为事件存储到日志条目中,所以它们扭转了状态。
匿名事件
在 solidity 中事件能够是匿名的。默认状况下所有的事件都会有一个主题, 来自定义时候的函数名称。应用 anonymous 来记录一个没有主题的事件。匿名事件也会成为 ABI 的一部分。
event Message(
address _recipient,
string _message
) anonymous;
匿名事件的应用老本更低。然而匿名事件不能通过名称去筛选,只能通过合约地址。
demo
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Event {
// Event declaration
// Up to 3 parameters can be indexed.
// Indexed parameters helps you filter the logs by the indexed parameter
event Log(address indexed sender, string message);
event AnotherLog();
function test() public {emit Log(msg.sender, "Hello World!");
emit Log(msg.sender, "Hello EVM!");
emit AnotherLog();}
}