From 8f4c72c579e25b9c191dbc1eeea0f3a6f63341f5 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 26 Mar 2024 19:35:48 +0100 Subject: [PATCH] p2p/discover: add debug API --- p2p/discover/node.go | 6 ++++++ p2p/discover/table.go | 19 ++++++++++--------- p2p/discover/v4_udp.go | 4 ++++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/p2p/discover/node.go b/p2p/discover/node.go index 9ffe101ccf..079fed8852 100644 --- a/p2p/discover/node.go +++ b/p2p/discover/node.go @@ -29,6 +29,12 @@ import ( "github.com/ethereum/go-ethereum/p2p/enode" ) +type BucketNode struct { + Node *enode.Node `json:"node"` + AddedAt time.Time `json:"added"` + Checks int `json:"checks"` +} + // node represents a host on the network. // The fields of Node may not be modified. type node struct { diff --git a/p2p/discover/table.go b/p2p/discover/table.go index 2b7a28708b..46e6401448 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -150,18 +150,19 @@ func newMeteredTable(t transport, db *enode.DB, cfg Config) (*Table, error) { } // Nodes returns all nodes contained in the table. -func (tab *Table) Nodes() []*enode.Node { - if !tab.isInitDone() { - return nil - } - +func (tab *Table) Nodes() [][]BucketNode { tab.mutex.Lock() defer tab.mutex.Unlock() - var nodes []*enode.Node - for _, b := range &tab.buckets { - for _, n := range b.entries { - nodes = append(nodes, unwrapNode(n)) + nodes := make([][]BucketNode, len(tab.buckets)) + for i, b := range &tab.buckets { + nodes[i] = make([]BucketNode, len(b.entries)) + for j, n := range b.entries { + nodes[i][j] = BucketNode{ + Node: &n.Node, + Checks: int(n.livenessChecks), + AddedAt: n.addedAt, + } } } return nodes diff --git a/p2p/discover/v4_udp.go b/p2p/discover/v4_udp.go index 44b1f5305c..c2de12133c 100644 --- a/p2p/discover/v4_udp.go +++ b/p2p/discover/v4_udp.go @@ -375,6 +375,10 @@ func (t *UDPv4) RequestENR(n *enode.Node) (*enode.Node, error) { return respN, nil } +func (t *UDPv4) TableBuckets() [][]BucketNode { + return t.tab.Nodes() +} + // pending adds a reply matcher to the pending reply queue. // see the documentation of type replyMatcher for a detailed explanation. func (t *UDPv4) pending(id enode.ID, ip net.IP, ptype byte, callback replyMatchFunc) *replyMatcher {