Solidity 小白教程:12. 事件

news2024/12/23 23:34:58

Solidity 小白教程:12. 事件

这一讲,我们用转账 ERC20 代币为例来介绍solidity中的事件(event)。

事件

Solidity中的事件(event)是EVM上日志的抽象,它具有两个特点:

  • 响应:应用程序(ethers.js)可以通过RPC接口订阅和监听这些事件,并在前端做响应。
  • 经济:事件是EVM上比较经济的存储数据的方式,每个大概消耗 2,000 gas;相比之下,链上存储一个新变量至少需要 20,000 gas

声明事件

事件的声明由event关键字开头,接着是事件名称,括号里面写好事件需要记录的变量类型和变量名。以ERC20代币合约的Transfer事件为例:

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

我们可以看到,Transfer事件共记录了 3 个变量fromtovalue,分别对应代币的转账地址,接收地址和转账数量,其中fromto前面带有indexed关键字,他们会保存在以太坊虚拟机日志的topics中,方便之后检索。

释放事件

我们可以在函数里释放事件。在下面的例子中,每次用**_transfer()函数进行转账操作的时候,都会释放Transfer**事件,并记录相应的变量。

// 定义_transfer函数,执行转账逻辑
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) external {

        _balances[from] = 10000000; // 给转账地址一些初始代币

        _balances[from] -=  amount; // from地址减去转账数量
        _balances[to] += amount; // to地址加上转账数量

        // 释放事件
        emit Transfer(from, to, amount);
    }

EVM 日志 Log

以太坊虚拟机(EVM)用日志Log来存储Solidity事件,每条日志记录都包含主题topics和数据data两部分。
image.png

主题 Topics

日志的第一部分是主题数组,用于描述事件,长度不能超过4。它的第一个元素是事件的签名(哈希)。对于上面的Transfer事件,它的签名就是:

keccak256("Transfer(addrses,address,uint256)")

//0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

除了事件签名,主题还可以包含至多3indexed参数,也就是Transfer事件中的fromto
indexed标记的参数可以理解为检索事件的索引“键”,方便之后搜索。每个 indexed 参数的大小为固定的 256 比特,如果参数太大了(比如字符串),就会自动计算哈希存储在主题中。

数据 Data

事件中不带 indexed的参数会被存储在 data 部分中,可以理解为事件的“值”。data 部分的变量不能被直接检索,但可以存储任意大小的数据。因此一般 data 部分可以用来存储复杂的数据结构,例如数组和字符串等等,因为这些数据超过了 256 比特,即使存储在事件的 topic 部分中,也是以哈希的方式存储。另外,data 部分的变量在存储上消耗的 gas 相比于 topic 更少。

Remix演示

Event.sol 合约为例,编译部署。
然后调用 _transfer 函数。
image.png
点击右侧的交易查看详情,可以看到日志的具体内容。
image.png

在 etherscan 上查询事件

我们尝试用**_transfer()函数在Rinkeby测试网络上转账 100 代币,可以在etherscan上查询到相应的tx**:网址。
点击Logs按钮,就能看到事件明细:

Topics里面有三个元素,[0]是这个事件的哈希,[1][2]是我们定义的两个indexed变量的信息,即转账的转出地址和接收地址。Data里面是剩下的不带indexed的变量,也就是转账数量。

总结

这一讲,我们介绍了如何使用和查询solidity中的事件。很多链上分析工具包括NansenDune Analysis都是基于事件工作的。

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

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

相关文章

外传-Midjourney的局部重绘功能

今天在抄袭。。。啊不,借鉴 midjourney 官网教程的时候,发现多了一个 局部重绘的功能,意外发觉还不错,分享一下用法。 先给大家说一下,我这段时间都在学习 SD,局部重绘是基操,而 MJ 一直是次次…

react实现一个搜索部门(input + tree)

目录 react实现一个搜索部门(input tree)searchDept.jsxtreeData.js使用组件效果 react实现一个搜索部门(input tree) searchDept.jsx import React, { useState, useEffect } from "react"; import StyleDeptId from "styled-components"; import Spl…

数据链路层重点协议-以太网

以太网简介 "以太网" 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了 一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等; 以太网数据帧…

用python使用pyautogui库实现按键精灵模拟鼠标键盘找图的功能

用到库pyautogui 目前只能在python2.7.13上使用。在python3上不能用。所以运行程序前要设置pycharm。 使用pyautogui当然首先要安装。在cmd的默认是python2的环境下安装。 可以上https://pypi.org/查看一下 因为好久没有安装新包了,看来新版本已经可以支持python3…

C++:类和对象(三)

