Solidity智能合约中的事件和日志

news2024/10/3 20:14:16

1. Solidity 中的事件和日志概述

1.1 什么是事件?

在 Solidity 中,事件(Event)是一种允许智能合约与外部世界进行通信的机制。通过触发事件,可以记录合约执行中的关键操作,并将这些操作发送到链上。事件的记录会以日志的形式存储在区块中,不会直接改变合约的状态。

1.2 什么是日志?

日志(Log)是链上的一种轻量级记录方式,存储在交易的 receipt(收据)中。尽管日志不能在链上被智能合约访问,但它可以被链外的应用(如 DApps)使用,以便监听事件和获取状态变化。


2. 事件的定义和使用

2.1 定义事件

事件的定义非常类似于函数声明,使用 event 关键字来声明事件。事件可以接收参数,这些参数可以是任意数据类型。

// 定义一个事件
event Transfer(address indexed from, address indexed to, uint256 value);

在上面的例子中,Transfer 事件接收了三个参数:发送者地址、接收者地址和转移的数额。indexed 关键字用于标记可以被日志索引的参数(最多允许三个 indexed 参数),方便链外查询。

2.2 触发事件

通过 emit 关键字来触发事件。当合约执行过程中发生某个操作时,可以通过触发事件来记录该操作。

// 触发事件
emit Transfer(msg.sender, recipient, amount);

Transfer 事件被触发时,这些信息会被记录在交易的日志中,外部应用可以监听这个事件并作出相应的反应。


3. 事件的应用场景

3.1 记录合约中的重要操作

事件最常见的用途是记录合约中的重要操作,例如资金转移、合约状态变化等。对于代币合约,通常会使用 TransferApproval 事件来记录代币的转账和授权。

3.2 外部应用的监听

外部应用可以通过 Web3.js 或 Ethers.js 等库来监听链上的事件,从而获取合约执行中的实时状态。例如,DApp 可以监听 Transfer 事件来更新用户界面中的账户余额。


4. 索引事件参数

4.1 indexed 参数的作用

通过 indexed 关键字,事件参数可以被索引,这使得查询特定事件变得更加高效。带有 indexed 的参数可以在链上通过事件过滤器进行搜索。

event Transfer(address indexed from, address indexed to, uint256 value);

在上面的例子中,fromto 地址被标记为 indexed,这意味着用户可以通过筛选 fromto 地址来过滤相应的事件日志。

4.2 最多三个索引参数

Solidity 允许每个事件最多标记三个 indexed 参数。如果超出这个限制,将会抛出编译错误。


5. 事件和日志的 Gas 消耗

5.1 事件的 Gas 消耗

触发事件会消耗 Gas,尤其是当事件带有多个参数时,Gas 消耗将会增加。一般来说,每个 indexed 参数的 Gas 消耗要高于普通参数,因为 indexed 参数需要额外的存储操作。

5.2 日志的 Gas 优化

虽然事件可以帮助节省区块链上存储数据的成本,但过多或不必要的事件触发可能会造成不必要的 Gas 开销。因此,开发者应谨慎使用事件,并尽量减少冗余事件的触发。


6. 事件的监听与日志查询

6.1 Web3.js 监听事件

外部应用可以使用 Web3.js 库监听特定的事件,并作出相应的处理。以下是一个监听事件的示例:

const contract = new web3.eth.Contract(abi, contractAddress);

contract.events.Transfer({
    filter: {from: '0x123456...'},
    fromBlock: 0
}, function(error, event){ console.log(event); })
.on('data', function(event){
    console.log(event.returnValues);
});

通过设置过滤器和监听器,Web3.js 可以捕捉链上发生的特定事件,并获取事件的相关数据。

6.2 Ethers.js 监听事件

Ethers.js 是另一个流行的库,它提供了类似的事件监听功能。

contract.on('Transfer', (from, to, value) => {
    console.log(from, to, value);
});

Ethers.js 提供了简洁的 API 来监听事件,并可以通过回调函数处理事件数据。

6.3 日志查询工具

除了通过程序监听事件,还可以通过区块链浏览器(如 Etherscan)或链上日志查询工具直接查看特定交易的日志内容。这些工具会展示事件的详细信息,包括事件名称、参数和触发时间。


7. 事件和日志的局限性

7.1 合约中不可访问的日志

智能合约无法读取已记录的日志数据。日志仅对外部用户和应用程序可见,无法在链上被合约重新访问。这意味着日志不应作为关键的合约逻辑依赖。

7.2 日志数据的持久性

虽然日志数据存储在区块链上,但它不是存储在状态树中的数据。因此,日志被认为是不可变且轻量级的,但不能作为智能合约中的长期存储方式。


8. 结论

Solidity 中的事件和日志是智能合约与外部世界进行交互的重要工具。它们不仅允许外部应用监听合约状态的变化,还可以用于记录合约执行中的重要操作。开发者应根据应用场景合理设计事件,并注意事件的 Gas 消耗和日志的不可访问性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

别再为开题报告发愁了,ChatGPT可以助力你高效完成!

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 面对开题报告时,我们常常感到迷茫和压力。如何清晰地表达研究目的、梳理文献综述、明确研究问题与假设,以及构建合理的研究方法,这些环节都对开题报告…

OpenCV-图像拼接

文章目录 一、基本原理二、步骤三、代码实现1.定义函数2.读取图像3.图像配准(1).特征点检测(2).特征匹配 4.透视变换5.图像拼接 四、图像拼接的注意事项 图像拼接是一种将多张有重叠部分的图像合并成一张无缝的全景图或高分辨率图…

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1,脉冲部分代码2,ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …

基于工业物联网的能源监控系统:边缘数据处理的应用

