Logs

在 Go 中正確將日誌主題轉換為 int64

  • February 27, 2019

我目前使用下面的程式碼從傳輸事件日誌中提取 ERC721 令牌 ID :

txHash := newLog.TxHash.Hex()
hexString := common.BytesToAddress(newLog.Topics[3].Bytes()).Hex()
flowerNum, _ := strconv.ParseUint(hexString, 0, 10)
flowerNumInt := int64(flowerNum)

flowerNumInt1023,即使txHash下面連結引用 FLOWER # 1133。此外,FLOWER #1023根本沒有傳輸事件,也沒有出現在下面連結的 tx 中。

https://etherscan.io/tx/0xe330601b05c54116da3b06dd17cf483ab3106fb969989458c8587aac1c34fbf3

我在轉換過程中做錯了嗎?

這是解碼日誌主題以獲取值的完整範例(在您的情況下,ID 為 uint64):

package main

import (
   "context"
   "fmt"
   "log"
   "math/big"

   "github.com/ethereum/go-ethereum/common"
   "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
   client, err := ethclient.Dial("https://mainnet.infura.io")
   if err != nil {
       log.Fatal(err)
   }

   txID := common.HexToHash("0xe330601b05c54116da3b06dd17cf483ab3106fb969989458c8587aac1c34fbf3")
   receipt, err := client.TransactionReceipt(context.Background(), txID)
   if err != nil {
       log.Fatal(err)
   }

   logID := "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
   for _, vLog := range receipt.Logs {
       if vLog.Topics[0].Hex() == logID {
           if len(vLog.Topics) > 2 {
               id := new(big.Int)
               id.SetBytes(vLog.Topics[3].Bytes())

               fmt.Println(id.Uint64()) // 1133
           }
       }
   }
}

引用自:https://ethereum.stackexchange.com/questions/67063