bnb-chain / go-sdk

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Websocket subscription gets closed after a few minutes

tajelp opened this issue · comments

commented

Hello there, I am trying to get transactions data in real-time with the official go sdk. Everything is okay except for the fact that the wss seems to get interrupted after a few minutes, so I am not able to get new data anymore and I would have to constantly restart the script. Here's the relevant code:

package main

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	"github.com/bnb-chain/go-sdk/client/rpc"
	"github.com/bnb-chain/go-sdk/types"
	"github.com/bnb-chain/go-sdk/types/tx"
	ctypes "github.com/bnb-chain/go-sdk/common/types"
	"github.com/bnb-chain/go-sdk/keys"
	"time"
	"reflect"
)

type EventData struct {
	Tx string `json:"tx"`
}

type Input struct {
	Address string `json:"address"`
	Coins   []struct {
		Denom  string `json:"denom"`
		Amount int64  `json:"amount"`
	} `json:"coins"`
}

type Output struct {
	Address string `json:"address"`
	Coins   []struct {
		Denom  string `json:"denom"`
		Amount int64  `json:"amount"`
	} `json:"coins"`
}

type Msg struct {
	Inputs  []Input  `json:"inputs"`
	Outputs []Output `json:"outputs"`
}

type DecodedTx struct {
	Msg        []Msg `json:"msg"`
	Signatures []struct {
		PubKey      string `json:"pub_key"`
		Signature   string `json:"signature"`
		AccountNum  int64  `json:"account_number"`
		Sequence    int64  `json:"sequence"`
	} `json:"signatures"`
	Memo   string      `json:"memo"`
	Source int64       `json:"source"`
	Data   interface{} `json:"data"`
}

type Coins []Coin

type Coin struct {
    Denom  string `json:"denom"`
    Amount int64  `json:"amount"`
}

func scanMempool() {
        BNBClient = rpc.NewRPCClient("dataseed1.binance.org:80", ctypes.ProdNetwork)
	query := "tm.event = 'Tx'"
	events, err := BNBClient.Subscribe(query, 100)
	if err != nil {
		fmt.Println("Error while subscribing", err)
		return
	}
	
	for event := range events {
		fmt.Printf("[%s] new event\n", time.Now().UTC().Format("2006-01-02 15:04:05 GMT"))
		eventDataBytes, err := json.Marshal(event.Data)
		if err != nil {
			fmt.Println("Error converting TMEventData to bytes:", err)
			continue
		}

		var eventData EventData
		err = json.Unmarshal(eventDataBytes, &eventData)
		if err != nil {
			fmt.Println("Error unmarshaling event data:", err)
			continue
		}

		txBytes, err := base64.StdEncoding.DecodeString(eventData.Tx)
		if err != nil {
			fmt.Println("error:", err)
			continue
		}

		txs := []string{
			string(txBytes),
		}

		codec := types.NewCodec()
		parsedTxs := make([]tx.StdTx, len(txs))
		
		for i := range txs {
			err := codec.UnmarshalBinaryLengthPrefixed([]byte(txs[i]), &parsedTxs[i])
			if err != nil {
				fmt.Println("Failed to unmarshal transaction:", err)
				continue
			}

			// Extract and print the inputs and destination address
			for _, tx := range parsedTxs {
				txBytes, err := json.Marshal(tx)
				if err != nil {
					fmt.Println("Failed to marshal transaction:", err)
					continue
				}

				var decodedTx DecodedTx
				err = json.Unmarshal(txBytes, &decodedTx)
				if err != nil {
					fmt.Println("Failed to unmarshal decoded transaction:", err)
					continue
				}

				for _, msg := range decodedTx.Msg {
					for _, input := range msg.Inputs {
						fmt.Println("Input Address:", input.Address)
						for _, coin := range input.Coins {
							fmt.Println("Coin Denom:", coin.Denom)
							fmt.Println("Coin Amount:", coin.Amount)
						}
					}

					for _, output := range msg.Outputs {
						fmt.Println("Output Address:", output.Address)
					}
				}
				fmt.Println("-")
			}
		}
	}
}

And here's a sample output:

[2023-08-15 12:03:06 GMT] new event
Input Address: bnb1fnd0k5l4p3ck2j9x9dp36chk059w977pszdgdz
Coin Denom: DOGE-B67
Coin Amount: 40557400000
Output Address: bnb1rw2q5m33e90h9yuzsjuquh2xhffy9qga5v8p04
-
[2023-08-15 12:03:13 GMT] new event
Input Address: bnb1xrfwzlu9c5208lhtn7ywt0mjrhjh4nt4fjyqxy
Coin Denom: BNB
Coin Amount: 1186198
Output Address: bnb1a777eq69f2rmjqxllk2fy9sj93narq9z7knetg
-
[2023-08-15 12:03:26 GMT] new event
Input Address: bnb1fnd0k5l4p3ck2j9x9dp36chk059w977pszdgdz
Coin Denom: BNB
Coin Amount: 3700525
Output Address: bnb1q5mjgexmxfdtk86x9erm6de9lx5jruhw7295lh
-
[2023-08-15 12:03:39 GMT] new event
Input Address: bnb1tel566az93u7g6sc0jg49rxwdvk4yqz96ggnad
Coin Denom: BUSD-BD1
Coin Amount: 170000000000
Output Address: bnb17dntvsztw8pyul7904cstg9rs50dv96r2elmpc
-
[2023-08-15 12:03:50 GMT] new event
-
[2023-08-15 12:03:50 GMT] new event
-

