From ad4e6665ead7532b90ed08104459b2a46a75e9bb Mon Sep 17 00:00:00 2001 From: gmega Date: Mon, 22 Jun 2026 16:32:39 -0300 Subject: [PATCH] add libp2p and mix public keys to debug info --- storage/rest/json.nim | 41 +++++++++++++++++++++++++++++++++++++---- storage/utils/json.nim | 5 +++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/storage/rest/json.nim b/storage/rest/json.nim index f782a8fb..e2277a98 100644 --- a/storage/rest/json.nim +++ b/storage/rest/json.nim @@ -1,5 +1,9 @@ +import std/importutils + import pkg/questionable import pkg/libp2p +import pkg/libp2p_mix +import pkg/libp2p_mix/curve25519 import pkg/codexdht/discv5/node as dn import pkg/codexdht/discv5/routing_table as rt import ../node @@ -47,13 +51,20 @@ type version* {.serialize.}: string revision* {.serialize.}: string - DebugInfo* = object + DebugInfo* = object # Peer's ID id* {.serialize.}: PeerId + # peer addresses known by the libp2p switch addrs* {.serialize.}: seq[MultiAddress] - repo* {.serialize.}: string + # signed peer record (URI form) spr* {.serialize.}: Option[SignedPeerRecord] + # provider record (the one we announce for content we provide) providerRecord* {.serialize.}: Option[SignedPeerRecord] + # addresses contained in the provider record announceAddresses* {.serialize.}: seq[MultiAddress] + # libp2p public key + libp2pPubKey* {.serialize.}: string + # mix public key (for nodes that support mix) + mixPubKey* {.serialize.}: Option[FieldElement] table* {.serialize.}: RestRoutingTable storage* {.serialize.}: VersionInfo @@ -92,12 +103,34 @@ proc `%`*(obj: RestNodeId): JsonNode = % $obj.id proc init*(_: type DebugInfo, node: StorageNodeRef): DebugInfo = + let + peerInfo = node.switch.peerInfo + peerId = peerInfo.peerId + libp2pPubKeyBytes = peerInfo.publicKey.getBytes() + + # Cause there's no cannonical way to get your own key from MixProtocol + # that I'm aware of. + privateAccess(MixProtocol) + DebugInfo( - id: node.switch.peerInfo.peerId, - addrs: node.switch.peerInfo.addrs, + id: peerId, + addrs: peerInfo.addrs, spr: node.discovery.dhtRecord, providerRecord: node.discovery.providerRecord, announceAddresses: node.discovery.announceAddrs, table: RestRoutingTable.init(node.discovery.protocol.routingTable), storage: VersionInfo(version: $storageVersion, revision: $storageRevision), + # Serialization has no error contract in nim-serde, so we need to + # handle this here. + libp2pPubKey: + if libp2pPubKeyBytes.isErr: + $libp2pPubKeyBytes.error + else: + byteutils.toHex(libp2pPubKeyBytes.get), + mixPubKey: + if node.discovery.mixProto.isNil(): + none(FieldElement) + else: + # It's a bug if we don't have the peer in the pool, so let it throw an exception. + some(node.discovery.mixProto.mixNodeInfo.mixPubKey), ) diff --git a/storage/utils/json.nim b/storage/utils/json.nim index 744994aa..3450713e 100644 --- a/storage/utils/json.nim +++ b/storage/utils/json.nim @@ -4,7 +4,9 @@ from pkg/libp2p import import pkg/contractabi import pkg/codexdht/discv5/node as dn import pkg/codexdht/discv5/spr as spr +import pkg/libp2p_mix/curve25519 import pkg/serde/json +import pkg/stew/byteutils import pkg/questionable/results import ../errors @@ -31,3 +33,6 @@ func `%`*(obj: AddressInfo): JsonNode = func `%`*(obj: MultiAddress): JsonNode = % $obj + +func `%`*(obj: FieldElement): JsonNode = + %byteutils.toHex(fieldElementToBytes(obj))