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 9f1a914a5fc9909bc90170e90c03913ea69e2630..079b480dc4e8395021ce8a9873596034f17fb203 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_inbox_repr.ml @@ -390,6 +390,8 @@ let key_of_message ix = let level_key = ["level"] +let number_of_messages_key = ["number_of_messages"] + type serialized_proof = bytes let serialized_proof_encoding = Data_encoding.bytes @@ -525,11 +527,19 @@ struct level_bytes (Data_encoding.Binary.of_bytes_opt Raw_level_repr.encoding) + let set_number_of_messages tree number_of_messages = + let number_of_messages_bytes = + Data_encoding.Binary.to_bytes_exn Data_encoding.n number_of_messages + in + Tree.add tree number_of_messages_key number_of_messages_bytes + (** Initialise the merkle tree for a new level in the inbox. We have to include the [level] in this structure so that it cannot be forged by a malicious rollup node. *) let new_level_tree ctxt level = + let open Lwt_syntax in let tree = Tree.empty ctxt in + let* tree = set_number_of_messages tree Z.zero in set_level tree level let add_message inbox payload level_tree = @@ -543,6 +553,7 @@ struct (Bytes.of_string (payload : Sc_rollup_inbox_message_repr.serialized :> string)) in + let*! level_tree = set_number_of_messages level_tree message_counter in let nb_messages_in_commitment_period = Int64.succ inbox.nb_messages_in_commitment_period in @@ -587,6 +598,10 @@ struct in Bytes.to_string level_bytes + let commit_tree ctxt tree inbox_level = + let key = [key_of_level inbox_level] in + P.commit_tree ctxt key tree + let form_history_proof ctxt history inbox level_tree = let open Lwt_tzresult_syntax in let*! () = @@ -595,7 +610,7 @@ struct | Some tree -> Lwt.return tree | None -> new_level_tree ctxt inbox.level in - P.commit_tree ctxt [key_of_level inbox.level] tree + commit_tree ctxt tree inbox.level in let prev_cell = inbox.old_levels_messages in let prev_cell_ptr = hash_skip_list_cell prev_cell in @@ -1127,9 +1142,7 @@ struct let open Lwt_syntax in let pre_genesis_level = Raw_level_repr.root in let* initial_level = new_level_tree context pre_genesis_level in - let* () = - P.commit_tree context [key_of_level pre_genesis_level] initial_level - in + let* () = commit_tree context initial_level pre_genesis_level in let initial_hash = hash_level_tree initial_level in return { diff --git a/tezt/tests/sc_rollup.ml b/tezt/tests/sc_rollup.ml index 13e8a64ff4ea71e23e91ab712f0eb69b92fae52f..ec8a80b937e6f84d8ec110eecc85a55fd1dec20a 100644 --- a/tezt/tests/sc_rollup.ml +++ b/tezt/tests/sc_rollup.ml @@ -642,7 +642,13 @@ module Sc_rollup_inbox = struct P.Raw_level_repr.encoding (P.Raw_level_repr.of_int32_exn level) in + let number_of_messages_bytes = + Data_encoding.Binary.to_bytes_exn + Data_encoding.n + (Z.of_int (List.length current_messages)) + in let* tree = add (empty ()) ["level"] level_bytes in + let* tree = add tree ["number_of_messages"] number_of_messages_bytes in let* tree = build_current_messages_tree Z.zero tree current_messages in let context_hash = hash tree in let test =