diff --git a/beacon_chain/sync/sync_protocol.nim b/beacon_chain/sync/sync_protocol.nim index e744d3b2f5..d79ecb10ad 100644 --- a/beacon_chain/sync/sync_protocol.nim +++ b/beacon_chain/sync/sync_protocol.nim @@ -44,50 +44,19 @@ proc readChunkPayload*( var contextBytes: ForkDigest try: await conn.readExactly(addr contextBytes, sizeof contextBytes) - except CancelledError as exc: - raise exc except CatchableError: return neterr UnexpectedEOF + let contextFork = + peer.network.forkDigests[].consensusForkForDigest(contextBytes).valueOr: + return neterr InvalidContextBytes - static: doAssert ConsensusFork.high == ConsensusFork.Electra - if contextBytes == peer.network.forkDigests.phase0: - let res = await readChunkPayload(conn, peer, phase0.SignedBeaconBlock) + withConsensusFork(contextFork): + let res = await readChunkPayload( + conn, peer, consensusFork.SignedBeaconBlock) if res.isOk: return ok newClone(ForkedSignedBeaconBlock.init(res.get)) else: return err(res.error) - elif contextBytes == peer.network.forkDigests.altair: - let res = await readChunkPayload(conn, peer, altair.SignedBeaconBlock) - if res.isOk: - return ok newClone(ForkedSignedBeaconBlock.init(res.get)) - else: - return err(res.error) - elif contextBytes == peer.network.forkDigests.bellatrix: - let res = await readChunkPayload(conn, peer, bellatrix.SignedBeaconBlock) - if res.isOk: - return ok newClone(ForkedSignedBeaconBlock.init(res.get)) - else: - return err(res.error) - elif contextBytes == peer.network.forkDigests.capella: - let res = await readChunkPayload(conn, peer, capella.SignedBeaconBlock) - if res.isOk: - return ok newClone(ForkedSignedBeaconBlock.init(res.get)) - else: - return err(res.error) - elif contextBytes == peer.network.forkDigests.deneb: - let res = await readChunkPayload(conn, peer, deneb.SignedBeaconBlock) - if res.isOk: - return ok newClone(ForkedSignedBeaconBlock.init(res.get)) - else: - return err(res.error) - elif contextBytes == peer.network.forkDigests.electra: - let res = await readChunkPayload(conn, peer, electra.SignedBeaconBlock) - if res.isOk: - return ok newClone(ForkedSignedBeaconBlock.init(res.get)) - else: - return err(res.error) - else: - return neterr InvalidContextBytes proc readChunkPayload*( conn: Connection, peer: Peer, MsgType: type (ref BlobSidecar)): @@ -95,19 +64,21 @@ proc readChunkPayload*( var contextBytes: ForkDigest try: await conn.readExactly(addr contextBytes, sizeof contextBytes) - except CancelledError as exc: - raise exc except CatchableError: return neterr UnexpectedEOF - - if contextBytes == peer.network.forkDigests.deneb: - let res = await readChunkPayload(conn, peer, BlobSidecar) - if res.isOk: - return ok newClone(res.get) + let contextFork = + peer.network.forkDigests[].consensusForkForDigest(contextBytes).valueOr: + return neterr InvalidContextBytes + + withConsensusFork(contextFork): + when consensusFork >= ConsensusFork.Deneb: + let res = await readChunkPayload(conn, peer, BlobSidecar) + if res.isOk: + return ok newClone(res.get) + else: + return err(res.error) else: - return err(res.error) - else: - return neterr InvalidContextBytes + return neterr InvalidContextBytes {.pop.} # TODO fix p2p macro for raises