diff --git a/codex/blockexchange/engine/engine.nim b/codex/blockexchange/engine/engine.nim index 35785cfe0..29432aeac 100644 --- a/codex/blockexchange/engine/engine.nim +++ b/codex/blockexchange/engine/engine.nim @@ -396,28 +396,8 @@ proc blocksDeliveryHandler*( peer = peer address = bd.address - try: - if err =? self.validateBlockDelivery(bd).errorOption: - warn "Block validation failed", msg = err.msg - continue - - if err =? (await self.localStore.putBlock(bd.blk)).errorOption: - error "Unable to store block", err = err.msg - continue - - if bd.address.leaf: - without proof =? bd.proof: - warn "Proof expected for a leaf block delivery" - continue - if err =? ( - await self.localStore.putCidAndProof( - bd.address.treeCid, bd.address.index, bd.blk.cid, proof - ) - ).errorOption: - warn "Unable to store proof and cid for a block" - continue - except CatchableError as exc: - warn "Error handling block delivery", error = exc.msg + if err =? self.validateBlockDelivery(bd).errorOption: + warn "Block validation failed", msg = err.msg continue validatedBlocksDelivery.add(bd) diff --git a/codex/blockexchange/engine/pendingblocks.nim b/codex/blockexchange/engine/pendingblocks.nim index f169f744c..4fe814333 100644 --- a/codex/blockexchange/engine/pendingblocks.nim +++ b/codex/blockexchange/engine/pendingblocks.nim @@ -16,6 +16,7 @@ import std/strutils import pkg/chronos import pkg/libp2p import pkg/metrics +import pkg/questionable/results import ../protobuf/blockexc import ../../blocktype @@ -105,6 +106,9 @@ proc resolve*( stopTime = getMonoTime().ticks retrievalDurationUs = (stopTime - startTime) div 1000 + if bd.proof.isSome: + bd.blk.proof = bd.proof + blockReq.handle.complete(bd.blk) codex_block_exchange_retrieval_time_us.set(retrievalDurationUs) diff --git a/codex/blocktype.nim b/codex/blocktype.nim index 7e13493d8..2a88407a6 100644 --- a/codex/blocktype.nim +++ b/codex/blocktype.nim @@ -28,6 +28,7 @@ import ./errors import ./logutils import ./utils/json import ./codextypes +from ./merkletree/codex/codex import CodexProof export errors, logutils, units, codextypes @@ -35,6 +36,7 @@ type Block* = ref object of RootObj cid*: Cid data*: seq[byte] + proof*: ?CodexProof BlockAddress* = object case leaf*: bool diff --git a/codex/merkletree/codex/codex.nim b/codex/merkletree/codex/codex.nim index e287dfacf..04ae598f2 100644 --- a/codex/merkletree/codex/codex.nim +++ b/codex/merkletree/codex/codex.nim @@ -20,6 +20,7 @@ import ../../utils import ../../rng import ../../errors import ../../blocktype +import ../../codextypes from ../../utils/digest import digestBytes diff --git a/codex/stores/networkstore.nim b/codex/stores/networkstore.nim index f94bca330..0710c29fc 100644 --- a/codex/stores/networkstore.nim +++ b/codex/stores/networkstore.nim @@ -41,6 +41,25 @@ method getBlock*(self: NetworkStore, address: BlockAddress): Future[?!Block] {.a error "Unable to get block from exchange engine", address, err = err.msg return failure err + if address.leaf: + without proof =? newBlock.proof: + error "Proof expected for a leaf block delivery" + return failure "Proof expected for a leaf block delivery" + if err =? (await self.localStore.putBlock(newBlock)).errorOption: + error "Unable to store block", err = err.msg + return failure err + if err =? ( + await self.localStore.putCidAndProof( + address.treeCid, address.index, newBlock.cid, proof + ) + ).errorOption: + error "Unable to store proof and cid for a block:", err = err.msg + return failure err + else: + if err =? (await self.localStore.putBlock(newBlock)).errorOption: + error "Unable to store block", err = err.msg + return failure err + return success newBlock return success blk