diff --git a/contrib/kaitai-struct-files/files/alpha__constants.ksy b/contrib/kaitai-struct-files/files/alpha__constants.ksy index 83f23985dbd1299080d2d5af50afb3d43f2a53c8..19fa2c0fd159eecc5fa6411744a2dd0262ebe5f4 100644 --- a/contrib/kaitai-struct-files/files/alpha__constants.ksy +++ b/contrib/kaitai-struct-files/files/alpha__constants.ksy @@ -161,6 +161,8 @@ types: type: s4 - id: dal_parameters type: s4 + - id: dal_attested_slots_validity_lag + type: int31 z: seq: - id: has_tail diff --git a/contrib/kaitai-struct-files/files/alpha__constants__parametric.ksy b/contrib/kaitai-struct-files/files/alpha__constants__parametric.ksy index cddf94099bcbd91d2fb1f0b3a100d6bc0de174ea..5bd0ece088710e5d99807782a81eddac9b4810d2 100644 --- a/contrib/kaitai-struct-files/files/alpha__constants__parametric.ksy +++ b/contrib/kaitai-struct-files/files/alpha__constants__parametric.ksy @@ -161,6 +161,8 @@ types: type: s4 - id: dal_parameters type: s4 + - id: dal_attested_slots_validity_lag + type: int31 z: seq: - id: has_tail diff --git a/contrib/kaitai-struct-files/files/alpha__parameters.ksy b/contrib/kaitai-struct-files/files/alpha__parameters.ksy index 5979bfa3ec3e56958d670d349a6626ad2982b69a..7adea7423c07b99b1c6640cdf6c0904c0787caaa 100644 --- a/contrib/kaitai-struct-files/files/alpha__parameters.ksy +++ b/contrib/kaitai-struct-files/files/alpha__parameters.ksy @@ -385,6 +385,8 @@ types: type: s4 - id: dal_parameters type: s4 + - id: dal_attested_slots_validity_lag + type: int31 whitelist: seq: - id: whitelist_entries diff --git a/src/lib_smart_rollup/rollup_constants.ml b/src/lib_smart_rollup/rollup_constants.ml index 8f199b5efe34306a97bd7dd5813f162bda8e8faf..caed70d3f331af2c03e69a789a5aa33d692938dc 100644 --- a/src/lib_smart_rollup/rollup_constants.ml +++ b/src/lib_smart_rollup/rollup_constants.ml @@ -37,6 +37,7 @@ type reveal_activation_level = { metadata : int32; dal_page : int32; dal_parameters : int32; + dal_attested_slots_validity_lag : int32; } type sc_rollup_constants = { diff --git a/src/lib_smart_rollup_node/node_context_loader.ml b/src/lib_smart_rollup_node/node_context_loader.ml index 1d2af051da904bc5761f48aa290800d90f59d455..886b23391801f806b796c2fa820945deb72541bd 100644 --- a/src/lib_smart_rollup_node/node_context_loader.ml +++ b/src/lib_smart_rollup_node/node_context_loader.ml @@ -333,6 +333,7 @@ module Internal_for_tests = struct metadata = 0l; dal_page = 0l; dal_parameters = 0l; + dal_attested_slots_validity_lag = Int32.max_int; }; max_number_of_stored_cemented_commitments = 0; }; diff --git a/src/lib_smart_rollup_node/test/helpers/helpers.ml b/src/lib_smart_rollup_node/test/helpers/helpers.ml index 7ce69f5fd311a5fad15d210f7d20a347b8f70735..c2934152e2e587e93408a758a15ef9a8ccd8f0f6 100644 --- a/src/lib_smart_rollup_node/test/helpers/helpers.ml +++ b/src/lib_smart_rollup_node/test/helpers/helpers.ml @@ -52,7 +52,13 @@ let default_constants = commitment_period_in_blocks = 3; reveal_activation_level = Some - {blake2B = 0l; metadata = 0l; dal_page = 0l; dal_parameters = 0l}; + { + blake2B = 0l; + metadata = 0l; + dal_page = 0l; + dal_parameters = 0l; + dal_attested_slots_validity_lag = Int32.max_int; + }; max_number_of_stored_cemented_commitments = 5; }; dal = diff --git a/src/proto_018_Proxford/lib_sc_rollup_layer2/sc_rollup_proto_types.ml b/src/proto_018_Proxford/lib_sc_rollup_layer2/sc_rollup_proto_types.ml index bfb1ac323f7d0926ad4719932623e90c2abe28a6..af0bdc22a387394e1c09ca04d7405029ac0c570c 100644 --- a/src/proto_018_Proxford/lib_sc_rollup_layer2/sc_rollup_proto_types.ml +++ b/src/proto_018_Proxford/lib_sc_rollup_layer2/sc_rollup_proto_types.ml @@ -453,8 +453,13 @@ module Constants = struct let reveal_activation_level_of_octez Octez_smart_rollup.Rollup_constants. - {blake2B; metadata; dal_page; dal_parameters} : reveal_activation_level - = + { + blake2B; + metadata; + dal_page; + dal_parameters; + dal_attested_slots_validity_lag = _; + } : reveal_activation_level = { raw_data = {blake2B = Raw_level.of_int32_exn blake2B}; metadata = Raw_level.of_int32_exn metadata; @@ -471,5 +476,6 @@ module Constants = struct metadata = Raw_level.to_int32 metadata; dal_page = Raw_level.to_int32 dal_page; dal_parameters = Raw_level.to_int32 dal_parameters; + dal_attested_slots_validity_lag = Int32.max_int; } end diff --git a/src/proto_alpha/lib_parameters/default_parameters.ml b/src/proto_alpha/lib_parameters/default_parameters.ml index 70b30e51b14814e44b4441788e796f714560bf00..d0f1738d05207bf92af71516eaab28c31e82c84b 100644 --- a/src/proto_alpha/lib_parameters/default_parameters.ml +++ b/src/proto_alpha/lib_parameters/default_parameters.ml @@ -31,7 +31,8 @@ let seconds_in_a_day = 60 * 60 * 24 let seconds_in_a_week = seconds_in_a_day * 7 -let make_sc_rollup_parameter ~dal_activation_level block_time = +let make_sc_rollup_parameter ~dal_activation_level + ~dal_attested_slots_validity_lag block_time = (* Maximum number of outbox messages per level. WARNING: changing this value impacts the storage size a rollup has to @@ -120,6 +121,7 @@ let make_sc_rollup_parameter ~dal_activation_level block_time = metadata = Raw_level.root; dal_page = dal_activation_level; dal_parameters = dal_activation_level; + dal_attested_slots_validity_lag; }; private_enable = true; riscv_pvm_enable = false; @@ -179,7 +181,19 @@ let constants_mainnet : Constants.Parametric.t = exception with the value [Int32.int_min] (see tezt/tests/mockup.ml). *) Raw_level.of_int32_exn Int32.(pred max_int) in - let sc_rollup = make_sc_rollup_parameter ~dal_activation_level block_time in + let dal_attested_slots_validity_lag = + (* A rollup node shouldn't import a page of an attested slot whose attested + level is too far in the past w.r.t. the current level. Importation window + is fixed to 241_920 levels below. It is the number of blocks produced + during 28 days (4 weeks) with a block time of 10 seconds. *) + 241_920 + in + let sc_rollup = + make_sc_rollup_parameter + ~dal_activation_level + ~dal_attested_slots_validity_lag + block_time + in { consensus_rights_delay = 2; blocks_preservation_cycles = 1; diff --git a/src/proto_alpha/lib_parameters/default_parameters.mli b/src/proto_alpha/lib_parameters/default_parameters.mli index bc28be2d209e73f1e2be9f36ba8e404b85875cc5..0dd084324d2b1b523e769eeb43c13839e6ac8776 100644 --- a/src/proto_alpha/lib_parameters/default_parameters.mli +++ b/src/proto_alpha/lib_parameters/default_parameters.mli @@ -55,5 +55,8 @@ val json_of_parameters : module Internal_for_tests : sig val make_sc_rollup_parameter : - dal_activation_level:Raw_level.t -> int -> Constants.Parametric.sc_rollup + dal_activation_level:Raw_level.t -> + dal_attested_slots_validity_lag:int -> + int -> + Constants.Parametric.sc_rollup end diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 372d92abafdce577b6c978379770387a3669fa02..c216f7941a12d88dacb22d1ac87dc1311e6d945f 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -838,6 +838,7 @@ module Constants : sig metadata : Raw_level.t; dal_page : Raw_level.t; dal_parameters : Raw_level.t; + dal_attested_slots_validity_lag : int; } type sc_rollup = { @@ -3842,6 +3843,8 @@ module Sc_rollup : sig val dal_number_of_slots : int val dal_activation_level : Raw_level.t option + + val dal_attested_slots_validity_lag : int end end @@ -3858,6 +3861,7 @@ module Sc_rollup : sig dal_attestation_lag:int -> dal_number_of_slots:int -> is_reveal_enabled:is_reveal_enabled -> + dal_attested_slots_validity_lag:int -> 'proof t -> (input option * input_request) tzresult Lwt.t @@ -3876,6 +3880,7 @@ module Sc_rollup : sig origination_level:Raw_level.t -> commit_inbox_level:Raw_level.t -> Dal.Slot.Header.id -> + dal_attested_slots_validity_lag:int -> bool end end @@ -3984,6 +3989,7 @@ module Sc_rollup : sig step:step -> choice:Tick.t -> is_reveal_enabled:is_reveal_enabled -> + dal_attested_slots_validity_lag:int -> (game_result, t) Either.t tzresult Lwt.t type timeout = {alice : int; bob : int; last_turn_level : Raw_level.t} diff --git a/src/proto_alpha/lib_protocol/constants_parametric_repr.ml b/src/proto_alpha/lib_protocol/constants_parametric_repr.ml index 0f7414b51fd4fe56548831ffab6aaf72a83d82e6..01a61e7752958668469bbb86e8f4d5f5a5243002 100644 --- a/src/proto_alpha/lib_protocol/constants_parametric_repr.ml +++ b/src/proto_alpha/lib_protocol/constants_parametric_repr.ml @@ -90,6 +90,23 @@ type sc_rollup_reveal_activation_level = { metadata : Raw_level_repr.t; dal_page : Raw_level_repr.t; dal_parameters : Raw_level_repr.t; + (* Once a DAL slot is attested, a rollup can only import it within the range + of levels [attested_level; attested_level + + dal_attested_slots_validity_lag]. *) + (* Warning: the semantics of valid slots needs to be adapted if the + value of this parameter is changed in the future. + - If it is increased, some attested slots that were outdated with + the old value will become valid again. + - If it is decreased, some attested slots that were valid with + the old value will become outdated. + + In both cases, the status of slots before and after the value change is + different. Said otherwise, the validity of the slot may differ depending on + the time of the check, in particular it may be different in the following + two cases: (a) the slot is imported before the value upgrade, (2) a + refutation game targeting a page of that slot is started after the + upgrade. *) + dal_attested_slots_validity_lag : int; } let sc_rollup_reveal_hashing_schemes_encoding = @@ -103,14 +120,30 @@ let sc_rollup_reveal_activation_level_encoding : sc_rollup_reveal_activation_level Data_encoding.t = let open Data_encoding in conv - (fun t -> (t.raw_data, t.metadata, t.dal_page, t.dal_parameters)) - (fun (raw_data, metadata, dal_page, dal_parameters) -> - {raw_data; metadata; dal_page; dal_parameters}) - (obj4 + (fun t -> + ( t.raw_data, + t.metadata, + t.dal_page, + t.dal_parameters, + t.dal_attested_slots_validity_lag )) + (fun ( raw_data, + metadata, + dal_page, + dal_parameters, + dal_attested_slots_validity_lag ) -> + { + raw_data; + metadata; + dal_page; + dal_parameters; + dal_attested_slots_validity_lag; + }) + (obj5 (req "raw_data" sc_rollup_reveal_hashing_schemes_encoding) (req "metadata" Raw_level_repr.encoding) (req "dal_page" Raw_level_repr.encoding) - (req "dal_parameters" Raw_level_repr.encoding)) + (req "dal_parameters" Raw_level_repr.encoding) + (req "dal_attested_slots_validity_lag" Data_encoding.int31)) type sc_rollup = { arith_pvm_enable : bool; diff --git a/src/proto_alpha/lib_protocol/constants_parametric_repr.mli b/src/proto_alpha/lib_protocol/constants_parametric_repr.mli index eb61c83f845131c1987892d1e97f76c9bb3e92a0..da434f1c42b8de524f2d6ddc672a204e89c75605 100644 --- a/src/proto_alpha/lib_protocol/constants_parametric_repr.mli +++ b/src/proto_alpha/lib_protocol/constants_parametric_repr.mli @@ -44,6 +44,7 @@ type sc_rollup_reveal_activation_level = { metadata : Raw_level_repr.t; dal_page : Raw_level_repr.t; dal_parameters : Raw_level_repr.t; + dal_attested_slots_validity_lag : int; } type sc_rollup = { diff --git a/src/proto_alpha/lib_protocol/raw_context.ml b/src/proto_alpha/lib_protocol/raw_context.ml index c67c6343d8fd39199cb564131fc359de2c8af5b1..5665e00896b35eac8d0ddee6bad75219c058b82d 100644 --- a/src/proto_alpha/lib_protocol/raw_context.ml +++ b/src/proto_alpha/lib_protocol/raw_context.ml @@ -1074,6 +1074,13 @@ let prepare_first_block ~level ~timestamp _chain_id ctxt = tezt/tests/mockup.ml). *) Raw_level_repr.of_int32_exn Int32.(pred max_int) in + let dal_attested_slots_validity_lag = + (* A rollup node shouldn't import a page of an attested slot whose attested + level is too far in the past w.r.t. the current level. Importation window + is fixed to 241_920 levels below. It is the number of blocks produced + during 28 days (4 weeks) with a block time of 10 seconds. *) + 241_920 + in let reveal_activation_level : Constants_parametric_repr.sc_rollup_reveal_activation_level = let ({ @@ -1091,6 +1098,19 @@ let prepare_first_block ~level ~timestamp _chain_id ctxt = metadata; dal_page = dal_activation_level; dal_parameters = dal_activation_level; + (* Warning: the semantics of valid slots needs to be adapted if the + value of this parameter is changed in the future. + - If it is increased, some attested slots that were outdated with + the old value will become valid again. + - If it is decreased, some attested slots that were valid with + the old value will become outdated. + + In both cases, the status of slots before and after the value + change is different. So, the behaviour if a valid slot is + imported before the value upgrade but a refutation game + targetting a page of that slot is started after the upgrade is + not the correct/expected one. *) + dal_attested_slots_validity_lag; } in let sc_rollup = diff --git a/src/proto_alpha/lib_protocol/sc_rollup_game_repr.ml b/src/proto_alpha/lib_protocol/sc_rollup_game_repr.ml index 3530735d5115383c6d830984f51f8bb6c9e10cf0..3a1b1fe4129863145204e90876d1fc80980f04e3 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_game_repr.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_game_repr.ml @@ -744,7 +744,8 @@ let check_proof_refute_stop_state ~stop_state input input_request proof = (** Returns the validity of the first final move on top of a dissection. *) let validity_final_move ~pvm ~dal_parameters ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~first_move ~metadata ~proof ~game - ~start_chunk ~stop_chunk ~is_reveal_enabled = + ~start_chunk ~stop_chunk ~is_reveal_enabled ~dal_attested_slots_validity_lag + = let open Lwt_result_syntax in let*! res = let {inbox_snapshot; inbox_level; dal_snapshot; _} = game in @@ -763,6 +764,7 @@ let validity_final_move ~pvm ~dal_parameters ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~is_reveal_enabled + ~dal_attested_slots_validity_lag proof in let*? () = @@ -899,7 +901,7 @@ let cost_play ~step ~choice = let play kind dal_parameters ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~stakers metadata game ~step ~choice ~is_reveal_enabled - = + ~dal_attested_slots_validity_lag = let open Lwt_result_syntax in let (Packed ((module PVM) as pvm)) = Sc_rollups.Kind.pvm_of kind in let mk_loser loser = @@ -949,6 +951,7 @@ let play kind dal_parameters ~dal_activation_level ~dal_attestation_lag ~start_chunk ~stop_chunk ~is_reveal_enabled + ~dal_attested_slots_validity_lag in if player_result then return @@ mk_loser (opponent game.turn) else @@ -985,6 +988,7 @@ let play kind dal_parameters ~dal_activation_level ~dal_attestation_lag ~game ~proof ~is_reveal_enabled + ~dal_attested_slots_validity_lag in if player_result then (* If we play when the final move started, the opponent provided diff --git a/src/proto_alpha/lib_protocol/sc_rollup_game_repr.mli b/src/proto_alpha/lib_protocol/sc_rollup_game_repr.mli index 025990199c526112d5f4b88142805b450264adab..632a7c44b04bfb37291b123d0bff43758c64e267 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_game_repr.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_game_repr.mli @@ -400,6 +400,7 @@ val play : step:step -> choice:Sc_rollup_tick_repr.t -> is_reveal_enabled:Sc_rollup_PVM_sig.is_reveal_enabled -> + dal_attested_slots_validity_lag:int -> (game_result, t) Either.t tzresult Lwt.t (** [cost_play ~step ~choice] returns the gas cost of [play] applied with[step], 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 3f73b2ccb77a42dfb2d126ecf24a339bdf2b98ff..d0396d90b035789ae2b5651ca1a851e0ad5a85bd 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml @@ -240,7 +240,8 @@ module Dal_helpers = struct 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} = + Dal_slot_repr.Header.{published_level; index} + ~dal_attested_slots_validity_lag = (* [dal_attestation_lag] is supposed to be positive. *) let open Raw_level_repr in let dal_was_activated = @@ -248,7 +249,9 @@ module Dal_helpers = struct | None -> false | Some dal_activation_level -> published_level >= dal_activation_level in - let not_too_old = published_level > origination_level in + let slot_published_after_origination = + published_level > origination_level + in let not_too_recent = add published_level dal_attestation_lag <= commit_inbox_level in @@ -258,11 +261,22 @@ module Dal_helpers = struct ~number_of_slots:dal_number_of_slots index in - dal_was_activated && not_too_old && not_too_recent && index_is_valid + (* 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. *) + let ttl_not_expired = + Raw_level_repr.( + add + (add published_level dal_attestation_lag) + dal_attested_slots_validity_lag + >= commit_inbox_level) + in + dal_was_activated && slot_published_after_origination && not_too_recent + && index_is_valid && ttl_not_expired let verify ~metadata ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~commit_inbox_level dal_parameters page_id - dal_snapshot proof = + dal_snapshot proof ~dal_attested_slots_validity_lag = let open Result_syntax in if valid_slot_id @@ -272,6 +286,7 @@ module Dal_helpers = struct ~commit_inbox_level ~dal_number_of_slots Dal_slot_repr.(page_id.Page.slot_id) + ~dal_attested_slots_validity_lag then let* input = Dal_slot_repr.History.verify_proof @@ -285,7 +300,7 @@ module Dal_helpers = struct let produce ~metadata ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~commit_inbox_level dal_parameters page_id ~page_info - ~get_history confirmed_slots_history = + ~get_history confirmed_slots_history ~dal_attested_slots_validity_lag = let open Lwt_result_syntax in if valid_slot_id @@ -295,6 +310,7 @@ module Dal_helpers = struct ~dal_attestation_lag ~commit_inbox_level Dal_slot_repr.(page_id.Page.slot_id) + ~dal_attested_slots_validity_lag then let* proof, content_opt = Dal_slot_repr.History.produce_proof @@ -314,7 +330,7 @@ let valid (type state proof output) ~(pvm : (state, proof, output) Sc_rollups.PVM.implementation) ~metadata snapshot commit_inbox_level dal_snapshot dal_parameters ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots - ~is_reveal_enabled (proof : proof t) = + ~is_reveal_enabled ~dal_attested_slots_validity_lag (proof : proof t) = let open Lwt_result_syntax in let (module P) = pvm in let origination_level = metadata.Sc_rollup_metadata_repr.origination_level in @@ -345,6 +361,7 @@ let valid (type state proof output) ~dal_number_of_slots ~metadata ~dal_activation_level + ~dal_attested_slots_validity_lag dal_parameters ~dal_attestation_lag ~commit_inbox_level @@ -453,6 +470,8 @@ module type PVM_with_context_and_state = sig val dal_number_of_slots : int val dal_activation_level : Raw_level_repr.t option + + val dal_attested_slots_validity_lag : int end end @@ -527,6 +546,7 @@ let produce ~metadata pvm_and_state commit_inbox_level ~is_reveal_enabled = page_id ~page_info ~get_history + ~dal_attested_slots_validity_lag confirmed_slots_history | Needs_reveal Reveal_dal_parameters -> let open Dal_with_history in 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 fce1841cf52aa03e535286170c3af9b72389530b..6862b3b7d548311fe354a7537d8ad995dafa6d8f 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli @@ -174,6 +174,7 @@ val valid : dal_attestation_lag:int -> dal_number_of_slots:int -> is_reveal_enabled:Sc_rollup_PVM_sig.is_reveal_enabled -> + dal_attested_slots_validity_lag:int -> 'proof t -> (Sc_rollup_PVM_sig.input option * Sc_rollup_PVM_sig.input_request) tzresult Lwt.t @@ -239,6 +240,8 @@ module type PVM_with_context_and_state = sig (** The level at which the DAL got activated, [None] if the DAL has not yet been activated. *) val dal_activation_level : Raw_level_repr.t option + + val dal_attested_slots_validity_lag : int end end @@ -296,6 +299,7 @@ module Dal_helpers : sig origination_level:Raw_level_repr.t -> commit_inbox_level:Raw_level_repr.t -> Dal_slot_repr.Header.id -> + dal_attested_slots_validity_lag:int -> bool end diff --git a/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml b/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml index 0b2962e2db1efa60fef16c31f07d6d58111f2acb..ea12778a017a2d5218fff612fc5f2c2b8afaf699 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml @@ -453,6 +453,9 @@ let game_move ctxt rollup ~player ~opponent ~step ~choice = Some constants.sc_rollup.reveal_activation_level.dal_parameters else None in + let dal_attested_slots_validity_lag = + constants.sc_rollup.reveal_activation_level.dal_attested_slots_validity_lag + in let* check_result, ctxt = check_stakes ctxt rollup stakers in match check_result with | Some game_result -> return (Some game_result, ctxt) @@ -474,6 +477,7 @@ let game_move ctxt rollup ~player ~opponent ~step ~choice = ~is_reveal_enabled: (Sc_rollup_PVM_sig.is_reveal_enabled_predicate (Constants_storage.sc_rollup_reveal_activation_level ctxt)) + ~dal_attested_slots_validity_lag in match move_result with | Either.Left game_result -> return (Some game_result, ctxt) diff --git a/src/proto_alpha/lib_protocol/test/helpers/sc_rollup_helpers.ml b/src/proto_alpha/lib_protocol/test/helpers/sc_rollup_helpers.ml index 753be05b595864668e30661a0455acd7122a0bba..133a589ecd601cd0b2f5429e73a5058a441da1c5 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/sc_rollup_helpers.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/sc_rollup_helpers.ml @@ -1012,5 +1012,10 @@ let make_pvm_with_context_and_state (type context state) if constants.dal.feature_enable then Some constants.sc_rollup.reveal_activation_level.dal_parameters else None + + let dal_attested_slots_validity_lag = + let constants = Default_parameters.constants_test in + constants.sc_rollup.reveal_activation_level + .dal_attested_slots_validity_lag end end) diff --git a/src/proto_alpha/lib_protocol/test/integration/test_constants.ml b/src/proto_alpha/lib_protocol/test/integration/test_constants.ml index 4020c744c579191242c469d12b76bad3d5267826..2b7c9d3cd58db0b014750554237bec50fc96d011 100644 --- a/src/proto_alpha/lib_protocol/test/integration/test_constants.ml +++ b/src/proto_alpha/lib_protocol/test/integration/test_constants.ml @@ -47,6 +47,8 @@ let test_sc_rollup_constants_consistency () = let block_time = 10 in let sc_rollup = Default_parameters.Internal_for_tests.make_sc_rollup_parameter + ~dal_attested_slots_validity_lag:241_920 + (* 4 weeks with a 10 secs block time. *) ~dal_activation_level:Raw_level.root block_time in diff --git a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_arith.ml b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_arith.ml index 8d129bc37f2d28faf48f6b221cbd6dbb338a1d17..1cdbad7f85964ebebd047778fd87c6f5a01caf67 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_arith.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_arith.ml @@ -374,6 +374,8 @@ let test_reveal ~threshold ~inbox_level ~hash ~preimage_reveal_step metadata = Protocol.Raw_level_repr.root; dal_page = Protocol.Raw_level_repr.root; dal_parameters = Protocol.Raw_level_repr.root; + dal_attested_slots_validity_lag = 241_920; + (* 4 weeks with a 10 secs block time. *) } in let is_reveal_enabled = @@ -677,6 +679,9 @@ let test_serialized_reveal_proof ~hashed_preimage ~input_preimage () = Some constants.sc_rollup.reveal_activation_level.dal_parameters else None in + let dal_attested_slots_validity_lag = + constants.sc_rollup.reveal_activation_level.dal_attested_slots_validity_lag + in let ctxt = Sc_rollup_helpers.Arith_pvm.make_empty_context () in let is_reveal_enabled = Sc_rollup_helpers.is_reveal_enabled_default in @@ -727,6 +732,7 @@ let test_serialized_reveal_proof ~hashed_preimage ~input_preimage () = dal_snapshot dal_parameters.cryptobox_parameters ~dal_activation_level + ~dal_attested_slots_validity_lag ~dal_attestation_lag:dal_parameters.attestation_lag ~dal_number_of_slots:dal_parameters.number_of_slots ~is_reveal_enabled diff --git a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_game.ml b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_game.ml index e18d488643275f24c88860b54340bf42f90cfa1b..19ed51c70a8d3ea989ebf0357f191b0d6832faf1 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_game.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_game.ml @@ -249,6 +249,9 @@ let test_invalid_serialized_inbox_proof () = Some constants.sc_rollup.reveal_activation_level.dal_parameters else None in + let dal_attested_slots_validity_lag = + constants.sc_rollup.reveal_activation_level.dal_attested_slots_validity_lag + in let ctxt = Sc_rollup_helpers.Arith_pvm.make_empty_context () in let empty = Sc_rollup_helpers.Arith_pvm.make_empty_state () in let*! state = Arith_pvm.initial_state ~empty in @@ -282,6 +285,7 @@ let test_invalid_serialized_inbox_proof () = dal_snapshot dal_parameters.cryptobox_parameters ~dal_activation_level + ~dal_attested_slots_validity_lag ~dal_attestation_lag:dal_parameters.attestation_lag ~dal_number_of_slots:dal_parameters.number_of_slots ~is_reveal_enabled diff --git a/src/proto_alpha/lib_sc_rollup_layer2/sc_rollup_proto_types.ml b/src/proto_alpha/lib_sc_rollup_layer2/sc_rollup_proto_types.ml index bfb1ac323f7d0926ad4719932623e90c2abe28a6..79fca0a3799dd0f463f5ce7882f871498fade460 100644 --- a/src/proto_alpha/lib_sc_rollup_layer2/sc_rollup_proto_types.ml +++ b/src/proto_alpha/lib_sc_rollup_layer2/sc_rollup_proto_types.ml @@ -453,23 +453,37 @@ module Constants = struct let reveal_activation_level_of_octez Octez_smart_rollup.Rollup_constants. - {blake2B; metadata; dal_page; dal_parameters} : reveal_activation_level - = + { + blake2B; + metadata; + dal_page; + dal_parameters; + dal_attested_slots_validity_lag; + } : reveal_activation_level = { raw_data = {blake2B = Raw_level.of_int32_exn blake2B}; metadata = Raw_level.of_int32_exn metadata; dal_page = Raw_level.of_int32_exn dal_page; dal_parameters = Raw_level.of_int32_exn dal_parameters; + dal_attested_slots_validity_lag = + Int32.to_int dal_attested_slots_validity_lag; } let reveal_activation_level_to_octez Constants.Parametric. - {raw_data = {blake2B}; metadata; dal_page; dal_parameters} : - Octez_smart_rollup.Rollup_constants.reveal_activation_level = + { + raw_data = {blake2B}; + metadata; + dal_page; + dal_parameters; + dal_attested_slots_validity_lag; + } : Octez_smart_rollup.Rollup_constants.reveal_activation_level = { blake2B = Raw_level.to_int32 blake2B; metadata = Raw_level.to_int32 metadata; dal_page = Raw_level.to_int32 dal_page; dal_parameters = Raw_level.to_int32 dal_parameters; + dal_attested_slots_validity_lag = + Int32.of_int dal_attested_slots_validity_lag; } 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 b352cd020f961cf82a90dd2d28358b8ba5c81b9b..427cbe5ac73310dff884fa4b92ccf5d6b98cd585 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 @@ -111,7 +111,8 @@ let storage_invariant_broken published_level index = published_level let slot_id_is_valid ~dal_activation_level ~dal_attestation_lag - ~dal_number_of_slots ~origination_level ~inbox_level slot_id = + ~dal_number_of_slots ~origination_level ~inbox_level slot_id + ~dal_attested_slots_validity_lag = 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 @@ -122,11 +123,12 @@ let slot_id_is_valid ~dal_activation_level ~dal_attestation_lag ~origination_level ~commit_inbox_level ~dal_number_of_slots + ~dal_attested_slots_validity_lag slot_id | _ -> false let slot_pages ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots - ~inbox_level node_ctxt slot_id = + ~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 @@ -140,6 +142,7 @@ let slot_pages ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~origination_level ~inbox_level ~dal_number_of_slots + ~dal_attested_slots_validity_lag slot_id then return_none else @@ -163,7 +166,7 @@ let slot_pages ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots | 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 = + ~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 @@ -178,6 +181,7 @@ let page_content ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~origination_level ~inbox_level ~dal_number_of_slots + ~dal_attested_slots_validity_lag slot_id then return_none else 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 9c2c80e5c95df98eb63db465ff9cbca220ab46d8..5109dfa209cee52365dac782dffba895ec3c062d 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 @@ -60,6 +60,7 @@ val slot_pages : inbox_level:int32 -> _ Node_context.t -> Dal.slot_id -> + dal_attested_slots_validity_lag:int -> Dal.Page.content list option tzresult Lwt.t (** Retrieve the content of the page identified by the given ID from the store. @@ -79,4 +80,5 @@ val page_content : inbox_level:int32 -> _ Node_context.t -> Dal.Page.t -> + dal_attested_slots_validity_lag:int -> Dal.Page.content option tzresult Lwt.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 577d1b7f8428feed4f3c8a8c0577d138fe437e3e..95589aca0df570cb494050c860a92185008f7204 100644 --- a/src/proto_alpha/lib_sc_rollup_node/fueled_pvm.ml +++ b/src/proto_alpha/lib_sc_rollup_node/fueled_pvm.ml @@ -95,6 +95,12 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct 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 -> + Int32.to_int reveal_activation_level.dal_attested_slots_validity_lag + | _ -> max_int + in let* dal_activation_level = if constants.dal.feature_enable then match constants.sc_rollup.reveal_activation_level with @@ -143,6 +149,7 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct let*! content = Dal_pages_request.page_content ~dal_activation_level + ~dal_attested_slots_validity_lag ~inbox_level:(Int32.of_int level) ~dal_attestation_lag ~dal_number_of_slots @@ -272,6 +279,7 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots + ~dal_attested_slots_validity_lag node_ctxt page_id in 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 42349a97d71c90a8f5eed0e0c6c93e37419bdfac..409e62a64838dd5f6f2bcfd708e1e69d887d06b7 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 @@ -83,17 +83,18 @@ let page_info_from_pvm_state constants (node_ctxt : _ Node_context.t) activation level. *) fun ~current_block_level:_ _ -> true in - let* dal_activation_level = - if constants.dal.feature_enable then - match constants.sc_rollup.reveal_activation_level with - | None -> return_none - | Some reveal_activation_level -> - let*? level = - Raw_level.of_int32 reveal_activation_level.dal_parameters - |> Environment.wrap_tzresult - in - return_some level - else return_none + let* dal_activation_level, dal_attested_slots_validity_lag = + match constants.sc_rollup.reveal_activation_level with + | Some reveal_activation_level when constants.dal.feature_enable -> + let*? level = + Raw_level.of_int32 reveal_activation_level.dal_parameters + |> Environment.wrap_tzresult + in + return + ( Some level, + Int32.to_int reveal_activation_level.dal_attested_slots_validity_lag + ) + | _ -> return (None, max_int) in let*! input_request = let open (val Pvm.of_kind node_ctxt.kind) in @@ -109,6 +110,7 @@ let page_info_from_pvm_state constants (node_ctxt : _ Node_context.t) ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots + ~dal_attested_slots_validity_lag ~inbox_level node_ctxt slot_id @@ -184,17 +186,18 @@ let generate_proof (node_ctxt : _ Node_context.t) let dal_parameters = dal_l1_parameters.cryptobox_parameters in let dal_attestation_lag = dal_l1_parameters.attestation_lag in let dal_number_of_slots = dal_l1_parameters.number_of_slots in - let* dal_activation_level = - if dal_l1_parameters.feature_enable then - match constants.sc_rollup.reveal_activation_level with - | None -> return_none - | Some reveal_activation_level -> - let*? level = - Raw_level.of_int32 reveal_activation_level.dal_parameters - |> Environment.wrap_tzresult - in - return_some level - else return_none + let* dal_activation_level, dal_attested_slots_validity_lag = + match constants.sc_rollup.reveal_activation_level with + | Some reveal_activation_level when dal_l1_parameters.feature_enable -> + let*? level = + Raw_level.of_int32 reveal_activation_level.dal_parameters + |> Environment.wrap_tzresult + in + return + ( Some level, + Int32.to_int reveal_activation_level.dal_attested_slots_validity_lag + ) + | _ -> return (None, max_int) in let* page_info = page_info_from_pvm_state @@ -272,6 +275,8 @@ let generate_proof (node_ctxt : _ Node_context.t) let page_info = page_info let dal_activation_level = dal_activation_level + + let dal_attested_slots_validity_lag = dal_attested_slots_validity_lag end end in let metadata = metadata node_ctxt in @@ -326,6 +331,7 @@ let generate_proof (node_ctxt : _ Node_context.t) ~pvm:(module PVM) unserialized_proof ~is_reveal_enabled + ~dal_attested_slots_validity_lag in let res = Environment.wrap_tzresult result in assert (Result.is_ok res) ; diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- misc_protocol.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- misc_protocol.out index d8135ede97b1aeb58eb82866624091d4e4ba4533..06b2c855d8e54401029a983a6daa8000b53c65c7 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- misc_protocol.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- misc_protocol.out @@ -55,7 +55,9 @@ "smart_rollup_max_number_of_parallel_games": 32, "smart_rollup_reveal_activation_level": { "raw_data": { "Blake2B": 0 }, "metadata": 0, "dal_page": 2147483646, - "dal_parameters": 2147483646 }, "smart_rollup_private_enable": true, + "dal_parameters": 2147483646, + "dal_attested_slots_validity_lag": 241920 }, + "smart_rollup_private_enable": true, "smart_rollup_riscv_pvm_enable": false, "zk_rollup_enable": false, "zk_rollup_origination_size": 4000, "zk_rollup_min_pending_to_process": 10, "zk_rollup_max_ticket_payload_size": 2048, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- misc_protocol.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- misc_protocol.out index 45fa33e0a8ffe5a19e63fd52f90255446244bd88..2769d416945af6d6b0fadfdf7b145cf93ad35f1b 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- misc_protocol.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- misc_protocol.out @@ -55,7 +55,9 @@ "smart_rollup_max_number_of_parallel_games": 32, "smart_rollup_reveal_activation_level": { "raw_data": { "Blake2B": 0 }, "metadata": 0, "dal_page": 2147483646, - "dal_parameters": 2147483646 }, "smart_rollup_private_enable": true, + "dal_parameters": 2147483646, + "dal_attested_slots_validity_lag": 241920 }, + "smart_rollup_private_enable": true, "smart_rollup_riscv_pvm_enable": false, "zk_rollup_enable": false, "zk_rollup_origination_size": 4000, "zk_rollup_min_pending_to_process": 10, "zk_rollup_max_ticket_payload_size": 2048, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- misc_protocol.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- misc_protocol.out index 36e4b18f568a632b0d410195721615a8b07147f8..bb6c99fd26f4096ee79569b354c126ddc5e3599d 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- misc_protocol.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- misc_protocol.out @@ -55,7 +55,9 @@ "smart_rollup_max_number_of_parallel_games": 32, "smart_rollup_reveal_activation_level": { "raw_data": { "Blake2B": 0 }, "metadata": 0, "dal_page": 2147483646, - "dal_parameters": 2147483646 }, "smart_rollup_private_enable": true, + "dal_parameters": 2147483646, + "dal_attested_slots_validity_lag": 241920 }, + "smart_rollup_private_enable": true, "smart_rollup_riscv_pvm_enable": false, "zk_rollup_enable": false, "zk_rollup_origination_size": 4000, "zk_rollup_min_pending_to_process": 10, "zk_rollup_max_ticket_payload_size": 2048, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_data_dir) RPC regression tests- misc_protocol.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_data_dir) RPC regression tests- misc_protocol.out index ee32b3da1c7fda5a179b329a88af73f9deb5678f..30c135145e2b267326c5f17fb508e1eb0c06a377 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_data_dir) RPC regression tests- misc_protocol.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_data_dir) RPC regression tests- misc_protocol.out @@ -55,7 +55,9 @@ "smart_rollup_max_number_of_parallel_games": 32, "smart_rollup_reveal_activation_level": { "raw_data": { "Blake2B": 0 }, "metadata": 0, "dal_page": 2147483646, - "dal_parameters": 2147483646 }, "smart_rollup_private_enable": true, + "dal_parameters": 2147483646, + "dal_attested_slots_validity_lag": 241920 }, + "smart_rollup_private_enable": true, "smart_rollup_riscv_pvm_enable": false, "zk_rollup_enable": false, "zk_rollup_origination_size": 4000, "zk_rollup_min_pending_to_process": 10, "zk_rollup_max_ticket_payload_size": 2048, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_rpc) RPC regression tests- misc_protocol.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_rpc) RPC regression tests- misc_protocol.out index ee32b3da1c7fda5a179b329a88af73f9deb5678f..30c135145e2b267326c5f17fb508e1eb0c06a377 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_rpc) RPC regression tests- misc_protocol.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_rpc) RPC regression tests- misc_protocol.out @@ -55,7 +55,9 @@ "smart_rollup_max_number_of_parallel_games": 32, "smart_rollup_reveal_activation_level": { "raw_data": { "Blake2B": 0 }, "metadata": 0, "dal_page": 2147483646, - "dal_parameters": 2147483646 }, "smart_rollup_private_enable": true, + "dal_parameters": 2147483646, + "dal_attested_slots_validity_lag": 241920 }, + "smart_rollup_private_enable": true, "smart_rollup_riscv_pvm_enable": false, "zk_rollup_enable": false, "zk_rollup_origination_size": 4000, "zk_rollup_min_pending_to_process": 10, "zk_rollup_max_ticket_payload_size": 2048,