Solidity智能合约事件(event)
文章目录
- Solidity智能合约事件(event)
- 什么是event
- 事件event有什么作用
- 日志内容位于区块链的什么地方?
- 【重要】以太坊交易获取
- 如何在 Solidity 中使用事件?
- 参考
Solidity智能合约事件(event)
什么是event
EVM有一个日志功能,用于将数据“写”到智能合约之外的数据结构中。其中一个重要的数据是Solidity事件。事件允许我们“打印”在区块链上的信息,这种方式比在智能合约中保存到公共存储变量更容易搜索,且更省gas费。
当被发送事件(调用)时,会触发参数存储到交易的日志中(一种区块链上的特殊数据结构)。这些日志与合约的地址关联,并记录到区块链中.
Solidity event,在更通用的以太坊和 EVM 中称为logs,Solidity中的事件(event)是EVM上日志的抽象。日志是指事件保存在区块链上的数据。事件强调操作行为,日志强调存储内容。
以太坊中的Events和Logs基本上算是同一个概念。Solidity和web3.js中称为Events,以太坊黄皮书中称为Logs。可以理解为:以太坊通过Logs实现Events(事件)功能。智能合约代码通过LOG 将日志写入区块链中。
事件event有什么作用
事件Event的作用的可以总结为以下几点:
- 异步获取执行结果
- 和前端交互
我们可以通过监听event来做到及时更新前端显示 - 存储合约数据,相比storage要便宜很多(storage存储的大概价格为:每32字节需要消耗20000Gas,而日志存储价格大概为每字节8Gas)
事件有 3 中主要的使用场景
- 智能合约给用户的返回值
- 异常触发
- 更便宜的数据存储
日志内容位于区块链的什么地方?
日志内容是交易收据(Transaction Receipts)的一部分,整个日志内容,包括Receipts的其它内容会生成一个ReceiptsRoot存储在区块的头部。而完整数据则是链下存储。
【重要】以太坊交易获取
以太坊交易信息及event、input、logs、topics等概念机制
参考URL: https://learnblockchain.cn/article/3274
当上述事件在合约中调用后,我们通过其交易hash获取交易信息。从以太坊得到一条交易信息的方式有两种:
- eth_getTransactionByHash: :返回指定交易对应的交易信息
- eth_getTransactionReceipt :返回指定交易对应的收据信息
eth_getTransactionByHash 返回的具体信息如下
{"jsonrpc": "2.0","id": 1,"result": {"blockHash": "0xb0d0e3b6c5e59b7b3e7e16701f6d6cb0c3c93487415b03839e88b3f7a241c528","blockNumber": "0xd19505","from": "0xb8262c6a2dcabd92a77df1d5bd074afd07fc5829","gas": "0x10e3d","gasPrice": "0x274daee580","maxFeePerGas": "0x2d48ddd9f1","maxPriorityFeePerGas": "0x6ccc91d0","hash": "0xae2a33da8396a6bc40e874b0f32b9967113a3dbf071ab1290c44c62d86873d36","input": "0xa9059cbb000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000016512c902","nonce": "0x14","to": "0xdac17f958d2ee523a2206206994597c13d831ec7","transactionIndex": "0x71","value": "0x0","type": "0x2","accessList": [],"chainId": "0x1","v": "0x1","r": "0xa1d7455286525df11602aab34e9e8ab21b092e2c7853a0d6beca0dfb2a78b2e8","s": "0x75a485b8c378173a829b27a2e55312311fdb33c68ae65f4c74e5f9cc0a748e0d"}
}
eth_getTransactionReceipt
{"jsonrpc": "2.0","id": 1,"result": {"blockHash": "0xb0d0e3b6c5e59b7b3e7e16701f6d6cb0c3c93487415b03839e88b3f7a241c528","blockNumber": "0xd19505","contractAddress": null,"cumulativeGasUsed": "0x6c847e","effectiveGasPrice": "0x274daee580","from": "0xb8262c6a2dcabd92a77df1d5bd074afd07fc5829","gasUsed": "0xa169","logs": [{"address": "0xdac17f958d2ee523a2206206994597c13d831ec7","topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000b8262c6a2dcabd92a77df1d5bd074afd07fc5829","0x000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7"],"data": "0x000000000000000000000000000000000000000000000000000000016512c902","blockNumber": "0xd19505","transactionHash": "0xae2a33da8396a6bc40e874b0f32b9967113a3dbf071ab1290c44c62d86873d36","transactionIndex": "0x71","blockHash": "0xb0d0e3b6c5e59b7b3e7e16701f6d6cb0c3c93487415b03839e88b3f7a241c528","logIndex": "0xa0","removed": false}],"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000010000000000000000000000000000000000000000000000000000000008000000000080000000000000000000000000000000000000000000000000000000000000000000200000000000000010000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000004000000002000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000200","status": "0x1","to": "0xdac17f958d2ee523a2206206994597c13d831ec7","transactionHash": "0xae2a33da8396a6bc40e874b0f32b9967113a3dbf071ab1290c44c62d86873d36","transactionIndex": "0x71","type": "0x2"}
}
不同于比特币,以太坊作为智能合约平台。每一笔交易作为消息在以太坊虚拟机中执行时,均会获得一个交易回执信息(Receipt)。

