diff --git a/src/bin_dal_node/RPC_server.ml b/src/bin_dal_node/RPC_server.ml index 65cedc28e6230c682a1a51410f992652f03a7643..bff8f3944a65afffbfdfc946a01c5a59ca0aa00b 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_crypto_dal/cryptobox.ml b/src/lib_crypto_dal/cryptobox.ml index ca73444b706c018d670af07c9d0a183ba6daa8d7..7e2b18579c332300f961d053c354a4b86dbe1e42 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 f70a328ed22f7419370c4a8daa2f51772f41fa26..bf1d1d112c61387fda2ff519dc07c53319bca8b5 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 4b5638ecc264869bd482095f51683e614f4990f7..bfeee24f1ca3f05022d79a56557066ff17723e75 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_dal_node/dal_node_client.ml b/src/lib_dal_node/dal_node_client.ml index 6cfdeea6d322d18fcfb56128ba54c5ae87517a4c..14ebd16f1704d7190d947d065766a7b23f4c16db 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 ae83a88fc358af59a037c73b14a1961d3f259717..908df9c8f2eefe9b2a33e46c455f4d03f23b958d 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 a912e9ee7175f17984fa6b1b5a24a00c3c4f89a6..175b906cb059f07db8604852c5e7e77aecdf5c39 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 0000000000000000000000000000000000000000..7b06c7682d18769516eae529d98291d4c5cedb61 --- /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 diff --git a/src/lib_protocol_environment/environment_V7.ml b/src/lib_protocol_environment/environment_V7.ml index ec83aded072611d1a72e891460943251d99687d2..4ffe74e9d44013f8fc4656532c5dfb4c2184fa5a 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 bb973385e1d763c6eea65331cb66eb77dbcf0dcc..5c8d31f62dfb8e864ad8f2294b5414e6eea5a332 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 7950e6e1ea2055c46e1b43d0322a43f6a49d7caf..591fe878f5a79d96132acde220f05d5edfa5d261 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 b3c8609b69afd2ef3439f6a07c1d1de08a9ee114..af0696b1d06ba14e505ce6609cfaed0f0220dda5 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