From a4f4d45b5e3a1b4a944b5f47403b05cc085f3323 Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Tue, 26 Sep 2023 15:39:42 +0200 Subject: [PATCH 1/3] Alpha/DAL: rename field in error --- .../lib_protocol/alpha_context.mli | 6 ++-- src/proto_alpha/lib_protocol/dal_apply.ml | 12 +++---- .../lib_protocol/dal_errors_repr.ml | 35 ++++++++++--------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 560937d1d0f9..eeb433d38c6d 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -2758,14 +2758,14 @@ module Dal_errors : sig } | Dal_data_availibility_attestor_not_in_committee of { attestor : Signature.Public_key_hash.t; - level : Level.t; + level : Raw_level.t; } | Dal_operation_for_old_level of { - current : Raw_level.t; + expected : Raw_level.t; given : Raw_level.t; } | Dal_operation_for_future_level of { - current : Raw_level.t; + expected : Raw_level.t; given : Raw_level.t; } | Dal_cryptobox_error of {explanation : string} diff --git a/src/proto_alpha/lib_protocol/dal_apply.ml b/src/proto_alpha/lib_protocol/dal_apply.ml index 24364280bfc9..de5c2054f4c3 100644 --- a/src/proto_alpha/lib_protocol/dal_apply.ml +++ b/src/proto_alpha/lib_protocol/dal_apply.ml @@ -64,22 +64,22 @@ let validate_attestation ctxt op = Compare.Int.(size <= maximum_size) (Dal_attestation_size_limit_exceeded {maximum_size; got = size}) in - let current = Level.(current ctxt).level in - let delta_levels = Raw_level.diff current given in + let expected = Level.(current ctxt).level in + let delta_levels = Raw_level.diff expected given in let* () = error_when Compare.Int32.(delta_levels > 0l) - (Dal_operation_for_old_level {current; given}) + (Dal_operation_for_old_level {expected; given}) in let* () = error_when Compare.Int32.(delta_levels < 0l) - (Dal_operation_for_future_level {current; given}) + (Dal_operation_for_future_level {expected; given}) in error_when (Option.is_none @@ Dal.Attestation.shards_of_attestor ctxt ~attestor) (Dal_data_availibility_attestor_not_in_committee - {attestor; level = Level.current ctxt}) + {attestor; level = expected}) let apply_attestation ctxt op = let open Result_syntax in @@ -88,7 +88,7 @@ let apply_attestation ctxt op = match Dal.Attestation.shards_of_attestor ctxt ~attestor with | None -> (* This should not happen: operation validation should have failed. *) - let level = Level.current ctxt in + let level = (Level.current ctxt).level in tzfail (Dal_data_availibility_attestor_not_in_committee {attestor; level}) | Some shards -> Ok (Dal.Attestation.record_attested_shards ctxt attestation shards) diff --git a/src/proto_alpha/lib_protocol/dal_errors_repr.ml b/src/proto_alpha/lib_protocol/dal_errors_repr.ml index 6ba587e9ccf6..a15c49554757 100644 --- a/src/proto_alpha/lib_protocol/dal_errors_repr.ml +++ b/src/proto_alpha/lib_protocol/dal_errors_repr.ml @@ -42,14 +42,14 @@ type error += } | Dal_data_availibility_attestor_not_in_committee of { attestor : Signature.Public_key_hash.t; - level : Level_repr.t; + level : Raw_level_repr.t; } | Dal_operation_for_old_level of { - current : Raw_level_repr.t; + expected : Raw_level_repr.t; given : Raw_level_repr.t; } | Dal_operation_for_future_level of { - current : Raw_level_repr.t; + expected : Raw_level_repr.t; given : Raw_level_repr.t; } | Dal_cryptobox_error of {explanation : string} @@ -210,43 +210,44 @@ let () = ~id:"Dal_operation_for_old_level" ~title:"Dal operation for an old level" ~description:"The Dal operation targets an old level" - ~pp:(fun ppf (current_lvl, given_lvl) -> + ~pp:(fun ppf (expected_lvl, given_lvl) -> Format.fprintf ppf - "Dal operation targets an old level %a. Current level is %a." + "Dal operation targets an old level %a. Expected level is %a." Raw_level_repr.pp given_lvl Raw_level_repr.pp - current_lvl) + expected_lvl) Data_encoding.( obj2 - (req "current_level" Raw_level_repr.encoding) + (req "expected_level" Raw_level_repr.encoding) (req "given_level" Raw_level_repr.encoding)) (function - | Dal_operation_for_old_level {current; given} -> Some (current, given) + | Dal_operation_for_old_level {expected; given} -> Some (expected, given) | _ -> None) - (fun (current, given) -> Dal_operation_for_old_level {current; given}) ; + (fun (expected, given) -> Dal_operation_for_old_level {expected; given}) ; register_error_kind `Temporary ~id:"Dal_operation_for_future_level" ~title:"Dal operation for a future level" ~description:"The Dal operation target a future level" - ~pp:(fun ppf (current_lvl, given_lvl) -> + ~pp:(fun ppf (expected_lvl, given_lvl) -> Format.fprintf ppf - "Dal operation targets a future level %a. Current level is %a." + "Dal operation targets a future level %a. Expected level is %a." Raw_level_repr.pp given_lvl Raw_level_repr.pp - current_lvl) + expected_lvl) Data_encoding.( obj2 - (req "current_level" Raw_level_repr.encoding) + (req "expected_level" Raw_level_repr.encoding) (req "given_level" Raw_level_repr.encoding)) (function - | Dal_operation_for_future_level {current; given} -> Some (current, given) + | Dal_operation_for_future_level {expected; given} -> + Some (expected, given) | _ -> None) - (fun (current, given) -> Dal_operation_for_future_level {current; given}) ; + (fun (expected, given) -> Dal_operation_for_future_level {expected; given}) ; register_error_kind `Permanent ~id:"Dal_data_availibility_attestor_not_in_committee" @@ -258,12 +259,12 @@ let () = "The attestor %a is not part of the DAL committee for the level %a" Signature.Public_key_hash.pp attestor - Level_repr.pp + Raw_level_repr.pp level) Data_encoding.( obj2 (req "attestor" Signature.Public_key_hash.encoding) - (req "level" Level_repr.encoding)) + (req "level" Raw_level_repr.encoding)) (function | Dal_data_availibility_attestor_not_in_committee {attestor; level} -> Some (attestor, level) -- GitLab From 8f285b268d58cb53969e68517a58682a8b22a4e5 Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Tue, 26 Sep 2023 15:12:08 +0200 Subject: [PATCH 2/3] DAL: the level of DAL attestations is as for endorsements --- src/bin_dal_node/RPC_server.ml | 6 +++++- src/proto_alpha/lib_delegate/baking_actions.ml | 14 ++++++++------ src/proto_alpha/lib_delegate/baking_actions.mli | 1 - src/proto_alpha/lib_delegate/baking_lib.ml | 6 ++---- src/proto_alpha/lib_delegate/node_rpc.ml | 4 ++-- src/proto_alpha/lib_delegate/node_rpc.mli | 2 +- src/proto_alpha/lib_protocol/alpha_context.mli | 1 + src/proto_alpha/lib_protocol/dal_apply.ml | 7 ++++++- .../lib_protocol/dal_attestation_repr.mli | 15 ++++++++++++--- src/proto_alpha/lib_protocol/dal_errors_repr.ml | 13 ++++++++++++- .../integration/validate/generator_descriptors.ml | 4 ++-- tezt/tests/dal.ml | 14 +++++--------- 12 files changed, 56 insertions(+), 31 deletions(-) diff --git a/src/bin_dal_node/RPC_server.ml b/src/bin_dal_node/RPC_server.ml index c3645bd3e140..2df9b83d6911 100644 --- a/src/bin_dal_node/RPC_server.ml +++ b/src/bin_dal_node/RPC_server.ml @@ -157,12 +157,16 @@ module Profile_handlers = struct let get_attestable_slots ctxt pkh attested_level () () = call_handler2 ctxt (fun store {proto_parameters; _} -> + (* For retrieving the assigned shard indexes, we consider the committee + at [attested_level - 1], because the (DAL) attestations in the blocks + at level [attested_level] refer to the predecessor level. *) + let attestation_level = Int32.pred attested_level in (let open Lwt_result_syntax in let* shard_indices = Node_context.fetch_assigned_shard_indices ctxt ~pkh - ~level:attested_level + ~level:attestation_level |> Errors.other_lwt_result in Profile_manager.get_attestable_slots diff --git a/src/proto_alpha/lib_delegate/baking_actions.ml b/src/proto_alpha/lib_delegate/baking_actions.ml index 61a4fd9ba018..fd9821e563cb 100644 --- a/src/proto_alpha/lib_delegate/baking_actions.ml +++ b/src/proto_alpha/lib_delegate/baking_actions.ml @@ -660,7 +660,7 @@ let inject_attestations state ~attestations = return_unit)) signed_operations -let inject_dal_attestations state attestations ~attestation_level = +let inject_dal_attestations state attestations = let open Lwt_result_syntax in let cctxt = state.global_state.cctxt in let chain_id = state.global_state.chain_id in @@ -680,6 +680,7 @@ let inject_dal_attestations state attestations ~attestation_level = encoded_op in let bitset_int = Bitset.to_z (attestation :> Bitset.t) in + let attestation_level = state.level_state.current_level in let*! () = Events.( emit @@ -710,9 +711,11 @@ let only_if_dal_feature_enabled state ~default_value f = | Some ctxt -> f ctxt else return default_value -let get_dal_attestations state ~attestation_level = +let get_dal_attestations state = let open Lwt_result_syntax in only_if_dal_feature_enabled state ~default_value:[] (fun dal_node_rpc_ctxt -> + let attestation_level = state.level_state.current_level in + let attested_level = Int32.succ attestation_level in let delegates = List.map (fun delegate_slot -> delegate_slot.consensus_key_and_delegate) @@ -726,7 +729,7 @@ let get_dal_attestations state ~attestation_level = Node_rpc.get_attestable_slots dal_node_rpc_ctxt (signing_key delegate) - ~level:attestation_level + ~attested_level in match tz_res with | Error errs -> @@ -781,9 +784,8 @@ let get_dal_attestations state ~attestation_level = let get_and_inject_dal_attestations state = let open Lwt_result_syntax in - let attestation_level = Int32.succ state.level_state.current_level in - let* attestations = get_dal_attestations state ~attestation_level in - inject_dal_attestations state attestations ~attestation_level + let* attestations = get_dal_attestations state in + inject_dal_attestations state attestations let prepare_waiting_for_quorum state = let consensus_threshold = diff --git a/src/proto_alpha/lib_delegate/baking_actions.mli b/src/proto_alpha/lib_delegate/baking_actions.mli index 649385e5c7c4..cd55b01326d2 100644 --- a/src/proto_alpha/lib_delegate/baking_actions.mli +++ b/src/proto_alpha/lib_delegate/baking_actions.mli @@ -117,7 +117,6 @@ val sign_dal_attestations : val get_dal_attestations : state -> - attestation_level:Int32.t -> (consensus_key_and_delegate * Dal.Attestation.operation * int32) list tzresult Lwt.t diff --git a/src/proto_alpha/lib_delegate/baking_lib.ml b/src/proto_alpha/lib_delegate/baking_lib.ml index 117e080dfe79..7fd3c01dd671 100644 --- a/src/proto_alpha/lib_delegate/baking_lib.ml +++ b/src/proto_alpha/lib_delegate/baking_lib.ml @@ -546,10 +546,7 @@ let rec baking_minimal_timestamp ~count state current_mempool (List.map (fun (_, x, _, _) -> x) signed_attestations) in - let attestation_level = Int32.succ latest_proposal.block.shell.level in - let* own_dal_attestations = - Baking_actions.get_dal_attestations state ~attestation_level - in + let* own_dal_attestations = Baking_actions.get_dal_attestations state in let* signed_dal_attestations = Baking_actions.sign_dal_attestations state own_dal_attestations in @@ -583,6 +580,7 @@ let rec baking_minimal_timestamp ~count state if count <= 1 then return_unit else let*! () = + let attestation_level = Int32.succ latest_proposal.block.shell.level in Lwt_stream.junk_while_s (fun proposal -> Lwt.return diff --git a/src/proto_alpha/lib_delegate/node_rpc.ml b/src/proto_alpha/lib_delegate/node_rpc.ml index f2a0eb938067..f566aee6e5d7 100644 --- a/src/proto_alpha/lib_delegate/node_rpc.ml +++ b/src/proto_alpha/lib_delegate/node_rpc.ml @@ -289,11 +289,11 @@ let await_protocol_activation cctxt ~chain () = stop () ; return_unit -let get_attestable_slots dal_node_rpc_ctxt pkh ~level = +let get_attestable_slots dal_node_rpc_ctxt pkh ~attested_level = Tezos_rpc.Context.make_call Tezos_dal_node_services.Services.get_attestable_slots dal_node_rpc_ctxt - (((), pkh), level) + (((), pkh), attested_level) () () diff --git a/src/proto_alpha/lib_delegate/node_rpc.mli b/src/proto_alpha/lib_delegate/node_rpc.mli index ddae8fb67267..be2b2338bbff 100644 --- a/src/proto_alpha/lib_delegate/node_rpc.mli +++ b/src/proto_alpha/lib_delegate/node_rpc.mli @@ -88,7 +88,7 @@ val await_protocol_activation : val get_attestable_slots : Tezos_rpc.Context.generic -> public_key_hash -> - level:int32 -> + attested_level:int32 -> Tezos_dal_node_services.Services.Types.attestable_slots tzresult Lwt.t (** [register_dal_profiles ctxt delegates] calls the DAL node RPC PATCH diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index eeb433d38c6d..d0e760df32ea 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -2769,6 +2769,7 @@ module Dal_errors : sig given : Raw_level.t; } | Dal_cryptobox_error of {explanation : string} + | Dal_unexpected_attestation_at_root_level end (** This module re-exports definitions from {!Sc_rollup_storage} and diff --git a/src/proto_alpha/lib_protocol/dal_apply.ml b/src/proto_alpha/lib_protocol/dal_apply.ml index de5c2054f4c3..3774ecbfc6a7 100644 --- a/src/proto_alpha/lib_protocol/dal_apply.ml +++ b/src/proto_alpha/lib_protocol/dal_apply.ml @@ -64,7 +64,12 @@ let validate_attestation ctxt op = Compare.Int.(size <= maximum_size) (Dal_attestation_size_limit_exceeded {maximum_size; got = size}) in - let expected = Level.(current ctxt).level in + let current = Level.(current ctxt).level in + let* expected = + match Raw_level.pred current with + | None -> error Dal_unexpected_attestation_at_root_level + | Some level -> return level + in let delta_levels = Raw_level.diff expected given in let* () = error_when diff --git a/src/proto_alpha/lib_protocol/dal_attestation_repr.mli b/src/proto_alpha/lib_protocol/dal_attestation_repr.mli index 7a62135f6b72..f27e03250aac 100644 --- a/src/proto_alpha/lib_protocol/dal_attestation_repr.mli +++ b/src/proto_alpha/lib_protocol/dal_attestation_repr.mli @@ -51,10 +51,19 @@ type operation = { attestation : t; (** The bitset of slots that are attested to be available. *) level : Raw_level_repr.t; - (** The level at which the operation is valid. It should be equal to the - attested slot's published level plus the DAL attestation lag. *) + (** Similar to {!Operation_repr.consensus_content.level}. It is the level + at which the operation is valid in the mempool. It is the predecessor + at the level of the block that contains it. It should be equal to the + attested slot's published level plus the DAL attestation lag minus + one. *) (* TODO: https://gitlab.com/tezos/tezos/-/issues/4672 - consider renaming to [attested_level] *) + consider renaming to [attestation_level]. + Maybe not a great idea, but we could try this: + - attestation level: this level ^, the one inside the op; + - attested level: its successor, the level of the block + - That is, we have: + [attestation_level + 1 = attested_level] + [published_level + attestation_lag = attested_level] *) } val encoding : t Data_encoding.t diff --git a/src/proto_alpha/lib_protocol/dal_errors_repr.ml b/src/proto_alpha/lib_protocol/dal_errors_repr.ml index a15c49554757..3a781e245236 100644 --- a/src/proto_alpha/lib_protocol/dal_errors_repr.ml +++ b/src/proto_alpha/lib_protocol/dal_errors_repr.ml @@ -57,6 +57,7 @@ type error += length : int; slot_header : Dal_slot_repr.Header.t; } + | Dal_unexpected_attestation_at_root_level let () = let open Data_encoding in @@ -305,4 +306,14 @@ let () = Some (length, slot_header) | _ -> None) (fun (length, slot_header) -> - Dal_register_invalid_slot_header {length; slot_header}) + Dal_register_invalid_slot_header {length; slot_header}) ; + let description = "DAL attestations are not expected at root level" in + register_error_kind + `Temporary + ~id:"dal_unexpected_attestation_at_root_level" + ~title:"DAL unexpected attestation at root level" + ~description + ~pp:(fun ppf () -> Format.fprintf ppf "%s" description) + empty + (function Dal_unexpected_attestation_at_root_level -> Some () | _ -> None) + (fun () -> Dal_unexpected_attestation_at_root_level) diff --git a/src/proto_alpha/lib_protocol/test/integration/validate/generator_descriptors.ml b/src/proto_alpha/lib_protocol/test/integration/validate/generator_descriptors.ml index 27cf81624d36..176cd025ab1a 100644 --- a/src/proto_alpha/lib_protocol/test/integration/validate/generator_descriptors.ml +++ b/src/proto_alpha/lib_protocol/test/integration/validate/generator_descriptors.ml @@ -642,9 +642,9 @@ let dal_attestation ctxt current_level delegate = | Some _interval -> (* The content of the attestation does not matter for covalidity. *) let attestation = Dal.Attestation.empty in - let next_level = Raw_level.succ current_level in return_some - (Dal_attestation {attestor = delegate; attestation; level = next_level}) + (Dal_attestation + {attestor = delegate; attestation; level = current_level}) let dal_attestation_descriptor = let open Lwt_result_syntax in diff --git a/tezt/tests/dal.ml b/tezt/tests/dal.ml index fdc0ea3ab278..98f013c167fd 100644 --- a/tezt/tests/dal.ml +++ b/tezt/tests/dal.ml @@ -500,11 +500,7 @@ let dal_attestation ?level ?(force = false) ~signer ~nb_slots availability let attestation = Array.make nb_slots false in List.iter (fun i -> attestation.(i) <- true) availability ; let* level = - match level with - | Some level -> return level - | None -> - let* level = Client.level client in - return @@ (level + 1) + match level with Some level -> return level | None -> Client.level client in Operation.Consensus.inject ~force @@ -781,10 +777,10 @@ let test_slots_attestation_operation_behavior _protocol parameters cryptobox let* (`OpHash h2) = attest ~level:(now - 1) in let outdated = [h1; h2] in let* () = mempool_is ~__LOC__ Mempool.{empty with outdated} in - let* (`OpHash h3) = attest ~level:(now + 1) in + let* (`OpHash h3) = attest ~level:now in let validated = [h3] in let* () = mempool_is ~__LOC__ Mempool.{empty with outdated; validated} in - let* (`OpHash h4) = attest ~level:(now + 2) in + let* (`OpHash h4) = attest ~level:(now + 1) in let branch_delayed = [h4] in let* () = mempool_is ~__LOC__ Mempool.{empty with outdated; validated; branch_delayed} @@ -847,7 +843,7 @@ let test_slots_attestation_operation_behavior _protocol parameters cryptobox (* Tests that DAL attestations are only included in the block if the attestation is from a DAL-committee member. *) let test_slots_attestation_operation_dal_committee_membership_check _protocol - parameters _cryptobox node client _bootstrap_key = + parameters _cryptobox _node client _bootstrap_key = let* new_account = (* Set up a new account that holds some tez and is revealed. *) let* new_account = Client.gen_and_show_keys client in @@ -865,7 +861,7 @@ let test_slots_attestation_operation_dal_committee_membership_check _protocol return new_account in let nb_slots = parameters.Dal.Parameters.number_of_slots in - let* level = next_level node in + let* level = Client.level client in let* (`OpHash _oph) = (* The attestation from the new account should fail as the new account is not an attester and cannot be on the DAL committee. *) -- GitLab From f52d702bd21b67911bf10baecb143bd5ba8f2e8d Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Tue, 26 Sep 2023 16:03:48 +0200 Subject: [PATCH 3/3] DAL/Tests: improve test readability --- tezt/tests/dal.ml | 48 +++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/tezt/tests/dal.ml b/tezt/tests/dal.ml index 98f013c167fd..9eb8c7c0b479 100644 --- a/tezt/tests/dal.ml +++ b/tezt/tests/dal.ml @@ -773,23 +773,27 @@ let test_slots_attestation_operation_behavior _protocol parameters cryptobox let* now = Node.get_level node in let* (`OpHash h1) = attest ~level:1 in let outdated = [h1] in + Log.info "expected mempool: outdated: h1 = %s" h1 ; let* () = mempool_is ~__LOC__ Mempool.{empty with outdated} in let* (`OpHash h2) = attest ~level:(now - 1) in let outdated = [h1; h2] in + Log.info "expected mempool: outdated: h1, h2 = %s" h2 ; let* () = mempool_is ~__LOC__ Mempool.{empty with outdated} in let* (`OpHash h3) = attest ~level:now in - let validated = [h3] in - let* () = mempool_is ~__LOC__ Mempool.{empty with outdated; validated} in + Log.info "expected mempool: outdated: h1, h2; validated: h3 = %s" h3 ; + let* () = + mempool_is ~__LOC__ Mempool.{empty with outdated; validated = [h3]} + in let* (`OpHash h4) = attest ~level:(now + 1) in - let branch_delayed = [h4] in let* () = - mempool_is ~__LOC__ Mempool.{empty with outdated; validated; branch_delayed} + mempool_is + ~__LOC__ + Mempool.{empty with outdated; validated = [h3]; branch_delayed = [h4]} in let* () = Client.bake_for_and_wait client in - let validated = [h4] in - let branch_delayed = [] in + Log.info "expected mempool: outdated: h1, h2, validated: h4 = %s" h4 ; let* () = - mempool_is ~__LOC__ Mempool.{empty with outdated; validated; branch_delayed} + mempool_is ~__LOC__ Mempool.{empty with outdated; validated = [h4]} in let* () = check_slots_availability ~__LOC__ ~attested:[] in (* Part B. @@ -809,35 +813,35 @@ let test_slots_attestation_operation_behavior _protocol parameters cryptobox cryptobox client in - let validated = h5 :: validated in + Log.info "expected mempool: outdated: h1, h2, validated: h4, h5 = %s" h5 ; let* () = - mempool_is ~__LOC__ Mempool.{empty with outdated; validated; branch_delayed} + mempool_is ~__LOC__ Mempool.{empty with outdated; validated = [h4; h5]} in let* () = Client.bake_for_and_wait client in let* now = Node.get_level node in + let level = now + lag - 1 in let* attestation_ops = - let level = now + lag in let* hashes = dal_attestations ~force:true ~nb_slots ~level [10] client in return @@ List.map (fun (`OpHash h) -> h) hashes in - let validated = [] in + Log.info + "Injected %d ops at level %d (current_level = %d, lag = %d)" + (List.length attestation_ops) + level + now + lag ; let branch_delayed = attestation_ops in - let* () = - mempool_is ~__LOC__ Mempool.{empty with outdated; validated; branch_delayed} - in + let* () = mempool_is ~__LOC__ Mempool.{empty with outdated; branch_delayed} in let* () = repeat (lag - 1) (fun () -> Client.bake_for_and_wait client) in - let validated = attestation_ops in - let branch_delayed = [] in let* () = - mempool_is ~__LOC__ Mempool.{empty with outdated; validated; branch_delayed} + mempool_is + ~__LOC__ + Mempool.{empty with outdated; validated = attestation_ops} in let* () = check_slots_availability ~__LOC__ ~attested:[] in let* () = Client.bake_for_and_wait client in - let validated = [] in - let branch_delayed = [] in - let* () = - mempool_is ~__LOC__ Mempool.{empty with outdated; validated; branch_delayed} - in + Log.info "expected mempool: outdated: h1, h2" ; + let* () = mempool_is ~__LOC__ Mempool.{empty with outdated} in check_slots_availability ~__LOC__ ~attested:[10] (* Tests that DAL attestations are only included in the block -- GitLab