diff --git a/libp2p/peerstore.nim b/libp2p/peerstore.nim index c9d245b07..b216daa94 100644 --- a/libp2p/peerstore.nim +++ b/libp2p/peerstore.nim @@ -63,6 +63,7 @@ type KeyBook* {.public.} = ref object of PeerBook[PublicKey] AgentBook* {.public.} = ref object of PeerBook[string] + LastSeenBook* {.public.} = ref object of PeerBook[Opt[MultiAddress]] ProtoVersionBook* {.public.} = ref object of PeerBook[string] SPRBook* {.public.} = ref object of PeerBook[Envelope] @@ -145,10 +146,16 @@ proc del*(peerStore: PeerStore, peerId: PeerId) {.public.} = for _, book in peerStore.books: book.deletor(peerId) -proc updatePeerInfo*(peerStore: PeerStore, info: IdentifyInfo) = - if info.addrs.len > 0: +proc updatePeerInfo*( + peerStore: PeerStore, + info: IdentifyInfo, + observedAddr: Opt[MultiAddress] = Opt.none(MultiAddress), +) = + if len(info.addrs) > 0: peerStore[AddressBook][info.peerId] = info.addrs + peerStore[LastSeenBook][info.peerId] = observedAddr + info.pubkey.withValue(pubkey): peerStore[KeyBook][info.peerId] = pubkey @@ -200,7 +207,7 @@ proc identify*(peerStore: PeerStore, muxer: Muxer) {.async.} = knownAgent = shortAgent muxer.connection.setShortAgent(knownAgent) - peerStore.updatePeerInfo(info) + peerStore.updatePeerInfo(info, stream.observedAddr) finally: await stream.closeWithEOF() diff --git a/tests/testswitch.nim b/tests/testswitch.nim index f58e1d7d6..eb645b14a 100644 --- a/tests/testswitch.nim +++ b/tests/testswitch.nim @@ -842,6 +842,8 @@ suite "Switch": switch1.peerStore[AddressBook][switch2.peerInfo.peerId] == switch2.peerInfo.addrs switch1.peerStore[ProtoBook][switch2.peerInfo.peerId] == switch2.peerInfo.protocols + switch1.peerStore[LastSeenBook][switch2.peerInfo.peerId].isSome() + switch1.peerInfo.peerId notin switch2.peerStore[AddressBook] switch1.peerInfo.peerId notin switch2.peerStore[ProtoBook]