diff --git a/src/bin_dac_node/main_dac.ml b/src/bin_dac_node/main_dac.ml index b3120e328051dba8e3c3d1fbcabe909eea7f9133..7c57aafee2ca240586d4e108daefd6a7ead1c086 100644 --- a/src/bin_dac_node/main_dac.ml +++ b/src/bin_dac_node/main_dac.ml @@ -127,7 +127,7 @@ let rpc_port_arg = ~default positive_int_parameter -let coordinator_rpc_parameter = +let raw_rpc_parameter = Tezos_clic.parameter (fun _cctxt h -> match String.split ':' h with | [host_name; port] -> ( @@ -140,7 +140,12 @@ let coordinator_rpc_param ?(name = "DAC coordinator rpc address parameter") let desc = String.concat "\n" [desc; "An address of the form :"] in - Tezos_clic.param ~name ~desc coordinator_rpc_parameter + Tezos_clic.param ~name ~desc raw_rpc_parameter + +let committee_rpc_addresses_param + ?(name = "DAC committee member rpc address parameter.") + ?(desc = "RPC address of the DAC committee member.") = + Tezos_clic.param ~name ~desc raw_rpc_parameter module Config_init = struct let create_configuration ~data_dir ~reveal_data_dir ~rpc_address ~rpc_port @@ -262,9 +267,12 @@ module Config_init = struct ~desc:"Configure DAC node in observer mode." (args4 data_dir_arg rpc_address_arg rpc_port_arg reveal_data_dir_arg) (prefixes ["configure"; "as"; "observer"; "with"; "coordinator"] - @@ coordinator_rpc_param @@ stop) + @@ coordinator_rpc_param + @@ prefixes ["and"; "committee"; "member"; "rpc"; "addresses"] + @@ seq_of_param @@ committee_rpc_addresses_param) (fun (data_dir, rpc_address, rpc_port, reveal_data_dir) (coordinator_rpc_address, coordinator_rpc_port) + committee_rpc_addresses cctxt -> create_configuration ~data_dir @@ -272,6 +280,7 @@ module Config_init = struct ~rpc_address ~rpc_port (Configuration.make_observer + ~committee_rpc_addresses coordinator_rpc_address coordinator_rpc_port) cctxt) diff --git a/src/lib_dac_node/configuration.ml b/src/lib_dac_node/configuration.ml index 02f4c23c63df6e90c7af99cab1809f9416236c01..c7e9420d38e7a97adc6074a240af37ce6db7f05a 100644 --- a/src/lib_dac_node/configuration.ml +++ b/src/lib_dac_node/configuration.ml @@ -95,21 +95,42 @@ module Committee_member = struct end module Observer = struct - type t = {coordinator_rpc_address : string; coordinator_rpc_port : int} + type t = { + coordinator_rpc_address : string; + coordinator_rpc_port : int; + committee_rpc_addresses : (string * int) list; + } - let make coordinator_rpc_address coordinator_rpc_port = - {coordinator_rpc_address; coordinator_rpc_port} + let make ~committee_rpc_addresses coordinator_rpc_address coordinator_rpc_port + = + {coordinator_rpc_address; coordinator_rpc_port; committee_rpc_addresses} let encoding = Data_encoding.( conv - (fun {coordinator_rpc_address; coordinator_rpc_port} -> - (coordinator_rpc_address, coordinator_rpc_port)) - (fun (coordinator_rpc_address, coordinator_rpc_port) -> - {coordinator_rpc_address; coordinator_rpc_port}) - (obj2 + (fun { + coordinator_rpc_address; + coordinator_rpc_port; + committee_rpc_addresses; + } -> + ( coordinator_rpc_address, + coordinator_rpc_port, + committee_rpc_addresses )) + (fun ( coordinator_rpc_address, + coordinator_rpc_port, + committee_rpc_addresses ) -> + { + coordinator_rpc_address; + coordinator_rpc_port; + committee_rpc_addresses; + }) + (obj3 (req "coordinator_rpc_address" string) - (req "coordinator_rpc_port" uint16))) + (req "coordinator_rpc_port" uint16) + (req + "committee_rpc_addresses" + (Data_encoding.list + (obj2 (req "rpc_address" string) (req "rpc_port" uint16)))))) let name = "Observer" end @@ -202,8 +223,13 @@ let make_committee_member coordinator_rpc_address coordinator_rpc_port coordinator_rpc_port committee_member_address) -let make_observer coordinator_rpc_address coordinator_rpc_port = - Observer (Observer.make coordinator_rpc_address coordinator_rpc_port) +let make_observer ~committee_rpc_addresses coordinator_rpc_address + coordinator_rpc_port = + Observer + (Observer.make + ~committee_rpc_addresses + coordinator_rpc_address + coordinator_rpc_port) let make_legacy ?coordinator_host_and_port threshold committee_members_addresses committee_member_address_opt = diff --git a/src/lib_dac_node/configuration.mli b/src/lib_dac_node/configuration.mli index 9c8758544cc66f9151e188569342be5acda8f775..3bf7d939905f88fa8d43c1e104b263612388719d 100644 --- a/src/lib_dac_node/configuration.mli +++ b/src/lib_dac_node/configuration.mli @@ -56,7 +56,11 @@ end (** Observer specific configuration. *) module Observer : sig (** The type of an Observer specific configuration mode. *) - type t = {coordinator_rpc_address : string; coordinator_rpc_port : int} + type t = { + coordinator_rpc_address : string; + coordinator_rpc_port : int; + committee_rpc_addresses : (string * int) list; + } end (** Legacy specific configuration. *) @@ -124,10 +128,12 @@ val make_coordinator : val make_committee_member : string -> int -> Tezos_crypto.Aggregate_signature.public_key_hash -> mode -(** [make_observer coordinator_rpc_address coordinator_rpc_port] - creates a new observer configuration using the given address and - port for the coordinator, and the given [committee_member_address]. *) -val make_observer : string -> int -> mode +(** [make_observer committee_endpoints coordinator_rpc_address coordinator_rpc_port] + creates a new observer configuration that sets the Data Availabiity Committee + endpoints to [committee_endpoints] and Coordinator endpoint to + [(coordinator_rpc_address * coordinator_rpc_port)] as the coordinator. *) +val make_observer : + committee_rpc_addresses:(string * int) list -> string -> int -> mode (** [make_legacy ?coordinator_host_and_port threshold committee_members_addresses] diff --git a/src/lib_dac_node/node_context.ml b/src/lib_dac_node/node_context.ml index 15a2306d9c6d5bd4d83667f39cbb9355c0375e2c..5a9fdc5d559ce8505ee22d10b39551c52c4e14f6 100644 --- a/src/lib_dac_node/node_context.ml +++ b/src/lib_dac_node/node_context.ml @@ -101,11 +101,19 @@ module Committee_member = struct end module Observer = struct - type t = {coordinator_cctxt : Dac_node_client.cctxt} + type t = { + coordinator_cctxt : Dac_node_client.cctxt; + committee_cctxts : Dac_node_client.cctxt list; + } let init observer_config = let open Lwt_result_syntax in - let Configuration.Observer.{coordinator_rpc_address; coordinator_rpc_port} = + let Configuration.Observer. + { + coordinator_rpc_address; + coordinator_rpc_port; + committee_rpc_addresses; + } = observer_config in let coordinator_cctxt = @@ -114,7 +122,13 @@ module Observer = struct ~host:coordinator_rpc_address ~port:coordinator_rpc_port in - return {coordinator_cctxt} + let committee_cctxts = + List.map + (fun (host, port) -> + Dac_node_client.make_unix_cctxt ~scheme:"http" ~host ~port) + committee_rpc_addresses + in + return {coordinator_cctxt; committee_cctxts} end module Legacy = struct diff --git a/src/lib_dac_node/node_context.mli b/src/lib_dac_node/node_context.mli index bcd6a697c66da7cdbe641c6c6f10fa7ede099fbf..aaacfe4f5a4249848402b23340dee2020e5bddab 100644 --- a/src/lib_dac_node/node_context.mli +++ b/src/lib_dac_node/node_context.mli @@ -80,6 +80,9 @@ module Observer : sig coordinator_cctxt : Dac_node_client.cctxt; (** The [Dac_node_client.cctxt] used by the [Observer] node to send requests to a [Coordinator] node. *) + committee_cctxts : Dac_node_client.cctxt list; + (** The list of [Dac_node_client.cctxt] used by the [Observer] node + to send requests to each [Committee_member] node respectively. *) } end diff --git a/tezt/lib_tezos/dac_helper.ml b/tezt/lib_tezos/dac_helper.ml index 1b0e86928ad990a99ef37823da24f3178bfdd532..42dfeeffc64bf280aae3051226e74ecbf3e77575 100644 --- a/tezt/lib_tezos/dac_helper.ml +++ b/tezt/lib_tezos/dac_helper.ml @@ -230,7 +230,8 @@ let with_committee_member ?name ?sc_rollup_node ?(pvm_name = "arith") 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 = + ?(wait_ready = true) ~committee_member_rpcs tezos_node coordinator_node + tezos_client f = let reveal_data_dir = Option.map (fun sc_rollup_node -> @@ -245,6 +246,7 @@ let with_observer ?name ?sc_rollup_node ?(pvm_name = "arith") ?reveal_data_dir ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) + ~committee_member_rpcs () in let* _dir = Dac_node.init_config dac_node in @@ -317,6 +319,13 @@ let scenario_with_full_dac_infrastructure ?(tags = ["dac"; "full"]) ()) committee_members in + let committee_member_rpcs = + List.map + (fun committee_member_node -> + ( Dac_node.rpc_host committee_member_node, + Dac_node.rpc_port committee_member_node )) + committee_members_nodes + in let rollup_nodes, observer_nodes = List.init observers Fun.id |> List.map (fun i -> @@ -342,6 +351,7 @@ let scenario_with_full_dac_infrastructure ?(tags = ["dac"; "full"]) ~reveal_data_dir ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) + ~committee_member_rpcs () in (rollup_node_i, dac_node_i)) diff --git a/tezt/lib_tezos/dac_helper.mli b/tezt/lib_tezos/dac_helper.mli index 1d0def2d87ef917b630397ac69f0468d2812c2fe..45a5dadf4fed5b641370464f2d2b9b8bac8374d0 100644 --- a/tezt/lib_tezos/dac_helper.mli +++ b/tezt/lib_tezos/dac_helper.mli @@ -96,6 +96,7 @@ val with_observer : ?sc_rollup_node:Sc_rollup_node.t -> ?pvm_name:string -> ?wait_ready:bool -> + committee_member_rpcs:(string * int) list -> Node.t -> Dac_node.t -> Client.t -> diff --git a/tezt/lib_tezos/dac_node.ml b/tezt/lib_tezos/dac_node.ml index dc3461582b4bfb0121b4d019c4c621e2b2b9c7dd..8e27c5fd8e5253b492a08f0c0195f7405623c7cd 100644 --- a/tezt/lib_tezos/dac_node.ml +++ b/tezt/lib_tezos/dac_node.ml @@ -42,6 +42,7 @@ module Parameters = struct type observer_mode_settings = { coordinator_rpc_host : string; coordinator_rpc_port : int; + committee_member_rpcs : (string * int) list; } type mode_settings = @@ -111,6 +112,8 @@ let reveal_data_dir dac_node = dac_node.persistent_state.reveal_data_dir let spawn_command dac_node = Process.spawn ~name:dac_node.name ~color:dac_node.color dac_node.path +let raw_rpc (host, port) = Printf.sprintf "%s:%d" host port + let spawn_config_init dac_node = let arg_command = [ @@ -173,12 +176,26 @@ let spawn_config_init dac_node = "signer"; committee_member_params.address; ] - | Observer observer_params -> + | Observer + {coordinator_rpc_host; coordinator_rpc_port; committee_member_rpcs} -> let coordinator_host = - observer_params.coordinator_rpc_host ^ ":" - ^ Int.to_string observer_params.coordinator_rpc_port + coordinator_rpc_host ^ ":" ^ Int.to_string coordinator_rpc_port in - ["configure"; "as"; "observer"; "with"; "coordinator"; coordinator_host] + let committee_member_rpcs = List.map raw_rpc committee_member_rpcs in + [ + "configure"; + "as"; + "observer"; + "with"; + "coordinator"; + coordinator_host; + "and"; + "committee"; + "member"; + "rpc"; + "addresses"; + ] + @ committee_member_rpcs in spawn_command dac_node (mode_command @ arg_command) @@ -355,12 +372,14 @@ let create_committee_member ?(path = Constant.dac_node) ?name ?color ?data_dir let create_observer ?(path = Constant.dac_node) ?name ?color ?data_dir ?event_pipe ?(rpc_host = "127.0.0.1") ?rpc_port ?reveal_data_dir - ?(coordinator_rpc_host = "127.0.0.1") ?coordinator_rpc_port ~node ~client () - = + ?(coordinator_rpc_host = "127.0.0.1") ?coordinator_rpc_port + ~committee_member_rpcs ~node ~client () = let coordinator_rpc_port = match coordinator_rpc_port with None -> Port.fresh () | Some port -> port in - let mode = Observer {coordinator_rpc_host; coordinator_rpc_port} in + let mode = + Observer {coordinator_rpc_host; coordinator_rpc_port; committee_member_rpcs} + in create ~path ?name diff --git a/tezt/lib_tezos/dac_node.mli b/tezt/lib_tezos/dac_node.mli index d2112311305ceede1358acc1fcb7272139fccc4c..7925dbdcef8e2d983e95d3bdaa8501d193c77889 100644 --- a/tezt/lib_tezos/dac_node.mli +++ b/tezt/lib_tezos/dac_node.mli @@ -85,7 +85,8 @@ val create_committee_member : t (** Creates a DAC node to run in observer mode, using the specified coordinator - rpc host and port. *) + rpc host and port and set the committee member endpoints to + [committee_member_rpcs]. *) val create_observer : ?path:string -> ?name:string -> @@ -97,6 +98,7 @@ val create_observer : ?reveal_data_dir:string -> ?coordinator_rpc_host:string -> ?coordinator_rpc_port:int -> + committee_member_rpcs:(string * int) list -> node:Node.t -> client:Client.t -> unit ->