2022-07-01 18:19:57 +00:00
|
|
|
# Nim-LibP2P
|
|
|
|
# Copyright (c) 2022 Status Research & Development GmbH
|
|
|
|
# Licensed under either of
|
|
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
|
|
# at your option.
|
|
|
|
# This file may not be copied, modified, or distributed except according to
|
|
|
|
# those terms.
|
2019-08-20 16:18:15 +00:00
|
|
|
|
2022-08-03 11:33:19 +00:00
|
|
|
when (NimMajor, NimMinor) < (1, 4):
|
|
|
|
{.push raises: [Defect].}
|
|
|
|
else:
|
|
|
|
{.push raises: [].}
|
2022-07-01 18:19:57 +00:00
|
|
|
{.push public.}
|
2020-08-08 06:52:20 +00:00
|
|
|
|
2022-05-24 13:10:57 +00:00
|
|
|
import std/[options, sequtils]
|
2021-05-22 18:27:30 +00:00
|
|
|
import pkg/[chronos, chronicles, stew/results]
|
2022-07-01 18:19:57 +00:00
|
|
|
import peerid, multiaddress, crypto/crypto, routing_record, errors, utility
|
2019-08-20 16:18:15 +00:00
|
|
|
|
2022-03-14 08:39:30 +00:00
|
|
|
export peerid, multiaddress, crypto, routing_record, errors, results
|
2020-07-01 07:22:29 +00:00
|
|
|
|
2021-09-08 09:07:46 +00:00
|
|
|
## Our local peer info
|
2019-12-07 16:36:39 +00:00
|
|
|
|
|
|
|
type
|
2021-05-22 18:27:30 +00:00
|
|
|
PeerInfoError* = LPError
|
|
|
|
|
2022-07-01 18:19:57 +00:00
|
|
|
PeerInfo* {.public.} = ref object
|
2021-12-16 10:05:20 +00:00
|
|
|
peerId*: PeerId
|
2019-12-04 04:44:54 +00:00
|
|
|
addrs*: seq[MultiAddress]
|
|
|
|
protocols*: seq[string]
|
2020-06-09 18:42:52 +00:00
|
|
|
protoVersion*: string
|
|
|
|
agentVersion*: string
|
2021-09-08 09:07:46 +00:00
|
|
|
privateKey*: PrivateKey
|
|
|
|
publicKey*: PublicKey
|
2022-04-13 07:35:28 +00:00
|
|
|
signedPeerRecord*: SignedPeerRecord
|
2019-12-07 16:36:39 +00:00
|
|
|
|
2020-09-06 08:31:47 +00:00
|
|
|
func shortLog*(p: PeerInfo): auto =
|
2020-06-09 18:42:52 +00:00
|
|
|
(
|
2020-09-06 08:31:47 +00:00
|
|
|
peerId: $p.peerId,
|
2020-06-09 18:42:52 +00:00
|
|
|
addrs: mapIt(p.addrs, $it),
|
|
|
|
protocols: mapIt(p.protocols, $it),
|
|
|
|
protoVersion: p.protoVersion,
|
|
|
|
agentVersion: p.agentVersion,
|
|
|
|
)
|
2020-09-06 08:31:47 +00:00
|
|
|
chronicles.formatIt(PeerInfo): shortLog(it)
|
2020-05-11 19:05:24 +00:00
|
|
|
|
2022-04-13 07:35:28 +00:00
|
|
|
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"
|
|
|
|
|
2021-10-25 08:26:32 +00:00
|
|
|
proc new*(
|
2021-05-21 16:27:01 +00:00
|
|
|
p: typedesc[PeerInfo],
|
|
|
|
key: PrivateKey,
|
2021-12-16 10:05:20 +00:00
|
|
|
addrs: openArray[MultiAddress] = [],
|
|
|
|
protocols: openArray[string] = [],
|
2021-05-21 16:27:01 +00:00
|
|
|
protoVersion: string = "",
|
2021-05-22 18:27:30 +00:00
|
|
|
agentVersion: string = ""): PeerInfo
|
|
|
|
{.raises: [Defect, PeerInfoError].} =
|
|
|
|
|
2021-09-08 09:07:46 +00:00
|
|
|
let pubkey = try:
|
2021-10-25 08:26:32 +00:00
|
|
|
key.getPublicKey().tryGet()
|
2021-09-08 09:07:46 +00:00
|
|
|
except CatchableError:
|
|
|
|
raise newException(PeerInfoError, "invalid private key")
|
2022-03-14 08:39:30 +00:00
|
|
|
|
2022-07-27 11:47:50 +00:00
|
|
|
let peerId = PeerId.init(key).tryGet()
|
2022-03-14 08:39:30 +00:00
|
|
|
|
2021-05-21 16:27:01 +00:00
|
|
|
let peerInfo = PeerInfo(
|
2022-03-14 08:39:30 +00:00
|
|
|
peerId: peerId,
|
2021-09-08 09:07:46 +00:00
|
|
|
publicKey: pubkey,
|
|
|
|
privateKey: key,
|
2021-05-21 16:27:01 +00:00
|
|
|
protoVersion: protoVersion,
|
2021-09-08 09:07:46 +00:00
|
|
|
agentVersion: agentVersion,
|
|
|
|
addrs: @addrs,
|
2022-03-14 08:39:30 +00:00
|
|
|
protocols: @protocols,
|
2022-04-13 07:35:28 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
peerInfo.update()
|
2021-05-21 16:27:01 +00:00
|
|
|
|
|
|
|
return peerInfo
|