Skip to content

Commit 191d6ef

Browse files
committed
resolve filters
1 parent 0c952e7 commit 191d6ef

File tree

3 files changed

+46
-69
lines changed

3 files changed

+46
-69
lines changed

nimbus_verified_proxy/rpc/blocks.nim

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,26 @@ import
2323

2424
proc resolveBlockTag*(
2525
vp: VerifiedRpcProxy, blockTag: BlockTag
26-
): Result[base.BlockNumber, string] =
26+
): Result[BlockTag, string] =
2727
if blockTag.kind == bidAlias:
2828
let tag = blockTag.alias.toLowerAscii()
2929
case tag
3030
of "latest":
3131
let hLatest = vp.headerStore.latest.valueOr:
3232
return err("Couldn't get the latest block number from header store")
33-
ok(hLatest.number)
33+
ok(BlockTag(kind: bidNumber, number: hLatest.number))
3434
of "finalized":
3535
let hFinalized = vp.headerStore.finalized.valueOr:
3636
return err("Couldn't get the latest block number from header store")
37-
ok(hFinalized.number)
37+
ok(BlockTag(kind: bidNumber, number: hFinalized.number))
3838
of "earliest":
3939
let hEarliest = vp.headerStore.earliest.valueOr:
4040
return err("Couldn't get the latest block number from header store")
41-
ok(hEarliest.number)
41+
ok(BlockTag(kind: bidNumber, number: hEarliest.number))
4242
else:
4343
err("No support for block tag " & $blockTag)
4444
else:
45-
ok(base.BlockNumber(distinctBase(blockTag.number)))
45+
ok(blockTag)
4646

