Ethereum以太坊事件日志查询参数

news2024/11/20 12:38:39

目录

  • 一、Ethereum事件日志查询参数
  • 二、需求
  • 三、实现
  • 四、其他

一、Ethereum事件日志查询参数

  • addresses:合约地址列表
  • fromBlock:开始区块
  • toBlock:结束区块
  • topics:主题数组
  • blockhash:区块哈希,优先级高于fromBlock、toBlock

这里主要介绍topics参数,其他参数都比较好理解,topics是长度为4的数组集合,topic分为2种:一种事件签名topic,另一种indexed索引参数值topic。
topics的的0号位子数组放事件签名哈希,1/2/3号位子数组对应放事件的indexed索引参数值对应的哈希。
以demo合约举例:

pragma solidity ^0.4.4;

contract Hello {
    string name;
    event LogSet(string s);
    event LogSet1(string indexed s1);
    event LogSet2(string indexed s1, string indexed s2);
    event LogSet3(string indexed s1, string indexed s2, string indexed s3);

    constructor() public {
        name = "hello";
    }

    function get() public view returns (string) {
        return name;
    }

    function set(string newName) public {
        name = newName;
        emit LogSet(newName);
        emit LogSet1(newName);
        emit LogSet2(newName, "name2");
        emit LogSet3(newName, "name2", "name3");
    }
}

如果合约调用set(“Tom”),事件LogSet3的1号位indexed索引参数值为"Tom",2号位为"name2",3号位为"name3"。
注意:
合约事件里最多只能有3个indexed索引参数。
如果事件定义改为:

event LogSet3(string indexed s1, string s2, string indexed s3);

事件LogSet3的1号位indexed索引参数值为"Tom",2号位为"name3",没有3号位。

二、需求

部署一个新的Hello合约,并调用一次set函数,以触发生成4条不同的事件日志。要求查询该合约的LogSet3事件日志。

三、实现

第一步,合约部署前,获取到最新块高,作为fromBlock,假设9684。
第二步,部署Hello合约,并调用set函数,入参newName=“Tom”,假设获取到新合约地址0x0dba67483eddb71a84ac0834cd4c8c89dc971d4b。
第三步,再次获取最新块高,作为toBlock,假设9686。
第四步,计算事件LogSet3(string,string,string)的签名,得到0x3e03ccf7099c79040ac78f368a6a038e5d7918b8504f8cc99fd4d1ae71181e7b。
第五步,计算第一个indexed索引参数值"Tom"的哈希0x6984758a5a2907300d836a0ed6101bb5426c0a4422c0d996e8bbf9e59bb8c7cc,计算第二个indexed索引参数值"name2"的哈希0x7d51639d4f8290223cffdcc7a75498fd9c00ab65e7daf27837046fec6a6d6504,计算第三个indexed索引参数值"name3"的哈希0x289ff8670e65b79f5a7c14daf83f381a29ae238fff49f37396cc9100fb243074。
第六步,组装日志查询请求参数,如下:

{
    "addresses": [
        "0x0dba67483eddb71a84ac0834cd4c8c89dc971d4b"
    ],
    "toBlock": "9686",
    "topics": [
        [
            "0x3e03ccf7099c79040ac78f368a6a038e5d7918b8504f8cc99fd4d1ae71181e7b"
        ],
        [
            "0x6984758a5a2907300d836a0ed6101bb5426c0a4422c0d996e8bbf9e59bb8c7cc"
        ],
        [
            "0x7d51639d4f8290223cffdcc7a75498fd9c00ab65e7daf27837046fec6a6d6504"
        ],
        [
            "0x289ff8670e65b79f5a7c14daf83f381a29ae238fff49f37396cc9100fb243074"
        ]
    ],
    "fromBlock": "9684"
}

实际上,如果指定了具体的Hello合约地址,请求参数里不需要第一个和第二个索引参数topic,也可以唯一区分开该合约的其他三个事件,如此,请求参数如下:

