什么是智能合约事件?
您可以从事务触发的任何智能合约函数中发出事件,它们是以太坊应用程序架构难题的重要组成部分。
这些事件由一个名称和最多17个参数组成,这些参数的内容由发出函数提供。参数可以是索引的,也可以是非索引的;使用索引参数可以实现高效的链外查询。
例如,如果事件x包含索引字符串参数y,则在链外,我可以使用筛选器检索y==“foo”的所有事件。(稍后将详细介绍过滤器)
事件存储为日志而不是EVM存储,因此,它们具有您应该注意的属性:
· 由于无法从智能合约中访问:虽然智能合约功能会发出事件,但智能合约在发布后无法访问此事件信息。对于排放合同和任何其他外部合同都是如此。因此,您不能将事件用于跨智能合约通信。
· 事件的费用很便宜!:由于事件存储为日志,因此与更新EVM存储状态的传统方法相比,它们是非常便宜的。确切的成本取决于事件规范和事件中数据的大小。
事件的常见用途
异步链外触发器
大多数企业Java开发人员都熟悉事件总线模式,其中事件被发布到队列(如RabByMQ或Amazon SQL)。此模式允许对特定事件感兴趣的服务异步地从总线上使用它们,并执行进一步的处理,而不需要在发布服务器和使用者服务之间进行任何耦合。
事件总线模式
服务可以以类似的方式使用以太坊智能合约事件,以太坊网络充当一种消息队列。非