From 9f526c29158a68ba2d1435db31517d32e167e64f Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Tue, 6 Feb 2024 10:01:26 +0100 Subject: [PATCH 1/2] Proto/Dal: also check validity of slots index before importing a page --- .../lib_protocol/alpha_context.mli | 5 +-- .../lib_protocol/sc_rollup_proof_repr.ml | 33 ++++++++++++------- .../lib_protocol/sc_rollup_proof_repr.mli | 5 +-- .../lib_sc_rollup_node/dal_pages_request.ml | 27 ++++++++------- .../lib_sc_rollup_node/dal_pages_request.mli | 2 ++ .../lib_sc_rollup_node/fueled_pvm.ml | 3 ++ .../refutation_game_helpers.ml | 2 ++ 7 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 7fa209b847e6..b5c8dd51e930 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -3864,11 +3864,12 @@ module Sc_rollup : sig serialized t tzresult Lwt.t module Dal_helpers : sig - val valid_published_level : + val valid_slot_id : + dal_number_of_slots:int -> dal_attestation_lag:int -> origination_level:Raw_level.t -> commit_inbox_level:Raw_level.t -> - published_level:Raw_level.t -> + Dal.Slot.Header.id -> bool end end 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 43887edf97ba..fac69e12c8d2 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml @@ -237,26 +237,32 @@ module Dal_helpers = struct (* FIXME/DAL: https://gitlab.com/tezos/tezos/-/issues/3997 The current DAL refutation integration is not resilient to DAL parameters changes when upgrading the protocol. The code needs to be adapted. *) - let valid_published_level ~dal_attestation_lag ~origination_level - ~commit_inbox_level ~published_level = + + let valid_slot_id ~dal_number_of_slots ~dal_attestation_lag ~origination_level + ~commit_inbox_level Dal_slot_repr.Header.{published_level; index} = (* [dal_attestation_lag] is supposed to be positive. *) let open Raw_level_repr in let not_too_old = published_level > origination_level in + let not_too_recent = add published_level dal_attestation_lag <= commit_inbox_level in not_too_old && not_too_recent + && Result.is_ok + @@ Dal_slot_index_repr.check_is_in_range + ~number_of_slots:dal_number_of_slots + index - let verify ~metadata ~dal_attestation_lag ~commit_inbox_level dal_parameters - page_id dal_snapshot proof = + let verify ~metadata ~dal_attestation_lag ~dal_number_of_slots + ~commit_inbox_level dal_parameters page_id dal_snapshot proof = let open Result_syntax in if - valid_published_level + valid_slot_id ~origination_level:metadata.Sc_rollup_metadata_repr.origination_level ~dal_attestation_lag ~commit_inbox_level - ~published_level: - Dal_slot_repr.(page_id.Page.slot_id.Header.published_level) + ~dal_number_of_slots + Dal_slot_repr.(page_id.Page.slot_id) then let* input = Dal_slot_repr.History.verify_proof @@ -268,16 +274,17 @@ module Dal_helpers = struct return_some (Sc_rollup_PVM_sig.Reveal (Dal_page input)) else return_none - let produce ~metadata ~dal_attestation_lag ~commit_inbox_level dal_parameters - page_id ~page_info ~get_history confirmed_slots_history = + let produce ~metadata ~dal_attestation_lag ~dal_number_of_slots + ~commit_inbox_level dal_parameters page_id ~page_info ~get_history + confirmed_slots_history = let open Lwt_result_syntax in if - valid_published_level + valid_slot_id + ~dal_number_of_slots ~origination_level:metadata.Sc_rollup_metadata_repr.origination_level ~dal_attestation_lag ~commit_inbox_level - ~published_level: - Dal_slot_repr.(page_id.Page.slot_id.Header.published_level) + Dal_slot_repr.(page_id.Page.slot_id) then let* proof, content_opt = Dal_slot_repr.History.produce_proof @@ -324,6 +331,7 @@ let valid (type state proof output) return_some (Sc_rollup_PVM_sig.Reveal (Metadata metadata)) | Some (Reveal_proof (Dal_page_proof {proof; page_id})) -> Dal_helpers.verify + ~dal_number_of_slots ~metadata dal_parameters ~dal_attestation_lag @@ -496,6 +504,7 @@ let produce ~metadata pvm_and_state commit_inbox_level ~is_reveal_enabled = | Needs_reveal (Request_dal_page page_id) -> let open Dal_with_history in Dal_helpers.produce + ~dal_number_of_slots ~metadata dal_parameters ~dal_attestation_lag 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 6da2f0be2653..5b842effa3df 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli @@ -281,11 +281,12 @@ module Dal_helpers : sig [commit_inbox_level] (aka inbox_level in that module) is the level (included) up to which the PVM consumed all messages and DAL/DAC inputs before producing the related commitment. *) - val valid_published_level : + val valid_slot_id : + dal_number_of_slots:int -> dal_attestation_lag:int -> origination_level:Raw_level_repr.t -> commit_inbox_level:Raw_level_repr.t -> - published_level:Raw_level_repr.t -> + Dal_slot_repr.Header.id -> 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 90bf14c8ff6d..792c75dc81c9 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,32 +110,35 @@ let storage_invariant_broken published_level index = Raw_level.pp published_level -let page_level_is_valid ~dal_attestation_lag ~published_level ~origination_level - ~inbox_level = +let slot_id_is_valid ~dal_attestation_lag ~dal_number_of_slots + ~origination_level ~inbox_level slot_id = 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_published_level + Alpha_context.Sc_rollup.Proof.Dal_helpers.valid_slot_id ~dal_attestation_lag ~origination_level ~commit_inbox_level - ~published_level + ~dal_number_of_slots + slot_id | _ -> false -let slot_pages ~dal_attestation_lag ~inbox_level node_ctxt - Dal.Slot.Header.{published_level; index} = +let slot_pages ~dal_attestation_lag ~dal_number_of_slots ~inbox_level node_ctxt + slot_id = let open Lwt_result_syntax in let Node_context.{genesis_info = {level = origination_level; _}; _} = node_ctxt in + let Dal.Slot.Header.{published_level; index} = slot_id in if not - @@ page_level_is_valid + @@ slot_id_is_valid ~dal_attestation_lag - ~published_level ~origination_level ~inbox_level + ~dal_number_of_slots + slot_id then return_none else let* confirmed_in_block_hash = @@ -157,7 +160,8 @@ let slot_pages ~dal_attestation_lag ~inbox_level node_ctxt | Some `Unconfirmed -> return_none | None -> storage_invariant_broken published_level index -let page_content ~dal_attestation_lag ~inbox_level node_ctxt page_id = +let page_content ~dal_attestation_lag ~dal_number_of_slots ~inbox_level + node_ctxt page_id = 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 @@ -166,11 +170,12 @@ let page_content ~dal_attestation_lag ~inbox_level node_ctxt page_id = in if not - @@ page_level_is_valid + @@ slot_id_is_valid ~dal_attestation_lag - ~published_level ~origination_level ~inbox_level + ~dal_number_of_slots + slot_id then return_none else let* confirmed_in_block_hash = 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 5a9039c55f23..25f28b95c3ea 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 @@ -55,6 +55,7 @@ type error += Dal_slot_not_found_in_store of Dal.Slot.Header.id *) val slot_pages : dal_attestation_lag:int -> + dal_number_of_slots:int -> inbox_level:int32 -> _ Node_context.t -> Dal.slot_id -> @@ -72,6 +73,7 @@ val slot_pages : *) val page_content : 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 de645dd897f5..df5f31054ea3 100644 --- a/src/proto_alpha/lib_sc_rollup_node/fueled_pvm.ml +++ b/src/proto_alpha/lib_sc_rollup_node/fueled_pvm.ml @@ -94,6 +94,7 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct 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_parameters = Sc_rollup.Dal_parameters. { @@ -131,6 +132,7 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct Dal_pages_request.page_content ~inbox_level:(Int32.of_int level) ~dal_attestation_lag + ~dal_number_of_slots node_ctxt dal_page in @@ -255,6 +257,7 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct Dal_pages_request.page_content ~inbox_level:(Int32.of_int level) ~dal_attestation_lag + ~dal_number_of_slots 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 409b0dca6a46..64e3c332e355 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 @@ -71,6 +71,7 @@ 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 | Some reveal_activation_level -> @@ -94,6 +95,7 @@ let page_info_from_pvm_state constants (node_ctxt : _ Node_context.t) let* pages = Dal_pages_request.slot_pages ~dal_attestation_lag + ~dal_number_of_slots ~inbox_level node_ctxt slot_id -- GitLab From 8c0a84967e0256ddca2499c7f35f1d9bf143c9f5 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Tue, 6 Feb 2024 13:58:55 +0100 Subject: [PATCH 2/2] Proto/Dal: take activation level into account to check slots ids validity --- .../lib_protocol/alpha_context.mli | 5 ++ .../lib_protocol/sc_rollup_game_repr.ml | 27 +++++++---- .../lib_protocol/sc_rollup_game_repr.mli | 1 + .../lib_protocol/sc_rollup_proof_repr.ml | 47 ++++++++++++------- .../lib_protocol/sc_rollup_proof_repr.mli | 15 ++++-- .../sc_rollup_refutation_storage.ml | 9 +++- .../test/helpers/sc_rollup_helpers.ml | 6 +++ .../test/unit/test_sc_rollup_arith.ml | 9 +++- .../test/unit/test_sc_rollup_game.ml | 9 +++- .../lib_sc_rollup_node/dal_pages_request.ml | 15 +++--- .../lib_sc_rollup_node/dal_pages_request.mli | 2 + .../lib_sc_rollup_node/fueled_pvm.ml | 14 ++++++ .../refutation_game_helpers.ml | 29 +++++++++++- .../test/test_octez_conversions.ml | 8 +--- 14 files changed, 150 insertions(+), 46 deletions(-) diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index b5c8dd51e930..21b7618f36cb 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -3838,6 +3838,8 @@ module Sc_rollup : sig val dal_attestation_lag : int val dal_number_of_slots : int + + val dal_activation_level : Raw_level.t option end end @@ -3850,6 +3852,7 @@ module Sc_rollup : sig Raw_level.t -> Dal.Slots_history.t -> Dal.parameters -> + dal_activation_level:Raw_level.t option -> dal_attestation_lag:int -> dal_number_of_slots:int -> is_reveal_enabled:is_reveal_enabled -> @@ -3866,6 +3869,7 @@ module Sc_rollup : sig module Dal_helpers : sig val valid_slot_id : dal_number_of_slots:int -> + dal_activation_level:Raw_level.t option -> dal_attestation_lag:int -> origination_level:Raw_level.t -> commit_inbox_level:Raw_level.t -> @@ -3969,6 +3973,7 @@ module Sc_rollup : sig val play : Kind.t -> Dal.parameters -> + dal_activation_level:Raw_level.t option -> dal_attestation_lag:int -> dal_number_of_slots:int -> stakers:Index.t -> 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 6d5b8479bd12..3530735d5115 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_game_repr.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_game_repr.ml @@ -742,9 +742,9 @@ let check_proof_refute_stop_state ~stop_state input input_request proof = check_proof_stop_state ~stop_state input input_request proof false (** Returns the validity of the first final move on top of a dissection. *) -let validity_final_move ~pvm ~dal_parameters ~dal_attestation_lag - ~dal_number_of_slots ~first_move ~metadata ~proof ~game ~start_chunk - ~stop_chunk ~is_reveal_enabled = +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 = let open Lwt_result_syntax in let*! res = let {inbox_snapshot; inbox_level; dal_snapshot; _} = game in @@ -759,6 +759,7 @@ let validity_final_move ~pvm ~dal_parameters ~dal_attestation_lag inbox_level dal_snapshot dal_parameters + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~is_reveal_enabled @@ -808,11 +809,13 @@ let validity_final_move ~pvm ~dal_parameters ~dal_attestation_lag - The proof stop on the state different than the refuted one. - The proof is correctly verified. *) -let validity_first_final_move ~pvm ~dal_parameters ~dal_attestation_lag - ~dal_number_of_slots ~metadata ~proof ~game ~start_chunk ~stop_chunk = +let validity_first_final_move ~pvm ~dal_parameters ~dal_activation_level + ~dal_attestation_lag ~dal_number_of_slots ~metadata ~proof ~game + ~start_chunk ~stop_chunk = validity_final_move ~pvm ~dal_parameters + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~first_move:true @@ -829,12 +832,13 @@ let validity_first_final_move ~pvm ~dal_parameters ~dal_attestation_lag - The proof stop on the state validates the refuted one. - The proof is correctly verified. *) -let validity_second_final_move ~pvm ~dal_parameters ~dal_attestation_lag - ~dal_number_of_slots ~metadata ~agreed_start_chunk ~refuted_stop_chunk ~game - ~proof = +let validity_second_final_move ~pvm ~dal_parameters ~dal_activation_level + ~dal_attestation_lag ~dal_number_of_slots ~metadata ~agreed_start_chunk + ~refuted_stop_chunk ~game ~proof = validity_final_move ~pvm ~dal_parameters + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~first_move:false @@ -893,8 +897,9 @@ let cost_play ~step ~choice = scale10 @@ Gas_limit_repr.atomic_step_cost @@ Michelson_v1_gas_costs.cost_N_IBlake2b overapproximated_hashing_size -let play kind dal_parameters ~dal_attestation_lag ~dal_number_of_slots ~stakers - metadata game ~step ~choice ~is_reveal_enabled = +let play kind dal_parameters ~dal_activation_level ~dal_attestation_lag + ~dal_number_of_slots ~stakers metadata game ~step ~choice ~is_reveal_enabled + = let open Lwt_result_syntax in let (Packed ((module PVM) as pvm)) = Sc_rollups.Kind.pvm_of kind in let mk_loser loser = @@ -935,6 +940,7 @@ let play kind dal_parameters ~dal_attestation_lag ~dal_number_of_slots ~stakers validity_first_final_move ~pvm ~dal_parameters + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~proof @@ -970,6 +976,7 @@ let play kind dal_parameters ~dal_attestation_lag ~dal_number_of_slots ~stakers validity_second_final_move ~pvm ~dal_parameters + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~metadata 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 5f6930c2284e..025990199c52 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_game_repr.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_game_repr.mli @@ -391,6 +391,7 @@ val status_encoding : status Data_encoding.t val play : Sc_rollups.Kind.t -> Dal_slot_repr.parameters -> + dal_activation_level:Raw_level_repr.t option -> dal_attestation_lag:int -> dal_number_of_slots:int -> stakers:Index.t -> 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 fac69e12c8d2..3f73b2ccb77a 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.ml @@ -238,26 +238,35 @@ 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_attestation_lag ~origination_level - ~commit_inbox_level Dal_slot_repr.Header.{published_level; index} = + 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_attestation_lag] is supposed to be positive. *) let open Raw_level_repr in + let dal_was_activated = + match dal_activation_level with + | None -> false + | Some dal_activation_level -> published_level >= dal_activation_level + in let not_too_old = published_level > origination_level in - let not_too_recent = add published_level dal_attestation_lag <= commit_inbox_level in - not_too_old && not_too_recent - && Result.is_ok - @@ Dal_slot_index_repr.check_is_in_range - ~number_of_slots:dal_number_of_slots - index - - let verify ~metadata ~dal_attestation_lag ~dal_number_of_slots - ~commit_inbox_level dal_parameters page_id dal_snapshot proof = + let index_is_valid = + Result.is_ok + @@ Dal_slot_index_repr.check_is_in_range + ~number_of_slots:dal_number_of_slots + index + in + dal_was_activated && not_too_old && not_too_recent && index_is_valid + + let verify ~metadata ~dal_activation_level ~dal_attestation_lag + ~dal_number_of_slots ~commit_inbox_level dal_parameters page_id + dal_snapshot proof = let open Result_syntax in if valid_slot_id + ~dal_activation_level ~origination_level:metadata.Sc_rollup_metadata_repr.origination_level ~dal_attestation_lag ~commit_inbox_level @@ -274,13 +283,14 @@ module Dal_helpers = struct return_some (Sc_rollup_PVM_sig.Reveal (Dal_page input)) else return_none - let produce ~metadata ~dal_attestation_lag ~dal_number_of_slots - ~commit_inbox_level dal_parameters page_id ~page_info ~get_history - confirmed_slots_history = + 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 = let open Lwt_result_syntax in if valid_slot_id ~dal_number_of_slots + ~dal_activation_level ~origination_level:metadata.Sc_rollup_metadata_repr.origination_level ~dal_attestation_lag ~commit_inbox_level @@ -302,8 +312,9 @@ end let valid (type state proof output) ~(pvm : (state, proof, output) Sc_rollups.PVM.implementation) ~metadata - snapshot commit_inbox_level dal_snapshot dal_parameters ~dal_attestation_lag - ~dal_number_of_slots ~is_reveal_enabled (proof : proof t) = + snapshot commit_inbox_level dal_snapshot dal_parameters + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots + ~is_reveal_enabled (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 @@ -333,6 +344,7 @@ let valid (type state proof output) Dal_helpers.verify ~dal_number_of_slots ~metadata + ~dal_activation_level dal_parameters ~dal_attestation_lag ~commit_inbox_level @@ -439,6 +451,8 @@ module type PVM_with_context_and_state = sig val dal_attestation_lag : int val dal_number_of_slots : int + + val dal_activation_level : Raw_level_repr.t option end end @@ -506,6 +520,7 @@ let produce ~metadata pvm_and_state commit_inbox_level ~is_reveal_enabled = Dal_helpers.produce ~dal_number_of_slots ~metadata + ~dal_activation_level dal_parameters ~dal_attestation_lag ~commit_inbox_level 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 5b842effa3df..fce1841cf52a 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_proof_repr.mli @@ -153,12 +153,13 @@ val stop_of_pvm_step : output from the [input] proof is too recent to be allowed into the PVM proof ; - - DAL related parameters, to be able to check the page content membership to a slot - or check the revealed parameters if needed ; + - DAL related parameters, to be able to check the page content membership + to a slot or check the revealed parameters if needed ; - the [pvm_name], used to check that the proof given has the right PVM kind. + - The level at which DAL is activated (None if the DAL is not enabled). It also returns the optional input executed during the proof and the input_request for the state at the beginning of the proof. *) @@ -169,6 +170,7 @@ val valid : Raw_level_repr.t -> Dal_slot_repr.History.t -> Dal_slot_repr.parameters -> + dal_activation_level:Raw_level_repr.t option -> dal_attestation_lag:int -> dal_number_of_slots:int -> is_reveal_enabled:Sc_rollup_PVM_sig.is_reveal_enabled -> @@ -234,6 +236,9 @@ module type PVM_with_context_and_state = sig (** The number of DAL slots provided by the L1. *) val dal_number_of_slots : int + + (** 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 end end @@ -270,6 +275,7 @@ module Dal_helpers : sig is valid, and produce or verify a proof for it if, and only if, the level is in the following boundaries: + - DAL is activated and [published_level] >= [dal_activation_level] - [published_level] > [origination_level]: this means that the slot of the page was published after the rollup origination ; @@ -280,9 +286,12 @@ module Dal_helpers : sig According to the definition in {!Sc_rollup_commitment_repr}, [commit_inbox_level] (aka inbox_level in that module) is the level (included) up to which the PVM consumed all messages and DAL/DAC inputs - before producing the related commitment. *) + 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 -> + 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 -> 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 a94740a2c9dd..0b2962e2db1e 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml @@ -446,7 +446,13 @@ let game_move ctxt rollup ~player ~opponent ~step ~choice = Sc_rollup_wrong_turn in let* ctxt, metadata = Sc_rollup_storage.get_metadata ctxt rollup in - let dal = (Constants_storage.parametric ctxt).dal in + let constants = Constants_storage.parametric ctxt in + let dal = constants.dal in + let dal_activation_level = + if dal.feature_enable then + Some constants.sc_rollup.reveal_activation_level.dal_parameters + else None + in let* check_result, ctxt = check_stakes ctxt rollup stakers in match check_result with | Some game_result -> return (Some game_result, ctxt) @@ -457,6 +463,7 @@ let game_move ctxt rollup ~player ~opponent ~step ~choice = Sc_rollup_game_repr.play kind dal.cryptobox_parameters + ~dal_activation_level ~dal_attestation_lag:dal.attestation_lag ~dal_number_of_slots:dal.number_of_slots ~stakers 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 f0ead6a54a95..753be05b5958 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 @@ -1006,5 +1006,11 @@ let make_pvm_with_context_and_state (type context state) let dal_number_of_slots = Default_parameters.constants_test.dal.number_of_slots + + let dal_activation_level = + let constants = Default_parameters.constants_test in + if constants.dal.feature_enable then + Some constants.sc_rollup.reveal_activation_level.dal_parameters + else None end end) 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 d4fe147d6ff4..8d129bc37f2d 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 @@ -670,7 +670,13 @@ let test_serialized_reveal_proof ~hashed_preimage ~input_preimage () = in let snapshot = Sc_rollup.Inbox.take_snapshot inbox.inbox in let dal_snapshot = Dal.Slots_history.genesis in - let dal_parameters = Default_parameters.constants_mainnet.dal in + let constants = Default_parameters.constants_mainnet in + let dal_parameters = constants.dal in + let dal_activation_level = + if constants.dal.feature_enable then + Some constants.sc_rollup.reveal_activation_level.dal_parameters + else None + in let ctxt = Sc_rollup_helpers.Arith_pvm.make_empty_context () in let is_reveal_enabled = Sc_rollup_helpers.is_reveal_enabled_default in @@ -720,6 +726,7 @@ let test_serialized_reveal_proof ~hashed_preimage ~input_preimage () = Raw_level.root dal_snapshot dal_parameters.cryptobox_parameters + ~dal_activation_level ~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 ae0ba045c57c..e18d48864327 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 @@ -242,7 +242,13 @@ let test_invalid_serialized_inbox_proof () = let inbox = Sc_rollup_helpers.dumb_init level in let snapshot = Sc_rollup.Inbox.take_snapshot inbox in let dal_snapshot = Dal.Slots_history.genesis in - let dal_parameters = Default_parameters.constants_mainnet.dal in + let constants = Default_parameters.constants_mainnet in + let dal_parameters = constants.dal in + let dal_activation_level = + if constants.dal.feature_enable then + Some constants.sc_rollup.reveal_activation_level.dal_parameters + else None + 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 @@ -275,6 +281,7 @@ let test_invalid_serialized_inbox_proof () = Raw_level.root dal_snapshot dal_parameters.cryptobox_parameters + ~dal_activation_level ~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_node/dal_pages_request.ml b/src/proto_alpha/lib_sc_rollup_node/dal_pages_request.ml index 792c75dc81c9..b352cd020f96 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,13 +110,14 @@ let storage_invariant_broken published_level index = Raw_level.pp published_level -let slot_id_is_valid ~dal_attestation_lag ~dal_number_of_slots - ~origination_level ~inbox_level slot_id = +let slot_id_is_valid ~dal_activation_level ~dal_attestation_lag + ~dal_number_of_slots ~origination_level ~inbox_level slot_id = 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 + ~dal_activation_level ~dal_attestation_lag ~origination_level ~commit_inbox_level @@ -124,8 +125,8 @@ let slot_id_is_valid ~dal_attestation_lag ~dal_number_of_slots slot_id | _ -> false -let slot_pages ~dal_attestation_lag ~dal_number_of_slots ~inbox_level node_ctxt - slot_id = +let slot_pages ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots + ~inbox_level node_ctxt slot_id = let open Lwt_result_syntax in let Node_context.{genesis_info = {level = origination_level; _}; _} = node_ctxt @@ -134,6 +135,7 @@ let slot_pages ~dal_attestation_lag ~dal_number_of_slots ~inbox_level node_ctxt if not @@ slot_id_is_valid + ~dal_activation_level ~dal_attestation_lag ~origination_level ~inbox_level @@ -160,8 +162,8 @@ let slot_pages ~dal_attestation_lag ~dal_number_of_slots ~inbox_level node_ctxt | Some `Unconfirmed -> return_none | None -> storage_invariant_broken published_level index -let page_content ~dal_attestation_lag ~dal_number_of_slots ~inbox_level - node_ctxt page_id = +let page_content ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots + ~inbox_level node_ctxt page_id = 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 @@ -171,6 +173,7 @@ let page_content ~dal_attestation_lag ~dal_number_of_slots ~inbox_level if not @@ slot_id_is_valid + ~dal_activation_level ~dal_attestation_lag ~origination_level ~inbox_level 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 25f28b95c3ea..9c2c80e5c95d 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,6 +54,7 @@ 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 : + dal_activation_level:Raw_level.t option -> dal_attestation_lag:int -> dal_number_of_slots:int -> inbox_level:int32 -> @@ -72,6 +73,7 @@ val slot_pages : [dal_attestation_lag] is used to retrieve the correct entry in [store]. *) val page_content : + dal_activation_level:Raw_level.t option -> dal_attestation_lag:int -> dal_number_of_slots:int -> inbox_level:int32 -> 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 df5f31054ea3..577d1b7f8428 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,18 @@ 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_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 + in let dal_parameters = Sc_rollup.Dal_parameters. { @@ -130,6 +142,7 @@ 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 + ~dal_activation_level ~inbox_level:(Int32.of_int level) ~dal_attestation_lag ~dal_number_of_slots @@ -256,6 +269,7 @@ module Make_fueled (F : Fuel.S) : FUELED_PVM with type fuel = F.t = struct let* content_opt = Dal_pages_request.page_content ~inbox_level:(Int32.of_int level) + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots node_ctxt 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 64e3c332e355..42349a97d71c 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,6 +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 + in let*! input_request = let open (val Pvm.of_kind node_ctxt.kind) in is_input_state @@ -94,6 +106,7 @@ 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 + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~inbox_level @@ -171,7 +184,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 + in let* page_info = page_info_from_pvm_state constants @@ -246,6 +270,8 @@ let generate_proof (node_ctxt : _ Node_context.t) let dal_number_of_slots = dal_number_of_slots let page_info = page_info + + let dal_activation_level = dal_activation_level end end in let metadata = metadata node_ctxt in @@ -294,6 +320,7 @@ let generate_proof (node_ctxt : _ Node_context.t) (Raw_level.of_int32_exn game.inbox_level) dal_slots_history dal_parameters + ~dal_activation_level ~dal_attestation_lag ~dal_number_of_slots ~pvm:(module PVM) diff --git a/src/proto_alpha/lib_sc_rollup_node/test/test_octez_conversions.ml b/src/proto_alpha/lib_sc_rollup_node/test/test_octez_conversions.ml index a2c3695b9fb5..d8f5db8cac62 100644 --- a/src/proto_alpha/lib_sc_rollup_node/test/test_octez_conversions.ml +++ b/src/proto_alpha/lib_sc_rollup_node/test/test_octez_conversions.ml @@ -220,12 +220,7 @@ let compare_slot_header_id (s1 : Octez_smart_rollup.Dal.Slot_header.id) let c = Int32.compare s1.published_level s2.published_level in if c <> 0 then c else Int.compare s1.index s2.index -let gen_slot_headers = QCheck2.Gen.return [] -(* -TODO: https://gitlab.com/tezos/tezos/-/issues/6895 - -Adapt/re-enable tests - +let gen_slot_headers = let open QCheck2.Gen in let size = int_bound 50 in let+ l = list_size size gen_slot_header in @@ -247,7 +242,6 @@ Adapt/re-enable tests let h = {h with id = {h.id with published_level}} in (published_level, [h])) l -*) let gen_slot_history = let open Protocol.Alpha_context in -- GitLab