diff --git a/src/proto_alpha/bin_sc_rollup_node/inbox.ml b/src/proto_alpha/bin_sc_rollup_node/inbox.ml index bef0b8e45535f362bdc1040c0c76ac6b4091a42d..970fdc1ffe59a06bfdbe71d8eb303c017bb02e3d 100644 --- a/src/proto_alpha/bin_sc_rollup_node/inbox.ml +++ b/src/proto_alpha/bin_sc_rollup_node/inbox.ml @@ -118,13 +118,14 @@ let process_head Node_context.({cctxt; rollup_address; _} as node_ctxt) store @@ let*! history = State.history_of_hash store predecessor in let*! messages_tree = State.get_message_tree store predecessor in let*? level = Raw_level.of_int32 level in - let* messages_tree, history, inbox = - Store.Inbox.add_external_messages - history - inbox - level + let*? messages = + List.map_e + (fun message -> + Sc_rollup.Inbox.Message.(to_bytes @@ External message)) messages - messages_tree + in + let* messages_tree, history, inbox = + Store.Inbox.add_messages history inbox level messages messages_tree in let*! () = State.set_message_tree store head_hash messages_tree in let*! () = State.add_inbox store head_hash inbox in diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index f4a740efb2fd0d01c921c1a42917a3a3f3908e61..fa193e68509c1164a4b166cd8ea17bb8aba29967 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -2815,11 +2815,11 @@ module Sc_rollup : sig val history_at_genesis : bound:int64 -> history - val add_external_messages : + val add_messages : history -> t -> Raw_level.t -> - string list -> + Message.serialized list -> messages -> (messages * history * t) tzresult Lwt.t diff --git a/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.ml b/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.ml index 84f1461cd79b93b2afe272da162551eb42c96af0..2d3beec2de03fe13040aba219968293078243234 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.ml @@ -182,7 +182,7 @@ module V1 = struct nb_messages_in_commitment_period : int64; starting_level_of_current_commitment_period : Raw_level_repr.t; message_counter : Z.t; - (* Lazy to avoid hashing O(n^2) time in [add_external_messages] *) + (* Lazy to avoid hashing O(n^2) time in [add_messages] *) current_messages_hash : unit -> Hash.t; old_levels_messages : history_proof; } @@ -388,11 +388,11 @@ module type MerkelizedOperations = sig val history_at_genesis : bound:int64 -> history - val add_external_messages : + val add_messages : history -> t -> Raw_level_repr.t -> - string list -> + Sc_rollup_inbox_message_repr.serialized list -> messages -> (messages * history * t) tzresult Lwt.t @@ -643,14 +643,8 @@ module MakeHashingScheme (Tree : TREE) : let current_messages_hash () = hash_messages messages in return (messages, history, {inbox with current_messages_hash}) - let add_external_messages history inbox level payloads messages = + let add_messages history inbox level payloads messages = let open Lwt_tzresult_syntax in - let*? payloads = - List.map_e - (fun payload -> - Sc_rollup_inbox_message_repr.(to_bytes @@ External payload)) - payloads - in let* messages, With_history history, inbox = add_messages_aux (With_history history) inbox level payloads messages in diff --git a/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.mli b/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.mli index 96ca17e61fd14344b1dca61f1689a9c65cc6ea14..4456130ed0f59601fa971570a5ffc177d5dbfd51 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.mli @@ -198,10 +198,10 @@ module type MerkelizedOperations = sig positive. *) val history_at_genesis : bound:int64 -> history - (** [add_external_messages history inbox level payloads messages] inserts a - list of [payloads] as new messages in the [messages] of the current - [level] of the [inbox]. This function returns the new sequence - of messages as well as updated [inbox] and [history]. + (** [add_messages history inbox level payloads messages] inserts a list of + [payloads] as new messages in the [messages] of the current [level] of the + [inbox]. This function returns the new sequence of messages as well as + updated [inbox] and [history]. If the [inbox]'s level is older than [level], the [inbox] is updated so that the messages of the levels older than [level] are archived. @@ -213,17 +213,16 @@ module type MerkelizedOperations = sig This function fails if [level] is older than [inbox]'s [level]. *) - val add_external_messages : + val add_messages : history -> t -> Raw_level_repr.t -> - string list -> + Sc_rollup_inbox_message_repr.serialized list -> messages -> (messages * history * t) tzresult Lwt.t - (** [add_messages_no_history inbox level payloads messages] behaves - as {!add_external_messages} except that it does not remember the inbox - history. *) + (** [add_messages_no_history inbox level payloads messages] behaves as + {!add_messages} except that it does not remember the inbox history. *) val add_messages_no_history : t -> Raw_level_repr.t -> diff --git a/src/proto_alpha/lib_protocol/sc_rollup_inbox_storage.ml b/src/proto_alpha/lib_protocol/sc_rollup_inbox_storage.ml index 3b21d84ed353bdb06f7bef5c053ba332e2f143d7..7f9e86b319bec64dd1b11e11807eeb87d0a3bf2c 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_inbox_storage.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_inbox_storage.ml @@ -132,8 +132,11 @@ let add_messages ctxt rollup messages = node to produce inclusion proofs when needed. *) let* current_messages, inbox = - Sc_rollup_inbox_repr.( - add_messages_no_history inbox level messages current_messages) + Sc_rollup_inbox_repr.add_messages_no_history + inbox + level + messages + current_messages in let*? ctxt = Sc_rollup_in_memory_inbox.set_current_messages ctxt rollup current_messages @@ -141,30 +144,42 @@ let add_messages ctxt rollup messages = let* ctxt, size = Store.Inbox.update ctxt rollup inbox in return (inbox, Z.of_int size, ctxt) -let add_external_messages ctxt rollup external_messages = - let open Lwt_result_syntax in - let*? messages = - List.map_e - (fun message -> - Sc_rollup_inbox_message_repr.(to_bytes @@ External message)) - external_messages - in - add_messages ctxt rollup messages +(** TODO #3292 + We should carbonate this function. + The cost of [to_bytes] is cheap but traversing the list should still be + accounted for. + *) +let serialize_external_messages external_messages = + List.map_e + (fun message -> Sc_rollup_inbox_message_repr.(to_bytes @@ External message)) + external_messages -let add_internal_message ctxt rollup ~payload ~sender ~source = - let open Lwt_result_syntax in +let serialize_internal_message ctxt ~payload ~sender ~source = + let open Result_syntax in let internal_message = {Sc_rollup_inbox_message_repr.payload; sender; source} in (* Pay gas for serializing an internal message. *) - let*? ctxt = + let* ctxt = Raw_context.consume_gas ctxt (Sc_rollup_costs.cost_serialize_internal_inbox_message internal_message) in - let*? message = + let* message = Sc_rollup_inbox_message_repr.(to_bytes @@ Internal internal_message) in + return (message, ctxt) + +let add_external_messages ctxt rollup external_messages = + let open Lwt_result_syntax in + let*? messages = serialize_external_messages external_messages in + add_messages ctxt rollup messages + +let add_internal_message ctxt rollup ~payload ~sender ~source = + let open Lwt_result_syntax in + let*? message, ctxt = + serialize_internal_message ctxt ~payload ~sender ~source + in add_messages ctxt rollup [message] module Internal_for_tests = struct diff --git a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_inbox.ml b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_inbox.ml index 79a2af062f4419b97a9f30bda5e48b082c6b86a9..97eaa881f1d0414b864a45070b09735df775e13e 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_inbox.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_inbox.ml @@ -54,21 +54,30 @@ let test_empty () = (err "An empty inbox should have no available message.") let setup_inbox_with_messages list_of_payloads f = - create_context () >>=? fun ctxt -> + let open Lwt_result_syntax in + let* ctxt = create_context () in let empty_messages = Environment.Context.Tree.empty ctxt in let inbox = empty rollup level in let history = history_at_genesis ~bound:10000L in let rec aux level history inbox inboxes messages = function | [] -> return (messages, history, inbox, inboxes) | payloads :: ps -> - add_external_messages history inbox level payloads messages - >>=? fun (messages, history, inbox') -> + let*? payloads = + List.map_e + (fun payload -> + Sc_rollup_inbox_message_repr.(to_bytes @@ External payload)) + payloads + in + let* messages, history, inbox' = + add_messages history inbox level payloads messages + in let level = Raw_level_repr.succ level in aux level history inbox' (inbox :: inboxes) messages ps in - aux level history inbox [] empty_messages list_of_payloads - >|= Environment.wrap_tzresult - >>=? fun (messages, history, inbox, inboxes) -> + let* messages, history, inbox, inboxes = + aux level history inbox [] empty_messages list_of_payloads + >|= Environment.wrap_tzresult + in f messages history inbox inboxes let test_add_messages payloads =