60
60
const DefaultKeyStorePath * = " rlnKeystore.json"
61
61
const DefaultKeyStorePassword * = " password"
62
62
63
- template initializedGuard * (g: OnchainGroupManager ): untyped =
63
+ template initializedGuard (g: OnchainGroupManager ): untyped =
64
64
if not g.initialized:
65
65
raise newException (ValueError , " OnchainGroupManager is not initialized" )
66
66
@@ -156,7 +156,7 @@ method withdrawBatch*(g: OnchainGroupManager, idCommitments: seq[IDCommitment]):
156
156
157
157
# TODO : after slashing is enabled on the contract
158
158
159
- proc parseEvent * (event: type MemberRegistered ,
159
+ proc parseEvent (event: type MemberRegistered ,
160
160
log: JsonNode ): GroupManagerResult [Membership ] =
161
161
# # parses the `data` parameter of the `MemberRegistered` event `log`
162
162
# # returns an error if it cannot parse the `data` parameter
@@ -196,7 +196,16 @@ proc backfillRootQueue*(g: OnchainGroupManager, blockTable: BlockTable): Future[
196
196
# add the backfilled root
197
197
g.validRoots.addLast (g.validRootBuffer.popLast ())
198
198
199
- proc getEvents * (g: OnchainGroupManager , fromBlock: BlockNumber , toBlock: Option [BlockNumber ] = none (BlockNumber )): Future [BlockTable ] {.async .} =
199
+ proc insert (blockTable: var BlockTable , blockNumber: BlockNumber , member: Membership ) =
200
+ if blockTable.hasKeyOrPut (blockNumber, @ [member]):
201
+ try :
202
+ blockTable[blockNumber].add (member)
203
+ except KeyError : # qed
204
+ error " could not insert member into block table" , blockNumber= blockNumber, member= member
205
+
206
+ proc getRawEvents (g: OnchainGroupManager ,
207
+ fromBlock: BlockNumber ,
208
+ toBlock: Option [BlockNumber ] = none (BlockNumber )): Future [JsonNode ] {.async .} =
200
209
initializedGuard (g)
201
210
202
211
let ethRpc = g.ethRpc.get ()
@@ -212,13 +221,24 @@ proc getEvents*(g: OnchainGroupManager, fromBlock: BlockNumber, toBlock: Option[
212
221
else :
213
222
normalizedToBlock = fromBlock
214
223
224
+ let events = await rlnContract.getJsonLogs (MemberRegistered ,
225
+ fromBlock = some (fromBlock.blockId ()),
226
+ toBlock = some (normalizedToBlock.blockId ()))
227
+ return events
228
+
229
+ proc getBlockTables (g: OnchainGroupManager ,
230
+ fromBlock: BlockNumber ,
231
+ toBlock: Option [BlockNumber ] = none (BlockNumber )): Future [(BlockTable , BlockTable )] {.async .} =
232
+ initializedGuard (g)
233
+
215
234
var blockTable = default (BlockTable )
216
235
var toRemoveBlockTable = default (BlockTable )
217
236
218
- let events = await rlnContract.getJsonLogs (MemberRegistered , fromBlock = some (fromBlock.blockId ()), toBlock = some (normalizedToBlock.blockId ()))
237
+ let events = await g.getRawEvents (fromBlock, toBlock)
238
+
219
239
if events.len == 0 :
220
240
debug " no events found"
221
- return blockTable
241
+ return ( blockTable, toRemoveBlockTable)
222
242
223
243
for event in events:
224
244
let blockNumber = parseHexInt (event[" blockNumber" ].getStr ()).uint
@@ -232,21 +252,13 @@ proc getEvents*(g: OnchainGroupManager, fromBlock: BlockNumber, toBlock: Option[
232
252
if removed:
233
253
# remove the registration from the tree, per block
234
254
warn " member removed from the tree as per canonical chain" , index= parsedEvent.index
235
- if toRemoveBlockTable.hasKey (blockNumber):
236
- toRemoveBlockTable[blockNumber].add (parsedEvent)
237
- else :
238
- toRemoveBlockTable[blockNumber] = @ [parsedEvent]
239
-
240
- await g.backfillRootQueue (toRemoveBlockTable)
241
-
242
- if blockTable.hasKey (blockNumber):
243
- blockTable[blockNumber].add (parsedEvent)
255
+ toRemoveBlockTable.insert (blockNumber, parsedEvent)
244
256
else :
245
- blockTable[ blockNumber] = @ [ parsedEvent]
257
+ blockTable. insert ( blockNumber, parsedEvent)
246
258
247
- return blockTable
259
+ return ( blockTable, toRemoveBlockTable)
248
260
249
- proc seedBlockTableIntoTree * (g: OnchainGroupManager , blockTable: BlockTable ): Future [void ] {.async .} =
261
+ proc handleValidEvents (g: OnchainGroupManager , blockTable: BlockTable ): Future [void ] {.async .} =
250
262
initializedGuard (g)
251
263
252
264
for blockNumber, members in blockTable.pairs ():
@@ -268,30 +280,36 @@ proc seedBlockTableIntoTree*(g: OnchainGroupManager, blockTable: BlockTable): Fu
268
280
269
281
return
270
282
271
- proc getEventsAndSeedIntoTree * (g: OnchainGroupManager ,
272
- fromBlock: BlockNumber ,
273
- toBlock: Option [BlockNumber ] = none (BlockNumber )): Future [void ] {.async .} =
283
+ proc handleRemovedEvents (g: OnchainGroupManager , toRemoveBlockTable: BlockTable ): Future [void ] {.async .} =
284
+ initializedGuard (g)
285
+
286
+ await g.backfillRootQueue (toRemoveBlockTable)
287
+
288
+ proc getAndHandleEvents (g: OnchainGroupManager ,
289
+ fromBlock: BlockNumber ,
290
+ toBlock: Option [BlockNumber ] = none (BlockNumber )): Future [void ] {.async .} =
274
291
initializedGuard (g)
275
292
276
- let events = await g.getEvents (fromBlock, toBlock)
277
- await g.seedBlockTableIntoTree (events)
293
+ let (validEvents, removedEvents) = await g.getBlockTables (fromBlock, toBlock)
294
+ await g.handleRemovedEvents (removedEvents)
295
+ await g.handleValidEvents (validEvents)
278
296
return
279
297
280
- proc getNewHeadCallback * (g: OnchainGroupManager ): BlockHeaderHandler =
298
+ proc getNewHeadCallback (g: OnchainGroupManager ): BlockHeaderHandler =
281
299
proc newHeadCallback (blockheader: BlockHeader ) {.gcsafe .} =
282
300
let latestBlock = blockheader.number.uint
283
301
debug " block received" , blockNumber = latestBlock
284
302
# get logs from the last block
285
303
try :
286
- asyncSpawn g.getEventsAndSeedIntoTree (latestBlock)
304
+ asyncSpawn g.getAndHandleEvents (latestBlock)
287
305
except CatchableError :
288
306
warn " failed to handle log: " , error= getCurrentExceptionMsg ()
289
307
return newHeadCallback
290
308
291
309
proc newHeadErrCallback (error: CatchableError ) =
292
310
warn " failed to get new head" , error= error.msg
293
311
294
- proc startListeningToEvents * (g: OnchainGroupManager ): Future [void ] {.async .} =
312
+ proc startListeningToEvents (g: OnchainGroupManager ): Future [void ] {.async .} =
295
313
initializedGuard (g)
296
314
297
315
let ethRpc = g.ethRpc.get ()
@@ -301,11 +319,11 @@ proc startListeningToEvents*(g: OnchainGroupManager): Future[void] {.async.} =
301
319
except CatchableError :
302
320
raise newException (ValueError , " failed to subscribe to block headers: " & getCurrentExceptionMsg ())
303
321
304
- proc startOnchainSync * (g: OnchainGroupManager , fromBlock: BlockNumber = BlockNumber (0 )): Future [void ] {.async .} =
322
+ proc startOnchainSync (g: OnchainGroupManager , fromBlock: BlockNumber = BlockNumber (0 )): Future [void ] {.async .} =
305
323
initializedGuard (g)
306
324
307
325
try :
308
- await g.getEventsAndSeedIntoTree (fromBlock, some (fromBlock))
326
+ await g.getAndHandleEvents (fromBlock, some (fromBlock))
309
327
except CatchableError :
310
328
raise newException (ValueError , " failed to get the history/reconcile missed blocks: " & getCurrentExceptionMsg ())
311
329
@@ -315,7 +333,7 @@ proc startOnchainSync*(g: OnchainGroupManager, fromBlock: BlockNumber = BlockNum
315
333
except CatchableError :
316
334
raise newException (ValueError , " failed to start listening to events: " & getCurrentExceptionMsg ())
317
335
318
- proc persistCredentials * (g: OnchainGroupManager ): GroupManagerResult [void ] =
336
+ proc persistCredentials (g: OnchainGroupManager ): GroupManagerResult [void ] =
319
337
if not g.saveKeystore:
320
338
return ok ()
321
339
if g.idCredentials.isNone ():
0 commit comments