首页 > 其他分享 >ethereum.FilterQuery 日志查询处理自定义事件

ethereum.FilterQuery 日志查询处理自定义事件

时间:2024-11-08 22:20:07浏览次数:3  
标签:logv FilterQuery err 自定义 uint256 fmt 查询处理 common Println

  1. 前言: 在开发中也是遇到这个问题了,并非常见的Transfer,Approve等在ERC20中定义的事件,只要你的事件在sol文件中存在,那还好处理,但是如果不存在,刚开始接触的时候,你可能就有点懵,我也是找了两天,查阅了很多资料,并没什么niao用,偶然看见了区块浏览器中的log才恍然大悟。

  2. 问题:Uniswap闪兑事件金额统计,userA在sushi,uniswap中使用USDT兑换了某个代币,我们要统计这个人到底统计了多少这个代币?

  3. 构造查询:

    • 使用ethereum.FilterQuery构造查询,例如:
      	query := ethereum.FilterQuery{
        		FromBlock: big.NewInt(43804**3),
        		ToBlock:   big.NewInt(4380**7),
        		Addresses: []common.Address{
        			common.HexToAddress("0xcEc4*******a689"),
        			common.HexToAddress("0x7135a****7046"),
        		},
        		//Topics: [][]common.Hash{},
        	}
      
    • 注意事项:FromBlock And ToBlock 你一定要填写,不然就timeout了 数量很多很大,建议不要设置太大的交叉数值,一个Block也有很多数据的,可以在address里面写入你要筛选的地址,减少范围
  4. 执行查询:

    • 使用client.FilterLogs(context.Background(), query)执行查询,例如:
        logsList, err := w.client.FilterLogs(context.Background(), query)
      
  5. 筛选:

    • 获取调用函数签名
        functionSignature := "Swap(address,uint256,uint256,uint256,uint256,address)"
        eventSwapKey := crypto.Keccak256Hash([]byte(functionSignature)).Hex()
        fmt.Println("eventSwapKey", eventSwapKey)
      
    • 这里如何查看?
    • 前往区块浏览器 比如这个地址[随便找的]:
       https://bscscan.com/tx/0xcc77df7570e70abb743ba1dc45ee7457ebabdca1c154f4ce863a3a8e52da9bee#eventlog
      
      注意我们查看的是Logs 不是Overview
      示例图片
      Name就是方法名 将其拷贝下来 去掉除了类型意外所有的字符串空格,变成:
      Transfer(address,address,uint256)
      然后再生成key就可以了 就能和扫描出来的Topic一致
      因为这个方法一般合约都是基于ERC20创建,在你根据合约sol文件生成的时候,会有这个event,所以你很轻易的就能发现你的合约里面有一个ParseTransfer方法,
      PS: 但是如果你的合约里面没有这个方法怎么办 比如我的是一个Swap,他是uniswap中的一个方法,这个时候 你就要去Name后面的那个View Source中找到这个Event,然后Copy到你的合约中,随便找个位置丢下,然后重新生成Go文件,你就可以在你合约Go文件中找到这个ParseSwap方法 ,传入当前匹配的Log,就能很轻松的解析出这一个数据。例如我的:
      • Swap方法追踪:
        在这里插入图片描述

      • 合约中注入Swap方法
        在这里插入图片描述

      • 重新生成Go文件:

         abigen --abi .\build\Token.abi --bin .\bin\Token.bin --pkg token --out Token.go
        
      • 查看
        在这里插入图片描述

    • 这里所有的解析方法,都是有合约event事件支持的!!!
    • w.instance是NewToken得到的 你可以去查看你生成的go文件 检索Parse关键字

测试代码:

// QueryBlockInfo query block info
func (w *Web3TokenUseCase) QueryBlockInfo() error {
	query := ethereum.FilterQuery{
		FromBlock: big.NewInt(43****53),
		ToBlock:   big.NewInt(43****07),
		Addresses: []common.Address{
			common.HexToAddress("-------"),
			common.HexToAddress("-------"),
		},
		//Topics: [][]common.Hash{
		//	//{tokenABI.Events["Transfer"].ID},
		//},
	}
	logsList, err := w.client.FilterLogs(context.Background(), query)
	color.Red("[records] %d \n", len(logsList))
	if err != nil {
		panic(err)
	}
	functionSignature := "Swap(address,uint256,uint256,uint256,uint256,address)"
	eventSwapKey := crypto.Keccak256Hash([]byte(functionSignature)).Hex()
	fmt.Println("eventSwapKey", eventSwapKey)
	for _, logv := range logsList {
		event := logv.Topics[0].Hex()
		fmt.Println("event", event)
		if eventSwapKey != event {
			continue
		}
		swapInfo, err := w.instance.ParseSwap(logv)
		if err != nil {
			panic(err)
		}
		fmt.Println("== swapInfo", swapInfo)
		fmt.Println("record data", logv.Data)
		fmt.Println("record Address", logv.Address.Hex())
		fmt.Println("record Topics", logv.Topics)
		fmt.Println("record TxHash", logv.TxHash.Hex())
		fmt.Println("record BlockNumber", logv.BlockNumber)
		fmt.Println("record BlockNumber", logv.Index)

		fmt.Println("\n\n\n\n")
	}
	return nil
}

