玩以太坊链上项目的必备技能(事件-Solidity之旅十二)

news2024/11/14 15:03:17

事件(Events)

Solidity 中的事件(Events)与任何一种编程语言中事件(Events)一样。

一个事件(Events)是一个合约可继承的成员,它在触发(emit)时存储在交易日志中传递的参数。

EVM的日志设施下,事件(Events)被用来通知调用应用程序关于合约的当前状态。事件(Events)通知应用程序关于对合约和应用程序所做的改变,可以用来执行依赖逻辑。

如果外部实体需要该日志实际上存在于区块链中的证明,可以请求日志的Merkle证明. 但需要留意的是,由于合约中仅能访问最近的 256 个区块哈希,所以还需要提供区块头信息。

对日志的证明是可能的,如果一个外部实体提供了一个带有这种证明的合约,它可以检查日志是否真实存在于区块链中。

最多三个参数可以接收 indexed 属性(它是一个特殊的名为:ref:”主题” <abi_events> 的数据结构, 而不作为日志的数据部分)。 主题仅有 32 字节, 因此如果 引用类型]标记为索引项,则它们的 keccak-256 哈希值会被作为 主题topic 保存。

所有非索引 indexed 参数是 ABI-encoded 都将存储在日志的数据部分中。

主题topic 让我们可以可以搜索事件,比如在为某些事件过滤一些区块,还可以按发起事件的合同地址来过滤事件。

事件声明

事件(Events)在合约中被定义为全局的,并在其函数中被调用。事件(Events)是通过使用events关键字来声明的,后面是一个标识符和参数列表,并以分号结尾。参数值用于记录信息或执行条件逻辑。它的信息和值被保存为块内事务的一部分。不需要提供变量,只有数据类型就足够了。一个事件(Events)可以通过使用其名称和传递所需的参数从任何函数中调用。

event <eventName>(parameters) ;
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract eventExample {

    uint256 public value = 0;
    //声明一个时间  用于记录 调用者的地址
    event Increment(address owner);
    
    function getValue(uint _a, uint _b) public {
       //触发 事件
       emit Increment(msg.sender);
       value = _a + _b;
   }
}

在这里插入图片描述

添加了索引的事件,虽然方便了查找,但 gas fee更高了。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract eventExample {

    //声明一个时间  用于记录 调用者的地址
    event NewTrade(
       uint256 indexed date,
       address from,
       address indexed to,
       uint256 indexed amount
       );
       
   function trade(address to, uint256 amount) external  {
      emit NewTrade(block.timestamp, msg.sender, to,amount);
   }
}

在这里插入图片描述

使用javascript进行调用:

var abi = /* abi 由编译器产生 */;
var eventExampleABI = web3.eth.contract(abi);
var eventExample = eventExampleABI.at("0x1234...xlb67" /* 地址 */);

var tradeEvent = eventExample.NewTrade();

// 监听变化
tradeEvent.watch(function(error, result) {
    // 结果包含 非索引参数 以及 主题 topic
    if (!error)
        console.log(result);
});

// 或者通过传入回调函数,立即开始听监
var tradeEvent = eventExample.NewTrade(function(error, result) {
    if (!error)
        console.log(result);
});

除非你用 anonymous 声明事件(Events),否则事件(Events)签名的哈希值是一个 主题topic 。 同时也意味着对于匿名事件无法通过名字来过滤,仅能按合约地址过滤。 匿名事件的优势是他们部署和调用的成本更低。

由于交易日志只存储事件数据而不存储类型。你必须知道事件的类型,包括哪个参数被索引,以及该事件是否是匿名的,以便正确解释数据。 尤其是,有可能使用一个匿名事件来”伪造”另一个事件的签名。

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

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

相关文章

机器学习之分类-决策树随机森林

决策树 原理&#xff08;信息论&#xff09; 信息熵 信息&#xff1a;消除随机不定性的东西信息熵公式&#xff0c;单位bit H(X)−∑i1n(P(xi)log⁡bP(xi))H(X)-\sum^{n}_{i1}(P(x_i)\log_{b}P(x_i)) H(X)−i1∑n​(P(xi​)logb​P(xi​)) 信息增益 特征A对训练数据集D的信息…

Arthas常用命令和实践分享

一、序言 通常&#xff0c;本地开发环境无法访问生产环境。在实际工作中&#xff0c;我们会经常遇到在客户现场出现各种奇怪的问题&#xff0c;想要查看具体某个具体的对象&#xff0c;可能要打镜像&#xff0c;还要走银行内部的流程&#xff0c;整体很耗费时间&#xff0c;而…

