diff --git a/manifest/main.ml b/manifest/main.ml index 8a3b2a7b6b8098f05d7ee83dbfb9b6ccfc865814..a474d07dbf3a925712da790ebef285031b13439f 100644 --- a/manifest/main.ml +++ b/manifest/main.ml @@ -7371,6 +7371,7 @@ let _octez_dac_node = octez_rpc_http_client_unix; octez_stdlib_unix |> open_; octez_stdlib |> open_; + octez_dac_lib |> open_; octez_dac_node_lib |> open_; octez_layer2_store |> open_; irmin_pack; diff --git a/opam/octez-dac-node.opam b/opam/octez-dac-node.opam index d14cb582eb89a1686d5f240d4f126e50eaa05c82..e786466feb46852a1c2eab5b145fc036ed799a48 100644 --- a/opam/octez-dac-node.opam +++ b/opam/octez-dac-node.opam @@ -21,6 +21,7 @@ depends: [ "tezos-rpc-http-client-unix" "tezos-stdlib-unix" "tezos-stdlib" + "tezos-dac-lib" "tezos-dac-node-lib" "tezos-layer2-store" "irmin-pack" { >= "3.7.2" & < "3.8.0" } diff --git a/src/bin_dac_node/dune b/src/bin_dac_node/dune index 61fa57ebcf28b778d2089c038f5f66954a8d4ea9..1fbfcf77f06ca5e4eec818cbed8a0eaa1510dde8 100644 --- a/src/bin_dac_node/dune +++ b/src/bin_dac_node/dune @@ -19,6 +19,7 @@ tezos-rpc-http-client-unix tezos-stdlib-unix tezos-stdlib + tezos-dac-lib tezos_dac_node_lib tezos_layer2_store irmin-pack @@ -42,6 +43,7 @@ -open Tezos_rpc_http -open Tezos_stdlib_unix -open Tezos_stdlib + -open Tezos_dac_lib -open Tezos_dac_node_lib -open Tezos_layer2_store)) diff --git a/src/bin_dac_node/main_dac.ml b/src/bin_dac_node/main_dac.ml index 1fc562ff8589e9710819471e8c2d74bb3fabd06d..fcc4547bc54fa881ada1e72a04f3a2c8cca74888 100644 --- a/src/bin_dac_node/main_dac.ml +++ b/src/bin_dac_node/main_dac.ml @@ -156,12 +156,13 @@ let allow_v1_api_arg : (bool, Client_context.full) Tezos_clic.arg = () let raw_rpc_parameter = - Tezos_clic.parameter (fun _cctxt h -> - match String.split ':' h with - | [host_name; port] -> ( - try Lwt.return_ok (host_name, int_of_string port) - with _ -> failwith "Address not in format :") - | _ -> failwith "Address not in format :") + let open Lwt_result_syntax in + let open Dac_clic_helpers in + Tezos_clic.parameter (fun _cctxt raw_rpc -> + let parsed_rpc_result = Parsed_rpc.of_string raw_rpc in + match parsed_rpc_result with + | Ok parsed_rpc -> return parsed_rpc + | Error (`Parse_rpc_error msg) -> failwith "%s" msg) let coordinator_rpc_param ?(name = "coordinator-rpc-address") ?(desc = @@ -308,24 +309,29 @@ module Config_init = struct @@ tz4_address_param ~desc:"BLS public key hash to use as the signer." @@ stop) (fun (data_dir, rpc_address, rpc_port, reveal_data_dir, allow_v1_api) - (coordinator_rpc_address, coordinator_rpc_port) + coordinator_rpc_address address cctxt -> experimental_disclaimer () ; + let coordinator_rpc_address = + Uri.make + ~scheme:coordinator_rpc_address.scheme + ~host:coordinator_rpc_address.host + ~port:coordinator_rpc_address.port + () + in create_configuration ~data_dir ~reveal_data_dir ~rpc_address ~rpc_port ~allow_v1_api - (Configuration.make_committee_member - coordinator_rpc_address - coordinator_rpc_port - address) + (Configuration.make_committee_member ~coordinator_rpc_address address) cctxt) let observer_command = let open Tezos_clic in + let open Dac_clic_helpers in command ~group ~desc:"Configure DAC node in observer mode." @@ -351,10 +357,23 @@ module Config_init = struct reveal_data_dir, timeout, allow_v1_api ) - (coordinator_rpc_address, coordinator_rpc_port) + coordinator_rpc_address committee_rpc_addresses cctxt -> experimental_disclaimer () ; + let committee_rpc_addresses = + List.map + (fun Parsed_rpc.{scheme; host; port} -> + Uri.make ~scheme ~host ~port ()) + committee_rpc_addresses + in + let coordinator_rpc_address = + Uri.make + ~scheme:coordinator_rpc_address.scheme + ~host:coordinator_rpc_address.host + ~port:coordinator_rpc_address.port + () + in create_configuration ~data_dir ~reveal_data_dir @@ -364,8 +383,7 @@ module Config_init = struct (Configuration.make_observer ~committee_rpc_addresses ?timeout - coordinator_rpc_address - coordinator_rpc_port) + coordinator_rpc_address) cctxt) let commands = diff --git a/src/lib_dac_client/dac_node_client.ml b/src/lib_dac_client/dac_node_client.ml index 0d3cc85031a5131933acad679985421829a92ecb..2264a44289f1a1df4fb4699f9365ae00c627ed02 100644 --- a/src/lib_dac_client/dac_node_client.ml +++ b/src/lib_dac_client/dac_node_client.ml @@ -44,6 +44,13 @@ let make_unix_cctxt ~scheme ~host ~port = in new unix_cctxt ~rpc_config +let of_uri uri = + let endpoint = uri in + let rpc_config = + {Tezos_rpc_http_client_unix.RPC_client_unix.default_config with endpoint} + in + new unix_cctxt ~rpc_config + module V0 = struct (* FIXME: https://gitlab.com/tezos/tezos/-/issues/4895 If the preimage was generated using a different plugin, the computation of diff --git a/src/lib_dac_client/dac_node_client.mli b/src/lib_dac_client/dac_node_client.mli index db2ea4646f512afdab3741fa9a3e501daaab24d6..4bf3d8257cef996c65a44338e1edc2aef973e944 100644 --- a/src/lib_dac_client/dac_node_client.mli +++ b/src/lib_dac_client/dac_node_client.mli @@ -39,6 +39,9 @@ class unix_cctxt : the client configuration parameters. *) val make_unix_cctxt : scheme:string -> host:string -> port:int -> cctxt +(** [of_uri uri] generates a cctxt from [uri]. *) +val of_uri : Uri.t -> cctxt + (** [V0] is a module that provides a client specification for interacting with experimental [Tezos_lib_dac.Rpc_services.Api.V0] API. Note that even though [V0] api is binding, it is already deprecated. Use it at your own risk! *) diff --git a/src/lib_dac_node/configuration.ml b/src/lib_dac_node/configuration.ml index bbbbaa22096ac3c815f154b31c99f40816785e0a..9b02b865606033a9a0d3753ad6f602f9766b72f7 100644 --- a/src/lib_dac_node/configuration.ml +++ b/src/lib_dac_node/configuration.ml @@ -71,24 +71,23 @@ end module Committee_member = struct type t = { - coordinator_rpc_address : string; - coordinator_rpc_port : int; + coordinator_rpc_address : Uri.t; address : Tezos_crypto.Aggregate_signature.public_key_hash; } - let make coordinator_rpc_address coordinator_rpc_port address = - {coordinator_rpc_address; coordinator_rpc_port; address} + let make coordinator_rpc_address address = {coordinator_rpc_address; address} let encoding = Data_encoding.( conv - (fun {coordinator_rpc_address; coordinator_rpc_port; address} -> - (coordinator_rpc_address, coordinator_rpc_port, address)) - (fun (coordinator_rpc_address, coordinator_rpc_port, address) -> - {coordinator_rpc_address; coordinator_rpc_port; address}) - (obj3 + (fun {coordinator_rpc_address; address} -> + let coordinator_rpc_address = Uri.to_string coordinator_rpc_address in + (coordinator_rpc_address, address)) + (fun (coordinator_rpc_address, address) -> + let coordinator_rpc_address = Uri.of_string coordinator_rpc_address in + {coordinator_rpc_address; address}) + (obj2 (req "coordinator_rpc_address" string) - (req "coordinator_rpc_port" uint16) (req "address" Tezos_crypto.Aggregate_signature.Public_key_hash.encoding))) @@ -98,53 +97,35 @@ end module Observer = struct type t = { - coordinator_rpc_address : string; - coordinator_rpc_port : int; - committee_rpc_addresses : (string * int) list; + coordinator_rpc_address : Uri.t; + committee_rpc_addresses : Uri.t list; timeout : int; } let default_timeout = 6 let make ~committee_rpc_addresses ?(timeout = default_timeout) - coordinator_rpc_address coordinator_rpc_port = - { - coordinator_rpc_address; - timeout; - coordinator_rpc_port; - committee_rpc_addresses; - } + coordinator_rpc_address = + {coordinator_rpc_address; timeout; committee_rpc_addresses} let encoding = Data_encoding.( conv - (fun { - coordinator_rpc_address; - coordinator_rpc_port; - committee_rpc_addresses; - timeout; - } -> - ( coordinator_rpc_address, - coordinator_rpc_port, - committee_rpc_addresses, - timeout )) - (fun ( coordinator_rpc_address, - coordinator_rpc_port, - committee_rpc_addresses, - timeout ) -> - { - coordinator_rpc_address; - coordinator_rpc_port; - committee_rpc_addresses; - timeout; - }) - (obj4 + (fun {coordinator_rpc_address; committee_rpc_addresses; timeout} -> + let coordinator_rpc_address = Uri.to_string coordinator_rpc_address in + let committee_rpc_addresses = + List.map Uri.to_string committee_rpc_addresses + in + (coordinator_rpc_address, committee_rpc_addresses, timeout)) + (fun (coordinator_rpc_address, committee_rpc_addresses, timeout) -> + let coordinator_rpc_address = Uri.of_string coordinator_rpc_address in + let committee_rpc_addresses = + List.map Uri.of_string committee_rpc_addresses + in + {coordinator_rpc_address; committee_rpc_addresses; timeout}) + (obj3 (req "coordinator_rpc_address" string) - (req "coordinator_rpc_port" uint16) - (req - "committee_rpc_addresses" - (Data_encoding.list - (obj2 (req "rpc_address" string) (req "rpc_port" uint16)))) + (req "committee_rpc_addresses" (Data_encoding.list string)) (req "timeout" Data_encoding.uint8))) let name = "Observer" @@ -230,22 +211,13 @@ type mode = let make_coordinator committee_members = Coordinator (Coordinator.make committee_members) -let make_committee_member coordinator_rpc_address coordinator_rpc_port - committee_member_address = +let make_committee_member ~coordinator_rpc_address committee_member_address = Committee_member - (Committee_member.make - coordinator_rpc_address - coordinator_rpc_port - committee_member_address) + (Committee_member.make coordinator_rpc_address committee_member_address) -let make_observer ~committee_rpc_addresses ?timeout coordinator_rpc_address - coordinator_rpc_port = +let make_observer ~committee_rpc_addresses ?timeout coordinator_rpc_address = Observer - (Observer.make - ~committee_rpc_addresses - ?timeout - coordinator_rpc_address - coordinator_rpc_port) + (Observer.make ~committee_rpc_addresses ?timeout coordinator_rpc_address) 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 e7aab8057e8fe5d5a1d460b4b1431cb21c353c38..4414551ed2322dcff3aa5c701ca257482c6447bd 100644 --- a/src/lib_dac_node/configuration.mli +++ b/src/lib_dac_node/configuration.mli @@ -46,8 +46,7 @@ end module Committee_member : sig (** The type of a Committee_member specific configuration mode. *) type t = { - coordinator_rpc_address : string; - coordinator_rpc_port : int; + coordinator_rpc_address : Uri.t; address : Tezos_crypto.Aggregate_signature.public_key_hash; } end @@ -56,9 +55,8 @@ end module Observer : sig (** The type of an Observer specific configuration mode. *) type t = { - coordinator_rpc_address : string; - coordinator_rpc_port : int; - committee_rpc_addresses : (string * int) list; + coordinator_rpc_address : Uri.t; + committee_rpc_addresses : Uri.t list; timeout : int; } @@ -124,23 +122,20 @@ val mode_name : t -> string *) val make_coordinator : Tezos_crypto.Aggregate_signature.public_key list -> mode -(** [make_committee_member coordinator_rpc_address coordinator_rpc_port - committee_member_address] creates a new committee-member configuration - mode using the given address and port for the coordinator, and the given - [committee_member_address]. *) +(** [make_committee_member ~coordinator_rpc_address committee_member_address] + creates a new committee member configuration with [committee_member_address] + as the signer and [coordinator_rpc_address] as the coordinator. *) val make_committee_member : - string -> int -> Tezos_crypto.Aggregate_signature.public_key_hash -> mode + coordinator_rpc_address:Uri.t -> + Tezos_crypto.Aggregate_signature.public_key_hash -> + 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. *) +(** [make_observer ~committee_rpc_addresses ?timeout coordinator_rpc_address] + creates a new observer configuration that sets the DAC Committee + rpc addresses to [committee_rpc_addresses] and Coordinator endpoint to + [coordinator_rpc_address]. *) val make_observer : - committee_rpc_addresses:(string * int) list -> - ?timeout:int -> - string -> - int -> - mode + committee_rpc_addresses:Uri.t list -> ?timeout:int -> Uri.t -> 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 9f40e7e710d94b32339b1d624a30fa0ffc697ea2..b6bec685b629775f3038f8e446bd68e67cb80019 100644 --- a/src/lib_dac_node/node_context.ml +++ b/src/lib_dac_node/node_context.ml @@ -73,19 +73,13 @@ module Committee_member = struct let init committee_member_config cctxt = let open Lwt_result_syntax in - let Configuration.Committee_member. - {address; coordinator_rpc_address; coordinator_rpc_port} = + let Configuration.Committee_member.{address; coordinator_rpc_address} = committee_member_config in let+ committee_member = Wallet_account.Committee_member.of_committee_member_address address cctxt in - let coordinator_cctxt = - Dac_node_client.make_unix_cctxt - ~scheme:"http" - ~host:coordinator_rpc_address - ~port:coordinator_rpc_port - in + let coordinator_cctxt = Dac_node_client.of_uri coordinator_rpc_address in {committee_member; coordinator_cctxt} let secret_key_uri t = @@ -105,25 +99,12 @@ module Observer = struct let init observer_config = let open Lwt_result_syntax in let Configuration.Observer. - { - coordinator_rpc_address; - coordinator_rpc_port; - committee_rpc_addresses; - timeout; - } = + {coordinator_rpc_address; committee_rpc_addresses; timeout} = observer_config in - let coordinator_cctxt = - Dac_node_client.make_unix_cctxt - ~scheme:"http" - ~host:coordinator_rpc_address - ~port:coordinator_rpc_port - in + let coordinator_cctxt = Dac_node_client.of_uri coordinator_rpc_address in let committee_cctxts = - List.map - (fun (host, port) -> - Dac_node_client.make_unix_cctxt ~scheme:"http" ~host ~port) - committee_rpc_addresses + List.map Dac_node_client.of_uri committee_rpc_addresses in return {coordinator_cctxt; committee_cctxts; timeout} end