【问题标题】:Event data from Smart Contract parsing issue with go-ethereum来自 go-ethereum 的智能合约解析问题的事件数据
【发布时间】:2023-01-31 14:45:32
【问题描述】:

我无法使用 types.Log 通道获取从 SC 事件发出的完整数据。有什么办法可以让我从发出的事件中获取所有数据吗?

我试图解析的事件:

PairCreated(address indexed,address indexed,address,uint)

我的代码:

for {
        select {
        case err := <-sub.Err():
            log.Fatal(err)
        case vLog := <-logs:
            fmt.Printf("Log Block Number: %d\n", vLog.BlockNumber)
            fmt.Printf("Log Index: %d\n", vLog.Index)

            event := make(map[string]interface{})
            err := contractAbi.UnpackIntoMap(event, "PairCreated", vLog.Data)
            if err != nil {
                log.Fatal(err)
            }
            fmt.Println(event)
        }
    }

我只能解析事件的最后两个参数。

【问题讨论】:

    标签: go go-ethereum


    【解决方案1】:

    我明白这里出了什么问题。 如果参数声明为 indexed,则该参数将转到 Topics 而不是 Data。并且最多可以有 3 个主题。所以,我试图解开主题但失败了。并通过以下方式成功:

    token1 := common.HexToAddress(vLog.Topics[1].Hex())
    token2 := common.HexToAddress(vLog.Topics[2].Hex())
    

    一对在Data

    所以,最终的代码是:

    for {
            select {
            case err := <-sub.Err():
                log.Fatal(err)
            case vLog := <-logs:
                fmt.Printf("Log Block Number: %d
    ", vLog.BlockNumber)
                fmt.Printf("Log Index: %d
    ", vLog.Index)
    
                event := make(map[string]interface{})
                err := contractAbi.UnpackIntoMap(event, "PairCreated", vLog.Data)
                if err != nil {
                    log.Fatal(err)
                }
                fmt.Println(event)
    
                token1 := common.HexToAddress(vLog.Topics[1].Hex())
                token2 := common.HexToAddress(vLog.Topics[2].Hex())
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 2018-12-07
      • 2020-03-14
      • 2022-10-23
      • 1970-01-01
      • 2022-06-23
      • 2022-12-17
      • 1970-01-01
      相关资源
      最近更新 更多