Skip to content

Instantly share code, notes, and snippets.

@ixje
Last active June 13, 2024 07:05
Show Gist options
  • Save ixje/6a9e432a79b064c9e326f1438d84d0cc to your computer and use it in GitHub Desktop.
Save ixje/6a9e432a79b064c9e326f1438d84d0cc to your computer and use it in GitHub Desktop.
Get NEO node connected peer state info
package main
import (
"context"
"fmt"
"github.com/nspcc-dev/neo-go/pkg/io"
"github.com/nspcc-dev/neo-go/pkg/network"
"github.com/nspcc-dev/neo-go/pkg/network/capability"
"github.com/nspcc-dev/neo-go/pkg/network/payload"
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
"log"
"net"
"sync"
"time"
)
func main() {
opts := rpcclient.Options{}
c, err := rpcclient.New(context.TODO(), os.Args[1], opts)
if err != nil {
log.Fatalf("faild to create new RPC client: %v", err)
}
err = c.Init()
if err != nil {
log.Fatalf("failed to initialise RPC client: %v", err)
}
peers, err := c.GetPeers()
if err != nil {
return
}
var wg sync.WaitGroup
for _, p := range peers.Connected {
addr := fmt.Sprintf("%s:%d", p.Address, p.Port)
wg.Add(1)
go collectAndPrint(addr, &wg)
}
wg.Wait()
}
func collectAndPrint(addr string, wg *sync.WaitGroup) {
defer wg.Done()
conn, err := net.DialTimeout("tcp", addr, 3*time.Second)
if err != nil {
//log.Printf("failed to connect to peer %q: %v", addr, err)
return
}
r := io.NewBinReaderFromIO(conn)
m := network.Message{}
err = m.Decode(r)
if err != nil {
return
}
if p, ok := m.Payload.(*payload.Version); ok {
for _, c := range p.Capabilities {
if c.Type == capability.FullNode {
height := c.Data.(*capability.Node).StartHeight
fmt.Printf("%22s - %7d - %s\n", addr, height, p.UserAgent)
break
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment