Solidity智能合约中的事件和日志
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 记录合约中的重要操作
事件最常见的用途是记录合约中的重要操作,例如资金转移、合约状态变化等。对于代币合约,通常会使用 Transfer
和 Approval
事件来记录代币的转账和授权。
3.2 外部应用的监听
外部应用可以通过 Web3.js 或 Ethers.js 等库来监听链上的事件,从而获取合约执行中的实时状态。例如,DApp 可以监听 Transfer
事件来更新用户界面中的账户余额。
4. 索引事件参数
4.1 indexed
参数的作用
通过 indexed
关键字,事件参数可以被索引,这使得查询特定事件变得更加高效。带有 indexed
的参数可以在链上通过事件过滤器进行搜索。
event Transfer(address indexed from, address indexed to, uint256 value);
在上面的例子中,from
和 to
地址被标记为 indexed
,这意味着用户可以通过筛选 from
或 to
地址来过滤相应的事件日志。
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 消耗和日志的不可访问性。
相关文章:
Solidity智能合约中的事件和日志
1. Solidity 中的事件和日志概述 1.1 什么是事件? 在 Solidity 中,事件(Event)是一种允许智能合约与外部世界进行通信的机制。通过触发事件,可以记录合约执行中的关键操作,并将这些操作发送到链上。事件的…...
第四十一篇-Docker安装Neo4j
创建目录 mkdir /opt/neo4j-data创建 docker run \ -d --name neo4j \ -p 7474:7474 -p 7687:7687 \ -v /opt/neo4j-data/data:/data \ -v /opt/neo4j-data/logs:/logs \ -v /opt/neo4j-data//conf:/var/lib/neo4j/conf \ -v /opt/neo4j-data/plugins:/plugins \ --env NEO4J…...

数电基础(组合逻辑电路+Proteus)
1.组合逻辑电路 1.1组合逻辑电路的分析 1.1.1组合逻辑电路的定义 组合逻辑电路的定义 (1)对于一个逻辑电路,其输出状态在任何时刻只取决于同一时刻的输入状态,而与电路的原来状态无关,这种电路被定义为组合逻辑电路…...

自给自足:手搓了一个睡眠监测仪,用着怎么样?
很久不分享手搓党作品拉! 今天分享一个“基于毫米波雷达的睡眠监测仪”作品! 用Air700E开发板毫米波雷达,手搓一个开箱即用的睡眠监测仪,不花冤枉钱! 来仔细瞧瞧! 一、项目原理及硬件制作 毫米波是指频率…...

Miniforge详细安装教程(macOs和Windows)
(注:主要是解决商业应用anaconda收费问题,这是轻量级的代替,个人完全可以使用anaconda和miniconda) Miniforge 是一个轻量级的包管理器,类似于 Anaconda 和 Miniconda。它主要用于安装基于 conda 的 Python 环境,专注于…...
HDFS Shell作业1
1.在HDFS上建立/user/stu/自己学号,和/user/stu/input目录。 命令: hdfs dfs -mkdir -p /user/stu/22 hdfs dfs -mkdir /user/stu/input 2.用两种不同的方法上传albums.csv至HDFS的学号目录和input目录中。 命令: hdfs dfs -put par…...

工业交换机一键重启的好处
在当今高度自动化和智能化的工业环境中,工业交换机作为网络系统中至关重要的一环,其稳定性和可靠性直接影响到整个生产过程的顺利进行。为了更好地维护这些设备的健康运行,一键重启功能应运而生,并呈现出诸多显著的好处。 首先&am…...
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
全文目录: 前言一、PL/SQL基础语法1.1 变量声明变量声明示例: 二、记录类型与集合类型的使用2.1 记录类型记录类型的定义与使用 2.2 集合类型 三、PL/SQL表与关联数组3.1 PL/SQL表(嵌套表)嵌套表的定义与使用 3.2 关联数组关联数组…...

springboot系列--web相关知识探索二
一、映射 指的是与请求处理方法关联的URL路径,通过在Spring MVC的控制器类(使用RestController注解修饰的类)上使用注解(如 RequestMapping、GetMapping)来指定请求映射路径,可以将不同的HTTP请求映射到相应…...

Oracle 12c在Windows环境下安装
适合初学者使用的Oracle 12c在Windows环境下安装步骤、参数配置、常见问题及参数调优的详细补充说明。 一、Oracle 12c安装步骤 1. 准备工作 在安装Oracle 12c之前,确保你的系统满足以下要求: 操作系统:Oracle 12c支持的Windows版本包括Wi…...

Stable Diffusion绘画 | 来训练属于自己的模型:打标处理与优化
上一篇完成的打标工作,是为了获取提示词,让AI认识和学习图片的特征。 因此,合适、恰当、无误的提示词,对最终模型效果是相当重要的。 Tag 如何优化 通过软件自动生成的 Tag 只是起到快速建立大体架构的作用,里面会涉…...

【论文笔记】Visual Instruction Tuning
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Visual Instruction Tunin…...

ubuntu 设置静态IP
一、 ip addresssudo nano /etc/netplan/50-cloud-init.yaml 修改前: 修改后: # This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-inits # ne…...

Java 每日一刊(第19期):泛型
文章目录 前言1. 泛型概述1.1 不使用泛型 vs 使用泛型1.2 泛型的作用 2. 泛型的基本语法2.1 定义带类型参数的泛型类2.2 使用泛型类2.3 泛型方法 3. 泛型类型推断与钻石操作符3.1 类型推断3.2 钻石操作符 4. 通配符的使用4.1 无界通配符 <?>4.2 上界通配符 <? exten…...

windows下安装rabbitMQ并开通管理界面和允许远程访问
如题,在windows下安装一个rabbitMQ server;然后用浏览器访问其管理界面;由于rabbitMQ的默认账号guest默认只能本机访问,因此需要设置允许其他机器远程访问。这跟mysql的思路很像,默认只能本地访问,要远程访…...

深度剖析音频剪辑免费工具的特色与优势
是热爱生活的伙伴或者想要记录美好声音的普通用户,都可能会需要对音频进行剪辑处理。而幸运的是,现在有许多优秀的音频剪辑软件提供了免费版本,让我们能够轻松地施展音频剪辑的魔法。接下来,就让我们一同深入了解这些音频剪辑免费…...

Oracle中TRUNC()函数详解
文章目录 前言一、TRUNC函数的语法二、主要用途三、测试用例总结 前言 在Oracle中,TRUNC函数用于截取或截断日期、时间或数值表达式的部分。它返回一个日期、时间或数值的截断版本,根据提供的格式进行截取。 一、TRUNC函数的语法 TRUNC(date) TRUNC(d…...

【Spring Boot 入门一】构建你的第一个Spring Boot应用
一、引言 在当今的软件开发领域,Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸,为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程,让开发者能够专注于业务逻辑的实现。无论是构建小型的…...

PPT 快捷键使用、技巧
前言: 本文操作是以office 2021为基础的,仅供参考;不同版本office 的 ppt 快捷键 以及对应功能会有差异,需要实践出真知。 shift 移动 水平/垂直 移动 ; shift 放大/缩小 等比例放大 缩小 ; 正圆 正…...

Web安全 - 文件上传漏洞(File Upload Vulnerability)
文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...