{
    "addresses": [
        "0x0dba67483eddb71a84ac0834cd4c8c89dc971d4b"
    ],
    "toBlock": "9686",
    "topics": [
        [
            "0x3e03ccf7099c79040ac78f368a6a038e5d7918b8504f8cc99fd4d1ae71181e7b"
        ],
        null,
        null,
        [
            "0x289ff8670e65b79f5a7c14daf83f381a29ae238fff49f37396cc9100fb243074"
        ]
    ],
    "fromBlock": "9684"
}

四、其他

如果事件参数中包含枚举类型,如何正确计算该事件签名的topic。
在solidity中的enum类型,实际上是无符号整数,当枚举数量是小于等于256(2的8次方)个,则enum是uint8类型的,如果大于256且小于等于65536(2的16次方),则enum是uint16类型的,以次类推。其实在remix中也可以看到,枚举内的数量小于256,枚举类型自动使用uint8,如下:
uint8
所以对上面的例子,事件签名DataSaved(ProofType,bytes)是错误的,DataSaved(enum,bytes)也是错误的。正确应该是DataSaved(uint8,bytes)
如果ProofType枚举的类型从2种变为257种,在remix里重新部署合约后,可以看到uint8自动变为uint16,如下:
uint16

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

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

相关文章

chatgpt赋能Python-python3_9_1怎么用

Python3.9.1是什么? Python是一种高级、动态、解释型语言,具有优雅简洁、易于学习和阅读、功能丰富的特点。Python 3.9.1是Python编程语言的一个版本,于2020年12月21日正式发布,是Python 3的最新稳定版本。它包含了许多新的特性、…

chatgpt赋能Python-python3_7降级3_6

Python 3.7降级3.6:为什么?如何做? 如果你是一个认真的Python开发者,你可能会对Python 3.7的某些改进感到兴奋。但是,在某些情况下,你可能需要将Python降级到3.6版本。在这篇文章中,我们将探讨…

网吧管理系统修正

文章目录 网吧管理系统修正1. 改动1:上机缴费2. 改动2:下机超时计费3. 改动3:注销强制下机操作4. 改动4:计费标准数据的获取与释放 网吧管理系统修正 Carry文件中,打开文件忘记关闭了,虽然C语言中不会报错…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第八届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 学习完了所有模块之后(LIS302考点取消了, 扩展板也找不到了,如果你能找到可能你不是在十四届省赛后买的扩展板), 跟省赛一样,先拿第…

这个屏幕录制太好用了!

哈喽,大家好!今天给各位小伙伴测试了一屏幕录制的小工具——ApowerREC。它是一款专业同步录制屏幕画面及声音的录屏软件。界面简洁,操作简单,支持实时编辑屏幕录像、创建计划任务、录制摄像头高清视频等功能。废话不多说&#xff…

汇编九、直接地址与寄存器、ROM和RAM

1、直接地址与寄存器 1.1、A和ACC (1)A是没有地址的,可以当作寄存器使用。 (2)ACC是有地址的,地址为E0H(查数据手册)。 (3)如果使用压栈操作,要用ACC。因为ACC可当做直接地址。 (4)如果使用位操作,要用ACC。因为ACC可位寻址。…

总结855

