1- import os, results, strformat, sugar
1+ import os, results, strformat, sugar, sequtils
22import std/ streams
33import ../../ crypto/ [crypto, curve25519, secp]
4- import ../../ [multiaddress, multicodec, peerid]
4+ import ../../ [multiaddress, multicodec, peerid, peerinfo ]
55import ./ [serialization, curve25519, multiaddr]
66
77const MixNodeInfoSize * =
88 AddrSize + (2 * FieldElementSize ) + (SkRawPublicKeySize + SkRawPrivateKeySize )
99const MixPubInfoSize * = AddrSize + FieldElementSize + SkRawPublicKeySize
1010
1111type MixNodeInfo * = object
12+ peerId* : PeerId
1213 multiAddr* : MultiAddress
1314 mixPubKey* : FieldElement
1415 mixPrivKey* : FieldElement
1516 libp2pPubKey* : SkPublicKey
1617 libp2pPrivKey* : SkPrivateKey
1718
1819proc 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
3235proc 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
4043proc 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-
98101proc writeToFile * (
99102 node: MixNodeInfo , index: int , nodeInfoFolderPath: string = " ./nodeInfo"
100103): Result [void , string ] =
@@ -116,31 +119,27 @@ proc writeToFile*(
116119proc 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
145144proc 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
151150type MixPubInfo * = object
151+ peerId* : PeerId
152152 multiAddr* : MultiAddress
153153 mixPubKey* : FieldElement
154154 libp2pPubKey* : SkPublicKey
155155
156156proc 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
167173proc 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
195210proc writeToFile * (
196211 node: MixPubInfo , index: int , pubInfoFolderPath: string = " ./pubInfo"
@@ -213,31 +228,26 @@ proc writeToFile*(
213228proc 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
242252proc 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
299309proc 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
307315proc 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