package main
import (
"bytes"
ct "contracts"
"encoding/hex"
"encoding/json"
"fmt"
"github.com/ethereum/go-ethereum/accounts/abi"
"io/ioutil"
"math/big"
"net/http"
"strings"
)
func main() {
// 略去一些信息
request, error := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
request.Header.Set("Content-Type", "application/json")
client := &http.Client{}
response, error := client.Do(request)
if error != nil {
panic(error)
}
defer response.Body.Close()
type LogData struct {
LogIndex string `json:"logIndex"`
TransactionIndex string `json:"transactionIndex"`
TransactionHash string `json:"transactionHash"`
BlockHash string `json:"blockHash"`
BlockNumber string `json:"blockNumber"`
Address string `json:"address"`
Data string `json:"data"`
Topics []string `json:"topics"`
Type string `json:"type"`
}
type RPCResult struct {
Jsonrpc string `json:"jsonrpc"`
Id int64 `json:"id"` // 声明对应的json key
Result []LogData `json:"result"`
}
type TransferEvent struct {
Destination string
Amount *big.Int
Nonce *big.Int
}
body, _ := ioutil.ReadAll(response.Body)
fmt.Println("response Body:", string(body))
var rpcres RPCResult
err := json.Unmarshal(body, &rpcres)
if err != nil {
fmt.Println(err)
}
fmt.Println(rpcres.Result[0].Data)
contractAbi, err := abi.JSON(strings.NewReader(string(ct.SubchainRegisterABI)))
if err != nil {
fmt.Println(err)
}
for _, logData := range rpcres.Result {
logData := logData
var event TransferEvent
h, _ := hex.DecodeString(logData.Data[2:])
err := contractAbi.UnpackIntoInterface(&event, "SendToSubchainEvent", h)
if err != nil {
fmt.Println(err)
}
fmt.Println(event)
}
}
从json返回的log data是0x开头的,需要将其去掉, 然后取剩下的十六进制数据,然后用hex.DecodeString将其解析。