Then I get no more events, all stuck. Why? Can somebody help me, please?

commented

Here's the go.mod:

module EvnetbndGocode

go 1.17

require github.com/bnb-chain/go-sdk v1.3.2

require (
        github.com/mattn/go-sqlite3 v1.14.17 // indirect
        gopkg.in/resty.v1 v1.12.0 // indirect
)

require (
        github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d // indirect
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/bgentry/speakeasy v0.1.0 // indirect
        github.com/bnb-chain/ics23 v0.1.0 // indirect
        github.com/bnb-chain/node v0.10.7 // indirect
        github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
        github.com/btcsuite/btcd/btcutil v1.1.3 // indirect
        github.com/cespare/xxhash/v2 v2.1.2 // indirect
        github.com/cosmos/cosmos-sdk v0.47.3 // indirect
        github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d // indirect
        github.com/cosmos/ledger-go v0.9.2 // indirect
        github.com/davecgh/go-spew v1.1.1 // indirect
        github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
        github.com/etcd-io/bbolt v1.3.3 // indirect
        github.com/fsnotify/fsnotify v1.4.9 // indirect
        github.com/go-kit/kit v0.9.0 // indirect
        github.com/go-logfmt/logfmt v0.5.1 // indirect
        github.com/gogo/protobuf v1.3.2 // indirect
        github.com/golang/protobuf v1.5.2 // indirect
        github.com/golang/snappy v0.0.4 // indirect
        github.com/google/btree v1.0.0 // indirect
        github.com/gorilla/mux v1.7.3 // indirect
        github.com/gorilla/websocket v1.5.0 // indirect
        github.com/hashicorp/golang-lru v0.5.3 // indirect
        github.com/hashicorp/hcl v1.0.0 // indirect
        github.com/inconshreveable/mousetrap v1.0.0 // indirect
        github.com/jmhodges/levigo v1.0.0 // indirect
        github.com/libp2p/go-buffer-pool v0.0.2 // indirect
        github.com/magiconair/properties v1.8.1 // indirect
        github.com/mattn/go-isatty v0.0.10 // indirect
        github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
        github.com/mitchellh/go-homedir v1.1.0 // indirect
        github.com/mitchellh/mapstructure v1.1.2 // indirect
        github.com/pelletier/go-toml v1.4.0 // indirect
        github.com/pkg/errors v0.9.1 // indirect
        github.com/pmezard/go-difflib v1.0.0 // indirect
        github.com/prometheus/client_golang v1.14.0 // indirect
        github.com/prometheus/client_model v0.3.0 // indirect
        github.com/prometheus/common v0.37.0 // indirect
        github.com/prometheus/procfs v0.8.0 // indirect
        github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 // indirect
        github.com/rs/cors v1.6.0 // indirect
        github.com/spf13/afero v1.2.2 // indirect
        github.com/spf13/cast v1.3.0 // indirect
        github.com/spf13/cobra v0.0.5 // indirect
        github.com/spf13/jwalterweatherman v1.1.0 // indirect
        github.com/spf13/pflag v1.0.3 // indirect
        github.com/spf13/viper v1.4.0 // indirect
        github.com/stretchr/testify v1.8.1 // indirect
        github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
        github.com/tendermint/btcd v0.1.1 // indirect
        github.com/tendermint/go-amino v0.15.0 // indirect
        github.com/tendermint/iavl v0.12.4 // indirect
        github.com/tendermint/tendermint v0.35.9 // indirect
        github.com/zondax/hid v0.9.0 // indirect
        github.com/zondax/ledger-cosmos-go v0.9.9 // indirect
        golang.org/x/crypto v0.5.0 // indirect
        golang.org/x/net v0.7.0 // indirect
        golang.org/x/sys v0.5.0 // indirect
        golang.org/x/text v0.7.0 // indirect
        google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect
        google.golang.org/grpc v1.31.0 // indirect
        google.golang.org/protobuf v1.28.1 // indirect
        gopkg.in/yaml.v2 v2.4.0 // indirect
        gopkg.in/yaml.v3 v3.0.1 // indirect; indirectclient := client.New("wss://stream.binance.org:9443/ws")
)

replace (
        github.com/cosmos/cosmos-sdk => github.com/bnb-chain/bnc-cosmos-sdk v0.26.3
        github.com/tendermint/go-amino => github.com/bnb-chain/bnc-go-amino v0.14.1-binance.2
        github.com/tendermint/iavl => github.com/bnb-chain/bnc-tendermint-iavl v0.12.0-binance.5
        github.com/tendermint/tendermint => github.com/bnb-chain/bnc-tendermint v0.32.3-bc.10
        github.com/zondax/ledger-cosmos-go => github.com/bnb-chain/ledger-cosmos-go v0.9.10-0.20230201065744-d644bede1667
        github.com/zondax/ledger-go => github.com/bnb-chain/ledger-go v0.9.1
        golang.org/x/crypto => github.com/tendermint/crypto v0.0.0-20190823183015-45b1026d81ae
)