From 6dc2248642e3fdb85cffee46bdd9cf17726f1507 Mon Sep 17 00:00:00 2001 From: Alain Mebsout Date: Wed, 10 May 2023 16:07:43 +0200 Subject: [PATCH 1/4] SCORU/Node: fix incorrect inbox for migration blocks --- src/proto_alpha/lib_sc_rollup_node/inbox.ml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_sc_rollup_node/inbox.ml b/src/proto_alpha/lib_sc_rollup_node/inbox.ml index a15d5f35bbbd..67c01483125d 100644 --- a/src/proto_alpha/lib_sc_rollup_node/inbox.ml +++ b/src/proto_alpha/lib_sc_rollup_node/inbox.ml @@ -175,8 +175,13 @@ let process_head (node_ctxt : _ Node_context.t) ~(predecessor : Layer1.header) head.level (List.length collected_messages) in - let is_migration_block = - head.header.proto_level <> predecessor.header.proto_level + let* grandparent = + Node_context.get_predecessor_header node_ctxt predecessor + in + let is_first_block = + (* head is the first block of the protocol if its predecessor is a + migration block. *) + grandparent.header.proto_level <> predecessor.header.proto_level in let* (( _inbox_hash, inbox, @@ -184,7 +189,7 @@ let process_head (node_ctxt : _ Node_context.t) ~(predecessor : Layer1.header) _messages_with_protocol_internal_messages ) as res) = process_messages node_ctxt - ~is_migration_block + ~is_migration_block:is_first_block ~predecessor ~level:head.level collected_messages -- GitLab From dc2fded6dcc2464bd081f23bf6feed4334e2cf09 Mon Sep 17 00:00:00 2001 From: Alain Mebsout Date: Wed, 10 May 2023 16:08:06 +0200 Subject: [PATCH 2/4] SCORU/Node: rename incorrect migration_block to first_block --- src/proto_alpha/lib_sc_rollup_node/daemon.ml | 4 ++-- src/proto_alpha/lib_sc_rollup_node/inbox.ml | 16 +++++++------- src/proto_alpha/lib_sc_rollup_node/inbox.mli | 10 ++++----- .../lib_sc_rollup_node/interpreter.ml | 4 ++-- .../lib_sc_rollup_node/node_context.ml | 21 +++++++------------ .../lib_sc_rollup_node/node_context.mli | 2 +- .../lib_sc_rollup_node/refutation_game.ml | 9 ++------ src/proto_alpha/lib_sc_rollup_node/store.ml | 2 +- .../test/helpers/helpers.ml | 8 +++---- .../test/helpers/helpers.mli | 4 ++-- 10 files changed, 34 insertions(+), 46 deletions(-) diff --git a/src/proto_alpha/lib_sc_rollup_node/daemon.ml b/src/proto_alpha/lib_sc_rollup_node/daemon.ml index 5eb7c83900b8..48f0eeda36d7 100644 --- a/src/proto_alpha/lib_sc_rollup_node/daemon.ml +++ b/src/proto_alpha/lib_sc_rollup_node/daemon.ml @@ -588,7 +588,7 @@ module Make (PVM : Pvm.S) = struct (** Same as {!process_head} but only builds and stores the L2 block corresponding to [messages]. It is used by the unit tests to build an L2 chain. *) - let process_messages (node_ctxt : _ Node_context.t) ~is_migration_block + let process_messages (node_ctxt : _ Node_context.t) ~is_first_block ~predecessor head messages = let open Lwt_result_syntax in let* ctxt = previous_context node_ctxt ~predecessor in @@ -598,7 +598,7 @@ module Make (PVM : Pvm.S) = struct let* inbox_hash, inbox, inbox_witness, messages = Inbox.Internal_for_tests.process_messages node_ctxt - ~is_migration_block + ~is_first_block ~predecessor ~level:head.level messages diff --git a/src/proto_alpha/lib_sc_rollup_node/inbox.ml b/src/proto_alpha/lib_sc_rollup_node/inbox.ml index 67c01483125d..85fafb360157 100644 --- a/src/proto_alpha/lib_sc_rollup_node/inbox.ml +++ b/src/proto_alpha/lib_sc_rollup_node/inbox.ml @@ -91,7 +91,7 @@ let same_inbox_as_layer_1 node_ctxt head_hash inbox = (Sc_rollup.Inbox.equal layer1_inbox inbox) (Sc_rollup_node_errors.Inconsistent_inbox {layer1_inbox; inbox}) -let add_messages ~is_migration_block ~predecessor_timestamp ~predecessor inbox +let add_messages ~is_first_block ~predecessor_timestamp ~predecessor inbox messages = let open Lwt_result_syntax in let no_history = Sc_rollup.Inbox.History.empty ~capacity:0L in @@ -102,7 +102,7 @@ let add_messages ~is_migration_block ~predecessor_timestamp ~predecessor inbox witness, messages_with_protocol_internal_messages ) = Sc_rollup.Inbox.add_all_messages - ~first_block:is_migration_block + ~first_block:is_first_block ~predecessor_timestamp ~predecessor no_history @@ -118,7 +118,7 @@ let add_messages ~is_migration_block ~predecessor_timestamp ~predecessor inbox inbox, messages_with_protocol_internal_messages ) -let process_messages (node_ctxt : _ Node_context.t) ~is_migration_block +let process_messages (node_ctxt : _ Node_context.t) ~is_first_block ~(predecessor : Layer1.header) ~level messages = let open Lwt_result_syntax in let* inbox = @@ -132,7 +132,7 @@ let process_messages (node_ctxt : _ Node_context.t) ~is_migration_block inbox, messages_with_protocol_internal_messages ) = add_messages - ~is_migration_block + ~is_first_block ~predecessor_timestamp ~predecessor:predecessor.hash inbox @@ -148,7 +148,7 @@ let process_messages (node_ctxt : _ Node_context.t) ~is_migration_block node_ctxt witness_hash { - is_migration_block; + is_first_block; predecessor = predecessor.hash; predecessor_timestamp; messages; @@ -189,7 +189,7 @@ let process_head (node_ctxt : _ Node_context.t) ~(predecessor : Layer1.header) _messages_with_protocol_internal_messages ) as res) = process_messages node_ctxt - ~is_migration_block:is_first_block + ~is_first_block ~predecessor ~level:head.level collected_messages @@ -206,7 +206,7 @@ let process_head (node_ctxt : _ Node_context.t) ~(predecessor : Layer1.header) let start () = Inbox_event.starting () -let payloads_history_of_messages ~is_migration_block ~predecessor +let payloads_history_of_messages ~is_first_block ~predecessor ~predecessor_timestamp messages = let open Result_syntax in let dummy_inbox = @@ -223,7 +223,7 @@ let payloads_history_of_messages ~is_migration_block ~predecessor (N after next snapshot). *) Environment.wrap_tzresult @@ Sc_rollup.Inbox.add_all_messages - ~first_block:is_migration_block + ~first_block:is_first_block ~predecessor_timestamp ~predecessor (Sc_rollup.Inbox.History.empty ~capacity:0L) diff --git a/src/proto_alpha/lib_sc_rollup_node/inbox.mli b/src/proto_alpha/lib_sc_rollup_node/inbox.mli index 29caafad1846..8cd5f4f61ce7 100644 --- a/src/proto_alpha/lib_sc_rollup_node/inbox.mli +++ b/src/proto_alpha/lib_sc_rollup_node/inbox.mli @@ -54,11 +54,11 @@ val process_head : (** [start ()] initializes the inbox to track the messages being published. *) val start : unit -> unit Lwt.t -(** [add_messages ~is_migration_block ~predecessor_timestamp +(** [add_messages ~is_first_block ~predecessor_timestamp ~predecessor inbox messages] adds [messages] to the [inbox] using {!Sc_rollup.Inbox.add_all_messages}. *) val add_messages : - is_migration_block:bool -> + is_first_block:bool -> predecessor_timestamp:Timestamp.time -> predecessor:Block_hash.t -> Inbox.t -> @@ -70,13 +70,13 @@ val add_messages : tzresult Lwt.t -(** [payloads_history_of_messages ~is_migration_block ~predecessor +(** [payloads_history_of_messages ~is_first_block ~predecessor ~predecessor_timestamp messages] builds the payloads history for the list of [messages]. This allows to not store payloads histories (which contain merkelized skip lists) but simply messages. *) val payloads_history_of_messages : - is_migration_block:bool -> + is_first_block:bool -> predecessor:Block_hash.t -> predecessor_timestamp:Timestamp.time -> Sc_rollup.Inbox_message.t list -> @@ -87,7 +87,7 @@ val payloads_history_of_messages : module Internal_for_tests : sig val process_messages : Node_context.rw -> - is_migration_block:bool -> + is_first_block:bool -> predecessor:Layer1.header -> level:int32 -> Sc_rollup.Inbox_message.t list -> diff --git a/src/proto_alpha/lib_sc_rollup_node/interpreter.ml b/src/proto_alpha/lib_sc_rollup_node/interpreter.ml index 5b2cb2fb4e4a..a9ff8c1cab3c 100644 --- a/src/proto_alpha/lib_sc_rollup_node/interpreter.ml +++ b/src/proto_alpha/lib_sc_rollup_node/interpreter.ml @@ -218,7 +218,7 @@ module Make (PVM : Pvm.S) : S with module PVM = PVM = struct Layer1.{hash = block.header.predecessor; level = pred_level} in let* inbox = Node_context.get_inbox node_ctxt block.header.inbox_hash in - let* {is_migration_block; predecessor; predecessor_timestamp; messages} = + let* {is_first_block; predecessor; predecessor_timestamp; messages} = Node_context.get_messages node_ctxt block.header.inbox_witness in let inbox_level = Sc_rollup.Inbox.inbox_level inbox in @@ -228,7 +228,7 @@ module Make (PVM : Pvm.S) : S with module PVM = PVM = struct let open Sc_rollup.Inbox_message in Internal Start_of_level :: - (if is_migration_block then + (if is_first_block then [Internal Sc_rollup.Inbox_message.protocol_migration_internal_message] else []) @ Internal (Info_per_level {predecessor; predecessor_timestamp}) diff --git a/src/proto_alpha/lib_sc_rollup_node/node_context.ml b/src/proto_alpha/lib_sc_rollup_node/node_context.ml index 4c04fe2013dc..e8d49390a4fa 100644 --- a/src/proto_alpha/lib_sc_rollup_node/node_context.ml +++ b/src/proto_alpha/lib_sc_rollup_node/node_context.ml @@ -796,7 +796,7 @@ let get_inbox_by_block_hash node_ctxt hash = inbox_of_head node_ctxt {hash; level} type messages_info = { - is_migration_block : bool; + is_first_block : bool; predecessor : Block_hash.t; predecessor_timestamp : Timestamp.t; messages : Sc_rollup.Inbox_message.t list; @@ -813,20 +813,16 @@ let get_messages {store; _} messages_hash = messages_hash | Some ( messages, - (is_migration_block, predecessor, predecessor_timestamp, _num_messages) - ) -> - return {is_migration_block; predecessor; predecessor_timestamp; messages} + (is_first_block, predecessor, predecessor_timestamp, _num_messages) ) -> + return {is_first_block; predecessor; predecessor_timestamp; messages} let find_messages {store; _} hash = let open Lwt_result_syntax in let+ msgs = Store.Messages.read store.messages hash in Option.map (fun ( messages, - ( is_migration_block, - predecessor, - predecessor_timestamp, - _num_messages ) ) -> - {is_migration_block; predecessor; predecessor_timestamp; messages}) + (is_first_block, predecessor, predecessor_timestamp, _num_messages) + ) -> {is_first_block; predecessor; predecessor_timestamp; messages}) msgs let get_num_messages {store; _} hash = @@ -842,15 +838,12 @@ let get_num_messages {store; _} hash = return num_messages let save_messages {store; _} key - {is_migration_block; predecessor; predecessor_timestamp; messages} = + {is_first_block; predecessor; predecessor_timestamp; messages} = Store.Messages.append store.messages ~key ~header: - ( is_migration_block, - predecessor, - predecessor_timestamp, - List.length messages ) + (is_first_block, predecessor, predecessor_timestamp, List.length messages) ~value:messages let get_full_l2_block node_ctxt block_hash = diff --git a/src/proto_alpha/lib_sc_rollup_node/node_context.mli b/src/proto_alpha/lib_sc_rollup_node/node_context.mli index 870dfb23830b..90dd35e0b217 100644 --- a/src/proto_alpha/lib_sc_rollup_node/node_context.mli +++ b/src/proto_alpha/lib_sc_rollup_node/node_context.mli @@ -312,7 +312,7 @@ val commitment_was_published : (** {3 Inboxes} *) type messages_info = { - is_migration_block : bool; + is_first_block : bool; predecessor : Block_hash.t; predecessor_timestamp : Timestamp.t; messages : Sc_rollup.Inbox_message.t list; diff --git a/src/proto_alpha/lib_sc_rollup_node/refutation_game.ml b/src/proto_alpha/lib_sc_rollup_node/refutation_game.ml index ba76743c6fd9..9809d63b7cbc 100644 --- a/src/proto_alpha/lib_sc_rollup_node/refutation_game.ml +++ b/src/proto_alpha/lib_sc_rollup_node/refutation_game.ml @@ -261,17 +261,12 @@ module Make (Interpreter : Interpreter.S) : ~error:(Format.kasprintf Stdlib.failwith "%a" pp_print_trace)) @@ let open Lwt_result_syntax in - let* { - is_migration_block; - predecessor; - predecessor_timestamp; - messages; - } = + let* {is_first_block; predecessor; predecessor_timestamp; messages} = Node_context.get_messages node_ctxt witness in let*? hist = Inbox.payloads_history_of_messages - ~is_migration_block + ~is_first_block ~predecessor ~predecessor_timestamp messages diff --git a/src/proto_alpha/lib_sc_rollup_node/store.ml b/src/proto_alpha/lib_sc_rollup_node/store.ml index 17fb35d80197..4f87a0d36983 100644 --- a/src/proto_alpha/lib_sc_rollup_node/store.ml +++ b/src/proto_alpha/lib_sc_rollup_node/store.ml @@ -111,7 +111,7 @@ module Messages = let encoding = let open Data_encoding in obj4 - (req "is_migration_block" bool) + (req "is_first_block" bool) (req "predecessor" Block_hash.encoding) (req "predecessor_timestamp" Timestamp.encoding) (req "num_messages" int31) diff --git a/src/proto_alpha/lib_sc_rollup_node/test/helpers/helpers.ml b/src/proto_alpha/lib_sc_rollup_node/test/helpers/helpers.ml index 1178838d8360..2dd030c3a411 100644 --- a/src/proto_alpha/lib_sc_rollup_node/test/helpers/helpers.ml +++ b/src/proto_alpha/lib_sc_rollup_node/test/helpers/helpers.ml @@ -53,7 +53,7 @@ module type S = sig val append_l2_block : [`Read | `Write] Node_context.t -> - ?is_migration_block:bool -> + ?is_first_block:bool -> Sc_rollup.Inbox_message.t trace -> ((Sc_rollup_block.header, unit) Sc_rollup_block.block, tztrace) result Lwt.t end @@ -198,8 +198,8 @@ module Make (PVM : Pvm.S) = struct in {Layer1.hash; level; header} - let append_l2_block (node_ctxt : _ Node_context.t) - ?(is_migration_block = false) messages = + let append_l2_block (node_ctxt : _ Node_context.t) ?(is_first_block = false) + messages = let open Lwt_result_syntax in let* predecessor_l2_block = Node_context.last_processed_head_opt node_ctxt @@ -221,7 +221,7 @@ module Make (PVM : Pvm.S) = struct in Daemon.Internal_for_tests.process_messages node_ctxt - ~is_migration_block + ~is_first_block ~predecessor head messages diff --git a/src/proto_alpha/lib_sc_rollup_node/test/helpers/helpers.mli b/src/proto_alpha/lib_sc_rollup_node/test/helpers/helpers.mli index 252b6b9eaf91..6f2035aefe24 100644 --- a/src/proto_alpha/lib_sc_rollup_node/test/helpers/helpers.mli +++ b/src/proto_alpha/lib_sc_rollup_node/test/helpers/helpers.mli @@ -56,13 +56,13 @@ val add_l2_genesis_block : boot_sector:string -> Sc_rollup_block.t tzresult Lwt.t -(** [append_l2_block node_ctxt ?is_migration_block messages] creates and append +(** [append_l2_block node_ctxt ?is_first_block messages] creates and append an L2 block containing the [messages] given in argument. The block is added on top of the last L2 block in the chain (i.e. the head known by the node), and is returned. *) val append_l2_block : [`Read | `Write] Node_context.t -> - ?is_migration_block:bool -> + ?is_first_block:bool -> Sc_rollup.Inbox_message.t list -> Sc_rollup_block.t tzresult Lwt.t -- GitLab From 0af0d0bef4a768f05efe603bf21099c2d213ee66 Mon Sep 17 00:00:00 2001 From: Alain Mebsout Date: Wed, 10 May 2023 11:19:39 +0200 Subject: [PATCH 3/4] Test: basic protocol migration for rollup node --- tezt/tests/sc_rollup.ml | 117 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/tezt/tests/sc_rollup.ml b/tezt/tests/sc_rollup.ml index 88527e70e674..146cef6ecef5 100644 --- a/tezt/tests/sc_rollup.ml +++ b/tezt/tests/sc_rollup.ml @@ -362,6 +362,79 @@ let test_full_scenario ?supports ?regression ?hooks ~kind ?mode ?boot_sector in scenario protocol rollup_node rollup_client sc_rollup tezos_node tezos_client +let test_l2_migration_scenario ?parameters_ty ?(mode = Sc_rollup_node.Operator) + ?(operator = Constant.bootstrap1.alias) ?boot_sector ?commitment_period + ?challenge_window ?timeout ?variant ?(tags = []) ~kind ~migrate_from + ~migrate_to ~scenario_prior ~scenario_after ~description () = + let tags = + Protocol.tag migrate_from :: Protocol.tag migrate_to :: kind :: "migration" + :: tags + in + Test.register + ~__FILE__ + ~tags + ~title: + (sf + "%s->%s: %s" + (Protocol.name migrate_from) + (Protocol.name migrate_to) + (format_title_scenario kind {variant; tags; description})) + @@ fun () -> + let* tezos_node, tezos_client = + setup_l1 ?commitment_period ?challenge_window ?timeout migrate_from + in + let* rollup_node, rollup_client, sc_rollup = + setup_rollup + ~protocol:migrate_from + ?parameters_ty + ~kind + ~mode + ?boot_sector + ~operator + tezos_node + tezos_client + in + let* prior_res = + scenario_prior ~sc_rollup rollup_node rollup_client tezos_node tezos_client + in + let migration_level = Node.get_level tezos_node + 1 in + let patch_config = + Node.Config_file.set_sandbox_network_with_user_activated_upgrades + [(migration_level, migrate_to)] + in + Log.info + "Migrating L1 from %s to %s" + (Protocol.name migrate_from) + (Protocol.name migrate_to) ; + let* () = Node.terminate tezos_node in + let nodes_args = + Node.[Synchronisation_threshold 0; History_mode Archive; No_bootstrap_peers] + in + let* () = Node.run ~patch_config tezos_node nodes_args in + let* () = Node.wait_for_ready tezos_node in + let* () = Client.bake_for_and_wait tezos_client in + (* Rollup node and client for other protocol *) + let data_dir = Sc_rollup_node.data_dir rollup_node in + let rollup_node = + Sc_rollup_node.create + ~protocol:migrate_to + ~data_dir + ~base_dir:(Client.base_dir tezos_client) + ~default_operator:operator + mode + tezos_node + in + let rollup_client = + Sc_rollup_client.create ~protocol:migrate_to rollup_node + in + scenario_after + ~sc_rollup + rollup_node + rollup_client + tezos_node + tezos_client + prior_res + let commitment_info_inbox_level (commitment_info : Sc_rollup_client.commitment_info) = commitment_info.commitment_and_hash.commitment.inbox_level @@ -1381,6 +1454,47 @@ let test_rollup_node_run_with_kernel ~kind ~kernel_name ~internal = ~internal ~kind +let test_rollup_node_simple_migration ~kind ~migrate_from ~migrate_to = + let tags = ["store"] in + let description = "node can read data after store migration" in + let commitment_period = 10 in + let challenge_window = 10 in + let scenario_prior ~sc_rollup rollup_node _rollup_client _tezos_node + tezos_client = + let* () = Sc_rollup_node.run rollup_node sc_rollup [] in + let* () = send_messages commitment_period tezos_client in + let* _ = Sc_rollup_node.wait_sync rollup_node ~timeout:10. in + let* () = Sc_rollup_node.terminate rollup_node in + unit + in + let scenario_after ~sc_rollup rollup_node rollup_client tezos_node + tezos_client () = + let migration_level = Node.get_level tezos_node in + let* () = Sc_rollup_node.run rollup_node sc_rollup [] in + let*! _l2_block = + Sc_rollup_client.rpc_get + rollup_client + ["global"; "block"; string_of_int (migration_level - 1)] + in + let* () = send_messages 1 tezos_client in + let* _ = Sc_rollup_node.wait_sync rollup_node ~timeout:10. in + let*! _l2_block = + Sc_rollup_client.rpc_get rollup_client ["global"; "block"; "head"] + in + unit + in + test_l2_migration_scenario + ~tags + ~kind + ~commitment_period + ~challenge_window + ~migrate_from + ~migrate_to + ~scenario_prior + ~scenario_after + ~description + () + (* Ensure the PVM is transitioning upon incoming messages. ------------------------------------------------------- @@ -5278,7 +5392,8 @@ let register_migration ~kind ~migrate_from ~migrate_to = test_migration_cement ~kind ~migrate_from ~migrate_to ; test_migration_recover ~kind ~migrate_from ~migrate_to ; test_migration_refute ~kind ~migrate_from ~migrate_to ; - test_cont_refute_pre_migration ~kind ~migrate_from ~migrate_to + test_cont_refute_pre_migration ~kind ~migrate_from ~migrate_to ; + test_rollup_node_simple_migration ~kind ~migrate_from ~migrate_to let register_migration ~migrate_from ~migrate_to = register_migration ~kind:"arith" ~migrate_from ~migrate_to ; -- GitLab From ba5a377e168f42f41134bd9bd926043d1972f43e Mon Sep 17 00:00:00 2001 From: Alain Mebsout Date: Wed, 10 May 2023 11:23:58 +0200 Subject: [PATCH 4/4] SCORU/Node: backport !8689 to Nairobi rollup node - SCORU/Node: fix incorrect inbox for migration blocks - SCORU/Node: rename incorrect migration_block to first_block --- .../lib_sc_rollup_node/daemon.ml | 4 +-- .../lib_sc_rollup_node/inbox.ml | 25 +++++++++++-------- .../lib_sc_rollup_node/inbox.mli | 10 ++++---- .../lib_sc_rollup_node/interpreter.ml | 4 +-- .../lib_sc_rollup_node/node_context.ml | 21 ++++++---------- .../lib_sc_rollup_node/node_context.mli | 2 +- .../lib_sc_rollup_node/refutation_game.ml | 9 ++----- .../lib_sc_rollup_node/store.ml | 2 +- .../test/helpers/helpers.ml | 8 +++--- .../test/helpers/helpers.mli | 4 +-- 10 files changed, 41 insertions(+), 48 deletions(-) diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/daemon.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/daemon.ml index f97b10536f80..c19b0e3a4941 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/daemon.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/daemon.ml @@ -587,7 +587,7 @@ module Make (PVM : Pvm.S) = struct (** Same as {!process_head} but only builds and stores the L2 block corresponding to [messages]. It is used by the unit tests to build an L2 chain. *) - let process_messages (node_ctxt : _ Node_context.t) ~is_migration_block + let process_messages (node_ctxt : _ Node_context.t) ~is_first_block ~predecessor head messages = let open Lwt_result_syntax in let* ctxt = previous_context node_ctxt ~predecessor in @@ -597,7 +597,7 @@ module Make (PVM : Pvm.S) = struct let* inbox_hash, inbox, inbox_witness, messages = Inbox.Internal_for_tests.process_messages node_ctxt - ~is_migration_block + ~is_first_block ~predecessor ~level:head.level messages diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/inbox.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/inbox.ml index 07549aa6eb85..6c2b59e39ab6 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/inbox.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/inbox.ml @@ -91,7 +91,7 @@ let same_inbox_as_layer_1 node_ctxt head_hash inbox = (Sc_rollup.Inbox.equal layer1_inbox inbox) (Sc_rollup_node_errors.Inconsistent_inbox {layer1_inbox; inbox}) -let add_messages ~is_migration_block ~predecessor_timestamp ~predecessor inbox +let add_messages ~is_first_block ~predecessor_timestamp ~predecessor inbox messages = let open Lwt_result_syntax in let no_history = Sc_rollup.Inbox.History.empty ~capacity:0L in @@ -102,7 +102,7 @@ let add_messages ~is_migration_block ~predecessor_timestamp ~predecessor inbox witness, messages_with_protocol_internal_messages ) = Sc_rollup.Inbox.add_all_messages - ~first_block:is_migration_block + ~first_block:is_first_block ~predecessor_timestamp ~predecessor no_history @@ -118,7 +118,7 @@ let add_messages ~is_migration_block ~predecessor_timestamp ~predecessor inbox inbox, messages_with_protocol_internal_messages ) -let process_messages (node_ctxt : _ Node_context.t) ~is_migration_block +let process_messages (node_ctxt : _ Node_context.t) ~is_first_block ~(predecessor : Layer1.header) ~level messages = let open Lwt_result_syntax in let* inbox = @@ -132,7 +132,7 @@ let process_messages (node_ctxt : _ Node_context.t) ~is_migration_block inbox, messages_with_protocol_internal_messages ) = add_messages - ~is_migration_block + ~is_first_block ~predecessor_timestamp ~predecessor:predecessor.hash inbox @@ -148,7 +148,7 @@ let process_messages (node_ctxt : _ Node_context.t) ~is_migration_block node_ctxt witness_hash { - is_migration_block; + is_first_block; predecessor = predecessor.hash; predecessor_timestamp; messages; @@ -175,8 +175,13 @@ let process_head (node_ctxt : _ Node_context.t) ~(predecessor : Layer1.header) head.level (List.length collected_messages) in - let is_migration_block = - head.header.proto_level <> predecessor.header.proto_level + let* grandparent = + Node_context.get_predecessor_header node_ctxt predecessor + in + let is_first_block = + (* head is the first block of the protocol if its predecessor is a + migration block. *) + grandparent.header.proto_level <> predecessor.header.proto_level in let* (( _inbox_hash, inbox, @@ -184,7 +189,7 @@ let process_head (node_ctxt : _ Node_context.t) ~(predecessor : Layer1.header) _messages_with_protocol_internal_messages ) as res) = process_messages node_ctxt - ~is_migration_block + ~is_first_block ~predecessor ~level:head.level collected_messages @@ -201,7 +206,7 @@ let process_head (node_ctxt : _ Node_context.t) ~(predecessor : Layer1.header) let start () = Inbox_event.starting () -let payloads_history_of_messages ~is_migration_block ~predecessor +let payloads_history_of_messages ~is_first_block ~predecessor ~predecessor_timestamp messages = let open Result_syntax in let dummy_inbox = @@ -218,7 +223,7 @@ let payloads_history_of_messages ~is_migration_block ~predecessor (N after next snapshot). *) Environment.wrap_tzresult @@ Sc_rollup.Inbox.add_all_messages - ~first_block:is_migration_block + ~first_block:is_first_block ~predecessor_timestamp ~predecessor (Sc_rollup.Inbox.History.empty ~capacity:0L) diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/inbox.mli b/src/proto_017_PtNairob/lib_sc_rollup_node/inbox.mli index a723ad47e53e..34d19b287ab3 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/inbox.mli +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/inbox.mli @@ -54,11 +54,11 @@ val process_head : (** [start ()] initializes the inbox to track the messages being published. *) val start : unit -> unit Lwt.t -(** [add_messages ~is_migration_block ~predecessor_timestamp +(** [add_messages ~is_first_block ~predecessor_timestamp ~predecessor inbox messages] adds [messages] to the [inbox] using {!Inbox.add_all_messages}. *) val add_messages : - is_migration_block:bool -> + is_first_block:bool -> predecessor_timestamp:Timestamp.time -> predecessor:Block_hash.t -> Inbox.t -> @@ -70,13 +70,13 @@ val add_messages : tzresult Lwt.t -(** [payloads_history_of_messages ~is_migration_block ~predecessor +(** [payloads_history_of_messages ~is_first_block ~predecessor ~predecessor_timestamp messages] builds the payloads history for the list of [messages]. This allows to not store payloads histories (which contain merkelized skip lists) but simply messages. *) val payloads_history_of_messages : - is_migration_block:bool -> + is_first_block:bool -> predecessor:Block_hash.t -> predecessor_timestamp:Timestamp.time -> Sc_rollup.Inbox_message.t list -> @@ -87,7 +87,7 @@ val payloads_history_of_messages : module Internal_for_tests : sig val process_messages : Node_context.rw -> - is_migration_block:bool -> + is_first_block:bool -> predecessor:Layer1.header -> level:int32 -> Sc_rollup.Inbox_message.t list -> diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/interpreter.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/interpreter.ml index 41ad610367b3..f52bdb1540fe 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/interpreter.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/interpreter.ml @@ -201,7 +201,7 @@ module Make (PVM : Pvm.S) : S with module PVM = PVM = struct Layer1.{hash = block.header.predecessor; level = pred_level} in let* inbox = Node_context.get_inbox node_ctxt block.header.inbox_hash in - let* {is_migration_block; predecessor; predecessor_timestamp; messages} = + let* {is_first_block; predecessor; predecessor_timestamp; messages} = Node_context.get_messages node_ctxt block.header.inbox_witness in let inbox_level = Sc_rollup.Inbox.inbox_level inbox in @@ -211,7 +211,7 @@ module Make (PVM : Pvm.S) : S with module PVM = PVM = struct let open Sc_rollup.Inbox_message in Internal Start_of_level :: - (if is_migration_block then + (if is_first_block then [Internal Sc_rollup.Inbox_message.protocol_migration_internal_message] else []) @ Internal (Info_per_level {predecessor; predecessor_timestamp}) diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/node_context.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/node_context.ml index a4a84330a058..ffbab6706ed1 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/node_context.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/node_context.ml @@ -793,7 +793,7 @@ let get_inbox_by_block_hash node_ctxt hash = inbox_of_head node_ctxt {hash; level} type messages_info = { - is_migration_block : bool; + is_first_block : bool; predecessor : Block_hash.t; predecessor_timestamp : Timestamp.t; messages : Sc_rollup.Inbox_message.t list; @@ -810,20 +810,16 @@ let get_messages {store; _} messages_hash = messages_hash | Some ( messages, - (is_migration_block, predecessor, predecessor_timestamp, _num_messages) - ) -> - return {is_migration_block; predecessor; predecessor_timestamp; messages} + (is_first_block, predecessor, predecessor_timestamp, _num_messages) ) -> + return {is_first_block; predecessor; predecessor_timestamp; messages} let find_messages {store; _} hash = let open Lwt_result_syntax in let+ msgs = Store.Messages.read store.messages hash in Option.map (fun ( messages, - ( is_migration_block, - predecessor, - predecessor_timestamp, - _num_messages ) ) -> - {is_migration_block; predecessor; predecessor_timestamp; messages}) + (is_first_block, predecessor, predecessor_timestamp, _num_messages) + ) -> {is_first_block; predecessor; predecessor_timestamp; messages}) msgs let get_num_messages {store; _} hash = @@ -839,15 +835,12 @@ let get_num_messages {store; _} hash = return num_messages let save_messages {store; _} key - {is_migration_block; predecessor; predecessor_timestamp; messages} = + {is_first_block; predecessor; predecessor_timestamp; messages} = Store.Messages.append store.messages ~key ~header: - ( is_migration_block, - predecessor, - predecessor_timestamp, - List.length messages ) + (is_first_block, predecessor, predecessor_timestamp, List.length messages) ~value:messages let get_full_l2_block node_ctxt block_hash = diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/node_context.mli b/src/proto_017_PtNairob/lib_sc_rollup_node/node_context.mli index 713cf00c6502..6bf49eabb421 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/node_context.mli +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/node_context.mli @@ -307,7 +307,7 @@ val commitment_was_published : (** {3 Inboxes} *) type messages_info = { - is_migration_block : bool; + is_first_block : bool; predecessor : Block_hash.t; predecessor_timestamp : Timestamp.t; messages : Sc_rollup.Inbox_message.t list; diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/refutation_game.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/refutation_game.ml index 2b616cb3a38e..70a3f82e2af9 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/refutation_game.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/refutation_game.ml @@ -257,17 +257,12 @@ module Make (Interpreter : Interpreter.S) : ~error:(Format.kasprintf Stdlib.failwith "%a" pp_print_trace)) @@ let open Lwt_result_syntax in - let* { - is_migration_block; - predecessor; - predecessor_timestamp; - messages; - } = + let* {is_first_block; predecessor; predecessor_timestamp; messages} = Node_context.get_messages node_ctxt witness in let*? hist = Inbox.payloads_history_of_messages - ~is_migration_block + ~is_first_block ~predecessor ~predecessor_timestamp messages diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/store.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/store.ml index 17fb35d80197..4f87a0d36983 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/store.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/store.ml @@ -111,7 +111,7 @@ module Messages = let encoding = let open Data_encoding in obj4 - (req "is_migration_block" bool) + (req "is_first_block" bool) (req "predecessor" Block_hash.encoding) (req "predecessor_timestamp" Timestamp.encoding) (req "num_messages" int31) diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/test/helpers/helpers.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/test/helpers/helpers.ml index 1178838d8360..2dd030c3a411 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/test/helpers/helpers.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/test/helpers/helpers.ml @@ -53,7 +53,7 @@ module type S = sig val append_l2_block : [`Read | `Write] Node_context.t -> - ?is_migration_block:bool -> + ?is_first_block:bool -> Sc_rollup.Inbox_message.t trace -> ((Sc_rollup_block.header, unit) Sc_rollup_block.block, tztrace) result Lwt.t end @@ -198,8 +198,8 @@ module Make (PVM : Pvm.S) = struct in {Layer1.hash; level; header} - let append_l2_block (node_ctxt : _ Node_context.t) - ?(is_migration_block = false) messages = + let append_l2_block (node_ctxt : _ Node_context.t) ?(is_first_block = false) + messages = let open Lwt_result_syntax in let* predecessor_l2_block = Node_context.last_processed_head_opt node_ctxt @@ -221,7 +221,7 @@ module Make (PVM : Pvm.S) = struct in Daemon.Internal_for_tests.process_messages node_ctxt - ~is_migration_block + ~is_first_block ~predecessor head messages diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/test/helpers/helpers.mli b/src/proto_017_PtNairob/lib_sc_rollup_node/test/helpers/helpers.mli index 252b6b9eaf91..6f2035aefe24 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/test/helpers/helpers.mli +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/test/helpers/helpers.mli @@ -56,13 +56,13 @@ val add_l2_genesis_block : boot_sector:string -> Sc_rollup_block.t tzresult Lwt.t -(** [append_l2_block node_ctxt ?is_migration_block messages] creates and append +(** [append_l2_block node_ctxt ?is_first_block messages] creates and append an L2 block containing the [messages] given in argument. The block is added on top of the last L2 block in the chain (i.e. the head known by the node), and is returned. *) val append_l2_block : [`Read | `Write] Node_context.t -> - ?is_migration_block:bool -> + ?is_first_block:bool -> Sc_rollup.Inbox_message.t list -> Sc_rollup_block.t tzresult Lwt.t -- GitLab