diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index c216f7941a12d88dacb22d1ac87dc1311e6d945f..196a13c373335ef5338202033ac014c2ca299817 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -2738,6 +2738,8 @@ module Dal : sig val slots_range_opt : number_of_slots:int -> lower:int -> upper:int -> t list option + + val check_is_in_range : number_of_slots:int -> t -> unit tzresult end (** This module re-exports definitions from {!Dal_attestation_repr} and @@ -2796,6 +2798,10 @@ module Dal : sig val compare : int -> int -> int val equal : int -> int -> bool + + type error += Invalid_page_index of {given : int; min : int; max : int} + + val check_is_in_range : number_of_pages:int -> t -> unit tzresult end type t = {slot_id : slot_id; page_index : Index.t} @@ -3873,13 +3879,12 @@ module Sc_rollup : sig serialized t tzresult Lwt.t module Dal_helpers : sig - val valid_slot_id : - dal_number_of_slots:int -> + val import_level_is_valid : dal_activation_level:Raw_level.t option -> dal_attestation_lag:int -> origination_level:Raw_level.t -> commit_inbox_level:Raw_level.t -> - Dal.Slot.Header.id -> + published_level:Raw_level.t -> dal_attested_slots_validity_lag:int -> bool end diff --git a/src/proto_alpha/lib_protocol/dal_slot_repr.ml b/src/proto_alpha/lib_protocol/dal_slot_repr.ml index 21b383c08b7bec6b201cbcfc8a5534d856bb95aa..a5d848ae8392e39f984f5368f22742f264be7de7 100644 --- a/src/proto_alpha/lib_protocol/dal_slot_repr.ml +++ b/src/proto_alpha/lib_protocol/dal_slot_repr.ml @@ -137,6 +137,36 @@ module Page = struct let compare = Compare.Int.compare let equal = Compare.Int.equal + + type error += Invalid_page_index of {given : int; min : int; max : int} + + let () = + let open Data_encoding in + register_error_kind + `Permanent + ~id:"dal_page_index_repr.index.invalid_index" + ~title:"Invalid Dal page index" + ~description: + "The given index is out of range of representable page indices" + ~pp:(fun ppf (given, min, max) -> + Format.fprintf + ppf + "The given index %d is out of range of representable page indices \ + [%d, %d]" + given + min + max) + (obj3 (req "given" int31) (req "min" int31) (req "max" int31)) + (function + | Invalid_page_index {given; min; max} -> Some (given, min, max) + | _ -> None) + (fun (given, min, max) -> Invalid_page_index {given; min; max}) + + let check_is_in_range ~number_of_pages page_id = + error_unless + Compare.Int.(0 <= page_id && page_id < number_of_pages) + (Invalid_page_index + {given = page_id; min = zero; max = number_of_pages - 1}) end type t = {slot_id : Header.id; page_index : Index.t} diff --git a/src/proto_alpha/lib_protocol/dal_slot_repr.mli b/src/proto_alpha/lib_protocol/dal_slot_repr.mli index 0c4b0eec52caa71a12347b0a284461ce0bb1bcd9..40c8f94c91f02258ff1d024983f0553e21f924ca 100644 --- a/src/proto_alpha/lib_protocol/dal_slot_repr.mli +++ b/src/proto_alpha/lib_protocol/dal_slot_repr.mli @@ -138,6 +138,12 @@ module Page : sig val compare : int -> int -> int val equal : int -> int -> bool + + type error += Invalid_page_index of {given : int; min : int; max : int} + + (** [is_in_range ~number_of_pages page_id] returns true if and only if the + provided [page_id] is within the bounds of allowed pages. *) + val check_is_in_range : number_of_pages:int -> int -> unit tzresult end (** Encoding for page contents. *) @@ -223,7 +229,7 @@ module History : sig {!Raw_level_repr.root} as published level and no attested slots. Since Dal is not necessarily activated in the genesis block (e.g. this will be the case on mainnet), the skip list is reset at the first call to - {!add_confirmed_slot_headers} to enforce the invariant that there are no gaps + {!add_confirmed_slot_headers} to enforce the invariant that there are no gaps in the levels of the cells of the skip list. So, a skip list is initialized with this genesis cell. It's then replaced diff --git a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml index d0396d90b035789ae2b5651ca1a851e0ad5a85bd..562fa70d00ca602be9fed83d0bc8aa1d040c88df 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml @@ -238,9 +238,8 @@ module Dal_helpers = struct The current DAL refutation integration is not resilient to DAL parameters changes when upgrading the protocol. The code needs to be adapted. *) - let valid_slot_id ~dal_number_of_slots ~dal_activation_level - ~dal_attestation_lag ~origination_level ~commit_inbox_level - Dal_slot_repr.Header.{published_level; index} + let import_level_is_valid ~dal_activation_level ~dal_attestation_lag + ~origination_level ~commit_inbox_level ~published_level ~dal_attested_slots_validity_lag = (* [dal_attestation_lag] is supposed to be positive. *) let open Raw_level_repr in @@ -255,12 +254,6 @@ module Dal_helpers = struct let not_too_recent = add published_level dal_attestation_lag <= commit_inbox_level in - let index_is_valid = - Result.is_ok - @@ Dal_slot_index_repr.check_is_in_range - ~number_of_slots:dal_number_of_slots - index - in (* An attested slot is not expired if its attested level (equal to [published_level + dal_attestation_lag]) is not further than [dal_attested_slots_validity_lag] from the given inbox level. *) @@ -272,20 +265,43 @@ module Dal_helpers = struct >= commit_inbox_level) in dal_was_activated && slot_published_after_origination && not_too_recent - && index_is_valid && ttl_not_expired + && ttl_not_expired + + let page_id_is_valid ~dal_number_of_slots ~dal_activation_level + ~dal_attestation_lag ~origination_level ~commit_inbox_level + cryptobox_parameters + Dal_slot_repr.Page.{slot_id = {published_level; index}; page_index} + ~dal_attested_slots_validity_lag = + let open Dal_slot_repr in + Result.is_ok + (Page.Index.check_is_in_range + ~number_of_pages:(Page.pages_per_slot cryptobox_parameters) + page_index) + && Result.is_ok + (Dal_slot_index_repr.check_is_in_range + ~number_of_slots:dal_number_of_slots + index) + && import_level_is_valid + ~dal_activation_level + ~dal_attestation_lag + ~origination_level + ~commit_inbox_level + ~published_level + ~dal_attested_slots_validity_lag let verify ~metadata ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~commit_inbox_level dal_parameters page_id dal_snapshot proof ~dal_attested_slots_validity_lag = let open Result_syntax in if - valid_slot_id + page_id_is_valid + dal_parameters ~dal_activation_level ~origination_level:metadata.Sc_rollup_metadata_repr.origination_level ~dal_attestation_lag ~commit_inbox_level ~dal_number_of_slots - Dal_slot_repr.(page_id.Page.slot_id) + page_id ~dal_attested_slots_validity_lag then let* input = @@ -303,13 +319,14 @@ module Dal_helpers = struct ~get_history confirmed_slots_history ~dal_attested_slots_validity_lag = let open Lwt_result_syntax in if - valid_slot_id + page_id_is_valid + dal_parameters ~dal_number_of_slots ~dal_activation_level ~origination_level:metadata.Sc_rollup_metadata_repr.origination_level ~dal_attestation_lag ~commit_inbox_level - Dal_slot_repr.(page_id.Page.slot_id) + page_id ~dal_attested_slots_validity_lag then let* proof, content_opt = diff --git a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli index 6862b3b7d548311fe354a7537d8ad995dafa6d8f..968d4d2aebe141aa20184c2f7614ce7821798528 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli @@ -292,13 +292,12 @@ module Dal_helpers : sig before producing the related commitment. We also check that the given slot ID's index is within the range of allowed slots thanks to [dal_number_of_slots]. *) - val valid_slot_id : - dal_number_of_slots:int -> + val import_level_is_valid : dal_activation_level:Raw_level_repr.t option -> dal_attestation_lag:int -> origination_level:Raw_level_repr.t -> commit_inbox_level:Raw_level_repr.t -> - Dal_slot_repr.Header.id -> + published_level:Raw_level_repr.t -> dal_attested_slots_validity_lag:int -> bool end diff --git a/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.ml b/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.ml index 427cbe5ac73310dff884fa4b92ccf5d6b98cd585..9cdcee56c686ee674e83a1b9329d3129f9dc7445 100644 --- a/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.ml +++ b/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.ml @@ -110,25 +110,50 @@ let storage_invariant_broken published_level index = Raw_level.pp published_level -let slot_id_is_valid ~dal_activation_level ~dal_attestation_lag - ~dal_number_of_slots ~origination_level ~inbox_level slot_id +let slot_id_is_valid + (dal_constants : Octez_smart_rollup.Rollup_constants.dal_constants) + ~dal_activation_level ~origination_level ~inbox_level slot_id ~dal_attested_slots_validity_lag = + let open Alpha_context in + Result.is_ok + (Dal.Slot_index.check_is_in_range + ~number_of_slots:dal_constants.number_of_slots + slot_id.Dal.index) + && let origination_level_res = Raw_level.of_int32 origination_level in let commit_inbox_level_res = Raw_level.of_int32 inbox_level in match (origination_level_res, commit_inbox_level_res) with | Ok origination_level, Ok commit_inbox_level -> - Alpha_context.Sc_rollup.Proof.Dal_helpers.valid_slot_id + Alpha_context.Sc_rollup.Proof.Dal_helpers.import_level_is_valid ~dal_activation_level - ~dal_attestation_lag + ~dal_attestation_lag:dal_constants.attestation_lag ~origination_level ~commit_inbox_level - ~dal_number_of_slots ~dal_attested_slots_validity_lag - slot_id + ~published_level:slot_id.published_level | _ -> false -let slot_pages ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots - ~inbox_level node_ctxt slot_id ~dal_attested_slots_validity_lag = +let page_id_is_valid + (dal_constants : Octez_smart_rollup.Rollup_constants.dal_constants) + ~dal_activation_level ~origination_level ~inbox_level + Dal.Page.{slot_id; page_index} ~dal_attested_slots_validity_lag = + Result.is_ok + (Dal.Page.Index.check_is_in_range + ~number_of_pages: + (Dal.Page.pages_per_slot dal_constants.cryptobox_parameters) + page_index) + && slot_id_is_valid + dal_constants + ~dal_activation_level + ~origination_level + ~inbox_level + slot_id + ~dal_attested_slots_validity_lag + +let slot_pages + (dal_constants : Octez_smart_rollup.Rollup_constants.dal_constants) + ~dal_activation_level ~inbox_level node_ctxt slot_id + ~dal_attested_slots_validity_lag = let open Lwt_result_syntax in let Node_context.{genesis_info = {level = origination_level; _}; _} = node_ctxt @@ -137,18 +162,17 @@ let slot_pages ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots if not @@ slot_id_is_valid + dal_constants ~dal_activation_level - ~dal_attestation_lag ~origination_level ~inbox_level - ~dal_number_of_slots ~dal_attested_slots_validity_lag slot_id then return_none else let* confirmed_in_block_hash = store_entry_from_published_level - ~dal_attestation_lag + ~dal_attestation_lag:dal_constants.attestation_lag ~published_level node_ctxt in @@ -165,8 +189,10 @@ let slot_pages ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots | Some `Unconfirmed -> return_none | None -> storage_invariant_broken published_level index -let page_content ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots - ~inbox_level node_ctxt page_id ~dal_attested_slots_validity_lag = +let page_content + (dal_constants : Octez_smart_rollup.Rollup_constants.dal_constants) + ~dal_activation_level ~inbox_level node_ctxt page_id + ~dal_attested_slots_validity_lag = let open Lwt_result_syntax in let Dal.Page.{slot_id; page_index} = page_id in let Dal.Slot.Header.{published_level; index} = slot_id in @@ -175,19 +201,18 @@ let page_content ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots in if not - @@ slot_id_is_valid + @@ page_id_is_valid + dal_constants ~dal_activation_level - ~dal_attestation_lag ~origination_level ~inbox_level - ~dal_number_of_slots ~dal_attested_slots_validity_lag - slot_id + page_id then return_none else let* confirmed_in_block_hash = store_entry_from_published_level - ~dal_attestation_lag + ~dal_attestation_lag:dal_constants.attestation_lag ~published_level node_ctxt in diff --git a/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.mli b/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.mli index 5109dfa209cee52365dac782dffba895ec3c062d..e365e98fb5b83637ae57c05420bd330ba54ce9b8 100644 --- a/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.mli +++ b/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.mli @@ -54,9 +54,8 @@ type error += Dal_slot_not_found_in_store of Dal.Slot.Header.id [dal_attestation_lag] is used to retrieve the correct entry in [store]. *) val slot_pages : + Octez_smart_rollup.Rollup_constants.dal_constants -> dal_activation_level:Raw_level.t option -> - dal_attestation_lag:int -> - dal_number_of_slots:int -> inbox_level:int32 -> _ Node_context.t -> Dal.slot_id -> @@ -74,9 +73,8 @@ val slot_pages : [dal_attestation_lag] is used to retrieve the correct entry in [store]. *) val page_content : + Octez_smart_rollup.Rollup_constants.dal_constants -> dal_activation_level:Raw_level.t option -> - dal_attestation_lag:int -> - dal_number_of_slots:int -> inbox_level:int32 -> _ Node_context.t -> Dal.Page.t -> diff --git a/src/proto_alpha/lib_sc_rollup_node/fueled_pvm.ml b/src/proto_alpha/lib_sc_rollup_node/fueled_pvm.ml index 95589aca0df570cb494050c860a92185008f7204..8473f1d49ffa747945ce6c36e8391122e9a69dbc 100644 --- a/src/proto_alpha/lib_sc_rollup_node/fueled_pvm.ml +++ b/src/proto_alpha/lib_sc_rollup_node/fueled_pvm.ml @@ -93,8 +93,6 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct in let module PVM = (val Pvm.of_kind node_ctxt.kind) in let metadata = metadata node_ctxt in - let dal_attestation_lag = constants.dal.attestation_lag in - let dal_number_of_slots = constants.dal.number_of_slots in let dal_attested_slots_validity_lag = match constants.sc_rollup.reveal_activation_level with | Some reveal_activation_level when constants.dal.feature_enable -> @@ -117,7 +115,7 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct Sc_rollup.Dal_parameters. { number_of_slots = Int64.of_int constants.dal.number_of_slots; - attestation_lag = Int64.of_int dal_attestation_lag; + attestation_lag = Int64.of_int constants.dal.attestation_lag; slot_size = Int64.of_int constants.dal.cryptobox_parameters.slot_size; page_size = Int64.of_int constants.dal.cryptobox_parameters.page_size; } @@ -148,11 +146,10 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct | Request_dal_page dal_page -> ( let*! content = Dal_pages_request.page_content + constants.dal ~dal_activation_level ~dal_attested_slots_validity_lag ~inbox_level:(Int32.of_int level) - ~dal_attestation_lag - ~dal_number_of_slots node_ctxt dal_page in @@ -275,10 +272,9 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct | Needs_reveal (Request_dal_page page_id) -> ( let* content_opt = Dal_pages_request.page_content + constants.dal ~inbox_level:(Int32.of_int level) ~dal_activation_level - ~dal_attestation_lag - ~dal_number_of_slots ~dal_attested_slots_validity_lag node_ctxt page_id diff --git a/src/proto_alpha/lib_sc_rollup_node/refutation_game_helpers.ml b/src/proto_alpha/lib_sc_rollup_node/refutation_game_helpers.ml index 409e62a64838dd5f6f2bcfd708e1e69d887d06b7..fbb435cba3b71757ebdba34e5bb49e56d869b01a 100644 --- a/src/proto_alpha/lib_sc_rollup_node/refutation_game_helpers.ml +++ b/src/proto_alpha/lib_sc_rollup_node/refutation_game_helpers.ml @@ -70,10 +70,8 @@ let page_membership_proof params page_index slot_data = let page_info_from_pvm_state constants (node_ctxt : _ Node_context.t) ~inbox_level (dal_params : Dal.parameters) start_state = let open Lwt_result_syntax in - let dal_attestation_lag = constants.Rollup_constants.dal.attestation_lag in - let dal_number_of_slots = constants.Rollup_constants.dal.number_of_slots in let is_reveal_enabled = - match constants.sc_rollup.reveal_activation_level with + match constants.Rollup_constants.sc_rollup.reveal_activation_level with | Some reveal_activation_level -> Sc_rollup.is_reveal_enabled_predicate (Sc_rollup_proto_types.Constants.reveal_activation_level_of_octez @@ -107,9 +105,8 @@ let page_info_from_pvm_state constants (node_ctxt : _ Node_context.t) let Dal.Page.{slot_id; page_index} = page_id in let* pages = Dal_pages_request.slot_pages + constants.Rollup_constants.dal ~dal_activation_level - ~dal_attestation_lag - ~dal_number_of_slots ~dal_attested_slots_validity_lag ~inbox_level node_ctxt