Skip to content

Commit 18bb189

Browse files
committed
fix: code review
1 parent afc809e commit 18bb189

5 files changed

Lines changed: 157 additions & 150 deletions

File tree

libp2p/peerinfo.nim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ proc parseFullAddress*(ma: MultiAddress): MaResult[(PeerId, MultiAddress)] =
9393
proc parseFullAddress*(ma: string | seq[byte]): MaResult[(PeerId, MultiAddress)] =
9494
parseFullAddress(?MultiAddress.init(ma))
9595

96+
proc toFullAddress*(peerId: PeerId, ma: MultiAddress): MaResult[MultiAddress] =
97+
let peerIdPart = ?MultiAddress.init(multiCodec("p2p"), peerId.data)
98+
concat(ma, peerIdPart)
99+
96100
proc new*(
97101
p: typedesc[PeerInfo],
98102
key: PrivateKey,

libp2p/protocols/mix/mix_node.nim

Lines changed: 91 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
1-
import os, results, strformat, sugar
1+
import os, results, strformat, sugar, sequtils
22
import std/streams
33
import ../../crypto/[crypto, curve25519, secp]
4-
import ../../[multiaddress, multicodec, peerid]
4+
import ../../[multiaddress, multicodec, peerid, peerinfo]
55
import ./[serialization, curve25519, multiaddr]
66

77
const MixNodeInfoSize* =
88
AddrSize + (2 * FieldElementSize) + (SkRawPublicKeySize + SkRawPrivateKeySize)
99
const MixPubInfoSize* = AddrSize + FieldElementSize + SkRawPublicKeySize
1010

1111
type MixNodeInfo* = object
12+
peerId*: PeerId
1213
multiAddr*: MultiAddress
1314
mixPubKey*: FieldElement
1415
mixPrivKey*: FieldElement
1516
libp2pPubKey*: SkPublicKey
1617
libp2pPrivKey*: SkPrivateKey
1718

1819
proc initMixNodeInfo*(
20+
peerId: PeerId,
1921
multiAddr: MultiAddress,
2022
mixPubKey, mixPrivKey: FieldElement,
2123
libp2pPubKey: SkPublicKey,
2224
libp2pPrivKey: SkPrivateKey,
2325
): MixNodeInfo =
2426
MixNodeInfo(
27+
peerId: peerId,
2528
multiAddr: multiAddr,
2629
mixPubKey: mixPubKey,
2730
mixPrivKey: mixPrivKey,
@@ -31,14 +34,14 @@ proc initMixNodeInfo*(
3134

3235
proc get*(
3336
info: MixNodeInfo
34-
): (MultiAddress, FieldElement, FieldElement, SkPublicKey, SkPrivateKey) =
37+
): (PeerId, MultiAddress, FieldElement, FieldElement, SkPublicKey, SkPrivateKey) =
3538
(
36-
info.multiAddr, info.mixPubKey, info.mixPrivKey, info.libp2pPubKey,
39+
info.peerId, info.multiAddr, info.mixPubKey, info.mixPrivKey, info.libp2pPubKey,
3740
info.libp2pPrivKey,
3841
)
3942

4043
proc serialize*(nodeInfo: MixNodeInfo): Result[seq[byte], string] =
41-
let addrBytes = multiAddrToBytes(nodeInfo.multiAddr).valueOr:
44+
let addrBytes = multiAddrToBytes(?toFullAddress(nodeInfo.peerId, nodeInfo.multiAddr)).valueOr:
4245
return err("Error in multiaddress conversion to bytes: " & error)
4346

4447
let
@@ -56,9 +59,11 @@ proc deserialize*(T: typedesc[MixNodeInfo], data: openArray[byte]): Result[T, st
5659
return
5760
err("Serialized Mix node info must be exactly " & $MixNodeInfoSize & " bytes")
5861

59-
let multiAddr = bytesToMultiAddr(data[0 .. AddrSize - 1]).valueOr:
62+
let ma = bytesToMultiAddr(data[0 .. AddrSize - 1]).valueOr:
6063
return err("Error in multiaddress conversion to bytes: " & error)
6164

65+
let (peerId, multiAddr) = ?ma.parseFullAddress()
66+
6267
let mixPubKey = bytesToFieldElement(
6368
data[AddrSize .. (AddrSize + FieldElementSize - 1)]
6469
).valueOr:
@@ -84,6 +89,7 @@ proc deserialize*(T: typedesc[MixNodeInfo], data: openArray[byte]): Result[T, st
8489

8590
ok(
8691
T(
92+
peerId: peerId,
8793
multiAddr: multiAddr,
8894
mixPubKey: mixPubKey,
8995
mixPrivKey: mixPrivKey,
@@ -92,9 +98,6 @@ proc deserialize*(T: typedesc[MixNodeInfo], data: openArray[byte]): Result[T, st
9298
)
9399
)
94100

95-
proc isNodeMultiaddress*(mixNodeInfo: MixNodeInfo, multiAddr: MultiAddress): bool =
96-
return mixNodeInfo.multiAddr == multiAddr
97-
98101
proc writeToFile*(
99102
node: MixNodeInfo, index: int, nodeInfoFolderPath: string = "./nodeInfo"
100103
): Result[void, string] =
@@ -116,31 +119,27 @@ proc writeToFile*(
116119
proc readFromFile*(
117120
T: typedesc[MixNodeInfo], index: int, nodeInfoFolderPath: string = "./nodeInfo"
118121
): Result[T, string] =
119-
try:
120-
let filename = nodeInfoFolderPath / fmt"mixNode_{index}"
121-
if not fileExists(filename):
122-
return err("File does not exist")
123-
var file = newFileStream(filename, fmRead)
124-
if file == nil:
125-
return err(
126-
"Failed to open file: " & filename &
127-
". Check permissions or if the path is correct."
128-
)
129-
defer:
130-
file.close()
131-
let data = file.readAll()
132-
if data.len != MixNodeInfoSize:
133-
return err(
134-
"Invalid data size for MixNodeInfo: expected " & $MixNodeInfoSize &
135-
" bytes, but got " & $(data.len) & " bytes."
136-
)
137-
let dMixNodeInfo = MixNodeInfo.deserialize(cast[seq[byte]](data)).valueOr:
138-
return err("Mix node info deserialize error: " & error)
139-
return ok(dMixNodeInfo)
140-
except IOError as e:
141-
return err("File read error: " & $e.msg)
142-
except OSError as e:
143-
return err("OS error: " & $e.msg)
122+
let filename = nodeInfoFolderPath / fmt"mixNode_{index}"
123+
if not fileExists(filename):
124+
return err("File does not exist")
125+
var file = newFileStream(filename, fmRead)
126+
if file == nil:
127+
return err(
128+
"Failed to open file: " & filename &
129+
". Check permissions or if the path is correct."
130+
)
131+
defer:
132+
file.close()
133+
134+
let data = ?file.readAll().catch().mapErr(x => "File read error: " & x.msg)
135+
if data.len != MixNodeInfoSize:
136+
return err(
137+
"Invalid data size for MixNodeInfo: expected " & $MixNodeInfoSize &
138+
" bytes, but got " & $(data.len) & " bytes."
139+
)
140+
let dMixNodeInfo = MixNodeInfo.deserialize(cast[seq[byte]](data)).valueOr:
141+
return err("Mix node info deserialize error: " & error)
142+
return ok(dMixNodeInfo)
144143

145144
proc deleteNodeInfoFolder*(nodeInfoFolderPath: string = "./nodeInfo") =
146145
## Deletes the folder that stores serialized mix node info files
@@ -149,23 +148,30 @@ proc deleteNodeInfoFolder*(nodeInfoFolderPath: string = "./nodeInfo") =
149148
removeDir(nodeInfoFolderPath)
150149

151150
type MixPubInfo* = object
151+
peerId*: PeerId
152152
multiAddr*: MultiAddress
153153
mixPubKey*: FieldElement
154154
libp2pPubKey*: SkPublicKey
155155

156156
proc init*(
157157
T: typedesc[MixPubInfo],
158+
peerId: PeerId,
158159
multiAddr: MultiAddress,
159160
mixPubKey: FieldElement,
160161
libp2pPubKey: SkPublicKey,
161162
): T =
162-
T(multiAddr: multiAddr, mixPubKey: mixPubKey, libp2pPubKey: libp2pPubKey)
163+
T(
164+
peerId: PeerId,
165+
multiAddr: multiAddr,
166+
mixPubKey: mixPubKey,
167+
libp2pPubKey: libp2pPubKey,
168+
)
163169

164-
proc get*(info: MixPubInfo): (MultiAddress, FieldElement, SkPublicKey) =
165-
(info.multiAddr, info.mixPubKey, info.libp2pPubKey)
170+
proc get*(info: MixPubInfo): (PeerId, MultiAddress, FieldElement, SkPublicKey) =
171+
(info.peerId, info.multiAddr, info.mixPubKey, info.libp2pPubKey)
166172

167173
proc serialize*(nodeInfo: MixPubInfo): Result[seq[byte], string] =
168-
let addrBytes = multiAddrToBytes(nodeInfo.multiAddr).valueOr:
174+
let addrBytes = multiAddrToBytes(?toFullAddress(nodeInfo.peerId, nodeInfo.multiAddr)).valueOr:
169175
return err("Error in multiaddress conversion to bytes: " & error)
170176

171177
let
@@ -179,7 +185,7 @@ proc deserialize*(T: typedesc[MixPubInfo], data: openArray[byte]): Result[T, str
179185
return
180186
err("Serialized mix public info must be exactly " & $MixPubInfoSize & " bytes")
181187

182-
let multiAddr = bytesToMultiAddr(data[0 .. AddrSize - 1]).valueOr:
188+
let ma = bytesToMultiAddr(data[0 .. AddrSize - 1]).valueOr:
183189
return err("Error in bytes to multiaddress conversion: " & error)
184190

185191
let mixPubKey = bytesToFieldElement(
@@ -190,7 +196,16 @@ proc deserialize*(T: typedesc[MixPubInfo], data: openArray[byte]): Result[T, str
190196
let libp2pPubKey = SkPublicKey.init(data[(AddrSize + FieldElementSize) ..^ 1]).valueOr:
191197
return err("Failed to initialize libp2p public key: ")
192198

193-
ok(MixPubInfo(multiAddr: multiAddr, mixPubKey: mixPubKey, libp2pPubKey: libp2pPubKey))
199+
let (peerId, multiAddr) = ?ma.parseFullAddress()
200+
201+
ok(
202+
MixPubInfo(
203+
peerId: peerId,
204+
multiAddr: multiAddr,
205+
mixPubKey: mixPubKey,
206+
libp2pPubKey: libp2pPubKey,
207+
)
208+
)
194209

195210
proc writeToFile*(
196211
node: MixPubInfo, index: int, pubInfoFolderPath: string = "./pubInfo"
@@ -213,31 +228,26 @@ proc writeToFile*(
213228
proc readFromFile*(
214229
T: typedesc[MixPubInfo], index: int, pubInfoFolderPath: string = "./pubInfo"
215230
): Result[T, string] =
216-
try:
217-
let filename = pubInfoFolderPath / fmt"mixNode_{index}"
218-
if not fileExists(filename):
219-
return err("File does not exist")
220-
var file = newFileStream(filename, fmRead)
221-
if file == nil:
222-
return err(
223-
"Failed to open file: " & filename &
224-
". Check permissions or if the path is correct."
225-
)
226-
defer:
227-
file.close()
228-
let data = file.readAll()
229-
if data.len != MixPubInfoSize:
230-
return err(
231-
"Invalid data size for MixNodeInfo: expected " & $MixNodeInfoSize &
232-
" bytes, but got " & $(data.len) & " bytes."
233-
)
234-
let dMixPubInfo = MixPubInfo.deserialize(cast[seq[byte]](data)).valueOr:
235-
return err("Mix pub info deserialize error: " & error)
236-
return ok(dMixPubInfo)
237-
except IOError as e:
238-
return err("File read error: " & $e.msg)
239-
except OSError as e:
240-
return err("OS error: " & $e.msg)
231+
let filename = pubInfoFolderPath / fmt"mixNode_{index}"
232+
if not fileExists(filename):
233+
return err("File does not exist")
234+
var file = newFileStream(filename, fmRead)
235+
if file == nil:
236+
return err(
237+
"Failed to open file: " & filename &
238+
". Check permissions or if the path is correct."
239+
)
240+
defer:
241+
file.close()
242+
let data = ?file.readAll().catch().mapErr(x => "File read error: " & x.msg)
243+
if data.len != MixPubInfoSize:
244+
return err(
245+
"Invalid data size for MixNodeInfo: expected " & $MixNodeInfoSize &
246+
" bytes, but got " & $(data.len) & " bytes."
247+
)
248+
let dMixPubInfo = MixPubInfo.deserialize(cast[seq[byte]](data)).valueOr:
249+
return err("Mix pub info deserialize error: " & error)
250+
return ok(dMixPubInfo)
241251

242252
proc deletePubInfoFolder*(pubInfoFolderPath: string = "./pubInfo") =
243253
## Deletes the folder containing serialized public mix node info
@@ -252,13 +262,16 @@ proc getMixPubInfoByIndex*(self: MixNodes, index: int): Result[MixPubInfo, strin
252262
return err("Index must be between 0 and " & $(self.len))
253263
ok(
254264
MixPubInfo(
265+
peerId: self[index].peerId,
255266
multiAddr: self[index].multiAddr,
256267
mixPubKey: self[index].mixPubKey,
257268
libp2pPubKey: self[index].libp2pPubKey,
258269
)
259270
)
260271

261-
proc generateMixNodes(count: int, basePort: int = 4242): Result[MixNodes, string] =
272+
proc generateMixNodes(
273+
count: int, basePort: int = 4242, rng: ref HmacDrbgContext = newRng()
274+
): Result[MixNodes, string] =
262275
var nodes = newSeq[MixNodeInfo](count)
263276
for i in 0 ..< count:
264277
let keyPairResult = generateKeyPair()
@@ -269,23 +282,20 @@ proc generateMixNodes(count: int, basePort: int = 4242): Result[MixNodes, string
269282
let
270283
rng = newRng()
271284
keyPair = SkKeyPair.random(rng[])
272-
libp2pPrivKey = keyPair.seckey
273-
libp2pPubKey = keyPair.pubkey
274-
pubKeyProto = PublicKey(scheme: Secp256k1, skkey: libp2pPubKey)
285+
pubKeyProto = PublicKey(scheme: Secp256k1, skkey: keyPair.pubkey)
275286
peerId = PeerId.init(pubKeyProto).get()
276287
multiAddr =
277-
?MultiAddress
278-
.init(fmt"/ip4/0.0.0.0/tcp/{basePort + i}/p2p/{peerId}")
279-
.tryGet()
280-
.catch()
281-
.mapErr(x => x.msg)
288+
?MultiAddress.init(fmt"/ip4/0.0.0.0/tcp/{basePort + i}").tryGet().catch().mapErr(
289+
x => x.msg
290+
)
282291

283292
nodes[i] = MixNodeInfo(
293+
peerId: peerId,
284294
multiAddr: multiAddr,
285295
mixPubKey: mixPubKey,
286296
mixPrivKey: mixPrivKey,
287-
libp2pPubKey: libp2pPubKey,
288-
libp2pPrivKey: libp2pPrivKey,
297+
libp2pPubKey: keyPair.pubkey,
298+
libp2pPrivKey: keyPair.seckey,
289299
)
290300

291301
ok(nodes)
@@ -297,17 +307,16 @@ proc initializeMixNodes*(count: int, basePort: int = 4242): Result[MixNodes, str
297307
return ok(mixNodes)
298308

299309
proc findByPeerId*(self: MixNodes, peerId: PeerId): Result[MixNodeInfo, string] =
300-
for node in self:
301-
let p2pPart = ?node.multiAddr.getPart(multiCodec("p2p"))
302-
let nodePeerId = ?PeerId.init(?p2pPart.protoArgument()).mapErr(x => $x)
303-
if nodePeerId == peerId:
304-
return ok(node)
310+
let filteredNodes = self.filterIt(it.peerId == peerId)
311+
if filteredNodes.len != 0:
312+
return ok(filteredNodes[0])
305313
return err("No node with peer id: " & $peerId)
306314

307315
proc initMixMultiAddrByIndex*(
308-
self: var MixNodes, index: int, multiAddr: MultiAddress
316+
self: var MixNodes, index: int, peerId: PeerId, multiAddr: MultiAddress
309317
): Result[void, string] =
310318
if index < 0 or index >= self.len:
311319
return err("Index must be between 0 and " & $(self.len))
312320
self[index].multiAddr = multiAddr
321+
self[index].peerId = peerId
313322
ok()

0 commit comments

Comments
 (0)