4747
func convHeader*(blk: eth_api_types.BlockObject): Header =
4848
let nonce = blk.nonce.valueOr:
@@ -184,10 +184,8 @@ proc getBlock*(
184184
proc getBlock*(
185185
vp: VerifiedRpcProxy, blockTag: BlockTag, fullTransactions: bool
186186
): Future[Result[BlockObject, string]] {.async.} =
187-
let
188-
n = vp.resolveBlockTag(blockTag).valueOr:
189-
return err(error)
190-
numberTag = BlockTag(kind: BlockIdentifierKind.bidNumber, number: Quantity(n))
187+
let numberTag = vp.resolveBlockTag(blockTag).valueOr:
188+
return err(error)
191189

192190
# get the target block
193191
let blk =
@@ -196,7 +194,7 @@ proc getBlock*(
196194
except CatchableError as e:
197195
return err(e.msg)
198196

199-
if n != distinctBase(blk.number):
197+
if numberTag.number != blk.number:
200198
return
201199
err("the downloaded block number doesn't match with the requested block number")
202200

@@ -235,9 +233,9 @@ proc getHeader*(
235233
vp: VerifiedRpcProxy, blockTag: BlockTag
236234
): Future[Result[Header, string]] {.async.} =
237235
let
238-
n = vp.resolveBlockTag(blockTag).valueOr:
236+
numberTag = vp.resolveBlockTag(blockTag).valueOr:
239237
return err(error)
240-
numberTag = BlockTag(kind: BlockIdentifierKind.bidNumber, number: Quantity(n))
238+
n = distinctBase(numberTag.number)
241239
cachedHeader = vp.headerStore.get(n)
242240

243241
if cachedHeader.isNone():

nimbus_verified_proxy/rpc/receipts.nim

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -84,37 +84,28 @@ proc getReceipts*(
8484

8585
await vp.getReceipts(header, numberTag)
8686

87-
proc verifyFilterBoundaries*(
88-
filter: FilterOptions, logObjs: seq[LogObject]
89-
): Result[bool, string] =
87+
proc resolveFilterTags*(filter: FilterOptions): Result[FilterOptions, string] =
9088
let
91-
fromBlock = filter.fromBlock.get(
92-
BlockTag(kind: BlockIdentifierKind.bidAlias, alias: "latest")
93-
)
94-
toBlock =
95-
filter.toBlock.get(BlockTag(kind: BlockIdentifierKind.bidAlias, alias: "latest"))
96-
97-
bottom =
98-
if fromBlock.kind == BlockIdentifierKind.bidNumber:
99-
fromBlock.number
100-
else:
101-
return err("Cannot verify boundaries for block tags in 'fromBlock' field")
102-
top =
103-
if toBlock.kind == BlockIdentifierKind.bidNumber:
104-
toBlock.number
105-
else:
106-
return err("Cannot verify boundaries for block tags in 'toBlock' field")
107-
108-
for lg in logObjs:
109-
if lg.blockNumber.isSome:
110-
if lg.blockNumber.get < bottom or lg.blockNumber.get > top:
111-
return ok(false)
89+
fromBlock = filter.fromBlock.get(types.BlockTag(kind: bidAlias, alias: "latest"))
90+
toBlock = filter.toBlock.get(types.BlockTag(kind: bidAlias, alias: "latest"))
91+
fromBlockNumberTag = resolveBlockTag(fromBlock).valueOr:
92+
return err(error)
93+
toBlockNumberTag = resolveBlockTag(toBlock).valueOr:
94+
return err(error)
11295

113-
return ok(true)
96+
return ok(
97+
FilterOptions(
98+
fromBlock: Opt.some(fromBlockNumberTag),
99+
toBlock: Opt.some(toBlockNumberTag),
100+
address: filter.address,
101+
topics: filter.topics,
102+
blockHash: filter.blockHash,
103+
)
104+
)
114105

115106
proc verifyLogs*(
116-
vp: VerifiedRpcProxy, logObjs: seq[LogObject]
117-
): Future[Result[seq[LogObject], string]] {.async.} =
107+
vp: VerifiedRpcProxy, filterOptions: FilterOptions, logObjs: seq[LogObject]
108+
): Future[Result[bool, string]] {.async.} =
118109
var res = newSeq[LogObject]()
119110
120111
# store block hashes contains the logs so that we can batch receipt requests
@@ -140,7 +131,9 @@ proc verifyLogs*(
140131

141132
if rxLog.address != lg.address or rxLog.data != lg.data or
142133
rxLog.topics != lg.topics or
134+
lg.blockNumber.get() < filter.fromBlock.get().number or
135+
lg.blockNumber.get() > filter.toBlock.get().number or
143136
(not match(toLog(lg), filterOptions.address, filterOptions.topics)):
144137
return err("one of the returned logs is invalid")
145138

146-
return ok(logObjs)
139+
return ok()

nimbus_verified_proxy/rpc/rpc_eth_api.nim

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -273,27 +273,23 @@ proc installEthApiHandlers*(vp: VerifiedRpcProxy) =
273273

274274
vp.proxy.rpc("eth_getLogs") do(filterOptions: FilterOptions) -> seq[LogObject]:
275275
let
276+
filter = resolveFilterTags(filterOptions).valueOr:
277+
raise newException(ValueError, error)
276278
logObjs =
277279
try:
278-
await vp.rpcClient.eth_getLogs(filterOptions)
280+
await vp.rpcClient.eth_getLogs(filter)
279281
except CatchableError as e:
280282
raise newException(ValueError, e.msg)
281283

282-
boundsCheck = verifyFilterBoundaries(filterOptions, logObjs).valueOr:
283-
raise newException(ValueError, error)
284-
285-
if not boundsCheck:
286-
raise newException(ValueError, "Logs out of filter block range")
287-
288-
let verifiedLogs = (await vp.verifyLogs(logObjs)).valueOr:
289-
raise newException(ValueError, error)
284+
?(await vp.verifyLogs(filter, logObjs))
290285

291-
return verifiedLogs
286+
return logObjs
292287

293288
vp.proxy.rpc("eth_newFilter") do(filterOptions: FilterOptions) -> int:
294289
let
295290
hexId =
296291
try:
292+
# filter is not resolved when storing only while fetching
297293
await vp.rpcClient.eth_newFilter(filterOptions)
298294
except CatchableError as e:
299295
raise newException(ValueError, e.msg)
@@ -319,45 +315,35 @@ proc installEthApiHandlers*(vp: VerifiedRpcProxy) =
319315
raise newException(ValueError, "Filter doesn't exist")
320316

321317
let
318+
filter = resolveFilterTags(vp.filterStore[filterId]).valueOr:
319+
raise newException(ValueError, error)
322320
logObjs =
323321
try:
324322
# use locally stored filter and get logs
325-
await vp.rpcClient.eth_getLogs(vp.filterStore[filterId])
323+
await vp.rpcClient.eth_getLogs(filter)
326324
except CatchableError as e:
327325
raise newException(ValueError, e.msg)
328326

329-
boundsCheck = verifyFilterBoundaries(vp.filterStore[filterId], logObjs).valueOr:
330-
raise newException(ValueError, error)
327+
?(await vp.verifyLogs(filter, logObjs))
331328

332-
if not boundsCheck:
333-
raise newException(ValueError, "Logs out of filter block range")
334-
335-
let verifiedLogs = (await vp.verifyLogs(logObjs)).valueOr:
336-
raise newException(ValueError, error)
337-
338-
return verifiedLogs
329+
return logObjs
339330

340331
vp.proxy.rpc("eth_getFilterChanges") do(filterId: int) -> seq[LogObject]:
341332
if filterId notin vp.filterStore:
342333
raise newException(ValueError, "Filter doesn't exist")
343334

344335
let
336+
filter = resolveFilterTags(vp.filterStore[filterId]).valueOr:
337+
raise newException(ValueError, error)
345338
logObjs =
346339
try:
347340
await vp.rpcClient.eth_getFilterChanges("0x" & toHex(filterId))
348341
except CatchableError as e:
349342
raise newException(ValueError, e.msg)
350343

351-
boundsCheck = verifyFilterBoundaries(vp.filterStore[filterId], logObjs).valueOr:
352-
raise newException(ValueError, error)
353-
354-
if not boundsCheck:
355-
raise newException(ValueError, "Logs out of filter block range")
356-
357-
let verifiedLogs = (await vp.verifyLogs(logObjs)).valueOr:
358-
raise newException(ValueError, error)
344+
?(await vp.verifyLogs(filter, logObjs))
359345

360-
return verifiedLogs
346+
return logObjs
361347

362348
# Following methods are forwarded directly to the web3 provider and therefore
363349
# are not validated in any way.

0 commit comments

Comments
 (0)