学习目标: 月目标:5月(张宇强化前10讲,背诵15篇短文,熟词僻义300词基础词) 周目标:张宇强化前3讲并完成相应的习题并记录,英语背3篇文章并回诵 每日必复习(5分钟&#…

chatgpt赋能Python-python3_9_2怎么安装

Python3.9.2的安装指南 Python是一种高级编程语言,广泛应用于各种领域,从数据科学到机器学习到Web应用程序。Python具有易学性和通用性,因此成为众多开发人员的首选语言。此篇文章将指导您如何安装Python3.9.2版本。 为什么选择Python3.9.2…

Packet Tracer – 对 VLAN 实施进行故障排除 – 方案 1

Packet Tracer – 对 VLAN 实施进行故障排除 – 方案 1 地址分配表 设备 接口 IP 地址 子网掩码 交换机端口 VLAN PC1 NIC 172.17.10.21 255.255.255.0 S2 F0/11 10 PC2 NIC 172.17.20.22 255.255.255.0 S2 F0/18 20 PC3 NIC 172.17.30.23 255.255.255.0…

一星期学mysql day2

文章目录 DQL(数据查询语言)基础查询条件查询聚合查询(聚合函数)分组查询注意事项 排序查询注意事项 分页查询注意事项 编写顺序DQL执行顺序 DCL 管理用户管理用户注意事项 权限控制注意事项 函数字符串函数数值函数日期函数流程函…

车辆管理系统的设计与实现

背景 4S店车辆系统,为用户随时随地查看4S店车辆信息提供了便捷的方法,更重要的是大大的简化了管理员管理4S店车辆信息的方式方法,更提供了其他想要了解4S店车辆信息及运作情况以及挑选方便快捷的可靠渠道。相比于传统的管理方法,…

chatgpt赋能Python-python3_8怎么安装numpy库

Python3.8怎么安装numpy库?一个详细的步骤指南 你是否想要在Python3.8中安装numpy库,但不知道如何开始?没问题,本篇文章将介绍Python3.8的numpy安装步骤。 什么是numpy? numpy是Python中的一个重要的数学计算库&…

chatgpt赋能Python-python3_7怎么保存

Python 3.7 - 新的保存方式 Python 语言是一种广泛使用的编程语言之一,它在数据分析、网络编程、科学计算等领域都得到了广泛的应用。Python 的一个新版本,Python 3.7,增加了一种新的保存方式,这种方式可以提高数据的保存效率&am…

ElasticSearch漫游 (5.RestClient初始化准备)

之前都是在客户端页面各种操作, 但是我们作为一个java开发者,需要使用代码的方式 来操作ES, 所以我们要先从 Rest Client 开始 准备数据 既然是ES 查数据 不整点测试数据 没法下饭是吧 先建个酒店表 搞点数据: (新手…

两款亲测非常优秀的压缩软件

哈喽,大家好。今天给大家带来两款超级好用的压缩软件,一款是老牌的WinRAR,另一款是开源的7-Zip。 这两款都是小编电脑上必备的压缩软件,至于为什么要装两款嘛,可能因为任性吧,哈哈。 一、测试演示参数 演…

nvm-windows安装和配置

1.下载nvm-windows https://github.com/coreybutler/nvm-windows/releases 进入后如下图 选择nvm-setup.exe下载 2.安装 2.1 运行安装包,同意协议,下一步 2.2 选择nvm的安装目录,安装路径名最好不要有空格 2.3 点击Next,设…

【CPP】NULL nullptr

文章目录 NULLnullptr总结Ref. NULL 在C中,NULL实际上是0.因为C中不能把void*类型的指针隐式转换成其他类型的指针(cpp是强类型语言),所以为了解决空指针的表示问题,C引入了0来表示空指针,这样就有了上述代…

Python 爬虫(七):pyspider 使用

1 简介 pyspider 是一个支持任务监控、项目管理、多种数据库,具有 WebUI 的爬虫框架,它采用 Python 语言编写,分布式架构。详细特性如下: 拥有 Web 脚本编辑界面,任务监控器,项目管理器和结构查看器&#…

chatgpt赋能Python-python3_8_6怎么用

Python 3.8.6 全面介绍及使用指南 Python是一种高级编程语言,广泛应用于Web开发、数据科学、人工智能等领域。Python 3.8.6是Python 3.x系列的最新版本,在性能、稳定性、开发效率等方面有了重大的提升。本文将对Python3.8.6进行全面介绍,并给…

【野火启明_瑞萨RA6M5】梦的开始 ---- 点灯(FSP库)

文章目录 一、FSP配置二、hal_entry入口函数三、封装 LED 设备驱动程序下载验证 一、FSP配置 对于 Keil 开发环境: 拷贝一份之前的 Keil 工程模板 “06_Template”, 然后将工程文件夹重命名为 “11_GPIO_LED”,并进入该文件夹里面双击 Keil …