mirror of https://github.com/waku-org/nwaku.git
fix(rln-relay): scope of getEvents (#1672)
This commit is contained in:
parent
9616253611
commit
b62193e59b
|
@ -60,7 +60,7 @@ type
|
||||||
const DefaultKeyStorePath* = "rlnKeystore.json"
|
const DefaultKeyStorePath* = "rlnKeystore.json"
|
||||||
const DefaultKeyStorePassword* = "password"
|
const DefaultKeyStorePassword* = "password"
|
||||||
|
|
||||||
template initializedGuard*(g: OnchainGroupManager): untyped =
|
template initializedGuard(g: OnchainGroupManager): untyped =
|
||||||
if not g.initialized:
|
if not g.initialized:
|
||||||
raise newException(ValueError, "OnchainGroupManager is not initialized")
|
raise newException(ValueError, "OnchainGroupManager is not initialized")
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ method withdrawBatch*(g: OnchainGroupManager, idCommitments: seq[IDCommitment]):
|
||||||
|
|
||||||
# TODO: after slashing is enabled on the contract
|
# TODO: after slashing is enabled on the contract
|
||||||
|
|
||||||
proc parseEvent*(event: type MemberRegistered,
|
proc parseEvent(event: type MemberRegistered,
|
||||||
log: JsonNode): GroupManagerResult[Membership] =
|
log: JsonNode): GroupManagerResult[Membership] =
|
||||||
## parses the `data` parameter of the `MemberRegistered` event `log`
|
## parses the `data` parameter of the `MemberRegistered` event `log`
|
||||||
## returns an error if it cannot parse the `data` parameter
|
## returns an error if it cannot parse the `data` parameter
|
||||||
|
@ -196,7 +196,16 @@ proc backfillRootQueue*(g: OnchainGroupManager, blockTable: BlockTable): Future[
|
||||||
# add the backfilled root
|
# add the backfilled root
|
||||||
g.validRoots.addLast(g.validRootBuffer.popLast())
|
g.validRoots.addLast(g.validRootBuffer.popLast())
|
||||||
|
|
||||||
proc getEvents*(g: OnchainGroupManager, fromBlock: BlockNumber, toBlock: Option[BlockNumber] = none(BlockNumber)): Future[BlockTable] {.async.} =
|
proc insert(blockTable: var BlockTable, blockNumber: BlockNumber, member: Membership) =
|
||||||
|
if blockTable.hasKeyOrPut(blockNumber, @[member]):
|
||||||
|
try:
|
||||||
|
blockTable[blockNumber].add(member)
|
||||||
|
except KeyError: # qed
|
||||||
|
error "could not insert member into block table", blockNumber=blockNumber, member=member
|
||||||
|
|
||||||
|
proc getRawEvents(g: OnchainGroupManager,
|
||||||
|
fromBlock: BlockNumber,
|
||||||
|
toBlock: Option[BlockNumber] = none(BlockNumber)): Future[JsonNode] {.async.} =
|
||||||
initializedGuard(g)
|
initializedGuard(g)
|
||||||
|
|
||||||
let ethRpc = g.ethRpc.get()
|
let ethRpc = g.ethRpc.get()
|
||||||
|
@ -212,13 +221,24 @@ proc getEvents*(g: OnchainGroupManager, fromBlock: BlockNumber, toBlock: Option[
|
||||||
else:
|
else:
|
||||||
normalizedToBlock = fromBlock
|
normalizedToBlock = fromBlock
|
||||||
|
|
||||||
|
let events = await rlnContract.getJsonLogs(MemberRegistered,
|
||||||
|
fromBlock = some(fromBlock.blockId()),
|
||||||
|
toBlock = some(normalizedToBlock.blockId()))
|
||||||
|
return events
|
||||||
|
|
||||||
|
proc getBlockTables(g: OnchainGroupManager,
|
||||||
|
fromBlock: BlockNumber,
|
||||||
|
toBlock: Option[BlockNumber] = none(BlockNumber)): Future[(BlockTable, BlockTable)] {.async.} =
|
||||||
|
initializedGuard(g)
|
||||||
|
|
||||||
var blockTable = default(BlockTable)
|
var blockTable = default(BlockTable)
|
||||||
var toRemoveBlockTable = default(BlockTable)
|
var toRemoveBlockTable = default(BlockTable)
|
||||||
|
|
||||||
let events = await rlnContract.getJsonLogs(MemberRegistered, fromBlock = some(fromBlock.blockId()), toBlock = some(normalizedToBlock.blockId()))
|
let events = await g.getRawEvents(fromBlock, toBlock)
|
||||||
|
|
||||||
if events.len == 0:
|
if events.len == 0:
|
||||||
debug "no events found"
|
debug "no events found"
|
||||||
return blockTable
|
return (blockTable, toRemoveBlockTable)
|
||||||
|
|
||||||
for event in events:
|
for event in events:
|
||||||
let blockNumber = parseHexInt(event["blockNumber"].getStr()).uint
|
let blockNumber = parseHexInt(event["blockNumber"].getStr()).uint
|
||||||
|
@ -232,21 +252,13 @@ proc getEvents*(g: OnchainGroupManager, fromBlock: BlockNumber, toBlock: Option[
|
||||||
if removed:
|
if removed:
|
||||||
# remove the registration from the tree, per block
|
# remove the registration from the tree, per block
|
||||||
warn "member removed from the tree as per canonical chain", index=parsedEvent.index
|
warn "member removed from the tree as per canonical chain", index=parsedEvent.index
|
||||||
if toRemoveBlockTable.hasKey(blockNumber):
|
toRemoveBlockTable.insert(blockNumber, parsedEvent)
|
||||||
toRemoveBlockTable[blockNumber].add(parsedEvent)
|
|
||||||
else:
|
|
||||||
toRemoveBlockTable[blockNumber] = @[parsedEvent]
|
|
||||||
|
|
||||||
await g.backfillRootQueue(toRemoveBlockTable)
|
|
||||||
|
|
||||||
if blockTable.hasKey(blockNumber):
|
|
||||||
blockTable[blockNumber].add(parsedEvent)
|
|
||||||
else:
|
else:
|
||||||
blockTable[blockNumber] = @[parsedEvent]
|
blockTable.insert(blockNumber, parsedEvent)
|
||||||
|
|
||||||
return blockTable
|
return (blockTable, toRemoveBlockTable)
|
||||||
|
|
||||||
proc seedBlockTableIntoTree*(g: OnchainGroupManager, blockTable: BlockTable): Future[void] {.async.} =
|
proc handleValidEvents(g: OnchainGroupManager, blockTable: BlockTable): Future[void] {.async.} =
|
||||||
initializedGuard(g)
|
initializedGuard(g)
|
||||||
|
|
||||||
for blockNumber, members in blockTable.pairs():
|
for blockNumber, members in blockTable.pairs():
|
||||||
|
@ -268,22 +280,28 @@ proc seedBlockTableIntoTree*(g: OnchainGroupManager, blockTable: BlockTable): Fu
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
proc getEventsAndSeedIntoTree*(g: OnchainGroupManager,
|
proc handleRemovedEvents(g: OnchainGroupManager, toRemoveBlockTable: BlockTable): Future[void] {.async.} =
|
||||||
fromBlock: BlockNumber,
|
|
||||||
toBlock: Option[BlockNumber] = none(BlockNumber)): Future[void] {.async.} =
|
|
||||||
initializedGuard(g)
|
initializedGuard(g)
|
||||||
|
|
||||||
let events = await g.getEvents(fromBlock, toBlock)
|
await g.backfillRootQueue(toRemoveBlockTable)
|
||||||
await g.seedBlockTableIntoTree(events)
|
|
||||||
|
proc getAndHandleEvents(g: OnchainGroupManager,
|
||||||
|
fromBlock: BlockNumber,
|
||||||
|
toBlock: Option[BlockNumber] = none(BlockNumber)): Future[void] {.async.} =
|
||||||
|
initializedGuard(g)
|
||||||
|
|
||||||
|
let (validEvents, removedEvents) = await g.getBlockTables(fromBlock, toBlock)
|
||||||
|
await g.handleRemovedEvents(removedEvents)
|
||||||
|
await g.handleValidEvents(validEvents)
|
||||||
return
|
return
|
||||||
|
|
||||||
proc getNewHeadCallback*(g: OnchainGroupManager): BlockHeaderHandler =
|
proc getNewHeadCallback(g: OnchainGroupManager): BlockHeaderHandler =
|
||||||
proc newHeadCallback(blockheader: BlockHeader) {.gcsafe.} =
|
proc newHeadCallback(blockheader: BlockHeader) {.gcsafe.} =
|
||||||
let latestBlock = blockheader.number.uint
|
let latestBlock = blockheader.number.uint
|
||||||
debug "block received", blockNumber = latestBlock
|
debug "block received", blockNumber = latestBlock
|
||||||
# get logs from the last block
|
# get logs from the last block
|
||||||
try:
|
try:
|
||||||
asyncSpawn g.getEventsAndSeedIntoTree(latestBlock)
|
asyncSpawn g.getAndHandleEvents(latestBlock)
|
||||||
except CatchableError:
|
except CatchableError:
|
||||||
warn "failed to handle log: ", error=getCurrentExceptionMsg()
|
warn "failed to handle log: ", error=getCurrentExceptionMsg()
|
||||||
return newHeadCallback
|
return newHeadCallback
|
||||||
|
@ -291,7 +309,7 @@ proc getNewHeadCallback*(g: OnchainGroupManager): BlockHeaderHandler =
|
||||||
proc newHeadErrCallback(error: CatchableError) =
|
proc newHeadErrCallback(error: CatchableError) =
|
||||||
warn "failed to get new head", error=error.msg
|
warn "failed to get new head", error=error.msg
|
||||||
|
|
||||||
proc startListeningToEvents*(g: OnchainGroupManager): Future[void] {.async.} =
|
proc startListeningToEvents(g: OnchainGroupManager): Future[void] {.async.} =
|
||||||
initializedGuard(g)
|
initializedGuard(g)
|
||||||
|
|
||||||
let ethRpc = g.ethRpc.get()
|
let ethRpc = g.ethRpc.get()
|
||||||
|
@ -301,11 +319,11 @@ proc startListeningToEvents*(g: OnchainGroupManager): Future[void] {.async.} =
|
||||||
except CatchableError:
|
except CatchableError:
|
||||||
raise newException(ValueError, "failed to subscribe to block headers: " & getCurrentExceptionMsg())
|
raise newException(ValueError, "failed to subscribe to block headers: " & getCurrentExceptionMsg())
|
||||||
|
|
||||||
proc startOnchainSync*(g: OnchainGroupManager, fromBlock: BlockNumber = BlockNumber(0)): Future[void] {.async.} =
|
proc startOnchainSync(g: OnchainGroupManager, fromBlock: BlockNumber = BlockNumber(0)): Future[void] {.async.} =
|
||||||
initializedGuard(g)
|
initializedGuard(g)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await g.getEventsAndSeedIntoTree(fromBlock, some(fromBlock))
|
await g.getAndHandleEvents(fromBlock, some(fromBlock))
|
||||||
except CatchableError:
|
except CatchableError:
|
||||||
raise newException(ValueError, "failed to get the history/reconcile missed blocks: " & getCurrentExceptionMsg())
|
raise newException(ValueError, "failed to get the history/reconcile missed blocks: " & getCurrentExceptionMsg())
|
||||||
|
|
||||||
|
@ -315,7 +333,7 @@ proc startOnchainSync*(g: OnchainGroupManager, fromBlock: BlockNumber = BlockNum
|
||||||
except CatchableError:
|
except CatchableError:
|
||||||
raise newException(ValueError, "failed to start listening to events: " & getCurrentExceptionMsg())
|
raise newException(ValueError, "failed to start listening to events: " & getCurrentExceptionMsg())
|
||||||
|
|
||||||
proc persistCredentials*(g: OnchainGroupManager): GroupManagerResult[void] =
|
proc persistCredentials(g: OnchainGroupManager): GroupManagerResult[void] =
|
||||||
if not g.saveKeystore:
|
if not g.saveKeystore:
|
||||||
return ok()
|
return ok()
|
||||||
if g.idCredentials.isNone():
|
if g.idCredentials.isNone():
|
||||||
|
|
Loading…
Reference in New Issue