跟我学Solidity:事件

如何使用事件记录数据

> * 原文: https://medium.com/better-programming/learn-solidity-events-2801d6a99a92 作者: [wissal haji](https://wissal-haji.medium.com/) > * 译文出自:[登链翻译计划](https://github.com/lbc-team/Pioneer) > * 译者:[翻译小组](https://learnblockchain.cn/people/412) > * 校对:[Tiny 熊](https://learnblockchain.cn/people/15) > * 本文永久链接:[learnblockchain.cn/article…](https://learnblockchain.cn/article/2052) 欢迎订阅[《Solidity 智能合约专栏》](https://learnblockchain.cn/column/1)系列文章。 在[上一篇](https://medium.com/better-programming/build-your-first-dapp-with-web3-js-9a7306d16a61)中,我们已经看到了如何使用[web3.js](https://learnblockchain.cn/docs/web3.js/)来构建一个dapp。 在今天的文章中,我们将看到如何使用web3.js从区块链中读取事件。 Solidity中的事件就像你习惯于使用其他语言的日志记录功能一样,只是日志不是记录到控制台或文件,而是保存在以太坊区块链中。 在下面的内容中,我们将看到: - 如何声明和触发一个事件 - 什么是 "logsBloom" ,它如何用于高效搜索区块链数据? - 如何从区块链中读取一个事件? - 如何订阅事件 ## 如何声明和触发事件? 为了声明一个事件,你需要使用以下语法: ```javascript event event_name([data to record: var_type var_name]) // 例如: event MyEvent ( uint256 date, string value ); ``` 事件的定义包含了事件的名称和你想在触发事件时保存的参数。 一旦你声明了你的事件,你就可以从一个函数中发出一个事件,如下所示: ``` emit MyEvent(block.timestamp, 'hello')。 ``` 让我们来用一个例子,看看这到底是如何工作的。 在你的命令行终端,创建一个新的目录,并使用`truffle init`建立一个新的Truffle项目。 使用你最喜欢的代码编辑器打开项目,并在合约文件夹中创建一个名为`EventExample.sol`的新合约,然后复制粘贴以下代码。 ```javascript // SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.8.0; contract EventExample { event DataStored(uint256 val); uint256 val; function storeData(uint256 _val) external { val = _val; emit DataStored(val); } } ``` 创建相应的迁移文件`2_deploy_eventExample.js`。 ``` const EventExample = artifacts.require("EventExample"); module.exports = function (deployer) { deployer.deploy(EventExample)。 }; ``` 现在让我们使用 "truffle migrate" 部署合约,但在迁移之前不要忘记编辑 "truffle-config.js "文件来配置网络和编译器。 在你的终端,使用`truffle console`启动Truffle控制台。 我们要调用`storeData`函数,检查创建的交易的日志。 先获取部署合约的实例。 ``` let eventExample = await EventExample.deployment() ``` 现在我们可以使用以下方法调用该函数。 ``` let tx = await eventExample.storeData(10) ``` 如果你打印交易收据日志`tx.receive.rawLogs`的内容,其中存储了交易执行过程中发生的触发事件的数组,你将得到一个数组,其中有一个对象,看起来像这样。 ![收据交易记录的内容](https://img.learnblockchain.cn/pics/20210125213704.png) <center>交易日志</center> 你可以看到,事件数据是以十六进制存储在数据字段下的。 ## Bloom过滤器 如何帮助高效地检索区块链数据 为了高效地扫描区块链,寻找具有某些数据的事件,你可以在你...

  • 原文: https://medium.com/better-programming/learn-solidity-events-2801d6a99a92 作者: wissal haji
  • 译文出自:登链翻译计划
  • 译者:翻译小组
  • 校对:Tiny 熊
  • 本文永久链接:learnblockchain.cn/article…

欢迎订阅《Solidity 智能合约专栏》系列文章。

在上一篇中,我们已经看到了如何使用web3.js来构建一个dapp。 在今天的文章中,我们将看到如何使用web3.js从区块链中读取事件。

Solidity中的事件就像你习惯于使用其他语言的日志记录功能一样,只是日志不是记录到控制台或文件,而是保存在以太坊区块链中。 在下面的内容中,我们将看到:

  • 如何声明和触发一个事件
  • 什么是 "logsBloom" ,它如何用于高效搜索区块链数据?
  • 如何从区块链中读取一个事件?
  • 如何订阅事件

如何声明和触发事件?

为了声明一个事件,你需要使用以下语法:

event event_name([data to record: var_type var_name])

// 例如:
event MyEvent (
      uint256 date,
      string value
);

事件的定义包含了事件的名称和你想在触发事件时保存的参数。

一旦你声明了你的事件,你就可以从一个函数中发出一个事件,如下所示:

emit MyEvent(block.timestamp, 'hello')。

让我们来用一个例子,看看这到底是如何工作的。

在你的命令行终端,创建一个新的目录,并使用truffle init建立一个新的Truffle项目。 使用你最喜欢的代码编辑器打开项目,并在合约文件夹中创建一个名为EventExample.sol的新合约,然后复制粘贴以下代码。


// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 &lt;0.8.0;
contract EventExample {
   event DataStored(uint256 val);
   uint256 val;
   function storeData(uint256 _val) external {
         val = _val;
         emit DataStored(val);
  }
}

创建相应的迁移文件2_deploy_eventExample.js

const EventExample = artifacts.require("EventExample");

module.exports = function (deployer) {
   deployer.deploy(EventExample)。
};

现在让我们使用 "truffle migrate" 部署合约,但在迁移之前不要忘记编辑 "truffle-config.js "文件来配置网络和编译器。

在你的终端,使用truffle console启动Truffle控制台。 我们要调用storeData函数,检查创建的交易的日志。 先获取部署合约的实例。

let eventExample = await EventExample.deployment()

现在我们可以使用以下方法调用该函数。

let tx = await eventExample.storeData(10)

如果你打印交易收据日志tx.receive.rawLogs的内容,其中存储了交易执行过程中发生的触发事件的数组,你将得到一个数组,其中有一个对象,看起来像这样。

<center>交易日志</center>

你可以看到,事件数据是以十六进制存储在数据字段下的。

Bloom过滤器 如何帮助高效地检索区块链数据

为了高效地扫描区块链,寻找具有某些数据的事件,你可以在你...

剩余50%的内容订阅专栏后可查看

  • 单篇购买 5学分
  • 永久订阅专栏 (90学分)
  • 发表于 2021-01-26 12:04
  • 阅读 ( 1220 )
  • 学分 ( 65 )
  • 分类:以太坊
  • 专栏:全面掌握Solidity智能合约开发

评论