本文主要介绍初始化列表、static成员、友元、内部类、匿名对象、拷贝对象时编译器的优化。 目录 一、再谈构造函数 1.构造函数体赋值 2.初始化列表 3.explicit关键字 二、static成员 1.概念 2.特性 三、友元 1.友元函数 2.友元类 四、内部类 五、匿名对象 六、拷…

代码随想录算法训练营day45|70. 爬楼梯(进阶版)|322. 零钱兑换|279.完全平方数

70. 爬楼梯(进阶版) 一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢? 1阶,2阶,… m阶就是物品,楼顶就是背包。 每一阶可以重复使用&#…

系统架构设计高级技能 · 软件产品线

现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 软件产品线 一、产品线概述二、产品线的过程模型2.1 双生命…

AI绘画:StableDiffusion实操教程-诛仙-碧瑶(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程:“AI绘画:Stable Diffusion 终极宝典:从入门到精通 ” 不久前,我与大家分享了StableDiffusion的全面教程:“AI绘画:Stable Diffusion 终极宝典&#xff…

微调 TrOCR – 训练 TrOCR 识别弯曲文本

TrOCR(基于 Transformer 的光学字符识别)模型是性能最佳的 OCR 模型之一。在我们之前的文章中,我们分析了它们在单行打印和手写文本上的表现。然而,与任何其他深度学习模型一样,它们也有其局限性。TrOCR 在处理开箱即用的弯曲文本时表现不佳。本文将通过在弯曲文本数据集上…

Canvas怎样修改线条的宽度、颜色和形状?

在Canvas中,线的默认颜色为黑色,宽度为lpx,但我们可以使用相关属性为线添加不同的样式。下面我们将从宽度、描边颜色、端点形状3方面详细讲解线条样式的设置方法。 1.设置线条宽度 使用lineWidth属性可以定义线的宽度,该属性的取…

第三方电脑安装小爱同学

首先下面这个是小爱同学的商店地址,如图1: 查看链接(小爱同学 - Microsoft Store 应用程序) 打开微软应用商店后到上面的网页点击获取 安装完成后 点击miservice 点击隐私协议勾选同意 打开小爱同学登录小米账号即可开始使用 2…

UG\NX CAM二次开发 设置工序切削区域 UF_CAMGEOM_append_item

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置工序切削区域 UF_CAMGEOM_append_item 效果: 代码: static int init_proc(UF_UI_selection_p_t select, void* user_data) { int errorCode = 0; int num_triples = 1;//UF_UI_mask_…

打印剪刀手“耶”(V形)

用给定单个字符和首行宽度(奇数), 打印首行宽度为给定奇数“V”字形状)。 (本笔记适合Py 推崇的插件字符串格式化的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全…

UG\NX CAM二次开发 设置安全平面的起点和法向 UF_CAM_set_auto_blank

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置安全平面的起点和法向 UF_CAM_set_auto_blank 效果: 代码: void MyClass::do_it() { //获取加工环境tagtag_t setup_tag=NULL_TAG;UF_SETUP_ask_setup(&setup_tag);//返回当前工序导…

抓包工具Fiddler的下载与设置

1.在浏览器搜索Fiddler,找到下载Fiddler的官网‘ 2.选择Fiddler Classic 点击Learn more 3.填写邮箱信息进行下载 设置Fiddler可以对HTTPS协议进行抓包(刚下载只能对HTTP进行抓包) 1.点击Tools,选择Options,选择HTTP…

ChatGPT 太贵?一键部署自己的私有大模型

部署你的私有化对话机器人,只需要三步: 克隆 github 中文版 LLaMa repo下载 HuggingFace 13B 16K 完整模型启动对话窗口 没错,就是这么简单 我把这份操作指南,做成了一份 Jupyter Notebook 分享给大家,以下是链接&…

堆相关例子-排序最多移动k距离

题目: 一个几乎有序的数组。几乎有序是指:如果把数组排好序,每个数的移动距离一定不超过K,并且K一定远小于数组长度 分析: 给定的数组有上面的限制条件,根据条件可以分析得到: 对于前0-k个数…

java项目基于 SSM+JSP 的人事管理系统

java项目基于 SSMJSP 的人事管理系统 博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好,今天和大家聊的是 Java 基于 SSM 的人事管理系统。…

李宏毅深度学习self-attentin学习笔记

self-attention 一、self-attention的起源二、self-attention网络架构三、multi-head self-attention四、positional encoding五、pytorch实现 一、self-attention的起源 self-attention初始也是用于解决seq2seq的问题。即input是一堆序列,而output也是一段长度固定…

【LeetCode: 210. 课程表 II:拓扑排序+图】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…