From aec4f0122bde52d3705154230fe4eff83bb50921 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Tue, 6 Feb 2024 14:33:20 +0100 Subject: [PATCH 1/7] Dal/tests: be able to provide a slot_index in Dal_helpers.mk_page_info --- .../lib_protocol/test/helpers/dal_helpers.ml | 10 +++++++--- .../lib_protocol/test/helpers/dal_helpers.mli | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml index 0c4a75cda56d..e4ba77883d0d 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml @@ -136,13 +136,17 @@ struct let no_data = Some (fun ~default_char:_ _ -> None) - let mk_page_info ?(default_char = 'x') ?level ?(page_index = P.Index.zero) - ?(custom_data = None) (slot : S.Header.t) polynomial = + let mk_page_info ?(default_char = 'x') ?level ?slot_index + ?(page_index = P.Index.zero) ?(custom_data = None) (slot : S.Header.t) + polynomial = let open Result_syntax in let level = match level with None -> slot.id.published_level | Some level -> level in - let page_id = mk_page_id level slot.id.index page_index in + let slot_index = + match slot_index with None -> slot.id.index | Some index -> index + in + let page_id = mk_page_id level slot_index page_index in let* page_proof = dal_mk_prove_page polynomial page_id in match custom_data with | None -> diff --git a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli index 1eef4b51ec66..69e4f7146263 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli +++ b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli @@ -103,6 +103,7 @@ end) : sig val mk_page_info : ?default_char:char -> ?level:Raw_level_repr.t -> + ?slot_index:Dal_slot_index_repr.t -> ?page_index:int -> ?custom_data:(default_char:char -> int -> bytes option) option -> Dal_slot_repr.Header.t -> -- GitLab From c0d82f15e19796823001940ff327c49b3af4bda7 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Tue, 6 Feb 2024 14:56:44 +0100 Subject: [PATCH 2/7] Dal/tests: function content_slot_id to get the slot id of a cell content --- src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml | 3 +++ src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml index e4ba77883d0d..c5c05dfbab74 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml @@ -62,6 +62,9 @@ let derive_dal_parameters (reference : Cryptobox.parameters) ~redundancy_factor number_of_shards = reference.number_of_shards / constants_divider; } +let content_slot_id = function + | Hist.Internal_for_tests.Unattested id | Attested {id; _} -> id + module Make (Parameters : sig val dal_parameters : Alpha_context.Constants.Parametric.dal diff --git a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli index 69e4f7146263..6f41d1fa9034 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli +++ b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli @@ -38,6 +38,11 @@ val derive_dal_parameters : constants_divider:int -> Cryptobox.parameters +(** Returns the slot id of the given cell's content . *) +val content_slot_id : + Dal_slot_repr.History.Internal_for_tests.cell_content -> + Dal_slot_repr.Header.id + module Make (P : sig val dal_parameters : Alpha_context.Constants.Parametric.dal -- GitLab From 7280c15d6f81ced785ec253eef51bdae5e460adb Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Wed, 7 Feb 2024 09:50:55 +0100 Subject: [PATCH 3/7] Dal/tests: new bad_history_cache helper --- src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml | 8 ++++++++ src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml index c5c05dfbab74..c8d9c7c2b4a7 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml @@ -270,4 +270,12 @@ struct (Hist.Dal_proof_error "The page ID's slot is not confirmed, but page content and proof \ are provided.") + + let bad_history_cache ~__LOC__ = + failing_check_produce_result + ~__LOC__ + ~expected_error: + (Hist.Dal_proof_error + "Skip_list.search returned Nearest', while all given levels to \ + produce proofs are supposed to be in the skip list.") end diff --git a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli index 6f41d1fa9034..649920b8aeae 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli +++ b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.mli @@ -180,4 +180,9 @@ end) : sig 'a tzresult -> 'b -> unit tzresult Lwt.t + + (** Helper for the case where produce_proof is expected to fail because some + cells are missing in the history cache. *) + val bad_history_cache : + __LOC__:string -> 'a tzresult -> 'b -> unit tzresult Lwt.t end -- GitLab From 18622b3ac87d50c5a6703140458c949583731ba6 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Tue, 6 Feb 2024 16:04:42 +0100 Subject: [PATCH 4/7] Dal/tests: adapt skip lists proofs' unit tests --- .../test/unit/test_dal_slot_proof.ml | 129 ++++++++++-------- 1 file changed, 73 insertions(+), 56 deletions(-) diff --git a/src/proto_alpha/lib_protocol/test/unit/test_dal_slot_proof.ml b/src/proto_alpha/lib_protocol/test/unit/test_dal_slot_proof.ml index 0a58a7e3cc91..86815feba75b 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_dal_slot_proof.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_dal_slot_proof.ml @@ -31,11 +31,6 @@ Subject: These unit tests check proof-related functions of Dal slots. *) -(* -TODO: https://gitlab.com/tezos/tezos/-/issues/6895 - -Adapt/re-enable tests - open Protocol module S = Dal_slot_repr module H = S.Header @@ -62,11 +57,20 @@ struct (** Check insertion of a new slot in the given skip list. *) let skip_list_ordering skip_list ~mk_level ~mk_slot_index ~check_result = let open Lwt_result_wrap_syntax in - let {S.Header.id; _} = Hist.Internal_for_tests.content skip_list in + let id = + Hist.Internal_for_tests.content skip_list |> Dal_helpers.content_slot_id + in let level = mk_level id in let index = mk_slot_index id in let*? _data, _poly, slot = mk_slot ~level ~index () in - let@ result = Hist.add_confirmed_slot_headers_no_cache skip_list [slot] in + let@ result = + Hist.add_confirmed_slot_headers_no_cache + skip_list + level + [slot] + ~number_of_slots:Parameters.dal_parameters.number_of_slots + in + check_result result (** This test attempts to add a slot on top of genesis cell zero which would @@ -76,14 +80,22 @@ struct where (published_level, slot_index) doesn't increase (is the same as the genesis cell). *) let insertion_breaks_skip_list_ordering () = + let open Lwt_result_syntax in skip_list_ordering genesis_history - ~mk_level:(fun id -> id.H.published_level) - ~mk_slot_index:(fun id -> id.H.index) + ~mk_level:(fun id -> Raw_level_repr.succ id.H.published_level) + ~mk_slot_index:(fun id -> succ_slot_index id.H.index) ~check_result:(fun res -> - Assert.proto_error ~loc:__LOC__ res (function - | Hist.Add_element_in_slots_skip_list_violates_ordering -> true - | _ -> false)) + let* skip_list = Assert.get_ok ~__LOC__ res in + skip_list_ordering + skip_list + ~mk_level:(fun _id -> + Raw_level_repr.root (* Putting root here breaks ordering. *)) + ~mk_slot_index:(fun id -> id.H.index) + ~check_result:(fun res -> + Assert.proto_error ~loc:__LOC__ res (function + | Hist.Add_element_in_slots_skip_list_violates_ordering -> true + | _ -> false))) (** This test attempts to add a slot on top of genesis cell zero which satisfies the ordering. *) @@ -103,7 +115,7 @@ struct let open Lwt_result_syntax in skip_list_ordering genesis_history - ~mk_level:(fun id -> id.H.published_level) + ~mk_level:(fun id -> Raw_level_repr.succ id.H.published_level) ~mk_slot_index:(fun id -> succ_slot_index id.H.index) ~check_result:(fun res -> let* (_skip_list : Hist.t) = Assert.get_ok ~__LOC__ res in @@ -115,14 +127,13 @@ struct let open Lwt_result_syntax in skip_list_ordering genesis_history - ~mk_level:(fun id -> id.H.published_level) + ~mk_level:(fun id -> Raw_level_repr.succ id.H.published_level) ~mk_slot_index:(fun id -> succ_slot_index id.H.index) ~check_result:(fun res -> let* skip_list = Assert.get_ok ~__LOC__ res in skip_list_ordering skip_list - ~mk_level:(fun id -> - Raw_level_repr.(succ (succ id.H.published_level))) + ~mk_level:(fun id -> Raw_level_repr.(succ id.H.published_level)) ~mk_slot_index:(fun id -> id.H.index) ~check_result:(fun res -> let* (_skip_list : Hist.t) = Assert.get_ok ~__LOC__ res in @@ -131,31 +142,34 @@ struct (* Tests of construct/verify proofs that confirm/unconfirm pages on top of genesis skip list (whose unique cell is slot zero). *) - (** This test attempts to construct a proof to confirm a slot page from the - genesis skip list. Proof production is expected to fail. *) - let confirmed_page_on_genesis () = - let {H.id = {published_level; index}; _} = + (** This test attempts to construct a proof to unconfirm a slot page from the + genesis skip list. Proof production is expected to succeed. *) + let unconfirmed_page_on_genesis () = + let Dal_slot_repr.Header.{published_level; index} = Hist.Internal_for_tests.content genesis_history + |> Dal_helpers.content_slot_id in let page_id = mk_page_id published_level index P.Index.zero in produce_and_verify_proof genesis_history ~get_history:(get_history genesis_history_cache) (* values of level and slot index are equal to slot zero. We would get a - page confirmation proof. But, no proof that confirms the existence of a page - in slot [zero] is possible. *) + page confirmation proof. But, no proof that confirms the existence of a page + in slot [zero] is possible. *) ~page_info:None ~page_id - ~check_produce:(slot_confirmed_but_page_data_not_provided ~__LOC__) + ~check_produce:(successful_check_produce_result ~__LOC__ `Unconfirmed) (** This test attempts to construct a proof to unconfirm a slot page from the - genesis skip list. Proof production is expected to succeed. *) - let unconfirmed_page_on_genesis incr_level = - let {H.id = {published_level; index}; _} = + genesis skip list. But there is no cell with the page's level in the + history cache. *) + let unconfirmed_page_on_genesis_bad_cache () = + let Dal_slot_repr.Header.{published_level; index} = Hist.Internal_for_tests.content genesis_history + |> Dal_helpers.content_slot_id in let level, sindex = - if incr_level then (Raw_level_repr.succ published_level, index) + if false then (Raw_level_repr.succ published_level, index) else (published_level, succ_slot_index index) in let page_id = mk_page_id level sindex P.Index.zero in @@ -164,21 +178,22 @@ struct ~get_history:(get_history genesis_history_cache) ~page_info:None ~page_id - ~check_produce:(successful_check_produce_result ~__LOC__ `Unconfirmed) - ~check_verify:(successful_check_verify_result ~__LOC__ `Unconfirmed) + ~check_produce:(bad_history_cache ~__LOC__) (* Tests of construct/verify proofs that attempt to confirm pages on top of a (confirmed) slot added in genesis_history skip list. *) (** Helper function that adds a slot a top of the genesis skip list. *) let helper_confirmed_slot_on_genesis ~level ~mk_page_info ~check_produce - ?check_verify () = + ?check_verify ?index () = let open Lwt_result_wrap_syntax in - let*? _slot_data, polynomial, slot = mk_slot ~level () in + let*? _slot_data, polynomial, slot = mk_slot ~level ?index () in let*?@ skip_list, cache = Hist.add_confirmed_slot_headers + ~number_of_slots:Parameters.dal_parameters.number_of_slots genesis_history genesis_history_cache + level [slot] in let*? page_info, page_id = mk_page_info slot polynomial in @@ -194,7 +209,7 @@ struct where the correct data and page proof are provided. *) let confirmed_slot_on_genesis_confirmed_page_good_data = helper_confirmed_slot_on_genesis - ~level:(Raw_level_repr.succ level_ten) + ~level:level_one ~mk_page_info ~check_produce:(successful_check_produce_result ~__LOC__ `Confirmed) ~check_verify:(successful_check_verify_result ~__LOC__ `Confirmed) @@ -203,7 +218,7 @@ struct where the page data and proof are not given. *) let confirmed_slot_on_genesis_confirmed_page_no_data = helper_confirmed_slot_on_genesis - ~level:(Raw_level_repr.succ level_ten) + ~level:level_one ~mk_page_info:(mk_page_info ~custom_data:no_data) ~check_produce:(slot_confirmed_but_page_data_not_provided ~__LOC__) @@ -212,7 +227,7 @@ struct let confirmed_slot_on_genesis_confirmed_page_bad_page_proof = let open Result_syntax in helper_confirmed_slot_on_genesis - ~level:(Raw_level_repr.succ level_ten) + ~level:level_one ~mk_page_info:(fun slot poly -> let* page_info1, _page_id1 = mk_page_info ~page_index:1 slot poly in let* page_info2, page_id2 = mk_page_info ~page_index:2 slot poly in @@ -227,14 +242,14 @@ struct ~expected_error: (Hist.Dal_proof_error "Wrong page content for the given page index and slot \ - commitment (page id=(published_level: 11, slot_index: 0, \ + commitment (page id=(published_level: 1, slot_index: 0, \ page_index: 2)).")) (** Test where a slot is confirmed, requesting a proof for a confirmed page, where correct page proof is provided, but given page data is altered. *) let confirmed_slot_on_genesis_confirmed_page_bad_data_right_length = helper_confirmed_slot_on_genesis - ~level:(Raw_level_repr.succ level_ten) + ~level:level_one ~mk_page_info: (mk_page_info ~custom_data: @@ -249,7 +264,7 @@ struct ~expected_error: (Hist.Dal_proof_error "Wrong page content for the given page index and slot \ - commitment (page id=(published_level: 11, slot_index: 0, \ + commitment (page id=(published_level: 1, slot_index: 0, \ page_index: 0)).")) (** Same as {!confirmed_slot_on_genesis_confirmed_page_bad_data_right_length} @@ -257,7 +272,7 @@ struct let confirmed_slot_on_genesis_confirmed_page_bad_data_short = let page_size = Parameters.dal_parameters.cryptobox_parameters.page_size in helper_confirmed_slot_on_genesis - ~level:(Raw_level_repr.succ level_ten) + ~level:level_one ~mk_page_info: (mk_page_info ~custom_data: @@ -276,7 +291,7 @@ struct let confirmed_slot_on_genesis_confirmed_page_bad_data_long = let page_size = Parameters.dal_parameters.cryptobox_parameters.page_size in helper_confirmed_slot_on_genesis - ~level:(Raw_level_repr.succ level_ten) + ~level:level_one ~mk_page_info: (mk_page_info ~custom_data: @@ -303,37 +318,42 @@ struct let helper_confirmed_slot_on_genesis_unconfirmed_page ~check_produce ?check_verify ~page_level ~mk_page_info = helper_confirmed_slot_on_genesis - ~level:(Raw_level_repr.succ page_level) + ~level:page_level ~mk_page_info ~check_produce ?check_verify + let slot_index_2 = + match Dal_slot_index_repr.of_int_opt ~number_of_slots:20 2 with + | None -> assert false + | Some v -> v + (** Unconfirmation proof for a page with good data. *) let confirmed_slot_on_genesis_unconfirmed_page_good_data = helper_confirmed_slot_on_genesis_unconfirmed_page - ~page_level:level_ten - ~mk_page_info:(mk_page_info ~level:level_ten) + ~page_level:level_one + ~mk_page_info:(mk_page_info ~slot_index:slot_index_2) ~check_produce:(slot_not_confirmed_but_page_data_provided ~__LOC__) (** Unconfirmation proof for a page with no data. *) let confirmed_slot_on_genesis_unconfirmed_page_no_data = helper_confirmed_slot_on_genesis_unconfirmed_page - ~page_level:level_ten - ~mk_page_info:(mk_page_info ~custom_data:no_data ~level:level_ten) + ~page_level:level_one + ~mk_page_info:(mk_page_info ~custom_data:no_data ~slot_index:slot_index_2) ~check_produce:(successful_check_produce_result ~__LOC__ `Unconfirmed) (** Unconfirmation proof for a page with bad page proof. *) let confirmed_slot_on_genesis_unconfirmed_page_bad_proof = let open Result_syntax in - let level = level_ten in + let level = level_one in helper_confirmed_slot_on_genesis_unconfirmed_page ~page_level:level ~mk_page_info:(fun slot poly -> let* page_info1, _page_id1 = - mk_page_info ~level:level_ten ~page_index:1 slot poly + mk_page_info ~slot_index:slot_index_2 ~page_index:1 slot poly in let* _page_info2, page_id2 = - mk_page_info ~level:level_ten ~page_index:2 slot poly + mk_page_info ~slot_index:slot_index_2 ~page_index:2 slot poly in assert ( match (page_info1, _page_info2) with @@ -344,12 +364,12 @@ struct (** Unconfirmation proof for a page with bad data. *) let confirmed_slot_on_genesis_unconfirmed_page_bad_data = - let level = level_ten in + let level = level_one in helper_confirmed_slot_on_genesis_unconfirmed_page ~page_level:level ~mk_page_info: (mk_page_info - ~level:level_ten + ~slot_index:slot_index_2 ~custom_data: (Some (fun ~default_char page_size -> @@ -364,10 +384,6 @@ struct let tztest title test_function = Tztest.tztest (mk_title title) `Quick test_function in - let qcheck2 title gen test = - Tztest.tztest_qcheck2 ~name:(mk_title title) ~count:2 gen test - in - let bool = QCheck2.Gen.bool in let ordering_tests = [ tztest @@ -386,8 +402,10 @@ struct in let proofs_tests_on_genesis = [ - tztest "Confirmed page on genesis" confirmed_page_on_genesis; - qcheck2 "Unconfirmed page on genesis" bool unconfirmed_page_on_genesis; + tztest "Unconfirmed page on genesis - ok" unconfirmed_page_on_genesis; + tztest + "Unconfirmed page on genesis - bad cache" + unconfirmed_page_on_genesis_bad_cache; ] in @@ -447,4 +465,3 @@ let tests = let () = Alcotest_lwt.run ~__FILE__ Protocol.name [("dal slot proof", tests)] |> Lwt_main.run -*) -- GitLab From 28474cf405583e72b968edaac49aec38bdfb7e1f Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Wed, 7 Feb 2024 16:11:35 +0100 Subject: [PATCH 5/7] Dal/tests: adapt pbt tests --- .../test/pbt/test_dal_slot_proof.ml | 98 ++++++++++--------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/src/proto_alpha/lib_protocol/test/pbt/test_dal_slot_proof.ml b/src/proto_alpha/lib_protocol/test/pbt/test_dal_slot_proof.ml index 6b0eaf499035..cb2efc8705e4 100644 --- a/src/proto_alpha/lib_protocol/test/pbt/test_dal_slot_proof.ml +++ b/src/proto_alpha/lib_protocol/test/pbt/test_dal_slot_proof.ml @@ -31,11 +31,6 @@ Subject: Refutation proof-related functions of Dal *) -(* -TODO: https://gitlab.com/tezos/tezos/-/issues/6895 - -Adapt/re-enable tests - open Protocol module Make (Parameters : sig @@ -87,30 +82,49 @@ struct let* polynomial = dal_mk_polynomial_from_slot slot_data in let cryptobox = Lazy.force ARG.cryptobox in let* commitment = dal_commit cryptobox polynomial in - let add_slot level sindex (cell, cache, slots_info) skip_slot = - let index = - Option.value_f - (Dal_slot_index_repr.of_int_opt - ~number_of_slots:Parameters.(dal_parameters.number_of_slots) - sindex) - ~default:(fun () -> assert false) - in - let slot = - Dal_slot_repr.Header.{id = {published_level = level; index}; commitment} - in - let*@ cell, cache = - if skip_slot then return (cell, cache) - else Dal_slot_repr.History.add_confirmed_slot_headers cell cache [slot] - in - return (cell, cache, (polynomial, slot, skip_slot) :: slots_info) - in (* Insert the slots of a level. *) - let add_slots accu (level, slots_data) = + let add_slots (cell, cache, slots_info) (level, slots_data) = (* We start at level one, and we skip even levels for test purpose (which means that no DAL slot is confirmed for them). *) let curr_level = Raw_level_repr.of_int32_exn (Int32.of_int level) in - List.fold_left_i_e (add_slot curr_level) accu slots_data + let slots_headers = + List.mapi + (fun sindex skip_slot -> + let index = + Option.value_f + (Dal_slot_index_repr.of_int_opt + ~number_of_slots:Parameters.(dal_parameters.number_of_slots) + sindex) + ~default:(fun () -> assert false) + in + ( Dal_slot_repr.Header. + {id = {published_level = curr_level; index}; commitment}, + skip_slot )) + slots_data + in + let attested_slots_headers = + List.filter_map + (fun (slot, skip_slot) -> if skip_slot then None else Some slot) + slots_headers + in + let*@ cell, cache = + Dal_slot_repr.History.add_confirmed_slot_headers + ~number_of_slots:Parameters.dal_parameters.number_of_slots + cell + cache + curr_level + attested_slots_headers + in + let slots_info = + List.fold_left + (fun slots_info (slot, skip_slot) -> + (polynomial, slot, skip_slot) :: slots_info) + slots_info + slots_headers + in + return (cell, cache, slots_info) in + (* Insert the slots of all the levels. *) let add_levels = List.fold_left_e add_slots in add_levels (genesis_history, genesis_history_cache, []) levels_data @@ -131,20 +145,16 @@ struct (but the slot is not confirmed). Otherwise, we increment the publish_level field to simulate a non confirmed slot (as for even levels, no slot is confirmed. See {!populate_slots_history}). *) - let request_unconfirmed_page unconfirmed_level (poly, slot, skip_slot) = + let request_unconfirmed_page (poly, slot, skip_slot) = let open Result_syntax in - (* If the slot is unconfirmed, we test that a page belonging to it is not - confirmed. If the slot is confirmed, we check that the page of the - slot at the next level is unconfirmed (since we insert levels without - any confirmed slot). *) - let level = - let open Dal_slot_repr.Header in - if skip_slot then slot.id.published_level else unconfirmed_level - in - let* _page_info, page_id = mk_page_info ~level slot poly in - (* We should not provide the page's info if we want to build an - unconfirmation proof. *) - return_some (None, page_id) + let open Dal_slot_repr.Header in + if skip_slot then + let level = slot.id.published_level in + let* _page_info, page_id = mk_page_info ~level slot poly in + (* We should not provide the page's info if we want to build an + unconfirmation proof. *) + return_some (None, page_id) + else return_none (** This helper function allows to test DAL's {!produce_proof} and {!verify_proof} functions, using the data constructed from @@ -187,27 +197,20 @@ struct let*? last_cell, last_cache, slots_info = populate_slots_history levels_data in - let unconfirmed_level = - let last_level = - List.last (0, []) levels_data - |> fst |> Int32.of_int |> Raw_level_repr.of_int32_exn - in - Raw_level_repr.succ last_level - in helper_check_pbt_pages last_cell last_cache slots_info - ~page_to_request:(request_unconfirmed_page unconfirmed_level) + ~page_to_request:request_unconfirmed_page ~check_produce:(successful_check_produce_result ~__LOC__ `Unconfirmed) ~check_verify:(successful_check_verify_result ~__LOC__ `Unconfirmed) let tests = let gen_dal_config : levels QCheck2.Gen.t = QCheck2.Gen.( - let nb_slots = 10 -- 20 in + let nb_slots = 10 -- Parameters.(dal_parameters.number_of_slots) in let nb_levels = 4 -- 8 in - let gaps_between_levels = 1 -- 20 in + let gaps_between_levels = 1 -- 1 in (* The slot is confirmed iff the boolean is true *) let slot = bool in let slots = list_size nb_slots slot in @@ -263,4 +266,3 @@ let () = (Protocol.name ^ ": Dal slots refutation game") Test.tests |> Lwt_main.run -*) -- GitLab From 28a260fefb433fb998bb41e779a5122819c364b2 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Wed, 7 Feb 2024 17:43:50 +0100 Subject: [PATCH 6/7] Dal/tests: allow having empty levels (no slots) in the generated scenarii --- .../test/pbt/test_dal_slot_proof.ml | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/proto_alpha/lib_protocol/test/pbt/test_dal_slot_proof.ml b/src/proto_alpha/lib_protocol/test/pbt/test_dal_slot_proof.ml index cb2efc8705e4..17f8e7291d78 100644 --- a/src/proto_alpha/lib_protocol/test/pbt/test_dal_slot_proof.ml +++ b/src/proto_alpha/lib_protocol/test/pbt/test_dal_slot_proof.ml @@ -84,8 +84,6 @@ struct let* commitment = dal_commit cryptobox polynomial in (* Insert the slots of a level. *) let add_slots (cell, cache, slots_info) (level, slots_data) = - (* We start at level one, and we skip even levels for test purpose (which - means that no DAL slot is confirmed for them). *) let curr_level = Raw_level_repr.of_int32_exn (Int32.of_int level) in let slots_headers = List.mapi @@ -208,26 +206,21 @@ struct let tests = let gen_dal_config : levels QCheck2.Gen.t = QCheck2.Gen.( - let nb_slots = 10 -- Parameters.(dal_parameters.number_of_slots) in - let nb_levels = 4 -- 8 in - let gaps_between_levels = 1 -- 1 in + let nb_slots = 0 -- Parameters.(dal_parameters.number_of_slots) in + let nb_levels = 4 -- 30 in + let* start_level = small_nat in (* The slot is confirmed iff the boolean is true *) let slot = bool in let slots = list_size nb_slots slot in (* For each level, we generate the gap/delta w.r.t. the previous level, and the slots' flags (confirmed or not). *) - let* l = list_size nb_levels (pair gaps_between_levels slots) in - (* We compute the list of slots with explicit levels instead levels - gaps. *) - let rl, _level = - List.fold_left - (fun (acc, prev_level) (delta_level, slots) -> - let level = prev_level + delta_level in - ((level, slots) :: acc, level)) - ([], 0) - l - in - return @@ List.rev rl) + let* list = list_size nb_levels slots in + List.mapi + (fun i slots -> + let level = start_level + i in + (level, slots)) + list + |> return) in [ Tztest.tztest_qcheck2 -- GitLab From f559cd76dddf08427f65cb610a8ac869a8bb761d Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Wed, 7 Feb 2024 17:30:44 +0100 Subject: [PATCH 7/7] Dal/tests: adapt encoding tests in sc_rollups --- .../test/pbt/test_sc_rollup_encoding.ml | 88 ++++++++++++++----- 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/src/proto_alpha/lib_protocol/test/pbt/test_sc_rollup_encoding.ml b/src/proto_alpha/lib_protocol/test/pbt/test_sc_rollup_encoding.ml index 6cb575788d64..befd6e8f0515 100644 --- a/src/proto_alpha/lib_protocol/test/pbt/test_sc_rollup_encoding.ml +++ b/src/proto_alpha/lib_protocol/test/pbt/test_sc_rollup_encoding.ml @@ -119,14 +119,46 @@ let gen_inbox level = module Index = Dal_slot_index_repr -let gen_dal_slots_history () = Gen.return Dal_slot_repr.History.genesis -(* -TODO: https://gitlab.com/tezos/tezos/-/issues/6895 - -Adapt/re-enable tests - +let pack_slots_headers_by_level list = + let module ML = Map.Make (Raw_level_repr) in + let module SSH = Set.Make (struct + include Dal_slot_repr.Header + + let compare a b = Dal_slot_index_repr.compare a.id.index b.id.index + end) in + let map = + List.fold_left + (fun map (Dal_slot_repr.Header.{id = {published_level; _}; _} as sh) -> + let l = + ML.find published_level map |> Option.value ~default:SSH.empty + in + ML.add published_level (SSH.add sh l) map) + ML.empty + list + in + match ML.max_binding_opt map with + | None -> [] (* map is empty *) + | Some (max_level, _) -> + let rec loop counter map = + if Raw_level_repr.(counter >= max_level) then map + else + let counter = Raw_level_repr.succ counter in + let map = + if ML.mem counter map then map else ML.add counter SSH.empty map + in + loop counter map + in + loop Raw_level_repr.root map + |> ML.bindings + |> List.map (fun (k, ssh) -> (k, SSH.elements ssh)) + +let gen_dal_slots_history () = let open Gen in let open Dal_slot_repr in + let constants : Alpha_context.Constants.Parametric.t = + Tezos_protocol_alpha_parameters.Default_parameters.constants_test + in + let number_of_slots = constants.dal.number_of_slots in (* Generate a list of (level * confirmed slot ID). *) let* list = small_list (pair small_nat small_nat) in let list = @@ -139,28 +171,40 @@ Adapt/re-enable tests succ @@ try of_int32_exn (Int32.of_int level) with _ -> root) in let index = - Index.of_int_opt ~number_of_slots:256 slot_index + Index.of_int_opt ~number_of_slots slot_index |> Option.value ~default:Index.zero in Header.{id = {published_level; index}; commitment = Commitment.zero}) list in - let list = - (* Sort the list in the right ordering before adding slots to slots_history. *) - List.sort_uniq - (fun {Header.id = a; _} {id = b; _} -> - let c = Raw_level_repr.compare a.published_level b.published_level in - if c <> 0 then c else Index.compare a.index b.index) - list + let rec loop history = function + | [] -> return history + | (level, slot_headers) :: llist -> ( + let slot_headers = + (* Sort the list in the right ordering before adding slots to slots_history. *) + List.sort_uniq + (fun {Header.id = a; _} {id = b; _} -> + let c = + Raw_level_repr.compare a.published_level b.published_level + in + if c <> 0 then c else Index.compare a.index b.index) + slot_headers + in + History.( + add_confirmed_slot_headers_no_cache + ~number_of_slots + history + level + slot_headers) + |> function + | Ok history -> loop history llist + | Error e -> + return + @@ Stdlib.failwith + (Format.asprintf "%a" Error_monad.pp_print_trace + @@ Environment.wrap_tztrace e)) in - History.(add_confirmed_slot_headers_no_cache genesis list) |> function - | Ok v -> return v - | Error e -> - return - @@ Stdlib.failwith - (Format.asprintf "%a" Error_monad.pp_print_trace - @@ Environment.wrap_tztrace e) -*) + pack_slots_headers_by_level list |> loop History.genesis let gen_inbox_history_proof inbox_level = let open Gen in -- GitLab