From 9ba5c069c85c874e0ade3eb2d0143399250fbb00 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Wed, 13 Apr 2022 09:35:28 +0200 Subject: [PATCH] Update SPR when the PeerInfo changes (#711) --- libp2p/peerinfo.nim | 26 +++++++++++++++----------- libp2p/protocols/identify.nim | 4 ++-- libp2p/switch.nim | 2 ++ tests/testidentify.nim | 2 +- tests/testpeerinfo.nim | 2 +- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/libp2p/peerinfo.nim b/libp2p/peerinfo.nim index da9c266..af1ad98 100644 --- a/libp2p/peerinfo.nim +++ b/libp2p/peerinfo.nim @@ -28,7 +28,7 @@ type agentVersion*: string privateKey*: PrivateKey publicKey*: PublicKey - signedPeerRecord*: Option[Envelope] + signedPeerRecord*: SignedPeerRecord func shortLog*(p: PeerInfo): auto = ( @@ -40,6 +40,17 @@ func shortLog*(p: PeerInfo): auto = ) chronicles.formatIt(PeerInfo): shortLog(it) +proc update*(p: PeerInfo) = + let sprRes = SignedPeerRecord.init( + p.privateKey, + PeerRecord.init(p.peerId, p.addrs) + ) + if sprRes.isOk: + p.signedPeerRecord = sprRes.get() + else: + discard + #info "Can't update the signed peer record" + proc new*( p: typedesc[PeerInfo], key: PrivateKey, @@ -56,15 +67,6 @@ proc new*( let peerId = PeerID.init(key).tryGet() - let sprRes = SignedPeerRecord.init( - key, - PeerRecord.init(peerId, @addrs) - ) - let spr = if sprRes.isOk: - some(sprRes.get().envelope) - else: - none(Envelope) - let peerInfo = PeerInfo( peerId: peerId, publicKey: pubkey, @@ -73,6 +75,8 @@ proc new*( agentVersion: agentVersion, addrs: @addrs, protocols: @protocols, - signedPeerRecord: spr) + ) + + peerInfo.update() return peerInfo diff --git a/libp2p/protocols/identify.nim b/libp2p/protocols/identify.nim index b77a67f..8e5cfcd 100644 --- a/libp2p/protocols/identify.nim +++ b/libp2p/protocols/identify.nim @@ -96,8 +96,8 @@ proc encodeMsg(peerInfo: PeerInfo, observedAddr: MultiAddress, sendSpr: bool): P ## Optionally populate signedPeerRecord field. ## See https://github.com/libp2p/go-libp2p/blob/ddf96ce1cfa9e19564feb9bd3e8269958bbc0aba/p2p/protocol/identify/pb/identify.proto for reference. - if peerInfo.signedPeerRecord.isSome() and sendSpr: - let sprBuff = peerInfo.signedPeerRecord.get().encode() + if sendSpr: + let sprBuff = peerInfo.signedPeerRecord.envelope.encode() if sprBuff.isOk(): result.write(8, sprBuff.get()) diff --git a/libp2p/switch.nim b/libp2p/switch.nim index da68e86..3612558 100644 --- a/libp2p/switch.nim +++ b/libp2p/switch.nim @@ -265,6 +265,8 @@ proc start*(s: Switch) {.async, gcsafe.} = s.acceptFuts.add(s.accept(t)) s.peerInfo.addrs &= t.addrs + s.peerInfo.update() + debug "Started libp2p node", peer = s.peerInfo proc newSwitch*(peerInfo: PeerInfo, diff --git a/tests/testidentify.nim b/tests/testidentify.nim index 84efc40..931197b 100644 --- a/tests/testidentify.nim +++ b/tests/testidentify.nim @@ -144,7 +144,7 @@ suite "Identify": check id.protoVersion.get() == ProtoVersion check id.agentVersion.get() == AgentVersion check id.protos == @["/test/proto1/1.0.0", "/test/proto2/1.0.0"] - check id.signedPeerRecord.get() == remotePeerInfo.signedPeerRecord.get() + check id.signedPeerRecord.get() == remotePeerInfo.signedPeerRecord.envelope suite "handle push identify message": var diff --git a/tests/testpeerinfo.nim b/tests/testpeerinfo.nim index d29607c..8376579 100644 --- a/tests/testpeerinfo.nim +++ b/tests/testpeerinfo.nim @@ -31,7 +31,7 @@ suite "PeerInfo": peerInfo = PeerInfo.new(seckey, multiAddresses) let - env = peerInfo.signedPeerRecord.get() + env = peerInfo.signedPeerRecord.envelope rec = PeerRecord.decode(env.payload()).tryGet() # Check envelope fields