来自智能合约解析go-ethereum问题的事件数据

y0u0uwnf  于 2023-02-01  发布在  Go
关注(0)|答案(1)|浏览(220)

我无法使用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)
        }
    }

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

sc4hvdpw

sc4hvdpw1#

我知道这里出了什么问题。如果一个参数被声明为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\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)

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

相关问题