后面又什么坑再分享 有帮助点个赞

标签:logv,FilterQuery,err,自定义,uint256,fmt,查询处理,common,Println
From: https://blog.csdn.net/qq_18259599/article/details/143633611

相关文章

  • 【Linux】为终端命令自定义快件键并弹窗提醒 设置快捷键切换网络代理(Network Proxy)Dis
    【Linux】为终端命令自定义快件键并弹窗提醒设置快捷键切换网络代理(NetworkProxy)Disabled/Manual并弹窗提醒可以自定义快捷键执行终端命令,执行完毕会有弹窗提醒。下面给一个例子,设置快捷键切换网络代理(NetworkProxy)Disabled/Manual并弹窗提醒。适用于Ubuntu系统,为......
  • Qt 窗口强制禁用系统阴影(自定义菜单)
    解决方法当只使用Qt::FramelessWindowHint时,不会显示系统阴影,因为自定义菜单一般都会添加Qt::Popup,添加Qt::Popup后系统会默认添加阴影效果。在添加Qt::Popup后,继续添加Qt::NoDropShadowWindowHint枚举解决。 最小复现代码:QDialog*dia=newQDialog();dia->setW......
  • 前端Vue自定义个性化三级联动自定义简洁中国省市区picker选择器
    一、 前端组件概述前端组件开发在现代前端开发中占据着至关重要的地位。随着互联网的快速发展,前端应用的规模和复杂性不断增加,传统的开发方式已经难以满足需求。前端组件开发应运而生,成为提高开发效率、代码可维护性和可复用性的关键手段。二、 组件化的重要性通过将复......
  • windows下电脑自定义磁盘图标,u盘图标,文件夹图标
    闲言更改图标要确定有ico(icon)格式图片文件,文件比例1:1,一般像素大小比例推荐128:128确保文件后缀有显示目录闲言寻找或制作ico图片直接下载网络图片制作ico文件在线制作本地制作ico磁盘/U盘图标更改文件夹图标更改寻找或制作ico图片直接下载网络图片这里推荐阿里巴巴......
  • 学习笔记(二十八):ArkUi-自定义弹窗 (CustomDialog)
    概述:CustomDialog是自定义弹窗,可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗一、创建自定义弹框1、使用@CustomDialog装饰器装饰自定义弹窗,可在此装饰器内自定义弹窗内容//自定义弹框内容@CustomDialogst......
  • Jest进阶知识:深入测试 React Hooks-确保自定义逻辑的可靠性
    测试ReactHooks在React开发中,Hooks是一个非常重要的功能模块,允许开发者在函数组件中使用状态和其他React特性。自定义Hooks作为一种公共逻辑的抽离,经常被多个组件复用,因此对其测试是非常必要的。然而,由于Hooks必须在组件内部使用,直接测试它们并不像普通函数那......
  • netdxf中创建一个新的自定义视图
    需求是我想使用netdxf创建一个文件,插入一个长方体块进去,保存文件后打开就是我想要的视图,例如一个等二测的角度谢谢惊惊,南胜,鸿,和尚,大佬们关键1:DxfDocument.Viewport.ViewDirection关键2:向量与大小无关,只要等比例即可获取原图形中的视图角度,使用ifox的代码如下......
  • QCustomPlot添加自定义的图例,实现隐藏、删除功能(一)
    文章目录实现步骤:实现代码:代码讲解:功能说明:优化建议:其他参考:要实现一个支持勾选并可以控制曲线显示和隐藏的自定义QCPLegend类,可以通过继承QCPLegend并重写其相关方法来实现。我们需要添加一个自定义的复选框元素,并捕捉用户交互来实现曲线的隐藏......
  • Bootstrap Blazor自定义图片预览组件
            BootstrapBlazor的官方虽然有提供图片预览组件ImagePreviewer,但是,它是置于窗口顶层的,而且是全屏显示,如果业务中有在预览组件中添加其它功能的需求,它是不支持扩展的。    为此,我参考官方的源码,自己写了一个自定义图片预览组件,文件的源码在下面,可自行......
  • WinNTSetup 使用教程的框架,您可以根据自己的需求深入研究每个部分,特别是集成驱动、应
    WinNTSetupv5.3.5.2-InstallWindowsfromUSB-MSFNWinNTSetup官方原版多国语言版下载链接:https://www.mediafire.com/folder/53um6k2nmhvd5/https://www.mediafire.com/file/rbpu88tre4nxwbe/WinNTSetup_v5352.rar/fileWinNTSetupv5352初级使用教程大纲引言WinNTSet......