论文标题:《Industrial IoT-Based Energy Monitoring System: Using Data Processing at Edge》 作者信息: Akseer Ali MiraniAnshul AwasthiNiall O’MahonyJoseph Walsh 他们均来自爱尔兰的芒斯特技术大学IMaR研究中心,以及位于利默里克的…

秋招校招北森笔试测评北森笔测评常见图推题目解答

北森笔试测评常见题目解析第二弹: P1:每一行均出现圆,米,口加上内部的菱形和小圆形,行测上称之为遍历。 P2:题干也给提示了,肯定不选9,考虑封闭部分,选11. P3&#xf…

面试速通宝典——7

150. 数据库连接池的作用 数据库连接池的作用包括以下几个方面: 资源重用:连接池允许多个客户端共享有限的数据库连接,减少频繁创建和销毁连接的开销,从而提高资源的利用率。 统一的连接管理:连接池集中管理数据库连…

访问webapps下边的内容不能访问解决办法

1、看是否是带有中文路径,中文路径访问不了 2、是否在访问的时候没有带8080端口 如图,带有8080就可以访问了 原因: 当你尝试通过 http://localhost:8080/hello/hello.html 访问网页时,端口号 “8080” 指定了该请求将发送到本地主…

STM32-MPU6050+DAM库源码(江协笔记)

目录 1、MPU6050简介 2、MPU6050参数 3、MPU6050硬件电路 4、MPU6050结构 5、MPU6000和MPU6050的区别 6、MPU6050应用场景 7、MPU6050电气参数 8、MPU6050时钟源选择 9、MPU6050中断源 10、MPU6050的I2C读写操作 11、DMP库移植 1、MPU6050简介 10轴传感器&#xff1…

使用CSS实现酷炫加载

使用CSS实现酷炫加载 效果展示 整体页面布局 <div class"container"></div>使用JavaScript添加loading加载动画的元素 document.addEventListener("DOMContentLoaded", () > {let container document.querySelector(".container&q…

Unity初识+面板介绍

Unity版本使用 小版本号高&#xff0c;出现bug可能性更小&#xff1b;一台电脑可以安装多个版本的Unity&#xff0c;但是需要安装在不同路径&#xff1b;安装Unity时不能有中文路径&#xff1b;Unity项目路径也不要有中文。 Scene面板 相当于拍电影的片场&#xff0c;Unity程…

前缀和+思维,CF 1984C2 - Magnitude (Hard Version)

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1984C2 - Magnitude (Hard Version) 二、解题报告 1、思路分析 C1 是只要…

Docker巩固十七问

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 1. 如何批量清理临时镜像文件&#xff1f; 所谓的“临时镜像”或“虚悬镜像”&#xff08;dangling images&#xff09;是指那些…

动态规划算法专题(二):路径问题

1. 不同路径 . - 力扣&#xff08;LeetCode&#xff09; 1.1 算法原理 状态表示dp[i][j]&#xff1a;走到(i,j)位置&#xff0c;一共有多少种方法&#xff08;以(i,j)位置为结尾&#xff09;状态转移方程&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1];初始化&#xff1a;dp[0][1…

SSM超市进销存管理系统源码

主要功能说明&#xff1a; 管理员角色包含以下功能&#xff1a;管理员登录、进货管理、商品信息、类别管理、库存管理、销售管理、 客户信息管理、供应商管理、员工管理、修改管理员个人信息等功能。 员工角色包含以下功能&#xff1a;员工登录、进货信息查看、退货信息管理…

大华智慧园区综合管理平台系统存在多处漏洞

漏洞描述 大华智慧园区综合管理平台是一个集智能化、信息化、网络化、安全化为一体的智慧园区管理平台&#xff0c;旨在为园区提供一站式解决方案&#xff0c;包括安防、能源管理、环境监测、人员管理、停车管理等多个方面。 FOFA app"dahua-智慧园区综合管理平台"…

【Linux庖丁解牛】—Linux基本指令(中)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a; Linux庖丁解牛 &#x1f516;克心守己&#xff0c;律己则安 目录 1、rmdir与rm指令 2、man指令 3、cp指令 4、mv指令 5、cat与tac指令 6、重定向 7、more指令 8、…

【AIGC】ChatGPT账号的常见封号原因与解封方法

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;ChatGPT封号背景与常见原因ChatGPT封号行动背景ChatGPT常见的封号原因 &#x1f4af;OpenAl封号规则总结&#x1f4af;使用ChatGPT时防止封禁需要特别注意的细节和建议&a…

2025年数字人直播还能做吗?数字人直播的套路骗局须知网

2025年数字人直播还能做吗&#xff1f;数字人直播的套路骗局须知网 数字人直播是利用先进的数字技术和算法&#xff0c;创建出了一个具有人类形象的虚拟数字人&#xff0c;那通过模仿人类的行为、语言和情感进行事实的互动和内容的展示。 这种直播方式突破了传统的限制&#…

性能测试笔记1

为什么要进行性能测试&#xff1f;&#xff08;在真实项目商用时&#xff0c;需要大量的用户进行使用&#xff0c;因此需要模拟大量用户的使用场景 &#xff09; 1、业务需求 电商双 11 活动 / 微信春晚抢红包 /12306 春运订票 当前服务器配置是否支持 20000 人同时使用 技术…

深度学习中的结构化概率模型 - 使用图来描述模型结构篇

序言 在深度学习的探索之路上&#xff0c;结构化概率模型以其独特的视角和强大的表达能力&#xff0c;成为了研究复杂数据关系的重要工具。这一模型的核心在于其巧妙地利用图来描述模型结构&#xff0c;将随机变量间的复杂交互关系可视化、结构化。图的引入&#xff0c;不仅为…