getTransaction返回结果中包含input,而getTransactionReceipts返回结果中包含logs。
如何在 Solidity 中使用事件?
solidity中,使用关键字event来定义事件,其中参数列表就是需要保存到区块链上的数据。
- 在 solidity 中如何定义事件?
- 事件在函数外部定义
- 事件名必须和函数名称有所区分
- 事件名称必须是大写
- 为了减少混淆事件名称至少得 2 个字母和函数名称不一样
事件的声明由event关键字开头,然后跟事件名称,括号里面写好事件需要记录的变量类型和变量名。以ERC20代币合约的Transfer事件为例:
event Transfer(address indexed from, address indexed to, uint256 value);
在这个事件中,有两种参数:有索引的和无索引的。索引参数也被称为“主题”,是事件中的可搜索参数。
每个事件最多有3个带indexed的变量,Transfer事件共记录了3个变量from,to和value,分别对应代币的转账地址,接收地址和转账数量。同时from和to前面带着indexed关键字,表示很重要,程序可以轻松的筛选出特定转账地址和接收地址的转账事件。
一个事件可以分解为:
- Address:地址,
发出事件的合约或账户的地址。 当前交易被调用的合约地址 - Topics:主题,事件的索引参数。
- Data:数据,事件的非索引参数的ABI编码或“哈希”。由于我们知道合约的ABI(因为我们在Etherscan上验证了合约),我们可以在“Dec”或“Decoded”模式下查看它,或者在其原始的“hex”、“Hexidecimal”或 “Encoded”模式下查看。如果我们没有验证过合约,我们就无法看到解码的版本。
-
如何来使用事件
在函数内部通过 emit 关键词,后面跟上事件的名称和事件所需的参数(如果有的话)。
如果函数会触发事件,则不能将其定义为view或pure。这是因为触发事件会将数据写入区块链(到日志中)。 -
匿名事件
在 solidity 中事件可以是匿名的。默认情况下所有的事件都会有一个主题,来自定义时候的函数名称。使用 anonymous 来记录一个没有主题的事件。匿名事件也会成为 ABI 的一部分。
event Message(address _recipient,string _message
) anonymous;
如果事件声明为anonymous,在合约 ABI 中,事件的"anonymous"字段将标记为true。
匿名事件的使用成本更低。但是匿名事件不能通过名称去筛选,只能通过合约地址。
参考
web3.js与智能合约交互监听合约事件
参考URL: https://www.b2bchain.cn/8083.html
web3j开发以太坊过滤器(filter)和智能合约事件(event)
参考URL: https://blog.csdn.net/rejames/article/details/81294638
智能合约Solidity教程-事件和日志(一)
参考URL: https://blog.csdn.net/weixin_34252090/article/details/88720360
[强烈推荐,写的很详细]以太坊交易信息及event、input、logs、topics等概念机制
参考URL: https://learnblockchain.cn/article/3274
相关文章:
Solidity智能合约事件(event)
文章目录 Solidity智能合约事件(event)什么是event事件event有什么作用日志内容位于区块链的什么地方?【重要】以太坊交易获取如何在 Solidity 中使用事件?参考 Solidity智能合约事件(event) 什么是event EVM有一个日志功能,用于将数据“写…...
第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏
讲动人的故事,写懂人的代码 2.6.6 用as进行类型转换:显式而简洁的语法 贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prev和sum_of_two_dice都是u32类型,u32类型并不支持abs(…...
大话C语言:第24篇 预处理
1 C语言编译流程 C语言的编译流程包括: 预编译:将.c 中的头文件展开、宏展开,生成的文件是.i 文件。gcc指令:gcc -E file.c -o file.i 编译:将预处理之后的.i 文件生成 .s 汇编文件。gcc指令:gcc -S file…...
React如何配置路由
ReactTs配置路由 安装依赖 npm i react-router-dom在routers下面创建index.tsx import { RouteObject } from react-router-dom import React from react import PageA from /views/PageA import PageB from /views/PageB const routes: RouteObject[] [{path: /,element: …...
MAC使用初体验+入门
之前从来没有使用过MAC,这次拿到了一个 不得不说MAC度过适应期后用起来很舒服,续航长,触控板舒服,轻薄无比 我前期过度的时候记录的一部分快速指南,掌握如下一些电脑常识 可以做到正常使用了 基本操作 在 Mac 上使用桌…...
Go TOKEN机制与跨域处理方式
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
JavaScript 的运行
语法分析预编译解释执行 1.语法分析 语法分析是 JavaScript 引擎处理代码的第一步。 在这个阶段,引擎将源代码字符串分解成一个个的词素(token),这些词素是语言中有意义的最小单元,如关键字、变量名、操作符等。 语…...
园区地图导航系统:技术原理、部署方案与智能化应用解析
随着智能化时代的到来,园区管理面临诸多挑战。维小帮园区地图导航系统,采用前沿技术,为园区提供全面的导航解决方案,极大提升了园区管理效率和用户体验。 一、园区地图导航系统的功能特点 维小帮园区地图导航系统,以其…...
【数据结构】第十六弹---C语言实现希尔排序
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、希尔排序( 缩小增量排序 ) 1.1、预排序实现 1.2、希尔排序代码实现 1.3、代码测试 1.4、时空复杂度分析 1.5、性能比较 总结 上一弹我们…...
用Python向Word文档添加页眉和页脚
用Python向Word文档添加页眉和页脚 添加页眉和页脚效果代码 添加页眉和页脚 在本文中,我们将用python向文档中添加页眉和页脚。 效果 添加前的文档: 添加页眉和页脚后: 代码 from docx import Documentdef add_header_footer(doc_path…...
REST风格
黑马程序员Spring Boot2 文章目录 1、REST简介1.1 优点1.2 REST风格简介1.3 注意事项 2、RESTful入门案例 1、REST简介 1.1 优点 隐藏资源的访问行为,无法通过地址的值对资源适合中操作书写简化 1.2 REST风格简介 按照RST风格访问资源时使用行为动作区分对资源进…...
Mongodb连接测试程序【Java版】
先导入Maven依赖 <dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>4.9.0</version> </dependency>import com.mongodb.MongoClientSettings; import com.mongodb.MongoCred…...
SM3国密算法:优秀的密码散列函数
随着信息技术的飞速发展,信息安全已成为全球关注的焦点。密码学作为保障信息安全的核心技术,其重要性不言而喻。中国在密码学领域也取得了显著的成就,其中SM3国密算法就是中国自主设计并推广使用的密码学标准之一。 一、SM3算法概述 SM3算法…...
【安卓】在安卓中使用HTTP协议的最佳实践
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...
Spring Boot集成antlr实现词法和语法分析
1.什么是antlr? Antlr4 是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。基本上是当前 Java 语言中使用最为广泛的语法生成器工具。Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询࿱…...
多线程中run()和start()的区别
我们知道,在多线程中 Thread thread new Thread(runnable); thread.start();以及 thread.run();都可以执行runnable中run方法下的代码,但是二者又有所不同 下面给出一段代码用以体现二者的区别: 以下代码中,通过thread.start()启…...
Nginx基础理论
Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中。这不仅仅是因为Nginx本身比较轻量,更多的是得益于Nginx的高性能特性,以及支持插件化开发,为此,很多开发者或者公司基于Nginx开发出了众多的…...
【QT5】<应用> 小游戏:贪吃蛇
文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现:游戏界面存在一条蛇🐍,使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物,蛇可以吃食物,然后…...
【Webpack】使用 Webpack 构建 Vue3+TS 项目
构建项目目录 tsc --init npm init -yshim.d.ts 文件是一个类型声明文件,用于告诉 TypeScript 编译器如何处理 Vue 的单文件组件(SFC)和其他自定义模块。为 Vue 的单文件组件和其他非 TypeScript 模块提供类型信息,以便在 TypeScr…...
数据防泄漏的六个步骤|数据防泄漏软件有哪些
在当前复杂多变的网络安全环境下,数据防泄漏软件成为了企业信息安全架构中不可或缺的一环。下面以安企神软件为例,告诉你怎么防止数据泄露,以及好用的防泄露软件。 1. 安企神软件 安企神软件是当前市场上备受推崇的企业级数据防泄漏解决方案…...
基于事件触发机制,具有延时矩阵的固定时间共识
基于事件触发机制,具有延时矩阵的固定时间共识在分布式系统中,共识问题一直是个老大难。今天咱们聊聊一个挺有意思的解决方案——基于事件触发机制,带有延时矩阵的固定时间共识。听起来有点高大上?别急,咱们慢慢拆解。…...
零基础玩转物联网:借助快马ai生成带详细注释的esp8266wifi连接新手教程代码
最近在折腾物联网项目,发现ESP8266这个WiFi模块特别适合新手入门。作为一个小白,刚开始接触硬件编程时真的是一头雾水,好在发现了InsCode(快马)平台,它能根据自然语言描述直接生成带详细注释的代码,大大降低了学习门槛…...
【Android Framework 实战】记一次 SurfaceFlinger 黑屏死机惨案:一个 static 解决的性能血案
【Android Framework 实战】记一次 SurfaceFlinger 黑屏死机惨案:一个 static 解决的性能血案 在 Android 系统的深度定制中,多设备兼容和屏幕旋转往往是深水区。最近在某 AOSP 平台的项目开发中,我遭遇了一个因为一行代码拖死整个 SurfaceFlinger 渲染线程导致的黑屏惨案。…...
刚刚!美团开源LongCat-Next,全模态模型保姆级教程(非常详细),从入门到精通,建议收藏!
昨天下午刷到了美团龙猫团队又开源了一个新模型-LongCat-Next。 这次有所不同,是一个原生全模态模型,可以接受文本、语音、图像的输入,生成文本、语音、图像,激活参数3B。 在训练上,通过分词器-反分词器对࿰…...
OpenClaw+Qwen3.5-9B:自动化竞品监测与分析报告生成
OpenClawQwen3.5-9B:自动化竞品监测与分析报告生成 1. 为什么需要自动化竞品监测 作为一位长期关注行业动态的技术从业者,我每周都要花费大量时间手动收集竞品信息。传统方式需要反复访问多个网站,复制粘贴内容到Excel,再人工分…...
硬件设计避坑指南:为什么你的AD原理图转PCB总会丢失元器件位号?
硬件工程师必看:AD原理图转PCB丢失元器件位号的深度解析与根治方案 每次打开Altium Designer准备将精心设计的原理图导入PCB时,却发现所有元器件位号神秘消失——这种场景对硬件工程师来说简直是一场噩梦。位号不仅是元器件在PCB上的身份标识,…...
C++轻量级HTTP库cpp-httplib:从嵌入式设备到企业服务的全场景解决方案
C轻量级HTTP库cpp-httplib:从嵌入式设备到企业服务的全场景解决方案 【免费下载链接】cpp-httplib A C header-only HTTP/HTTPS server and client library 项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib 在现代C开发中,构建网络…...
Qwen-Image-2512-Pixel-Art-LoRA 模型v1.0 系列作品展:构建一个完整的像素风奇幻世界
Qwen-Image-2512-Pixel-Art-LoRA 模型v1.0 系列作品展:构建一个完整的像素风奇幻世界 朋友们,今天不聊代码,不聊部署,咱们来看点“好玩”的。最近我深度体验了Qwen-Image-2512-Pixel-Art-LoRA模型,它最让我惊喜的&…...
Granite TimeSeries FlowState R1电商销量预测实战:Vue前端可视化大屏
Granite TimeSeries FlowState R1电商销量预测实战:Vue前端可视化大屏 最近和几个做电商的朋友聊天,他们都在头疼同一个问题:备货。备多了怕压库存,备少了又怕错过销售高峰,眼睁睁看着流量来了却没货可发。传统的经验…...
MeetingBar AppleScript自动化:会议开始前自动暂停音乐的终极指南
MeetingBar AppleScript自动化:会议开始前自动暂停音乐的终极指南 【免费下载链接】MeetingBar 🇺🇦 Your meetings at your fingertips in the macOS menu bar 项目地址: https://gitcode.com/gh_mirrors/me/MeetingBar MeetingBar是…...
