全面掌握Solidity智能合约开发

2024年09月25日更新 796 人订阅
原价: ¥ 46 限时优惠
专栏简介 跟我学 Solidity :开发环境 跟我学 Solidity:关于变量 跟我学 Solidity : 变量的存储 跟我学 Solidity :引用变量 跟我学 Solidity :函数 跟我学 Solidity :合约的创建和继承 跟我学 Solidity :工厂模式 用Web3.js构建第一个Dapp 跟我学Solidity:事件 Solidity 中 immutable (不可变量)与constant(常量) [译] Solidity 0.6.x更新:继承 解析 Solidity 0.6 新引入的 try/catch 特性 探究新的 Solidity 0.8 版本 探索以太坊合约委托调用(DelegateCall) 停止使用Solidity的transfer() 使用工厂提高智能合约安全性 Solidity 怎样写出最节省Gas的智能合约[译] Solidity 优化 - 编写 O(1) 复杂度的可迭代映射 Solidity 优化 - 控制 gas 成本 Solidity 优化 - 减少智能合约的 gas 消耗的8种方法 Solidity 优化 - 如何维护排序列表 Solidity 优化:打包变量优化 gas 使用 Solidity 瞬态存储操作码 在 Solidity中使用值数组以降低 gas 消耗 Gas 优化:Solidity 中的使用动态值数组 计算Solidity 函数的Gas 消耗 Solidity 技巧:如何减少字节码大小及节省 gas 一些简单的 Gas 优化基础 "Stack Too Deep(堆栈太深)" 解决方案 智能合约Gas 优化的几个技术 合约实践:避免区块Gas限制导致问题 如何缩减合约以规避合约大小限制 Solidity 类特性 无需gas代币和ERC20-Permit还任重而道远 智能合约实现白名单的3个机制 Solidity智能合约安全:防止重入攻击的4种方法 Solidity 十大常见安全问题 [译]更好Solidity合约调试工具: console.log 智能合约开发的最佳实践 - 强烈推荐 全面理解智能合约升级 Solidity可升级代理模式: 透明代理与UUPS代理 使用OpenZeppelin编写可升级的智能合约 实战:调整NFT智能合约,减少70%的铸币Gas成本 Solidity 优化 - 隐藏的 Gas 成本 Gas 技巧:Solidity 中利用位图大幅节省Gas费 Solidity Gas 优化 - 理解不同变量 Gas 差异 关于Solidity 事件,我希望早一点了解到这些 Solidity 编码规范推荐标准 深入了解 Solidity bytes OpenZeppelin Contracts 5.0 版本发布 Solidity Gas优化:高效的智能合约策略 智能合约安全的新最低测试标准:Fuzz / Invariant Test 智能合约的白名单技术 模糊测试利器 - Echidna 简介 智能合约设计模式:代理 离线授权 NFT EIP-4494:ERC721 -Permit

跟我学Solidity:事件

如何使用事件记录数据

欢迎订阅《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 <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%的内容订阅专栏后可查看

点赞 3
收藏 3
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

5 条评论

请先 登录 后评论