【Python机器学习】Mean Shift、Kmeans聚类算法在图像分割中实战(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ Mean Shift算法是根据样本点分布密度进行迭代的聚类算法&#xff0c;它可以发现在空间中聚集的样本簇。簇中心是样本点密度最大的地方。 Mean Shift算法寻找一个簇的过程是先随机选择一个点作为初始簇中心&#xff0c;然后…

容器网络访问

网络分类 docker网络解决方案基于openstack平台&#xff0c;后演化为两派&#xff1a;一个是docker原生的CNM&#xff08;Container Network Model&#xff09;&#xff0c;另一个是兼容性更好的CNI&#xff08;Container Network Interface&#xff09; 单主机网络&#xff1…

【博学谷学习记录】超强总结,用心分享|架构师-容器编排 Kubernetes简介

文章目录一、k8s简介二、核心概念2.1 节点2.1.1 Master 节点2.1.2 Node2.2 Pod2.3 Replica Set2.4 Service2.5 Namespace一、k8s简介 k8s是市场上最好的容器编排工具之一。 Kubernetes 是一个开源项目&#xff0c;用于统一管理容器化的应用集群。 Kubernetes 负责在大规模服务…

疫苗预约系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

【AIOT】串口操作基于PyQT窗口工具编写

1. Serial Type 1.1. 物理接口形式 UART接口&#xff1a;通用异步收发器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;UART是串口收发的逻辑电路&#xff0c;这部分可以独立成芯片&#xff0c;也可以作为模块嵌入到其他芯片里&#xff0c;单片机、S…

【机器学习---03】感知机模型

文章目录1. 感知机模型是什么&#xff1f;有什么作用&#xff1f;2. 三要素2.1 模型2.2 策略2.3 算法1. 感知机模型是什么&#xff1f;有什么作用&#xff1f; 定义&#xff1a;感知机模型是建立将训练数据完全划分为2类的超平面。 注意&#xff1a; 由于感知机只关心将样本分开…

清越科技将开启申购:预计募资约8亿元,高裕弟为实际控制人

12月19日&#xff0c;苏州清越光电科技股份有限公司&#xff08;下称“清越科技”&#xff0c;SH:688496&#xff09;将开启申购。据贝多财经了解&#xff0c;清越科技本次上市的发行价格为9.16元/股&#xff0c;发行数量为9000万股&#xff0c;募资总额约为8.24亿元&#xff0…

深入哈希结构

目录 一、哈希结构概念 二、哈希冲突 三、哈希函数 3.1 哈希函数设计原则 3.2 常见哈希函数设计方法 1. 直接定址法--(常用) 2. 除留余数法--(常用) 3. 平方取中法 4. 折叠法 5. 随机数法 6. 数学分析法 3.3 处理key的局限性问题 四、通过闭散列解决哈希冲突 4.1…

GeoServer安装MBTiles插件

GeoServer安装MBTiles插件 之前介绍过GeoServer使用mvt插件来生成矢量切片&#xff0c;这种mvt切片本质上还是前台加载GeoJson数据&#xff0c;数据是由前端进行渲染加载的&#xff0c;数据存储在浏览器内存中&#xff0c;前台会承担渲染的压力&#xff0c;数据量过大的话&…

数字电子技术(六)时序逻辑电路

时序逻辑电路时序逻辑概述时序逻辑电路特点基本方程组时序逻辑电路的分类自启动同步时序逻辑电路的分析方法&#xff08;*考点&#xff09;分析步骤例题分析常用的时序逻辑电路模块寄存器与移位寄存器计数器二进制计数器十进制计数器任意进制计数器&#xff08;*考点&#xff0…

Python -- 高阶函数

目录 1.递归函数 2.匿名函数 3.高阶函数 3.1 定义一个变量指向函数 3.2 函数作为另一个函数的参数 3.3 函数作为另一个函数的返回值 1.递归函数 什么是递归函数&#xff1f; 如果一个函数在内部不调用其它的函数&#xff0c;而是自己本身的话&#xff0c;这个函数就是递归…

【SVM时序预测】基于matlab粒子群算法优化支持向量机PSO-SVM期贷时序数据预测【含Matlab源码 2289期】

⛄一、PSO-SVM介绍 1 SVM SVM是Vapnik提出的一种分类技术&#xff0c;这一技术具有坚实的统计理论基础。SVM可以将原始的数据映射到高维且线性可分的空间&#xff0c;扩展了线性不可分的样本数据&#xff0c;它是使用核函数将线性不可分转换为线性可分。 如果问题为线性不可分…

计算机毕业设计springboot+vue+elementUI进销存管理信息系统

项目介绍 本次系统设计是一个纺织企业进销存管理信息系统,主要目的是为了提升绿 岩纺织科技有限公司的进销存管理能力,实现绿岩纺织科技有限公司的采购/加 工管理、仓库管理、销售管理等功能。 1.基本信息模块 ;1;商品管理&#xff1a;主要包含商品信息的展示以及添加商品功能。…

Java+MySQL基于SSM的在线论坛交流系统

信息和交流是一个一直伴随着人类一生的话题,从人类诞生开始就已经拥有了这一概念,无论是远古时候的打猎还是现代化的多样化合作都离不开信息和交流。随着时代的积累,人们要面对的信息量也越来越大,任何一个人体单位的人类都不可能涉及到全部的知识,这就需要大家不断的进行交流才…

springboot之多数据源---1

一、多数据源的典型使用场景 在实际开发中&#xff0c;经常可能遇到在一个应用中可能需要访问多个数据库的情况。以下是两种典型场景&#xff1a; 1 业务复杂&#xff08;数据量大&#xff09; 数据分布在不同的数据库中&#xff0c;数据库拆了&#xff0c; 应用没拆。 一个公司…

Git 分布式版本控制工具 05SSH免登陆:如何使用SSH如何免密登录服务器~

6 ssh免登陆 SSH是目前比较可靠的专为远程登录会话和其他网络服务提供安全的协议。不同主机之间在进行通信时&#xff0c;一般都是需要输入密码进行验证&#xff0c; ssh免密码之后&#xff0c;只要通过指定主机地址和端口号就可以实现不同的计算机之间访问时&#xff0c;不需…

基于web的网上图书商城的设计与实现/图书购物系统

摘 要 本毕业设计的内容是设计并且实现一个基于JSP技术的网上图书商城。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;Tomcat网络信息服务作为应用服务器。网上图书商城的功能已基本实现&#xff0c;主要包括个人中心、图书分类管理、用户管理、图书信息管…

Android12指纹框架完全解析(一)

前言&#xff1a;自从Android6.0开始Google官方出了标准的Android指纹框架&#xff0c;结束了各家指纹厂商各自为政的局面&#xff0c;推动了电容指纹在Android的发展&#xff1b;自从2017年新思的屏下指纹方案横空出世&#xff0c;后边汇顶等指纹厂商跟进&#xff0c;Android …