From 128ac2a3fa19a95f810219ef7d71eb640d1cd3a4 Mon Sep 17 00:00:00 2001 From: Ryan Tan Date: Wed, 10 May 2023 18:45:19 +0100 Subject: [PATCH] Dac: proto dac client --- src/lib_dac_client/dac_node_client.ml | 5 + src/lib_dac_client/dac_node_client.mli | 9 +- .../lib_dac_plugin/dac_observer_client.ml | 205 ++- .../lib_dac_plugin/dac_observer_client.mli | 10 + .../wasm_kernel/tx-kernel-fixed-dac.wasm | Bin 0 -> 476472 bytes tezt/lib_tezos/dac_helper.ml | 439 +++++ tezt/lib_tezos/dac_helper.mli | 191 +++ tezt/lib_tezos/dac_node.ml | 11 + tezt/lib_tezos/dac_node.mli | 3 + tezt/lib_tezos/dac_rpc.mli | 2 +- tezt/tests/dac.ml | 1416 ++++++++++++----- 11 files changed, 1853 insertions(+), 438 deletions(-) create mode 100755 src/proto_alpha/lib_protocol/test/integration/wasm_kernel/tx-kernel-fixed-dac.wasm create mode 100644 tezt/lib_tezos/dac_helper.ml create mode 100644 tezt/lib_tezos/dac_helper.mli diff --git a/src/lib_dac_client/dac_node_client.ml b/src/lib_dac_client/dac_node_client.ml index 5d670aab7b10..f185896d61c5 100644 --- a/src/lib_dac_client/dac_node_client.ml +++ b/src/lib_dac_client/dac_node_client.ml @@ -76,3 +76,8 @@ module Coordinator = struct let post_preimage (cctxt : #cctxt) ~payload = cctxt#call_service RPC_services.Coordinator.post_preimage () () payload end + +module Observer = struct + let get_missing_page (cctxt : #cctxt) page_hash = + cctxt#call_service RPC_services.get_missing_page ((), page_hash) () () +end diff --git a/src/lib_dac_client/dac_node_client.mli b/src/lib_dac_client/dac_node_client.mli index e20d07c32038..a86c83026aba 100644 --- a/src/lib_dac_client/dac_node_client.mli +++ b/src/lib_dac_client/dac_node_client.mli @@ -46,7 +46,7 @@ val get_preimage : #cctxt -> page_hash:Dac_plugin.raw_hash -> bytes tzresult Lwt.t (** [post_store_preimage cctxt ~payload ~pagination_scheme] posts a [payload] to dac/store_preimage - using a given [pagination_scheme]. It returns the base58 encoded root page hash + using a given [pagination_scheme]. It returns the hex encoded root page hash and the raw bytes. *) val post_store_preimage : #cctxt -> @@ -91,3 +91,10 @@ module Coordinator : sig val post_preimage : #cctxt -> payload:bytes -> Dac_plugin.raw_hash tzresult Lwt.t end + +module Observer : sig + (** [get_missing_page plugin cctxt page_hash] notifies an [Observer] that a + page hash must be downloaded. This function returns the preimage of the + requested [page_hash]. *) + val get_missing_page : #cctxt -> Dac_plugin.raw_hash -> bytes tzresult Lwt.t +end diff --git a/src/proto_alpha/lib_dac_plugin/dac_observer_client.ml b/src/proto_alpha/lib_dac_plugin/dac_observer_client.ml index c18e870a0bd4..92f6c8d94a4f 100644 --- a/src/proto_alpha/lib_dac_plugin/dac_observer_client.ml +++ b/src/proto_alpha/lib_dac_plugin/dac_observer_client.ml @@ -26,6 +26,97 @@ module Reveal_hash = Protocol.Sc_rollup_reveal_hash module Dac_client = Dac_node_client +type error += + | Failed_to_initialize_dac_plugin + | Failed_to_fetch_missing_page_from_observer of Reveal_hash.t + | Failed_to_verify_raw_data_with_hash of (Reveal_hash.t * Protocol_hash.t) + | Timeout of Z.t + | Wrong_hash of {found : Reveal_hash.t; expected : Reveal_hash.t} + +let () = + register_error_kind + ~id:"dac_observer_client.failed_to_initialize_dac_plugin" + ~title:"Failed to initialize DAC plugin" + ~description:"Failed to initialize DAC plugin in DAC Observer client." + ~pp:(fun ppf () -> + Format.fprintf + ppf + "Failed to initialize DAC plugin in DAC Observer client.") + `Permanent + Data_encoding.unit + (function Failed_to_initialize_dac_plugin -> Some () | _ -> None) + (fun _ -> Failed_to_initialize_dac_plugin) ; + register_error_kind + ~id:"dac_observer_client_timeout" + ~title:"Timeout while querying Dac Observer Node" + ~description:"Timeout while querying Dac Observer Node." + ~pp:(fun ppf seconds -> + Format.fprintf + ppf + "Timeout after %as when querying Dac Observer Node" + Z.pp_print + seconds) + `Permanent + Data_encoding.(obj1 (req "seconds" z)) + (function Timeout seconds -> Some seconds | _ -> None) + (fun seconds -> Timeout seconds) ; + register_error_kind + ~id:"dac_observer_client.failed_to_fetch_missing_page_from_observer" + ~title:"Failed to fetch missing page from DAC Observer." + ~description:"Failed to fetch missing page from DAC Observer." + ~pp:(fun ppf hash -> + Format.fprintf + ppf + "Failed to fetch missing page from DAC Observer for hash: %s" + (Reveal_hash.to_hex hash)) + `Permanent + Data_encoding.(obj1 (req "hash" Reveal_hash.encoding)) + (function + | Failed_to_fetch_missing_page_from_observer hash -> Some hash | _ -> None) + (fun hash -> Failed_to_fetch_missing_page_from_observer hash) ; + register_error_kind + ~id:"dac_observer_client.failed_to_verify_raw_data" + ~title:"Failed to verify raw data with hash." + ~description:"Failed to verify raw data with hash." + ~pp:(fun ppf (hash, protocol_hash) -> + Format.fprintf + ppf + "Failed to verify raw data with preimage hash using expected current \ + protocol encoding. Preimage hash: %s. Current protocol: %s." + (Reveal_hash.to_hex hash) + (Protocol_hash.to_b58check protocol_hash)) + `Permanent + Data_encoding.( + obj2 + (req "preimage_hash" Reveal_hash.encoding) + (req "protocol_hash" Protocol_hash.encoding)) + (function + | Failed_to_verify_raw_data_with_hash (hash, protocol_hash) -> + Some (hash, protocol_hash) + | _ -> None) + (fun (hash, protocol_hash) -> + Failed_to_verify_raw_data_with_hash (hash, protocol_hash)) ; + register_error_kind + ~id:"dac_observer_client.wrong_hash_of_reveal_preimage" + ~title:"Hash of reveal preimage is incorrect." + ~description:"Hash of reveal preimage is incorrect." + ~pp:(fun ppf (found, expected) -> + Format.fprintf + ppf + "Reveal preimage hash is '%a' while a value of '%a' is expected" + Reveal_hash.pp + found + Reveal_hash.pp + expected) + `Permanent + Data_encoding.( + obj2 + (req "found" Reveal_hash.encoding) + (req "expected" Reveal_hash.encoding)) + (function + | Wrong_hash {found; expected} -> Some (found, expected) | _ -> None) + (fun (found, expected) -> Wrong_hash {found; expected}) + module Configuration = struct type t = { observer_endpoint : Uri.t; @@ -34,10 +125,116 @@ module Configuration = struct } end -type t = unit +type t = { + reveal_data_dir : string; + timeout_seconds : Z.t; + observer_cctxt : Dac_client.unix_cctxt; + dac_plugin : Dac_plugin.t; + protocol : Protocol_hash.t; +} + +module Client = struct + let make_unix endpoint = + let rpc_config = + {Tezos_rpc_http_client_unix.RPC_client_unix.default_config with endpoint} + in + new Dac_node_client.unix_cctxt ~rpc_config + + let proto_hash_to_dac_hash ((module P) : Dac_plugin.t) proto_reveal_hash = + proto_reveal_hash + |> Data_encoding.Binary.to_bytes_exn Protocol.Sc_rollup_reveal_hash.encoding + |> Data_encoding.Binary.of_bytes_exn P.encoding + + let fetch_missing_page dac_plugin observer_cctxt hash = + let open Lwt_result_syntax in + let dac_hash = + Dac_plugin.hash_to_raw @@ proto_hash_to_dac_hash dac_plugin hash + in + let+ preimage = + Dac_node_client.Observer.get_missing_page observer_cctxt dac_hash + in + String.of_bytes preimage +end -let init _config = +let timeout_default = Z.of_int 30 + +let init Configuration.{observer_endpoint; reveal_data_dir; timeout_seconds} = + let open Lwt_result_syntax in + let* dac_plugin = + match Dac_plugin.get Protocol.hash with + | Some dac_plugin -> return dac_plugin + | None -> + let () = Dac_plugin.register Dac_plugin_registration.make_plugin in + Option.fold_f + ~none:(fun () -> tzfail @@ Failed_to_initialize_dac_plugin) + ~some:(fun p -> return p) + (Dac_plugin.get Protocol.hash) + in + let observer_cctxt = Client.make_unix observer_endpoint in + let timeout_seconds = Option.value ~default:timeout_default timeout_seconds in + return + { + reveal_data_dir; + timeout_seconds; + observer_cctxt; + dac_plugin; + protocol = Protocol.hash; + } + +(** TODO: https://gitlab.com/tezos/tezos/-/issues/5519 + Remove duplicate code from reveals.ml + *) +let file_contents filename = let open Lwt_result_syntax in - return_unit + Lwt.catch + (fun () -> + let*! contents = Lwt_utils_unix.read_file filename in + return_some contents) + (fun _ -> return_none) -let fetch_preimage _dac_client _hash = assert false +let path data_dir hash = + let hash = Reveal_hash.to_hex hash in + Filename.(concat data_dir hash) + +(** TODO: https://gitlab.com/tezos/tezos/-/issues/5521 + Return non fatal error kinds if any. +*) +let fetch_preimage dac_client hash = + let open Lwt_result_syntax in + let {reveal_data_dir; timeout_seconds; observer_cctxt; dac_plugin; protocol} = + dac_client + in + let filename = path reveal_data_dir hash in + let* contents_opt = file_contents filename in + let* contents = + match contents_opt with + | Some preimage -> return preimage + | None -> + let run () = + Lwt_unix.with_timeout (Z.to_float timeout_seconds) (fun () -> + Client.fetch_missing_page dac_plugin observer_cctxt hash) + in + Lwt.catch run (function + | Lwt_unix.Timeout -> tzfail @@ Timeout timeout_seconds + | _ -> tzfail @@ Failed_to_fetch_missing_page_from_observer hash) + in + let*? () = + let contents_hash = + Reveal_hash.hash_string ~scheme:Reveal_hash.Blake2B [contents] + in + error_unless + (Reveal_hash.equal contents_hash hash) + (Wrong_hash {found = contents_hash; expected = hash}) + in + let* _encoded = + (* Check that the reveal input can be encoded within the bounds enforced by + the protocol. *) + trace (Failed_to_verify_raw_data_with_hash (hash, protocol)) + @@ protect + @@ fun () -> + Data_encoding.Binary.to_bytes_exn + Protocol.Alpha_context.Sc_rollup.input_encoding + (Reveal (Raw_data contents)) + |> return + in + return contents diff --git a/src/proto_alpha/lib_dac_plugin/dac_observer_client.mli b/src/proto_alpha/lib_dac_plugin/dac_observer_client.mli index 643d663b13ee..dffb3385a2f2 100644 --- a/src/proto_alpha/lib_dac_plugin/dac_observer_client.mli +++ b/src/proto_alpha/lib_dac_plugin/dac_observer_client.mli @@ -25,6 +25,16 @@ (* Client module for interacting with a Dac Node in Observer mode. This client should only used by components that are compiled with a protocol. *) + +module Reveal_hash = Protocol.Sc_rollup_reveal_hash + +type error += + | Failed_to_initialize_dac_plugin + | Failed_to_fetch_missing_page_from_observer of Reveal_hash.t + | Failed_to_verify_raw_data_with_hash of (Reveal_hash.t * Protocol_hash.t) + | Timeout of Z.t + | Wrong_hash of {found : Reveal_hash.t; expected : Reveal_hash.t} + type t module Configuration : sig diff --git a/src/proto_alpha/lib_protocol/test/integration/wasm_kernel/tx-kernel-fixed-dac.wasm b/src/proto_alpha/lib_protocol/test/integration/wasm_kernel/tx-kernel-fixed-dac.wasm new file mode 100755 index 0000000000000000000000000000000000000000..53e54a51cff63595af40c8d676f7e53a4bd2cc89 GIT binary patch literal 476472 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�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 z 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

-wb9< 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

Cz6E$F!K!nL(EN(xR29ZHJJ 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 *) +(* *) +(* Permission is hereby granted, free of charge, to any person obtaining a *) +(* copy of this software and associated documentation files (the "Software"),*) +(* to deal in the Software without restriction, including without limitation *) +(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) +(* and/or sell copies of the Software, and to permit persons to whom the *) +(* Software is furnished to do so, subject to the following conditions: *) +(* *) +(* The above copyright notice and this permission notice shall be included *) +(* in all copies or substantial portions of the Software. *) +(* *) +(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) +(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) +(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) +(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) +(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) +(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) +(* DEALINGS IN THE SOFTWARE. *) +(* *) +(*****************************************************************************) + +let hooks = Tezos_regression.hooks + +module Scenarios = struct + type full = { + protocol : Protocol.t; + node : Node.t; + client : Client.t; + key : string; + sc_rollup_address : string; + sc_rollup_node : Sc_rollup_node.t; + coordinator_node : Dac_node.t; + committee_members : Account.aggregate_key list; + committee_members_nodes : Dac_node.t list; + observer_nodes : Dac_node.t list; + rollup_nodes : Sc_rollup_node.t list; + } +end + +(* FIXME: https://gitlab.com/tezos/tezos/-/issues/3173 + The functions below are duplicated from sc_rollup.ml. + They should be moved to a common submodule. *) +let make_int_parameter name = function + | None -> [] + | Some value -> [(name, `Int value)] + +let test ~__FILE__ ?(tags = []) ?supports title f = + let tags = "dac" :: tags in + Protocol.register_test ~__FILE__ ~title ~tags ?supports f + +let regression_test ~__FILE__ ?(tags = []) title f = + let tags = "dac" :: tags in + Protocol.register_regression_test ~__FILE__ ~title ~tags f + +(* Some initialization functions to start needed nodes. *) + +let setup_node ?(additional_bootstrap_accounts = 5) ~parameters ~protocol + ?(event_sections_levels = []) ?(node_arguments = []) () = + (* Temporary setup to initialise the node. *) + let base = Either.right (protocol, None) in + let* parameter_file = Protocol.write_parameter_file ~base parameters in + let* _client = Client.init_mockup ~parameter_file ~protocol () in + let nodes_args = + Node. + [ + Synchronisation_threshold 0; History_mode (Full None); No_bootstrap_peers; + ] + in + let node = Node.create nodes_args in + let* () = Node.config_init node [] in + let* () = Node.run node ~event_sections_levels node_arguments in + let* () = Node.wait_for_ready node in + let* client = Client.init ~endpoint:(Node node) () in + let* additional_account_keys = + Client.stresstest_gen_keys additional_bootstrap_accounts client + in + let additional_bootstrap_accounts = + List.map (fun x -> (x, None, false)) additional_account_keys + in + let* parameter_file = + Protocol.write_parameter_file + ~additional_bootstrap_accounts + ~base + parameters + in + let* () = + Client.activate_protocol_and_wait ~parameter_file ~protocol client + in + return (node, client) + +let with_layer1 ?additional_bootstrap_accounts ?commitment_period + ?challenge_window ?event_sections_levels ?node_arguments f ~protocol = + let parameters = + make_int_parameter + ["smart_rollup_commitment_period_in_blocks"] + commitment_period + @ make_int_parameter + ["smart_rollup_challenge_window_in_blocks"] + challenge_window + @ [(["smart_rollup_arith_pvm_enable"], `Bool true)] + in + let* node, client = + setup_node + ?additional_bootstrap_accounts + ?event_sections_levels + ?node_arguments + ~parameters + ~protocol + () + in + let bootstrap1_key = Constant.bootstrap1.public_key_hash in + f node client bootstrap1_key + +let with_legacy_dac_node ?name ?sc_rollup_node ?(pvm_name = "arith") + ?(wait_ready = true) ?committee_member_address ~threshold ~committee_size + tezos_node tezos_client f = + let range i = List.init i Fun.id in + let reveal_data_dir = + Option.map + (fun sc_rollup_node -> + Filename.concat (Sc_rollup_node.data_dir sc_rollup_node) pvm_name) + sc_rollup_node + in + let* committee_members = + List.fold_left + (fun keys i -> + let* keys in + let* key = + Client.bls_gen_and_show_keys + ~alias:(Format.sprintf "dac-member-%d" i) + tezos_client + in + return (key :: keys)) + (return []) + (range committee_size) + in + let dac_node = + Dac_node.create_legacy + ?name + ~node:tezos_node + ~client:tezos_client + ?reveal_data_dir + ~threshold + ?committee_member_address + ~committee_members: + (List.map + (fun (dc : Account.aggregate_key) -> dc.aggregate_public_key_hash) + committee_members) + () + in + let* _dir = Dac_node.init_config dac_node in + let* () = Dac_node.run dac_node ~wait_ready in + f dac_node committee_members + +let with_coordinator_node ?name ?sc_rollup_node ?(pvm_name = "arith") + ?(wait_ready = true) ?(custom_committee_members = []) ~threshold + ~committee_size tezos_node tezos_client f = + let range i = List.init i Fun.id in + let reveal_data_dir = + Option.map + (fun sc_rollup_node -> + Filename.concat (Sc_rollup_node.data_dir sc_rollup_node) pvm_name) + sc_rollup_node + in + let* committee_members = + List.fold_left + (fun keys i -> + let* keys in + let* key = + Client.bls_gen_and_show_keys + ~alias:(Format.sprintf "committee-member-%d" i) + tezos_client + in + return (key :: keys)) + (return []) + (range committee_size) + in + let* () = + Lwt_list.iter_s + (fun (aggregate_key : Account.aggregate_key) -> + Client.bls_import_secret_key aggregate_key tezos_client) + custom_committee_members + in + let committee_members = + List.append committee_members custom_committee_members + in + let dac_node = + Dac_node.create_coordinator + ?name + ~node:tezos_node + ~client:tezos_client + ?reveal_data_dir + ~threshold + ~committee_members: + (List.map + (fun (dc : Account.aggregate_key) -> dc.aggregate_public_key_hash) + committee_members) + () + in + let* _dir = Dac_node.init_config dac_node in + let* () = Dac_node.run dac_node ~wait_ready in + f dac_node committee_members + +let with_committee_member ?name ?sc_rollup_node ?(pvm_name = "arith") + ?(wait_ready = true) ~committee_member tezos_node coordinator_node + tezos_client f = + let reveal_data_dir = + Option.map + (fun sc_rollup_node -> + Filename.concat (Sc_rollup_node.data_dir sc_rollup_node) pvm_name) + sc_rollup_node + in + let Account.{public_key_hash; _} = committee_member in + let dac_node = + Dac_node.create_committee_member + ?name + ~node:tezos_node + ~client:tezos_client + ?reveal_data_dir + ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) + ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) + ~address:public_key_hash + () + in + let* _dir = Dac_node.init_config dac_node in + let* () = Dac_node.run dac_node ~wait_ready in + f dac_node committee_member + +let with_observer ?name ?sc_rollup_node ?(pvm_name = "arith") + ?(wait_ready = true) tezos_node coordinator_node tezos_client f = + let reveal_data_dir = + Option.map + (fun sc_rollup_node -> + Filename.concat (Sc_rollup_node.data_dir sc_rollup_node) pvm_name) + sc_rollup_node + in + let dac_node = + Dac_node.create_observer + ?name + ~node:tezos_node + ~client:tezos_client + ?reveal_data_dir + ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) + ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) + () + in + let* _dir = Dac_node.init_config dac_node in + let* () = Dac_node.run dac_node ~wait_ready in + f dac_node + +(* TODO: https://gitlab.com/tezos/tezos/-/issues/4706 + Keep pvm name value in Sc_rollup.t. *) +let with_fresh_rollup ?(pvm_name = "arith") ~protocol tezos_node tezos_client + bootstrap1_key f = + let sc_rollup_node = + Sc_rollup_node.create + ~protocol + Operator + tezos_node + ~base_dir:(Client.base_dir tezos_client) + ~default_operator:bootstrap1_key + in + let* rollup_address = + Client.Sc_rollup.originate + ~hooks + ~burn_cap:Tez.(of_int 9999999) + ~alias:"rollup" + ~src:bootstrap1_key + ~kind:pvm_name + ~boot_sector:"" + ~parameters_ty:"string" + tezos_client + in + let* () = Client.bake_for_and_wait tezos_client in + f rollup_address sc_rollup_node + +let scenario_with_full_dac_infrastructure ?(tags = ["dac"; "full"]) + ?(pvm_name = "arith") ?(custom_committee_members = []) ?commitment_period + ?challenge_window ?event_sections_levels ?node_arguments ~__FILE__ + ~committee_size ~observers variant scenario = + let description = "Testing Full DAC infrastructure" in + test + ~__FILE__ + ~tags + (Printf.sprintf "%s (%s)" description variant) + (fun protocol -> + with_layer1 + ?commitment_period + ?challenge_window + ?event_sections_levels + ?node_arguments + ~protocol + @@ fun node client key -> + with_fresh_rollup ~protocol ~pvm_name node client key + @@ fun sc_rollup_address sc_rollup_node -> + with_coordinator_node + node + client + ~name:"coordinator" + ~pvm_name + ~threshold:0 + ~custom_committee_members + ~committee_size + @@ fun coordinator_node committee_members -> + let committee_members_nodes = + List.mapi + (fun i Account.{aggregate_public_key_hash; _} -> + Dac_node.create_committee_member + ~name:("committee-member-" ^ Int.to_string i) + ~node + ~client + ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) + ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) + ~address:aggregate_public_key_hash + ()) + committee_members + in + let rollup_nodes, observer_nodes = + List.init observers Fun.id + |> List.map (fun i -> + let rollup_node_i = + Sc_rollup_node.create + ~name:("observer-" ^ Int.to_string i ^ "-rollup-node") + ~protocol + Operator + node + ~base_dir:(Client.base_dir client) + ~default_operator:key + in + let reveal_data_dir = + Filename.concat + (Sc_rollup_node.data_dir rollup_node_i) + pvm_name + in + let dac_node_i = + Dac_node.create_observer + ~name:("observer-" ^ Int.to_string i) + ~node + ~client + ~reveal_data_dir + ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) + ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) + () + in + (rollup_node_i, dac_node_i)) + |> List.split + in + scenario + Scenarios. + { + protocol; + node; + client; + key; + coordinator_node; + committee_members; + committee_members_nodes; + observer_nodes; + rollup_nodes; + sc_rollup_address; + sc_rollup_node; + }) + +(* Wrapper scenario functions that should be re-used as much as possible when + writing tests. *) +let scenario_with_layer1_node ?(tags = ["dac"; "layer1"]) ?commitment_period + ?challenge_window ?event_sections_levels ?node_arguments ~__FILE__ variant + scenario = + let description = "Testing DAC L1 integration" in + test + ~__FILE__ + ~tags + (Printf.sprintf "%s (%s)" description variant) + (fun protocol -> + with_layer1 + ?commitment_period + ?challenge_window + ?event_sections_levels + ?node_arguments + ~protocol + @@ fun node client key -> scenario protocol node client key) + +let scenario_with_layer1_and_legacy_dac_nodes + ?(tags = ["dac"; "layer1"; "legacy"]) ?commitment_period ?challenge_window + ~__FILE__ ~threshold ~committee_size variant scenario = + let description = "Testing DAC node" in + test + ~__FILE__ + ~tags + (Printf.sprintf "%s (%s)" description variant) + (fun protocol -> + with_layer1 ?commitment_period ?challenge_window ~protocol + @@ fun node client _key -> + with_legacy_dac_node ~threshold ~committee_size node client + @@ fun dac_node committee_members -> + scenario protocol node client dac_node threshold committee_members) + +let scenario_with_layer1_legacy_and_rollup_nodes + ?(tags = ["dac"; "dac_node"; "legacy"]) ?(pvm_name = "arith") + ?commitment_period ?challenge_window ?committee_member_address ~__FILE__ + ~threshold ~committee_size variant scenario = + let description = "Testing DAC rollup and node with L1" in + regression_test + ~__FILE__ + ~tags + (Printf.sprintf "%s (%s)" description variant) + (fun protocol -> + with_layer1 ?commitment_period ?challenge_window ~protocol + @@ fun node client key -> + with_fresh_rollup + node + client + key + ~protocol + ~pvm_name + (fun sc_rollup_address sc_rollup_node -> + with_legacy_dac_node + node + ~sc_rollup_node + ~pvm_name + ~threshold + ~committee_size + ?committee_member_address + client + @@ fun dac_node committee_members -> + scenario + protocol + dac_node + sc_rollup_node + sc_rollup_address + node + client + pvm_name + threshold + committee_members)) diff --git a/tezt/lib_tezos/dac_helper.mli b/tezt/lib_tezos/dac_helper.mli new file mode 100644 index 000000000000..6bb8132f2be3 --- /dev/null +++ b/tezt/lib_tezos/dac_helper.mli @@ -0,0 +1,191 @@ +(*****************************************************************************) +(* *) +(* Open Source License *) +(* Copyright (c) 2023 TriliTech, *) +(* *) +(* Permission is hereby granted, free of charge, to any person obtaining a *) +(* copy of this software and associated documentation files (the "Software"),*) +(* to deal in the Software without restriction, including without limitation *) +(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) +(* and/or sell copies of the Software, and to permit persons to whom the *) +(* Software is furnished to do so, subject to the following conditions: *) +(* *) +(* The above copyright notice and this permission notice shall be included *) +(* in all copies or substantial portions of the Software. *) +(* *) +(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) +(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) +(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) +(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) +(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) +(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) +(* DEALINGS IN THE SOFTWARE. *) +(* *) +(*****************************************************************************) + +(** Helpers for configuring DAC scenarios. *) + +(* Repr for different kinds of scenarios that tezt tests can run against. *) +module Scenarios : sig + (* Components for full DAC infrastructure. *) + type full = { + protocol : Protocol.t; + node : Node.t; + client : Client.t; + key : string; + sc_rollup_address : string; + sc_rollup_node : Sc_rollup_node.t; + coordinator_node : Dac_node.t; + committee_members : Account.aggregate_key list; + committee_members_nodes : Dac_node.t list; + observer_nodes : Dac_node.t list; + rollup_nodes : Sc_rollup_node.t list; + } +end + +(** [with_legacy_dac_node] creates a Legacy Dac node. DAC Committee of size + [committee_size] will be generated and pre-configured in the legacy node. +*) +val with_legacy_dac_node : + ?name:string -> + ?sc_rollup_node:Sc_rollup_node.t -> + ?pvm_name:string -> + ?wait_ready:bool -> + ?committee_member_address:string -> + threshold:int -> + committee_size:int -> + Node.t -> + Client.t -> + (Dac_node.t -> Account.aggregate_key list -> 'a Lwt.t) -> + 'a Lwt.t + +(** Initializes a a Coordinator Dac node. DAC Committee of size [committee_size] + will be generated and pre-configured in the legacy node. An additional + [custom_committee_members] can be provided to configure fixed members of the + committee (useful for testing). +*) +val with_coordinator_node : + ?name:string -> + ?sc_rollup_node:Sc_rollup_node.t -> + ?pvm_name:string -> + ?wait_ready:bool -> + ?custom_committee_members:Account.aggregate_key list -> + threshold:int -> + committee_size:int -> + Node.t -> + Client.t -> + (Dac_node.t -> Account.aggregate_key list -> 'a Lwt.t) -> + 'a Lwt.t + +(** Initializes a a Committee Member Dac node with key [committee_member]. +*) +val with_committee_member : + ?name:string -> + ?sc_rollup_node:Sc_rollup_node.t -> + ?pvm_name:string -> + ?wait_ready:bool -> + committee_member:Account.key -> + Node.t -> + Dac_node.t -> + Client.t -> + (Dac_node.t -> Account.key -> 'a Lwt.t) -> + 'a Lwt.t + +(** Initializes a Observer Dac node with key [committee_member]. *) +val with_observer : + ?name:string -> + ?sc_rollup_node:Sc_rollup_node.t -> + ?pvm_name:string -> + ?wait_ready:bool -> + Node.t -> + Dac_node.t -> + Client.t -> + (Dac_node.t -> 'b Lwt.t) -> + 'b Lwt.t + +(** Initializes a new [Sc_rollup] with empty boot sector, attached to + an [Sc_rollup_node]. +*) +val with_fresh_rollup : + ?pvm_name:string -> + protocol:Protocol.t -> + Node.t -> + Client.t -> + string -> + (string -> Sc_rollup_node.t -> 'a Lwt.t) -> + 'a Lwt.t + +(** Initalizes a scenario with full DAC infrastruture. See [Scenarios.full] for + components. +*) +val scenario_with_full_dac_infrastructure : + ?tags:string list -> + ?pvm_name:string -> + ?custom_committee_members:Account.aggregate_key list -> + ?commitment_period:int -> + ?challenge_window:int -> + ?event_sections_levels:(string * Daemon.Level.level) list -> + ?node_arguments:Node.argument list -> + __FILE__:string -> + committee_size:int -> + observers:int -> + string -> + (Scenarios.full -> unit Lwt.t) -> + Protocol.t list -> + unit + +(** Initalizes a scenario with L1 node only. *) +val scenario_with_layer1_node : + ?tags:string list -> + ?commitment_period:int -> + ?challenge_window:int -> + ?event_sections_levels:(string * Daemon.Level.level) list -> + ?node_arguments:Node.argument list -> + __FILE__:string -> + string -> + (Protocol.t -> Node.t -> Client.t -> string -> unit Lwt.t) -> + Protocol.t list -> + unit + +(** Initalizes a scenario with L1 and legacy nodes. *) +val scenario_with_layer1_and_legacy_dac_nodes : + ?tags:string list -> + ?commitment_period:int -> + ?challenge_window:int -> + __FILE__:string -> + threshold:int -> + committee_size:int -> + string -> + (Protocol.t -> + Node.t -> + Client.t -> + Dac_node.t -> + int -> + Account.aggregate_key list -> + unit Lwt.t) -> + Protocol.t list -> + unit + +(** Initalizes a scenario with L1, legacy and rollup nodes. *) +val scenario_with_layer1_legacy_and_rollup_nodes : + ?tags:string list -> + ?pvm_name:string -> + ?commitment_period:int -> + ?challenge_window:int -> + ?committee_member_address:string -> + __FILE__:string -> + threshold:int -> + committee_size:int -> + string -> + (Protocol.t -> + Dac_node.t -> + Sc_rollup_node.t -> + string -> + Node.t -> + Client.t -> + string -> + int -> + Account.aggregate_key list -> + unit Lwt.t) -> + Protocol.t list -> + unit diff --git a/tezt/lib_tezos/dac_node.ml b/tezt/lib_tezos/dac_node.ml index d6618ce9a30b..6d89c5aac94f 100644 --- a/tezt/lib_tezos/dac_node.ml +++ b/tezt/lib_tezos/dac_node.ml @@ -188,6 +188,17 @@ let spawn_config_init dac_node = in spawn_command dac_node (mode_command @ arg_command) +let ls = "ls" + +let ls_reveal_data_dir dac_node = + let reveal_data_dir = dac_node.persistent_state.reveal_data_dir in + let commands = [reveal_data_dir] in + let process = + Process.spawn ~name:dac_node.name ~color:dac_node.color ls commands + in + let* filenames = Process.check_and_read_stdout process in + return @@ String.split_on_char '\n' filenames + let init_config dac_node = let process = spawn_config_init dac_node in let* output = Process.check_and_read_stdout process in diff --git a/tezt/lib_tezos/dac_node.mli b/tezt/lib_tezos/dac_node.mli index 2bbcb8f13d52..ba4924af9242 100644 --- a/tezt/lib_tezos/dac_node.mli +++ b/tezt/lib_tezos/dac_node.mli @@ -125,6 +125,9 @@ val data_dir : t -> string (** Get the reveal-data-dir of an dac node. *) val reveal_data_dir : t -> string +(** Calls [ls] on reveal data dir. *) +val ls_reveal_data_dir : t -> string list Lwt.t + (** [run ?wait_ready ?env node] launches the given dac node where env is a map of environment variable. diff --git a/tezt/lib_tezos/dac_rpc.mli b/tezt/lib_tezos/dac_rpc.mli index 652f605a64f4..23b7eeb77336 100644 --- a/tezt/lib_tezos/dac_rpc.mli +++ b/tezt/lib_tezos/dac_rpc.mli @@ -29,7 +29,7 @@ val get_preimage : string -> (Dac_node.t, string) RPC_core.t (** [post_store_preimage cctxt ~payload ~pagination_scheme] posts a [payload] to dac/store_preimage - using a given [pagination_scheme]. It returns the base58 encoded root page hash + using a given [pagination_scheme]. It returns the hex encoded root page hash and the raw bytes that can be used as contents of a rollup message to trigger the request of the payload in a WASM rollup. *) val post_store_preimage : diff --git a/tezt/tests/dac.ml b/tezt/tests/dac.ml index 3af10f3c3c85..6d27fbfa42e4 100644 --- a/tezt/tests/dac.ml +++ b/tezt/tests/dac.ml @@ -28,47 +28,14 @@ (* Testing ------- Component: Data-availability layer + Requirements: make -f kernels.mk build Invocation: dune exec tezt/tests/main.exe -- --file dac.ml Subject: Integration tests related to the data-availability layer *) +open Dac_helper let hooks = Tezos_regression.hooks -module Scenarios = struct - type full = { - protocol : Protocol.t; - node : Node.t; - client : Client.t; - key : string; - sc_rollup_address : string; - sc_rollup_node : Sc_rollup_node.t; - coordinator_node : Dac_node.t; - committee_members : Account.aggregate_key list; - committee_members_nodes : Dac_node.t list; - observer_nodes : Dac_node.t list; - rollup_nodes : Sc_rollup_node.t list; - } -end - -(* FIXME: https://gitlab.com/tezos/tezos/-/issues/3173 - The functions below are duplicated from sc_rollup.ml. - They should be moved to a common submodule. *) -let make_int_parameter name = function - | None -> [] - | Some value -> [(name, `Int value)] - -let make_bool_parameter name = function - | None -> [] - | Some value -> [(name, `Bool value)] - -let test ~__FILE__ ?(tags = []) ?supports title f = - let tags = "dac" :: tags in - Protocol.register_test ~__FILE__ ~title ~tags ?supports f - -let regression_test ~__FILE__ ?(tags = []) title f = - let tags = "dac" :: tags in - Protocol.register_regression_test ~__FILE__ ~title ~tags f - let assert_lwt_failure ?__LOC__ msg lwt_under_inspection = let* passed = Lwt.catch @@ -149,376 +116,6 @@ let streamed_certificates_client coordinator_node root_hash = (fun raw -> parse_certificate @@ JSON.parse ~origin:endpoint raw) rev_as_list_no_empty_element) -(* Some initialization functions to start needed nodes. *) - -let setup_node ?(additional_bootstrap_accounts = 5) ~parameters ~protocol - ?(event_sections_levels = []) ?(node_arguments = []) () = - (* Temporary setup to initialise the node. *) - let base = Either.right (protocol, None) in - let* parameter_file = Protocol.write_parameter_file ~base parameters in - let* _client = Client.init_mockup ~parameter_file ~protocol () in - let nodes_args = - Node. - [ - Synchronisation_threshold 0; History_mode (Full None); No_bootstrap_peers; - ] - in - let node = Node.create nodes_args in - let* () = Node.config_init node [] in - let* () = Node.run node ~event_sections_levels node_arguments in - let* () = Node.wait_for_ready node in - let* client = Client.init ~endpoint:(Node node) () in - let* additional_account_keys = - Client.stresstest_gen_keys additional_bootstrap_accounts client - in - let additional_bootstrap_accounts = - List.map (fun x -> (x, None, false)) additional_account_keys - in - let* parameter_file = - Protocol.write_parameter_file - ~additional_bootstrap_accounts - ~base - parameters - in - let* () = - Client.activate_protocol_and_wait ~parameter_file ~protocol client - in - return (node, client) - -let with_layer1 ?additional_bootstrap_accounts ?commitment_period - ?challenge_window ?event_sections_levels ?node_arguments f ~protocol = - let parameters = - make_int_parameter - ["smart_rollup_commitment_period_in_blocks"] - commitment_period - @ make_int_parameter - ["smart_rollup_challenge_window_in_blocks"] - challenge_window - @ [(["smart_rollup_arith_pvm_enable"], `Bool true)] - in - let* node, client = - setup_node - ?additional_bootstrap_accounts - ?event_sections_levels - ?node_arguments - ~parameters - ~protocol - () - in - let bootstrap1_key = Constant.bootstrap1.public_key_hash in - f node client bootstrap1_key - -let with_legacy_dac_node tezos_node ?name ?sc_rollup_node ?(pvm_name = "arith") - ?(wait_ready = true) ~threshold ?committee_member_address ~committee_members - tezos_client f = - let range i = List.init i Fun.id in - let reveal_data_dir = - Option.map - (fun sc_rollup_node -> - Filename.concat (Sc_rollup_node.data_dir sc_rollup_node) pvm_name) - sc_rollup_node - in - let* committee_members = - List.fold_left - (fun keys i -> - let* keys in - let* key = - Client.bls_gen_and_show_keys - ~alias:(Format.sprintf "dac-member-%d" i) - tezos_client - in - return (key :: keys)) - (return []) - (range committee_members) - in - let dac_node = - Dac_node.create_legacy - ?name - ~node:tezos_node - ~client:tezos_client - ?reveal_data_dir - ~threshold - ?committee_member_address - ~committee_members: - (List.map - (fun (dc : Account.aggregate_key) -> dc.aggregate_public_key_hash) - committee_members) - () - in - let* _dir = Dac_node.init_config dac_node in - let* () = Dac_node.run dac_node ~wait_ready in - f dac_node committee_members - -let with_coordinator_node tezos_node ?name ?sc_rollup_node ?(pvm_name = "arith") - ?(wait_ready = true) ~threshold ~committee_members tezos_client f = - let range i = List.init i Fun.id in - let reveal_data_dir = - Option.map - (fun sc_rollup_node -> - Filename.concat (Sc_rollup_node.data_dir sc_rollup_node) pvm_name) - sc_rollup_node - in - let* committee_members = - List.fold_left - (fun keys i -> - let* keys in - let* key = - Client.bls_gen_and_show_keys - ~alias:(Format.sprintf "committee-member-%d" i) - tezos_client - in - return (key :: keys)) - (return []) - (range committee_members) - in - let dac_node = - Dac_node.create_coordinator - ?name - ~node:tezos_node - ~client:tezos_client - ?reveal_data_dir - ~threshold - ~committee_members: - (List.map - (fun (dc : Account.aggregate_key) -> dc.aggregate_public_key_hash) - committee_members) - () - in - let* _dir = Dac_node.init_config dac_node in - let* () = Dac_node.run dac_node ~wait_ready in - f dac_node committee_members - -let with_committee_member tezos_node coordinator_node ?name ?sc_rollup_node - ?(pvm_name = "arith") ?(wait_ready = true) ~committee_member tezos_client f - = - let reveal_data_dir = - Option.map - (fun sc_rollup_node -> - Filename.concat (Sc_rollup_node.data_dir sc_rollup_node) pvm_name) - sc_rollup_node - in - let Account.{public_key_hash; _} = committee_member in - let dac_node = - Dac_node.create_committee_member - ?name - ~node:tezos_node - ~client:tezos_client - ?reveal_data_dir - ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) - ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) - ~address:public_key_hash - () - in - let* _dir = Dac_node.init_config dac_node in - let* () = Dac_node.run dac_node ~wait_ready in - f dac_node committee_member - -let with_observer tezos_node coordinator_node ?name ?sc_rollup_node - ?(pvm_name = "arith") ?(wait_ready = true) ~committee_member tezos_client f - = - let reveal_data_dir = - Option.map - (fun sc_rollup_node -> - Filename.concat (Sc_rollup_node.data_dir sc_rollup_node) pvm_name) - sc_rollup_node - in - let dac_node = - Dac_node.create_observer - ?name - ~node:tezos_node - ~client:tezos_client - ?reveal_data_dir - ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) - ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) - () - in - let* _dir = Dac_node.init_config dac_node in - let* () = Dac_node.run dac_node ~wait_ready in - f dac_node committee_member - -(* TODO: https://gitlab.com/tezos/tezos/-/issues/4706 - Keep pvm name value in Sc_rollup.t. *) -let with_fresh_rollup ~protocol ?(pvm_name = "arith") tezos_node tezos_client - bootstrap1_key f = - let* rollup_address = - Client.Sc_rollup.originate - ~hooks - ~burn_cap:Tez.(of_int 9999999) - ~alias:"rollup" - ~src:bootstrap1_key - ~kind:pvm_name - ~boot_sector:"" - ~parameters_ty:"string" - tezos_client - in - let sc_rollup_node = - Sc_rollup_node.create - ~protocol - Operator - tezos_node - ~base_dir:(Client.base_dir tezos_client) - ~default_operator:bootstrap1_key - in - let* () = Client.bake_for_and_wait tezos_client in - f rollup_address sc_rollup_node - -let scenario_with_full_dac_infrastructure ?(tags = ["dac"; "full"]) - ?(pvm_name = "arith") ~committee_members ~observers ?commitment_period - ?challenge_window ?event_sections_levels ?node_arguments variant scenario = - let description = "Testing Full DAC infrastructure" in - test - ~__FILE__ - ~tags - (Printf.sprintf "%s (%s)" description variant) - (fun protocol -> - with_layer1 - ?commitment_period - ?challenge_window - ?event_sections_levels - ?node_arguments - ~protocol - @@ fun node client key -> - with_fresh_rollup ~protocol ~pvm_name node client key - @@ fun sc_rollup_address sc_rollup_node -> - with_coordinator_node - node - client - ~name:"coordinator" - ~pvm_name - ~threshold:0 - ~committee_members - @@ fun coordinator_node committee_members -> - let committee_members_nodes = - List.mapi - (fun i Account.{aggregate_public_key_hash; _} -> - Dac_node.create_committee_member - ~name:("committee-member-" ^ Int.to_string i) - ~node - ~client - ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) - ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) - ~address:aggregate_public_key_hash - ()) - committee_members - in - let rollup_nodes, observer_nodes = - List.init observers Fun.id - |> List.map (fun i -> - let rollup_node_i = - Sc_rollup_node.create - ~name:("observer-" ^ Int.to_string i ^ "-rollup-node") - ~protocol - Operator - node - ~base_dir:(Client.base_dir client) - ~default_operator:key - in - let reveal_data_dir = - Filename.concat - (Sc_rollup_node.data_dir rollup_node_i) - pvm_name - in - let dac_node_i = - Dac_node.create_observer - ~name:("observer-" ^ Int.to_string i) - ~node - ~client - ~reveal_data_dir - ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) - ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) - () - in - (rollup_node_i, dac_node_i)) - |> List.split - in - scenario - Scenarios. - { - protocol; - node; - client; - key; - sc_rollup_address; - sc_rollup_node; - coordinator_node; - committee_members; - committee_members_nodes; - observer_nodes; - rollup_nodes; - }) - -(* Wrapper scenario functions that should be re-used as much as possible when - writing tests. *) -let scenario_with_layer1_node ?(tags = ["dac"; "layer1"]) ?commitment_period - ?challenge_window ?event_sections_levels ?node_arguments variant scenario = - let description = "Testing DAC L1 integration" in - test - ~__FILE__ - ~tags - (Printf.sprintf "%s (%s)" description variant) - (fun protocol -> - with_layer1 - ?commitment_period - ?challenge_window - ?event_sections_levels - ?node_arguments - ~protocol - @@ fun node client key -> scenario protocol node client key) - -let scenario_with_layer1_and_legacy_dac_nodes - ?(tags = ["dac"; "layer1"; "legacy"]) ?commitment_period ?challenge_window - ~threshold ~committee_members variant scenario = - let description = "Testing DAC node" in - test - ~__FILE__ - ~tags - (Printf.sprintf "%s (%s)" description variant) - (fun protocol -> - with_layer1 ?commitment_period ?challenge_window ~protocol - @@ fun node client _key -> - with_legacy_dac_node ~threshold ~committee_members node client - @@ fun dac_node committee_members -> - scenario protocol node client dac_node threshold committee_members) - -let scenario_with_layer1_legacy_and_rollup_nodes - ?(tags = ["dac"; "dac_node"; "legacy"]) ?(pvm_name = "arith") - ?commitment_period ?challenge_window ~threshold ?committee_member_address - ~committee_members variant scenario = - let description = "Testing DAC rollup and node with L1" in - regression_test - ~__FILE__ - ~tags - (Printf.sprintf "%s (%s)" description variant) - (fun protocol -> - with_layer1 ?commitment_period ?challenge_window ~protocol - @@ fun node client key -> - with_fresh_rollup - node - client - key - ~protocol - ~pvm_name - (fun sc_rollup_address sc_rollup_node -> - with_legacy_dac_node - node - ~sc_rollup_node - ~pvm_name - ~threshold - ~committee_members - ?committee_member_address - client - @@ fun dac_node committee_members -> - scenario - protocol - dac_node - sc_rollup_node - sc_rollup_address - node - client - pvm_name - threshold - committee_members)) - let wait_for_layer1_block_processing dac_node level = Dac_node.wait_for dac_node "dac_node_layer_1_new_head.v0" (fun e -> if JSON.(e |-> "level" |> as_int) = level then Some () else None) @@ -1270,10 +867,10 @@ module Legacy = struct (* 1. Observer should fetch missing page from Coordinator when GET /missing_page/{hash} is called. 2. As a side effect, Observer should save fetched page into its page store before - returning it in the response. This can be observer by checking the result of + returning it in the response. This can be observed by checking the result of retrieving preimage before and after the GET /missing_page/{hash} call.*) let test_observer_get_missing_page _protocol node client coordinator threshold - dac_members = + _committee_members = let root_hash = "00649d431e829f4adc68edecb8d8d8071154b57086cc124b465f6f6600a4bc91c7" in @@ -1286,15 +883,7 @@ module Legacy = struct assert (root_hash = Hex.show hex_root_hash) ; let* () = root_hash_stream_promise in let observer = - Dac_node.create_legacy - ~threshold - ~committee_members: - (List.map - (fun (dc : Account.aggregate_key) -> dc.aggregate_public_key_hash) - dac_members) - ~node - ~client - () + Dac_node.create_legacy ~threshold ~committee_members:[] ~node ~client () in let* _ = Dac_node.init_config observer in let () = set_coordinator observer coordinator in @@ -1902,113 +1491,1076 @@ module Full_infrastructure = struct return () end +(* Modified from tezt/tests/tx_sc_rollup.ml *) +module Tx_kernel_e2e = struct + open Sc_rollup_helpers + module Bls = Tezos_crypto.Signature.Bls + + let send_message ?(src = Constant.bootstrap2.alias) client msg = + let* () = Client.Sc_rollup.send_message ~hooks ~src ~msg client in + Client.bake_for_and_wait client + + (* TX Kernel external messages and their encodings *) + module Tx_kernel = struct + open Tezos_protocol_alpha.Protocol + open Tezos_crypto.Signature + + type ticket = { + ticketer : Alpha_context.Contract.t; + content : string; + amount : int; + } + + let ticket_of ~ticketer ~content amount = + { + ticketer = Result.get_ok (Alpha_context.Contract.of_b58check ticketer); + content; + amount; + } + + (* Primitive operation of tx kernel. + Several primitive operations might be outgoing from the same account. + Corresponds to kernel_core::inbox::external::v1::OperationContent + type in the tx kernel. *) + type operation = + | Withdrawal of { + receiver_contract : Contract_hash.t; + ticket : ticket; + entrypoint : string; + } + | Transfer of { + (* tz4 address *) + destination : Tezos_crypto.Signature.Bls.Public_key_hash.t; + ticket : ticket; + } + + (* List of elemtary operations which are outgoing from the same account. + Corresponds to a pair of + * kernel_core::bls::BlsKey and + * kernel_core::inbox::external::v1::verifiable::VerifiableOperation + in the tx kernel. + VerifiableOperation::signer is replaced by its private key + in order to be able to sign outer [multiaccount_tx]. + In terms of the tx kernel it is rather *sending* type not *verifiable*. + *) + type account_operations = { + signer : Bls.Secret_key.t; + counter : int64; + operations : operation list; + } + + let account_operations_of ~sk ~counter operations = + {signer = sk; counter; operations} + + (* Several account operations. + Content of this tx signed by each account, + and stored in the aggregated signature. + Corresponds to + kernel_core::inbox::external::v1::verifiable::VerifiableTransaction type + in the tx kernel + *) + type multiaccount_tx = { + accounts_operations : account_operations list; + encoded_accounts_ops : string; (* just encoded concatenated list above *) + aggregated_signature : Bls.t; + } + + (* Batch of multiaccount transactions. + Corresponds to + kernel_core::inbox::external::v1::ParsedBatch type + in the tx kernel + *) + type transactions_batch = { + transactions : multiaccount_tx list; + encoded_transactions : string; (* just encoded concatenated list above *) + aggregated_signature : Bls.t; + } + + module Encodings = struct + let list_encode xs = + Data_encoding.(Binary.to_string_exn string @@ String.concat "" xs) + + (* String ticket encoding for tx kernel. + Corresponds to kernel_core::encoding::string_ticket::StringTicketRepr *) + let ticket_repr {ticketer; content; amount} : string = + let open Tezos_protocol_alpha.Protocol.Alpha_context in + Printf.sprintf + "\007\007\n\000\000\000\022%s\007\007\001%s\000%s" + Data_encoding.(Binary.to_string_exn Contract.encoding ticketer) + Data_encoding.(Binary.to_string_exn bytes @@ Bytes.of_string content) + Data_encoding.(Binary.to_string_exn z @@ Z.of_int amount) + + (* Encoding of kernel_core::inbox::external::v1::OperationContent from tx_kernel *) + let operation_repr = function + | Withdrawal {receiver_contract; ticket; entrypoint} -> + let open Alpha_context in + let withdrawal_prefix = "\000" in + let contract_bytes = + Data_encoding.( + Binary.to_string_exn Contract_hash.encoding receiver_contract) + in + let entrypoint_bytes = + Data_encoding.( + Entrypoint.of_string_strict_exn entrypoint + |> Binary.to_string_exn Entrypoint.simple_encoding) + in + withdrawal_prefix ^ contract_bytes ^ ticket_repr ticket + ^ entrypoint_bytes + | Transfer {destination; ticket} -> + let transfer_prefix = "\001" in + let tz4address = + Data_encoding.( + Binary.to_string_exn + Tezos_crypto.Signature.Bls.Public_key_hash.encoding + destination) + in + transfer_prefix ^ tz4address ^ ticket_repr ticket + + let account_operations_repr {signer; counter; operations} : string = + let signer_bytes = + if Int64.equal counter 0L then + "\000" (* PK signer tag *) + ^ Data_encoding.( + Bls.Secret_key.to_public_key signer + |> Binary.to_string_exn Bls.Public_key.encoding) + else + "\001" (* tz4address signer tag *) + ^ Data_encoding.( + Bls.Secret_key.to_public_key signer + |> Bls.Public_key.hash + |> Binary.to_string_exn Bls.Public_key_hash.encoding) + in + let counter = Data_encoding.(Binary.to_string_exn int64 counter) in + let contents = list_encode @@ List.map operation_repr operations in + signer_bytes ^ counter ^ contents + + let list_of_account_operations_repr + (accounts_operations : account_operations list) : string = + let account_ops_encoded = + List.map account_operations_repr accounts_operations + in + list_encode account_ops_encoded + + let list_of_multiaccount_tx_encoding (transactions : multiaccount_tx list) + = + let txs_encodings = + List.map (fun x -> x.encoded_accounts_ops) transactions + in + list_encode txs_encodings + end + + let multiaccount_tx_of (accounts_operations : account_operations list) = + let encoded_accounts_ops = + Encodings.list_of_account_operations_repr accounts_operations + in + let accounts_sks = List.map (fun x -> x.signer) accounts_operations in + (* List consisting of single transaction, that is fine *) + let aggregated_signature = + Option.get + @@ Bls.( + aggregate_signature_opt + @@ List.map + (fun sk -> sign sk @@ Bytes.of_string encoded_accounts_ops) + accounts_sks) + in + assert ( + Bls.aggregate_check + (List.map + (fun sk -> + ( Bls.Secret_key.to_public_key sk, + None, + Bytes.of_string encoded_accounts_ops )) + accounts_sks) + aggregated_signature) ; + {accounts_operations; encoded_accounts_ops; aggregated_signature} + + let transactions_batch_of (transactions : multiaccount_tx list) = + let encoded_transactions = + Encodings.list_of_multiaccount_tx_encoding transactions + in + let signatures = + List.map + (fun (x : multiaccount_tx) -> x.aggregated_signature) + transactions + in + let aggregated_signature = + Option.get @@ Bls.aggregate_signature_opt signatures + in + {transactions; encoded_transactions; aggregated_signature} + + let external_message_of_batch ?(should_hex_encode = true) + (batch : transactions_batch) = + let v1_batch_prefix = "\000" in + let signature = + batch.aggregated_signature |> Tezos_crypto.Signature.Bls.to_bytes + |> Bytes.to_string + in + let raw = v1_batch_prefix ^ batch.encoded_transactions ^ signature in + if should_hex_encode then hex_encode raw else raw + + (* External message consisting of single transaction. *) + let external_message_of_account_ops (accounts_ops : account_operations list) + = + external_message_of_batch @@ transactions_batch_of + @@ [multiaccount_tx_of accounts_ops] + end + + let assert_state_changed ?block sc_rollup_client prev_state_hash = + let*! state_hash = + Sc_rollup_client.state_hash ?block ~hooks sc_rollup_client + in + Check.(state_hash <> prev_state_hash) + Check.string + ~error_msg:"State hash has not changed (%L <> %R)" ; + Lwt.return_unit + + let assert_ticks_advanced ?block sc_rollup_client prev_ticks = + let*! ticks = Sc_rollup_client.total_ticks ?block ~hooks sc_rollup_client in + Check.(ticks > prev_ticks) + Check.int + ~error_msg:"Tick counter did not advance (%L > %R)" ; + Lwt.return_unit + + (* Send a deposit into the rollup. *) + let test_deposit ~client ~sc_rollup_node ~sc_rollup_client ~sc_rollup_address + ~mint_and_deposit_contract level tz4_address = + let*! prev_state_hash = + Sc_rollup_client.state_hash ~hooks sc_rollup_client + in + let* () = + (* Internal message through forwarder *) + let arg = + sf + {|Pair (Pair %S "%s") (Pair 450 "Hello, Ticket!")|} + sc_rollup_address + tz4_address + in + Client.transfer + client + ~hooks + ~amount:Tez.zero + ~giver:Constant.bootstrap1.alias + ~receiver:mint_and_deposit_contract + ~arg + ~burn_cap:(Tez.of_int 1000) + in + let* () = Client.bake_for_and_wait client in + let* _ = + Sc_rollup_node.wait_for_level ~timeout:30. sc_rollup_node (level + 1) + in + let* () = assert_state_changed sc_rollup_client prev_state_hash in + Lwt.return @@ (level + 1) + + let rec bake_until cond client sc_rollup_node = + let* stop = cond client in + if stop then unit + else + let* () = Client.bake_for_and_wait client in + let* current_level = Client.level client in + let* _ = + Sc_rollup_node.wait_for_level ~timeout:30. sc_rollup_node current_level + in + bake_until cond client sc_rollup_node + + let ticket mint_and_deposit_contract amount = + Tx_kernel.ticket_of + ~ticketer:mint_and_deposit_contract + ~content:"Hello, Ticket!" + amount + + type prepare_message_setup = { + sk1 : Bls.Secret_key.t; + sk2 : Bls.Secret_key.t; + pkh1 : Bls.Public_key_hash.t; + pkh2 : Bls.Public_key_hash.t; + transfer_message : string; + withdraw_message : string; + mint_and_deposit_contract : string; + receive_tickets_contract : string; + level : int; + } + + type send_message_and_wait_setup = { + prev_state_hash : string; + prev_ticks : int; + level : int; + } + + let prepare_contracts_and_messages + ?(transfer_message_should_hex_encode = true) ~client ~level protocol = + let pkh1, _pk, sk1 = Tezos_crypto.Signature.Bls.generate_key () in + let pkh2, _pk2, sk2 = Tezos_crypto.Signature.Bls.generate_key () in + + (* Originate a contract that will mint and transfer tickets to the tx kernel. *) + (* Originate forwarder contract to send internal messages to rollup. *) + let* _, mint_and_deposit_contract = + Client.originate_contract_at (* ~alias:"rollup_deposit" *) + ~amount:Tez.zero + ~src:Constant.bootstrap1.alias + ~init:"Unit" + ~burn_cap:Tez.(of_int 1) + client + ["mini_scenarios"; "smart_rollup_mint_and_deposit_ticket"] + protocol + in + let* () = Client.bake_for_and_wait client in + Log.info + "The mint and deposit contract %s was successfully originated" + mint_and_deposit_contract ; + let level = level + 1 in + + (* originate ticket receiver contract that will receive withdrawls..*) + let* _, receive_tickets_contract = + Client.originate_contract_at + ~amount:Tez.zero + ~src:Constant.bootstrap1.alias + ~init:"{}" + ~burn_cap:Tez.(of_int 1) + client + ["mini_scenarios"; "smart_rollup_receive_tickets"] + protocol + in + let* () = Client.bake_for_and_wait client in + Log.info + "The receiver contract %s was successfully originated" + receive_tickets_contract ; + let level = level + 1 in + + (* Construct transfer message to send to rollup. *) + let transfer_message = + Tx_kernel.( + [ + multiaccount_tx_of + [ + (* Transfer 50 tickets *) + account_operations_of + ~sk:sk1 + ~counter:0L + [ + Transfer + { + destination = pkh2; + ticket = ticket mint_and_deposit_contract 60; + }; + ]; + (* Transfer 10 tickets back *) + account_operations_of + ~sk:sk2 + ~counter:0L + [ + Transfer + { + destination = pkh1; + ticket = ticket mint_and_deposit_contract 10; + }; + ]; + ]; + multiaccount_tx_of + [ + (* Transfer another 10 tickets back but in a separate tx *) + account_operations_of + ~sk:sk2 + ~counter:1L + [ + Transfer + { + destination = pkh1; + ticket = ticket mint_and_deposit_contract 10; + }; + ]; + ]; + ] + |> transactions_batch_of + |> external_message_of_batch + ~should_hex_encode:transfer_message_should_hex_encode) + in + (* Construct withdrawal *) + let withdrawal_op amount = + Tx_kernel.Withdrawal + { + receiver_contract = + Tezos_protocol_alpha.Protocol.Contract_hash.of_b58check_exn + receive_tickets_contract; + ticket = ticket mint_and_deposit_contract amount; + entrypoint = "receive_tickets"; + } + in + + (* Construct withdrawal mesage to send to rollup. *) + (* pk withdraws part of his tickets, pk2 withdraws all of his tickets *) + let withdraw_message = + Tx_kernel.( + [ + account_operations_of + ~sk:sk1 + ~counter:1L + [withdrawal_op 220; withdrawal_op 100]; + account_operations_of ~sk:sk2 ~counter:2L [withdrawal_op 40]; + ] + |> external_message_of_account_ops) + in + return + { + sk1; + sk2; + pkh1; + pkh2; + transfer_message; + withdraw_message; + mint_and_deposit_contract; + receive_tickets_contract; + level; + } + + let send_message_and_wait_for_level ~level ~sc_rollup_client ~sc_rollup_node + ~client ~hooks hex_encoded_message = + let*! prev_state_hash = + Sc_rollup_client.state_hash ~hooks sc_rollup_client + in + let*! prev_ticks = Sc_rollup_client.total_ticks ~hooks sc_rollup_client in + let* () = send_message client (sf "hex:[%S]" hex_encoded_message) in + let level = level + 1 in + let* _ = Sc_rollup_node.wait_for_level ~timeout:30. sc_rollup_node level in + let* () = assert_state_changed sc_rollup_client prev_state_hash in + return {prev_state_hash; prev_ticks; level} + + let verify_outbox_answer ~withdrawal_level ~sc_rollup_client + ~sc_rollup_address ~client ~receive_tickets_contract + ~mint_and_deposit_contract = + let*! outbox = + Sc_rollup_client.outbox ~outbox_level:withdrawal_level sc_rollup_client + in + Log.info "Outbox is %s" @@ JSON.encode outbox ; + let* answer = + let message_index = 0 in + let outbox_level = withdrawal_level in + let destination = receive_tickets_contract in + let open Tezos_protocol_alpha.Protocol.Alpha_context in + let ticketer = + mint_and_deposit_contract |> Contract.of_b58check |> Result.get_ok + |> Data_encoding.(Binary.to_string_exn Contract.encoding) + |> hex_encode + in + let parameters d = + Printf.sprintf + {|Pair 0x%s (Pair "%s" %s)|} + ticketer + "Hello, Ticket!" + (Int.to_string d) + in + let outbox_transaction param = + Sc_rollup_client. + { + destination; + entrypoint = Some "receive_tickets"; + parameters = parameters param; + parameters_ty = None; + } + in + Sc_rollup_client.outbox_proof_batch + sc_rollup_client + ~message_index + ~outbox_level + (List.map outbox_transaction [220; 100; 40]) + in + match answer with + | Some {commitment_hash; proof} -> + let*! () = + Client.Sc_rollup.execute_outbox_message + ~hooks + ~burn_cap:(Tez.of_int 10) + ~rollup:sc_rollup_address + ~src:Constant.bootstrap1.alias + ~commitment_hash + ~proof + client + in + Client.bake_for_and_wait client + | _ -> failwith "Unexpected error during proof generation" + + (* [prepare_dac_external_message ~coordinator_node ~committee_members_nodes payload] registers a + [payload] with [coordinator_node] then waits for all [committee_member_nodes] to sign the resultant + root hash. The associated DAC certificate is retrieved, the l1 external message is constructed, + hex encoded and returned. + *) + let prepare_dac_external_message ~coordinator_node ~committee_members_nodes + ?(should_run_committee_member_nodes = true) payload = + (* monitor event emission on dac member*) + let wait_for_signature_pushed_event dac_member = + Dac_node.wait_for + dac_member + "new_signature_pushed_to_coordinator.v0" + (fun _ -> Some ()) + in + let wait_for_member_signature_pushed_to_coordinator = + List.map wait_for_signature_pushed_event committee_members_nodes + in + let* () = + if should_run_committee_member_nodes then + Lwt_list.iter_s + (fun dac_member -> + let* _dir = Dac_node.init_config dac_member in + let ev = + wait_for_handle_new_subscription_to_hash_streamer coordinator_node + in + let* () = Dac_node.run dac_member in + ev) + committee_members_nodes + else unit + in + let* preimage_hash = + RPC.call coordinator_node (Dac_rpc.Coordinator.post_preimage ~payload) + in + let* () = Lwt.join wait_for_member_signature_pushed_to_coordinator in + let* witnesses, signature, root_hash = + RPC.call + coordinator_node + (Dac_rpc.get_certificate ~hex_root_hash:(`Hex preimage_hash)) + in + let root_hash = `Hex root_hash |> Hex.to_string |> String.to_bytes in + let signature = + Data_encoding.Binary.to_bytes_exn + Tezos_crypto.Aggregate_signature.encoding + @@ Tezos_crypto.Aggregate_signature.of_b58check_exn signature + in + let witnesses = + Data_encoding.Binary.to_bytes_exn Data_encoding.z (Z.of_int witnesses) + in + let dac_certificate_bin = + Bytes.to_string + @@ Bytes.concat Bytes.empty [root_hash; signature; witnesses] + in + let l1_external_message = hex_encode ("\042" ^ dac_certificate_bin) in + return @@ (`Hex l1_external_message, `Hex preimage_hash) + + (* Test scenario where DAC Observer is in sync with the Data Availability Committee - Ideal case. + When a DAC ceritifcate is created, the Observer should download pages from the Coordinator and + persist them to the rollup node's data directory. On reveal_hash, the pages should already be + present. + + The Tx-kernel outbox is verified to test the correctness of DAC infrastructure. + This test has 1 cordinator, 1 committee member, 1 rollup node with 1 observer running. + *) + let test_tx_kernel_e2e_with_dac_observer_synced_with_dac commitment_period + scenario = + let Dac_helper.Scenarios. + { + protocol; + client; + key; + coordinator_node; + committee_members_nodes; + observer_nodes; + rollup_nodes; + _; + } = + scenario + in + let sc_rollup_node = List.nth rollup_nodes 0 in + let observer_node = List.nth observer_nodes 0 in + let* _ = Dac_node.init_config observer_node in + let* () = Dac_node.run observer_node in + let* boot_sector = + prepare_installer_kernel + ~preimages_dir: + (Filename.concat + (Sc_rollup_node.data_dir sc_rollup_node) + "wasm_2_0_0") + "tx-kernel-fixed-dac" + in + let* sc_rollup_address = + Client.Sc_rollup.originate + ~burn_cap:Tez.(of_int 9999999) + ~alias:"tx_kernel_fixed_dac_rollup" + ~src:key + ~kind:"wasm_2_0_0" + ~boot_sector + ~parameters_ty:"pair string (ticket string)" + client + in + let* () = Client.bake_for_and_wait client in + (* Run the rollup node, ensure origination succeeds. *) + let* genesis_info = + RPC.Client.call ~hooks client + @@ RPC.get_chain_block_context_smart_rollups_smart_rollup_genesis_info + sc_rollup_address + in + let init_level = JSON.(genesis_info |-> "level" |> as_int) in + let* () = Sc_rollup_node.run sc_rollup_node sc_rollup_address [] in + let sc_rollup_client = Sc_rollup_client.create ~protocol sc_rollup_node in + let* level = + Sc_rollup_node.wait_for_level ~timeout:30. sc_rollup_node init_level + in + Check.(level = init_level) + Check.int + ~error_msg:"Current level has moved past origination level (%L = %R)" ; + let* { + pkh1; + transfer_message; + withdraw_message; + mint_and_deposit_contract; + receive_tickets_contract; + level; + _; + } = + prepare_contracts_and_messages + ~client + ~level + ~transfer_message_should_hex_encode:false + protocol + in + + (* Deposit *) + let* level = + test_deposit + ~client + ~sc_rollup_node + ~sc_rollup_client + ~sc_rollup_address + ~mint_and_deposit_contract + level + @@ Tezos_crypto.Signature.Bls.Public_key_hash.to_b58check pkh1 + in + + let payload = transfer_message in + + (* Register root hash with coordinator. + Retrieve certificate after committee members have signed. + Prepare L1 Dac message hex encoded. + *) + (* Tx kernel dac messages expects the root hash page to be a content page containing + a list of hashes that references the actually payload's merkle tree root hash. + Rollup id in tx kernel is hard-coded to `0` to select the list head. *) + let* _, hexed_preimage_hash = + prepare_dac_external_message + ~coordinator_node + ~committee_members_nodes + payload + in + let* `Hex l1_external_message, _ = + prepare_dac_external_message + ~coordinator_node + ~committee_members_nodes + ~should_run_committee_member_nodes:false + (Hex.to_string hexed_preimage_hash) + in + + (* Send DAC certificate as an External Message to L1 *) + let* {level; _} = + send_message_and_wait_for_level + ~level + ~sc_rollup_client + ~sc_rollup_node + ~client + ~hooks + l1_external_message + in + + (* After that pkh1 has 410 tickets, pkh2 has 40 tickets *) + (* Send withdrawal *) + let* {prev_state_hash; prev_ticks; level = withdrawal_level} = + send_message_and_wait_for_level + ~level + ~sc_rollup_client + ~sc_rollup_node + ~client + ~hooks + withdraw_message + in + let* _, last_lcc_level = + Sc_rollup_helpers.last_cemented_commitment_hash_with_level + ~sc_rollup:sc_rollup_address + client + in + let next_lcc_level = last_lcc_level + commitment_period in + + (* Bake until the next commitment is cemented, this commitment + will include the withdrawal. *) + let* () = + bake_until + (fun client -> + let* _, lcc_level = + Sc_rollup_helpers.last_cemented_commitment_hash_with_level + ~sc_rollup:sc_rollup_address + client + in + return (lcc_level = next_lcc_level)) + client + sc_rollup_node + in + + let block = string_of_int next_lcc_level in + let* () = assert_state_changed ~block sc_rollup_client prev_state_hash in + let* () = assert_ticks_advanced ~block sc_rollup_client prev_ticks in + + (* EXECUTE withdrawal *) + let* () = + verify_outbox_answer + ~client + ~sc_rollup_client + ~sc_rollup_address + ~receive_tickets_contract + ~mint_and_deposit_contract + ~withdrawal_level + in + unit + + (* Test scenario where DAC Observer joins halfway and hence is cold/has missing pages. In this scenario, + rollup node makes an RPC call to Observer via GET /missing_page/{hash}. The Observer should retrieve + the missing page then store it to the rollup node's data directory. Since the rollup node starts cold, + this should happen for every page in the root hash's Merkle tree. + + The Tx-kernel outbox is verified to test the correctness of DAC infrastructure. + This test has 1 cordinator, 1 committee member, 1 rollup node with 1 observer running. + *) + let test_tx_kernel_e2e_with_dac_observer_missing_pages commitment_period + scenario = + let Dac_helper.Scenarios. + { + protocol; + client; + key; + coordinator_node; + committee_members_nodes; + observer_nodes; + rollup_nodes; + _; + } = + scenario + in + let sc_rollup_node = List.nth rollup_nodes 0 in + let* boot_sector = + prepare_installer_kernel + ~preimages_dir: + (Filename.concat + (Sc_rollup_node.data_dir sc_rollup_node) + "wasm_2_0_0") + "tx-kernel-fixed-dac" + in + let* sc_rollup_address = + Client.Sc_rollup.originate + ~burn_cap:Tez.(of_int 9999999) + ~alias:"tx_kernel_fixed_dac_rollup" + ~src:key + ~kind:"wasm_2_0_0" + ~boot_sector + ~parameters_ty:"pair string (ticket string)" + client + in + let* () = Client.bake_for_and_wait client in + + (* Run the rollup node, ensure origination succeeds. *) + let* genesis_info = + RPC.Client.call ~hooks client + @@ RPC.get_chain_block_context_smart_rollups_smart_rollup_genesis_info + sc_rollup_address + in + let init_level = JSON.(genesis_info |-> "level" |> as_int) in + let observer_node = List.nth observer_nodes 0 in + let* _ = Dac_node.init_config observer_node in + let* () = + Sc_rollup_node.run + sc_rollup_node + sc_rollup_address + ["--dac-observer"; Dac_node.endpoint observer_node] + in + let sc_rollup_client = Sc_rollup_client.create ~protocol sc_rollup_node in + let* level = + Sc_rollup_node.wait_for_level ~timeout:30. sc_rollup_node init_level + in + Check.(level = init_level) + Check.int + ~error_msg:"Current level has moved past origination level (%L = %R)" ; + let* { + pkh1; + transfer_message; + withdraw_message; + mint_and_deposit_contract; + receive_tickets_contract; + level; + _; + } = + prepare_contracts_and_messages + ~client + ~level + ~transfer_message_should_hex_encode:false + protocol + in + + (* Deposit *) + let* level = + test_deposit + ~client + ~sc_rollup_node + ~sc_rollup_client + ~sc_rollup_address + ~mint_and_deposit_contract + level + @@ Tezos_crypto.Signature.Bls.Public_key_hash.to_b58check pkh1 + in + let payload = transfer_message in + + (* Register root hash with coordinator. + Retrieve certificate after committee members have signed. + Prepare L1 Dac message hex encoded. + *) + (* Tx kernel dac messages expects the root hash page to be a content page containing + a list of hashes that references the actually payload's merkle tree root hash. + Rollup id in tx kernel is hard-coded to `0` to select the list head. *) + let* _, transfer_messages_preimage_hash = + prepare_dac_external_message + ~coordinator_node + ~committee_members_nodes + payload + in + let* `Hex l1_external_message, hexed_perimage_hash = + prepare_dac_external_message + ~coordinator_node + ~committee_members_nodes + ~should_run_committee_member_nodes:false + (Hex.to_string transfer_messages_preimage_hash) + in + + (* Delay Observer start up to simulate it missing coordinator's streamed + root hash. *) + let* filenames = Dac_node.ls_reveal_data_dir observer_node in + Check.( + (false + = List.exists + (String.equal (Hex.show transfer_messages_preimage_hash)) + filenames) + ~__LOC__ + bool + ~error_msg: + "Observer node is in invalid state: Unexpected preimage hash found \ + in reveal data dir.") ; + + Check.( + (false + = List.exists (String.equal (Hex.show hexed_perimage_hash)) filenames) + ~__LOC__ + bool + ~error_msg: + "Observer node is in invalid state: Unexpected preimage hash found \ + in reveal data dir.") ; + let* () = Dac_node.run ~wait_ready:true observer_node in + + (* Send DAC certificate as an External Message to L1 *) + let* {level; _} = + send_message_and_wait_for_level + ~level + ~sc_rollup_client + ~sc_rollup_node + ~client + ~hooks + l1_external_message + in + + (* After that pkh1 has 410 tickets, pkh2 has 40 tickets *) + (* Send withdrawal *) + let* {prev_state_hash; prev_ticks; level = withdrawal_level} = + send_message_and_wait_for_level + ~level + ~sc_rollup_client + ~sc_rollup_node + ~client + ~hooks + withdraw_message + in + let* _, last_lcc_level = + Sc_rollup_helpers.last_cemented_commitment_hash_with_level + ~sc_rollup:sc_rollup_address + client + in + let next_lcc_level = last_lcc_level + commitment_period in + + (* Bake until the next commitment is cemented, this commitment + will include the withdrawal. *) + let* () = + bake_until + (fun client -> + let* _, lcc_level = + Sc_rollup_helpers.last_cemented_commitment_hash_with_level + ~sc_rollup:sc_rollup_address + client + in + return (lcc_level = next_lcc_level)) + client + sc_rollup_node + in + let block = string_of_int next_lcc_level in + let* () = assert_state_changed ~block sc_rollup_client prev_state_hash in + let* () = assert_ticks_advanced ~block sc_rollup_client prev_ticks in + + (* EXECUTE withdrawal *) + let* () = + verify_outbox_answer + ~client + ~sc_rollup_client + ~sc_rollup_address + ~receive_tickets_contract + ~mint_and_deposit_contract + ~withdrawal_level + in + unit + + let test_tx_kernel_e2e_with_dac_observer_synced_with_dac = + let commitment_period = 10 in + let challenge_window = 10 in + let custom_committee_members = [Constant.aggregate_tz4_account] in + Dac_helper.scenario_with_full_dac_infrastructure + ~__FILE__ + ~tags:["wasm"; "kernel"; "wasm_2_0_0"; "kernel_e2e"; "dac"; "full"] + ~pvm_name:"wasm_2_0_0" + ~committee_size:0 + ~observers:1 + ~custom_committee_members + ~commitment_period + ~challenge_window + "kernel_e2e.dac_observer_synced_with_dac" + (test_tx_kernel_e2e_with_dac_observer_synced_with_dac commitment_period) + + let test_tx_kernel_e2e_with_dac_observer_missing_pages = + let commitment_period = 10 in + let challenge_window = 10 in + let custom_committee_members = [Constant.aggregate_tz4_account] in + Dac_helper.scenario_with_full_dac_infrastructure + ~__FILE__ + ~tags:["wasm"; "kernel"; "wasm_2_0_0"; "kernel_e2e"; "dac"; "full"] + ~pvm_name:"wasm_2_0_0" + ~committee_size:0 + ~observers:1 + ~custom_committee_members + ~commitment_period + ~challenge_window + "kernel_e2e.dac_observer_missing_pages" + (test_tx_kernel_e2e_with_dac_observer_missing_pages commitment_period) +end + let register ~protocols = (* Tests with layer1 and dac nodes *) Legacy.test_dac_node_startup protocols ; Legacy.test_dac_node_imports_committee_members protocols ; Legacy.test_dac_node_dac_threshold_not_reached protocols ; scenario_with_layer1_legacy_and_rollup_nodes + ~__FILE__ ~tags:["dac"; "dac_node"] "dac_reveals_data_merkle_tree_v0" Legacy.test_dac_node_handles_dac_store_preimage_merkle_V0 protocols ~threshold:1 - ~committee_members:1 ; + ~committee_size:1 ; scenario_with_layer1_legacy_and_rollup_nodes + ~__FILE__ ~tags:["dac"; "dac_node"] "dac_reveals_data_hash_chain_v0" Legacy.test_dac_node_handles_dac_store_preimage_hash_chain_V0 protocols ~threshold:1 - ~committee_members:1 ; + ~committee_size:1 ; scenario_with_layer1_legacy_and_rollup_nodes + ~__FILE__ ~tags:["dac"; "dac_node"] ~threshold:0 - ~committee_members:0 + ~committee_size:0 "dac_retrieve_preimage" Legacy.test_dac_node_handles_dac_retrieve_preimage_merkle_V0 protocols ; scenario_with_layer1_legacy_and_rollup_nodes + ~__FILE__ ~tags:["dac"; "dac_node"] "dac_rollup_arith_uses_reveals" Legacy.test_rollup_arith_uses_reveals protocols ~threshold:1 - ~committee_members:1 ; + ~committee_size:1 ; scenario_with_layer1_legacy_and_rollup_nodes + ~__FILE__ ~tags:["dac"; "dac_node"] "dac_rollup_arith_wrong_hash" Legacy.test_reveals_fails_on_wrong_hash ~threshold:1 - ~committee_members:1 + ~committee_size:1 protocols ; scenario_with_layer1_and_legacy_dac_nodes + ~__FILE__ ~threshold:0 - ~committee_members:0 + ~committee_size:0 ~tags:["dac"; "dac_node"] "dac_streaming_of_root_hashes_in_legacy_mode" Legacy.test_streaming_of_root_hashes_as_observer protocols ; scenario_with_layer1_and_legacy_dac_nodes + ~__FILE__ ~threshold:0 - ~committee_members:1 + ~committee_size:1 ~tags:["dac"; "dac_node"] "dac_push_signature_in_legacy_mode_as_member" Legacy.test_streaming_of_root_hashes_as_member protocols ; scenario_with_layer1_and_legacy_dac_nodes + ~__FILE__ ~threshold:0 - ~committee_members:0 + ~committee_size:0 ~tags:["dac"; "dac_node"] "committee member downloads pages from coordinator" Legacy.test_observer_downloads_pages protocols ; scenario_with_layer1_and_legacy_dac_nodes + ~__FILE__ ~threshold:0 - ~committee_members:2 + ~committee_size:2 ~tags:["dac"; "dac_node"] "dac_get_certificate" Legacy.Signature_manager.test_get_certificate protocols ; scenario_with_layer1_and_legacy_dac_nodes + ~__FILE__ ~threshold:0 - ~committee_members:3 + ~committee_size:3 ~tags:["dac"; "dac_node"] "dac_store_member_signature" Legacy.Signature_manager.test_handle_store_signature protocols ; scenario_with_full_dac_infrastructure + ~__FILE__ ~observers:0 - ~committee_members:0 + ~committee_size:0 ~tags:["dac"; "dac_node"] "dac_coordinator_post_preimage_endpoint" Full_infrastructure.test_coordinator_post_preimage_endpoint protocols ; scenario_with_layer1_and_legacy_dac_nodes + ~__FILE__ ~threshold:0 - ~committee_members:1 + ~committee_size:1 ~tags:["dac"; "dac_node"] "dac_observer_get_missing_page" Legacy.test_observer_get_missing_page protocols ; scenario_with_full_dac_infrastructure + ~__FILE__ ~observers:1 - ~committee_members:1 + ~committee_size:1 ~tags:["dac"; "dac_node"] "committee members and observers download pages from coordinator" Full_infrastructure.test_download_and_retrieval_of_pages protocols ; scenario_with_full_dac_infrastructure + ~__FILE__ ~observers:0 - ~committee_members:2 + ~committee_size:2 ~tags:["dac"; "dac_node"] "certificates are updated in streaming endpoint" Full_infrastructure.test_streaming_certificates protocols ; scenario_with_full_dac_infrastructure + ~__FILE__ ~observers:0 - ~committee_members:2 + ~committee_size:2 ~tags:["dac"; "dac_node"] "test client commands" Full_infrastructure.test_client - protocols + protocols ; + Tx_kernel_e2e.test_tx_kernel_e2e_with_dac_observer_synced_with_dac protocols ; + Tx_kernel_e2e.test_tx_kernel_e2e_with_dac_observer_missing_pages protocols -- GitLab