From e3dbe1ae78699d7f6a65626a9c4aa910664e69f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Thir=C3=A9?= Date: Tue, 15 Nov 2022 21:30:56 +0100 Subject: [PATCH 1/2] Dal/Crypto: Make datatype consistent with their denotation --- src/lib_crypto_dal/cryptobox.ml | 14 +++++++------- src/lib_crypto_dal/cryptobox_intf.ml | 9 +++++---- src/lib_crypto_dal/test/test_dal_cryptobox.ml | 4 +--- src/lib_protocol_environment/environment_V7.ml | 4 +++- src/lib_protocol_environment/sigs/v8.ml | 9 +++++---- src/lib_protocol_environment/sigs/v8/dal.mli | 9 +++++---- src/proto_alpha/lib_protocol/dal_slot_repr.ml | 6 +++--- 7 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/lib_crypto_dal/cryptobox.ml b/src/lib_crypto_dal/cryptobox.ml index ca73444b706c..7e2b18579c33 100644 --- a/src/lib_crypto_dal/cryptobox.ml +++ b/src/lib_crypto_dal/cryptobox.ml @@ -137,7 +137,7 @@ module Inner = struct type page_proof = Bls12_381.G1.t - type page = {index : int; content : bytes} + type page = bytes type share = Scalar.t array @@ -854,12 +854,12 @@ module Inner = struct (* Parses the [slot_page] to get the evaluations that it contains. The evaluation points are given by the [slot_page_index]. *) - let verify_page t cm {index = slot_page_index; content = slot_page} proof = - if slot_page_index < 0 || slot_page_index >= t.pages_per_slot then + let verify_page t cm ~page_index page proof = + if page_index < 0 || page_index >= t.pages_per_slot then Error `Segment_index_out_of_range else let expected_page_length = t.page_size in - let got_page_length = Bytes.length slot_page in + let got_page_length = Bytes.length page in if expected_page_length <> got_page_length then Error `Page_length_mismatch else @@ -871,7 +871,7 @@ module Inner = struct | i when i < t.page_length - 1 -> let dst = Bytes.create scalar_bytes_amount in Bytes.blit - slot_page + page (i * scalar_bytes_amount) dst 0 @@ -880,7 +880,7 @@ module Inner = struct | i when i = t.page_length - 1 -> let dst = Bytes.create t.remaining_bytes in Bytes.blit - slot_page + page (i * scalar_bytes_amount) dst 0 @@ -894,7 +894,7 @@ module Inner = struct cm t.srs.kate_amortized_srs_g2_pages domain - (Domains.get t.domain_k slot_page_index, slot_page_evaluations) + (Domains.get t.domain_k page_index, slot_page_evaluations) proof) end diff --git a/src/lib_crypto_dal/cryptobox_intf.ml b/src/lib_crypto_dal/cryptobox_intf.ml index f70a328ed22f..bf1d1d112c61 100644 --- a/src/lib_crypto_dal/cryptobox_intf.ml +++ b/src/lib_crypto_dal/cryptobox_intf.ml @@ -89,10 +89,10 @@ module type VERIFIER = sig Fails if the size of the srs on the group G2 is too small. *) val verify_commitment : t -> commitment -> commitment_proof -> bool - (** The original slot can be split into a list of pages of size - [page_size]. A page is consequently encoded as a pair of an - [index] and the content of this page. *) - type page = {index : int; content : bytes} + (** The original slot can be split into a list of pages of fixed + size. This size is given by the parameter [page_size] given to the + function {!val:make}. *) + type page = bytes (** A proof that the evaluation of points of a polynomial is part of a commitment. *) @@ -115,6 +115,7 @@ module type VERIFIER = sig val verify_page : t -> commitment -> + page_index:int -> page -> page_proof -> (bool, [> `Segment_index_out_of_range | `Page_length_mismatch]) Result.t diff --git a/src/lib_crypto_dal/test/test_dal_cryptobox.ml b/src/lib_crypto_dal/test/test_dal_cryptobox.ml index 4b5638ecc264..bfeee24f1ca3 100644 --- a/src/lib_crypto_dal/test/test_dal_cryptobox.ml +++ b/src/lib_crypto_dal/test/test_dal_cryptobox.ml @@ -52,9 +52,7 @@ module Test = struct let cm = Cryptobox.commit t p in let* pi = Cryptobox.prove_page t p 1 in let page = Bytes.sub msg page_size page_size in - let* check = - Cryptobox.verify_page t cm {index = 1; content = page} pi - in + let* check = Cryptobox.verify_page t cm ~page_index:1 page pi in assert check ; let enc_shards = Cryptobox.shards_from_polynomial t p in let c_indices = diff --git a/src/lib_protocol_environment/environment_V7.ml b/src/lib_protocol_environment/environment_V7.ml index ec83aded0726..4ffe74e9d440 100644 --- a/src/lib_protocol_environment/environment_V7.ml +++ b/src/lib_protocol_environment/environment_V7.ml @@ -1407,8 +1407,10 @@ struct module Dal = struct include Tezos_crypto_dal.Cryptobox.Verifier + type page = {index : int; content : bytes} + let verify_page t sh page proof = - match verify_page t sh page proof with + match verify_page t sh ~page_index:page.index page.content proof with | Error `Page_length_mismatch -> Ok false | Error `Segment_index_out_of_range -> Error `Segment_index_out_of_range | Ok r -> Ok r diff --git a/src/lib_protocol_environment/sigs/v8.ml b/src/lib_protocol_environment/sigs/v8.ml index bb973385e1d7..5c8d31f62dfb 100644 --- a/src/lib_protocol_environment/sigs/v8.ml +++ b/src/lib_protocol_environment/sigs/v8.ml @@ -11905,10 +11905,10 @@ val commitment_proof_encoding : commitment_proof Data_encoding.t exceed [C.slot_size]. The verification time is constant. *) val verify_commitment : t -> commitment -> commitment_proof -> bool -(** The original slot can be split into a list of pages of size - [page_size]. A page is consequently encoded as a pair of an - [index] and the content of this page. *) -type page = {index : int; content : bytes} +(** The original slot can be split into a list of pages of fixed + size. This size is given by the parameter [page_size] given to the + function {!val:make}. *) +type page = bytes (** A proof that the evaluation of points of a polynomial is part of a commitment. *) @@ -11931,6 +11931,7 @@ val pages_per_slot : parameters -> int val verify_page : t -> commitment -> + page_index:int -> page -> page_proof -> (bool, [> `Segment_index_out_of_range | `Page_length_mismatch]) Result.t diff --git a/src/lib_protocol_environment/sigs/v8/dal.mli b/src/lib_protocol_environment/sigs/v8/dal.mli index 7950e6e1ea20..591fe878f5a7 100644 --- a/src/lib_protocol_environment/sigs/v8/dal.mli +++ b/src/lib_protocol_environment/sigs/v8/dal.mli @@ -81,10 +81,10 @@ val commitment_proof_encoding : commitment_proof Data_encoding.t exceed [C.slot_size]. The verification time is constant. *) val verify_commitment : t -> commitment -> commitment_proof -> bool -(** The original slot can be split into a list of pages of size - [page_size]. A page is consequently encoded as a pair of an - [index] and the content of this page. *) -type page = {index : int; content : bytes} +(** The original slot can be split into a list of pages of fixed + size. This size is given by the parameter [page_size] given to the + function {!val:make}. *) +type page = bytes (** A proof that the evaluation of points of a polynomial is part of a commitment. *) @@ -107,6 +107,7 @@ val pages_per_slot : parameters -> int val verify_page : t -> commitment -> + page_index:int -> page -> page_proof -> (bool, [> `Segment_index_out_of_range | `Page_length_mismatch]) Result.t diff --git a/src/proto_alpha/lib_protocol/dal_slot_repr.ml b/src/proto_alpha/lib_protocol/dal_slot_repr.ml index b3c8609b69af..af0696b1d06b 100644 --- a/src/proto_alpha/lib_protocol/dal_slot_repr.ml +++ b/src/proto_alpha/lib_protocol/dal_slot_repr.ml @@ -693,18 +693,18 @@ module History = struct let proof_error reason = error @@ dal_proof_error reason - let check_page_proof dal_params proof data pid commitment = + let check_page_proof dal_params proof data ({Page.page_index; _} as pid) + commitment = let open Result_syntax in let* dal = match Dal.make dal_params with | Ok dal -> return dal | Error (`Fail s) -> proof_error s in - let page = {Dal.content = data; index = pid.Page.page_index} in let fail_with_error_msg what = Format.kasprintf proof_error "%s (page id=%a)." what Page.pp pid in - match Dal.verify_page dal commitment page proof with + match Dal.verify_page dal commitment ~page_index data proof with | Ok true -> return () | Ok false -> fail_with_error_msg -- GitLab From 58b7449456957ebb6d0a5b51ea0d45c1b0840323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Thir=C3=A9?= Date: Tue, 15 Nov 2022 20:47:45 +0100 Subject: [PATCH 2/2] Dal/Node: Write an interface for DAL node services --- src/bin_dal_node/RPC_server.ml | 29 ++++----- src/lib_dal_node/dal_node_client.ml | 6 +- src/lib_dal_node/dal_node_client.mli | 5 +- src/lib_dal_node_services/services.ml | 14 ++--- src/lib_dal_node_services/services.mli | 87 ++++++++++++++++++++++++++ 5 files changed, 114 insertions(+), 27 deletions(-) create mode 100644 src/lib_dal_node_services/services.mli diff --git a/src/bin_dal_node/RPC_server.ml b/src/bin_dal_node/RPC_server.ml index 65cedc28e623..bff8f3944a65 100644 --- a/src/bin_dal_node/RPC_server.ml +++ b/src/bin_dal_node/RPC_server.ml @@ -108,25 +108,17 @@ let handle_monitor_slot_headers ctxt () () () = let register_stored_slot_headers ctxt dir = Tezos_rpc.Directory.register dir - (Services.stored_slot_headers ()) + Services.stored_slot_headers (handle_stored_slot_headers ctxt) let register_split_slot ctxt dir = - Tezos_rpc.Directory.register0 - dir - (Services.split_slot ()) - (handle_split_slot ctxt) + Tezos_rpc.Directory.register0 dir Services.split_slot (handle_split_slot ctxt) let register_show_slot ctxt dir = - Tezos_rpc.Directory.register dir (Services.slot ()) (handle_slot ctxt) + Tezos_rpc.Directory.register dir Services.slot (handle_slot ctxt) let register_show_slot_pages ctxt dir = - Tezos_rpc.Directory.register - dir - (Services.slot_pages ()) - (handle_slot_pages ctxt) - -let shard_service = Services.shard () + Tezos_rpc.Directory.register dir Services.slot_pages (handle_slot_pages ctxt) let shards_service : ( [`POST], @@ -136,21 +128,26 @@ let shards_service : int list, Cryptobox.shard list ) Tezos_rpc.Service.service = - Services.shards () + Services.shards let register_shards ctxt dir = Tezos_rpc.Directory.register dir shards_service (handle_shards ctxt) let register_shard ctxt dir = - Tezos_rpc.Directory.register dir shard_service (handle_shard ctxt) + Tezos_rpc.Directory.register dir Services.shard (handle_shard ctxt) let shards_rpc ctxt commitment shards = Tezos_rpc.Context.make_call shards_service ctxt ((), commitment) () shards let shard_rpc ctxt commitment shard = - Tezos_rpc.Context.make_call shard_service ctxt (((), commitment), shard) () () + Tezos_rpc.Context.make_call + Services.shard + ctxt + (((), commitment), shard) + () + () -let monitor_slot_headers_service = Services.monitor_slot_headers () +let monitor_slot_headers_service = Services.monitor_slot_headers let register_monitor_slot_headers ctxt dir = Tezos_rpc.Directory.gen_register diff --git a/src/lib_dal_node/dal_node_client.ml b/src/lib_dal_node/dal_node_client.ml index 6cfdeea6d322..14ebd16f1704 100644 --- a/src/lib_dal_node/dal_node_client.ml +++ b/src/lib_dal_node/dal_node_client.ml @@ -49,10 +49,10 @@ let make_unix_cctxt ~addr ~port = let call (cctxt : #cctxt) = cctxt#call_service let get_slot cctxt ?(trim_slot = false) header = - call cctxt (Services.slot ()) ((), header) trim_slot () + call cctxt Services.slot ((), header) trim_slot () let get_shard cctxt header shard_index = - call cctxt (Services.shard ()) (((), header), shard_index) () () + call cctxt Services.shard (((), header), shard_index) () () let get_slot_pages cctxt header = - call cctxt (Services.slot_pages ()) ((), header) () () + call cctxt Services.slot_pages ((), header) () () diff --git a/src/lib_dal_node/dal_node_client.mli b/src/lib_dal_node/dal_node_client.mli index ae83a88fc358..908df9c8f2ee 100644 --- a/src/lib_dal_node/dal_node_client.mli +++ b/src/lib_dal_node/dal_node_client.mli @@ -42,7 +42,10 @@ class unix_cctxt : val make_unix_cctxt : addr:string -> port:int -> cctxt val get_slot : - #cctxt -> ?trim_slot:bool -> Cryptobox.Commitment.t -> bytes tzresult Lwt.t + #cctxt -> + ?trim_slot:bool -> + Cryptobox.Commitment.t -> + Cryptobox.slot tzresult Lwt.t val get_shard : #cctxt -> Cryptobox.Commitment.t -> int -> Cryptobox.shard tzresult Lwt.t diff --git a/src/lib_dal_node_services/services.ml b/src/lib_dal_node_services/services.ml index a912e9ee7175..175b906cb059 100644 --- a/src/lib_dal_node_services/services.ml +++ b/src/lib_dal_node_services/services.ml @@ -30,7 +30,7 @@ let split_query = |+ flag "fill" (fun fill_x00 -> fill_x00) |> seal -let split_slot () = +let split_slot = Tezos_rpc.Service.post_service ~description:"Split and store a slot" ~query:split_query @@ -45,7 +45,7 @@ let slot_query = |+ flag "trim" (fun trim_x00 -> trim_x00) |> seal -let slot () = +let slot = Tezos_rpc.Service.get_service ~description:"Show content of a slot" ~query:slot_query @@ -53,7 +53,7 @@ let slot () = Tezos_rpc.Path.( open_root / "slot" / "content" /: Cryptobox.Commitment.rpc_arg) -let slot_pages () = +let slot_pages = Tezos_rpc.Service.get_service ~description:"Fetch slot as list of pages" ~query:Tezos_rpc.Query.empty @@ -61,7 +61,7 @@ let slot_pages () = Tezos_rpc.Path.( open_root / "slot" / "pages" /: Cryptobox.Commitment.rpc_arg) -let stored_slot_headers () = +let stored_slot_headers = Tezos_rpc.Service.get_service ~description:"List slot headers for a given block hash" ~query:Tezos_rpc.Query.empty @@ -74,7 +74,7 @@ let stored_slot_headers () = Tezos_rpc.Path.( open_root / "stored_slot_headers" /: Tezos_crypto.Block_hash.rpc_arg) -let shard () = +let shard = let shard_arg = Tezos_rpc.Arg.int in Tezos_rpc.Service.get_service ~description:"Fetch shard as bytes" @@ -83,7 +83,7 @@ let shard () = Tezos_rpc.Path.( open_root / "shard" /: Cryptobox.Commitment.rpc_arg /: shard_arg) -let shards () = +let shards = (* FIXME: https://gitlab.com/tezos/tezos/-/issues/4111 Bound size of the input *) Tezos_rpc.Service.post_service @@ -93,7 +93,7 @@ let shards () = ~input:Data_encoding.(list int31) Tezos_rpc.Path.(open_root / "shards" /: Cryptobox.Commitment.rpc_arg) -let monitor_slot_headers () = +let monitor_slot_headers = Tezos_rpc.Service.get_service ~description:"Monitor stored slot headers" ~query:Tezos_rpc.Query.empty diff --git a/src/lib_dal_node_services/services.mli b/src/lib_dal_node_services/services.mli new file mode 100644 index 000000000000..7b06c7682d18 --- /dev/null +++ b/src/lib_dal_node_services/services.mli @@ -0,0 +1,87 @@ +(*****************************************************************************) +(* *) +(* Open Source License *) +(* Copyright (c) 2022 Nomadic Labs, *) +(* *) +(* 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. *) +(* *) +(*****************************************************************************) + +val split_slot : + ( [`POST], + unit, + unit, + bool, + Tezos_crypto_dal.Cryptobox.slot, + string ) + Tezos_rpc.Service.service + +val slot : + ( [`GET], + unit, + unit * Tezos_crypto_dal.Cryptobox.commitment, + bool, + unit, + Tezos_crypto_dal.Cryptobox.slot ) + Tezos_rpc.Service.service + +val slot_pages : + ( [`GET], + unit, + unit * Tezos_crypto_dal.Cryptobox.commitment, + unit, + unit, + Tezos_crypto_dal.Cryptobox.page list ) + Tezos_rpc.Service.service + +val stored_slot_headers : + ( [`GET], + unit, + unit * Tezos_crypto.Block_hash.t, + unit, + unit, + (int * Tezos_crypto_dal.Cryptobox.commitment) list ) + Tezos_rpc.Service.service + +val shard : + ( [`GET], + unit, + (unit * Tezos_crypto_dal.Cryptobox.commitment) * int, + unit, + unit, + Tezos_crypto_dal.Cryptobox.shard ) + Tezos_rpc.Service.service + +val shards : + ( [`POST], + unit, + unit * Tezos_crypto_dal.Cryptobox.commitment, + unit, + int trace, + Tezos_crypto_dal.Cryptobox.shard list ) + Tezos_rpc.Service.service + +val monitor_slot_headers : + ( [`GET], + unit, + unit, + unit, + unit, + Tezos_crypto_dal.Cryptobox.commitment ) + Tezos_rpc.Service.service -- GitLab