From 9ff42c27ec43c9ce978194243c2f5307e952d501 Mon Sep 17 00:00:00 2001 From: Anne-Laure Date: Thu, 11 Jan 2024 08:34:50 +0100 Subject: [PATCH 1/4] Crypto_dal/Cryptobox: split prover & verifier SRS & add functions to generate verifier SRS --- src/lib_crypto_dal/cryptobox.ml | 215 +++++++++++++----- src/lib_crypto_dal/cryptobox.mli | 30 ++- src/lib_crypto_dal/test/test_dal_cryptobox.ml | 53 +++-- 3 files changed, 224 insertions(+), 74 deletions(-) diff --git a/src/lib_crypto_dal/cryptobox.ml b/src/lib_crypto_dal/cryptobox.ml index 18d9519307cb..332945e97199 100644 --- a/src/lib_crypto_dal/cryptobox.ml +++ b/src/lib_crypto_dal/cryptobox.ml @@ -47,7 +47,15 @@ let () = (fun parameter -> Failed_to_load_trusted_setup parameter) [@@coverage off] -type initialisation_parameters = {srs_g1 : Srs_g1.t; srs_g2 : Srs_g2.t} +type srs_user = Prover | Verifier + +type prover_raw_srs = {srs_g1 : Srs_g1.t; srs_g2 : Srs_g2.t} + +type verifier_raw_srs = {srs_g1 : Srs_g1.t; srs_g2 : Srs_g2.t} + +type initialisation_parameters = + | Prover_init_param of prover_raw_srs + | Verifier_init_param of verifier_raw_srs (* Initialisation parameters are supposed to be instantiated once. *) let initialisation_parameters = ref None @@ -80,7 +88,7 @@ let load_parameters parameters = An integrity check is run to ensure the validity of the files. *) -let initialisation_parameters_from_files ~srs_g1_path ~srs_g2_path +let initialisation_parameters_from_files ~srs_user ~srs_g1_path ~srs_g2_path ~srs_size_log2 = let open Lwt_result_syntax in let len = 1 lsl srs_size_log2 in @@ -123,17 +131,28 @@ let initialisation_parameters_from_files ~srs_g1_path ~srs_g2_path | Error (`Invalid_point p) -> tzfail (Failed_to_load_trusted_setup (Printf.sprintf "Invalid point %i" p)) - | Ok (srs_g1, srs_g2) -> return {srs_g1; srs_g2} + | Ok (srs_g1, srs_g2) -> ( + match srs_user with + | Prover -> return (Prover_init_param {srs_g1; srs_g2}) + | Verifier -> return (Verifier_init_param {srs_g1; srs_g2})) (* The srs is made of the initialisation_parameters and two well-choosen points. Building the srs from the initialisation parameters is almost cost-free. *) -type srs = { - raw : initialisation_parameters; +type prover_srs = { + raw : prover_raw_srs; + kate_amortized_srs_g2_shards : G2.t; + kate_amortized_srs_g2_pages : G2.t; +} + +type verifier_srs = { + raw : verifier_raw_srs; kate_amortized_srs_g2_shards : G2.t; kate_amortized_srs_g2_pages : G2.t; } +type srs = Prove of prover_srs | Verify of verifier_srs + module Inner = struct module Commitment = struct include Kzg.Commitment.Single @@ -530,23 +549,38 @@ module Inner = struct | None -> fail (`Fail "Dal_cryptobox.make: DAL was not initialised.") | Some srs -> return srs in + let srs_g1, srs_g2 = + match raw with + | Prover_init_param {srs_g1; srs_g2} -> (srs_g1, srs_g2) + | Verifier_init_param {srs_g1; srs_g2} -> (srs_g1, srs_g2) + in let* () = ensure_validity ~slot_size ~page_size ~redundancy_factor ~number_of_shards - ~srs_g1_length:(Srs_g1.size raw.srs_g1) - ~srs_g2_length:(Srs_g2.size raw.srs_g2) + ~srs_g1_length:(Srs_g1.size srs_g1) + ~srs_g2_length:(Srs_g2.size srs_g2) in let page_length = page_length ~page_size in let page_length_domain, _, _ = FFT.select_fft_domain page_length in let srs = - { - raw; - kate_amortized_srs_g2_shards = Srs_g2.get raw.srs_g2 shard_length; - kate_amortized_srs_g2_pages = Srs_g2.get raw.srs_g2 page_length_domain; - } + match raw with + | Prover_init_param raw -> + Prove + { + raw; + kate_amortized_srs_g2_shards = Srs_g2.get srs_g2 shard_length; + kate_amortized_srs_g2_pages = Srs_g2.get srs_g2 page_length_domain; + } + | Verifier_init_param raw -> + Verify + { + raw; + kate_amortized_srs_g2_shards = Srs_g2.get srs_g2 shard_length; + kate_amortized_srs_g2_pages = Srs_g2.get srs_g2 page_length_domain; + } in return { @@ -568,12 +602,7 @@ module Inner = struct remaining_bytes = page_size mod scalar_bytes_amount; srs; kate_amortized = - { - max_polynomial_length; - shard_length; - srs_g1 = srs.raw.srs_g1; - number_of_shards; - }; + {max_polynomial_length; shard_length; srs_g1; number_of_shards}; } let parameters @@ -1014,20 +1043,28 @@ module Inner = struct Ok (Poly.truncate ~len:t.max_polynomial_length p) let commit t p = - try Ok (Commitment.commit t.srs.raw.srs_g1 p) - with Kzg.Commitment.SRS_too_short _ -> - Error - (`Invalid_degree_strictly_less_than_expected - {given = Poly.degree p; expected = Srs_g1.size t.srs.raw.srs_g1}) - - let pp_commit_error fmt - (`Invalid_degree_strictly_less_than_expected {given; expected}) = - Format.fprintf - fmt - "Invalid degree: expecting input polynomial to commit function to have a \ - degree strictly less than %d. Got %d." - expected - given + match t.srs with + | Verify _ -> Error `Prover_SRS_not_loaded + | Prove srs -> ( + try Ok (Commitment.commit srs.raw.srs_g1 p) + with Kzg.Commitment.SRS_too_short _ -> + Error + (`Invalid_degree_strictly_less_than_expected + {given = Poly.degree p; expected = Srs_g1.size srs.raw.srs_g1})) + + let pp_commit_error fmt = function + | `Invalid_degree_strictly_less_than_expected {given; expected} -> + Format.fprintf + fmt + "Invalid degree: expecting input polynomial to commit function to \ + have a degree strictly less than %d. Got %d." + expected + given + | `Prover_SRS_not_loaded -> + Format.fprintf + fmt + "The prover's SRS was not loaded: cannot commit a polynomial without \ + the prover's SRS." let string_of_commit_error err = Format.asprintf "%a" pp_commit_error err @@ -1046,29 +1083,36 @@ module Inner = struct (* FIXME https://gitlab.com/tezos/tezos/-/issues/4192 Generalize this function to pass the slot_size in parameter. *) - let prove_commitment - ({srs = {raw = {srs_g1; _}; _}; max_polynomial_length; _} : t) p = - if Srs_g1.size srs_g1 >= max_polynomial_length then - Ok - (Degree_check.prove - ~max_commit:(Srs_g1.size srs_g1 - 1) - ~max_degree:(max_polynomial_length - 1) - srs_g1 - p) - else - Error - (`Invalid_degree_strictly_less_than_expected - {given = max_polynomial_length; expected = Srs_g1.size srs_g1}) + let prove_commitment ({srs; max_polynomial_length; _} : t) p = + match srs with + | Verify _ -> Error `Prover_SRS_not_loaded + | Prove {raw = {srs_g1; _}; _} -> + if Srs_g1.size srs_g1 >= max_polynomial_length then + Ok + (Degree_check.prove + ~max_commit:(Srs_g1.size srs_g1 - 1) + ~max_degree:(max_polynomial_length - 1) + srs_g1 + p) + else + Error + (`Invalid_degree_strictly_less_than_expected + {given = max_polynomial_length; expected = Srs_g1.size srs_g1}) (* Verifies that the degree of the committed polynomial is < t.max_polynomial_length *) let verify_commitment (t : t) cm proof = + let srs_g1, srs_g2 = + match t.srs with + | Prove srs -> (srs.raw.srs_g1, srs.raw.srs_g2) + | Verify srs -> (srs.raw.srs_g1, srs.raw.srs_g2) + in let max_allowed_committed_poly_degree = t.max_polynomial_length - 1 in - let max_committable_degree = Srs_g1.size t.srs.raw.srs_g1 - 1 in + let max_committable_degree = Srs_g1.size srs_g1 - 1 in let offset_monomial_degree = max_committable_degree - max_allowed_committed_poly_degree in - let srs_0 = Srs_g2.get t.srs.raw.srs_g2 0 in - let srs_n_d = Srs_g2.get t.srs.raw.srs_g2 offset_monomial_degree in + let srs_0 = Srs_g2.get srs_g2 0 in + let srs_n_d = Srs_g2.get srs_g2 offset_monomial_degree in Degree_check.verify {srs_0; srs_n_d} cm proof let save_precompute_shards_proofs precomputation ~filename = @@ -1155,7 +1199,11 @@ module Inner = struct Domain.get t.domain_erasure_encoded_polynomial_length shard_index in let domain = Domain.build t.shard_length in - let srs_point = t.srs.kate_amortized_srs_g2_shards in + let srs_point = + match t.srs with + | Prove srs -> srs.kate_amortized_srs_g2_shards + | Verify srs -> srs.kate_amortized_srs_g2_shards + in if Kate_amortized.verify t.kate_amortized @@ -1221,11 +1269,16 @@ module Inner = struct | _ -> Scalar.(copy zero)) in let root = Domain.get t.domain_polynomial_length page_index in + let srs_point = + match t.srs with + | Prove srs -> srs.kate_amortized_srs_g2_pages + | Verify srs -> srs.kate_amortized_srs_g2_pages + in if Kate_amortized.verify t.kate_amortized ~commitment - ~srs_point:t.srs.kate_amortized_srs_g2_pages + ~srs_point ~domain ~root ~evaluations @@ -1259,7 +1312,30 @@ module Internal_for_tests = struct let srs_g2 = Srs_g2.generate_insecure (max length evaluations_per_proof + 1) secret in - {srs_g1; srs_g2} + Prover_init_param {srs_g1; srs_g2} + + let parameters_initialisation_verifier + {slot_size; page_size; number_of_shards; redundancy_factor; _} = + let length = slot_as_polynomial_length ~slot_size ~page_size in + let secret = + Scalar.of_string + "20812168509434597367146703229805575690060615791308155437936410982393987532344" + in + let srs_g1 = Srs_g1.generate_insecure length secret in + (* The error is caught during the instantiation through [make]. *) + let erasure_encoded_polynomial_length = redundancy_factor * length in + let evaluations_per_proof = + match erasure_encoded_polynomial_length / number_of_shards with + | exception Invalid_argument _ -> 0 + | x -> x + in + (* The cryptobox will read at indices `size`, `1 lsl evaluations_per_proof_log` + and `page_length` so we take the max + 1. Since `page_length < size`, we + can remove the `page_length from the max. *) + let srs_g2 = + Srs_g2.generate_insecure (max length evaluations_per_proof + 1) secret + in + Verifier_init_param {srs_g1; srs_g2} let load_parameters parameters = initialisation_parameters := Some parameters @@ -1319,7 +1395,13 @@ module Internal_for_tests = struct Poly.init (degree + 1) (fun i -> if i = degree then nonzero () else Scalar.random ~state ()) - let srs_size_g1 t = Srs_g1.size t.srs.raw.srs_g1 + let srs_size_g1 t = + let srs_g1 = + match t.srs with + | Prove {raw = {srs_g1; _}; _} -> srs_g1 + | Verify {raw = {srs_g1; _}; _} -> srs_g1 + in + Srs_g1.size srs_g1 let encoded_share_size = encoded_share_size @@ -1339,13 +1421,18 @@ module Internal_for_tests = struct | None -> fail (`Fail "Dal_cryptobox.make: DAL was not initialisated.") | Some srs -> return srs in + let srs_g1, srs_g2 = + match raw with + | Prover_init_param {srs_g1; srs_g2} -> (srs_g1, srs_g2) + | Verifier_init_param {srs_g1; srs_g2} -> (srs_g1, srs_g2) + in ensure_validity ~slot_size ~page_size ~redundancy_factor ~number_of_shards - ~srs_g1_length:(Srs_g1.size raw.srs_g1) - ~srs_g2_length:(Srs_g2.size raw.srs_g2) + ~srs_g1_length:(Srs_g1.size srs_g1) + ~srs_g2_length:(Srs_g2.size srs_g2) let ensure_validity parameters = match ensure_validity parameters with Ok _ -> true | _ -> false @@ -1374,6 +1461,26 @@ module Config = struct | None -> let*? srs_g1_path, srs_g2_path = find_srs_files () in initialisation_parameters_from_files + ~srs_user:Prover + ~srs_g1_path + ~srs_g2_path + ~srs_size_log2 + in + Lwt.return (load_parameters initialisation_parameters) + else return_unit + + let init_dal_verifier ~find_srs_files ?(srs_size_log2 = 21) dal_config = + let open Lwt_result_syntax in + if dal_config.activated then + let* initialisation_parameters = + match dal_config.use_mock_srs_for_testing with + | Some parameters -> + return + (Internal_for_tests.parameters_initialisation_verifier parameters) + | None -> + let*? srs_g1_path, srs_g2_path = find_srs_files () in + initialisation_parameters_from_files + ~srs_user:Verifier ~srs_g1_path ~srs_g2_path ~srs_size_log2 diff --git a/src/lib_crypto_dal/cryptobox.mli b/src/lib_crypto_dal/cryptobox.mli index 9b5170c178f0..463a198a03da 100644 --- a/src/lib_crypto_dal/cryptobox.mli +++ b/src/lib_crypto_dal/cryptobox.mli @@ -201,19 +201,21 @@ val commit : t -> polynomial -> ( commitment, - [> `Invalid_degree_strictly_less_than_expected of (int, int) error_container] - ) + [> `Invalid_degree_strictly_less_than_expected of (int, int) error_container + | `Prover_SRS_not_loaded ] ) Result.t (** [pp_commit_error fmt error] pretty-prints the error returned by {!val:commit}. *) val pp_commit_error : Format.formatter -> - [< `Invalid_degree_strictly_less_than_expected of (int, int) error_container] -> + [< `Invalid_degree_strictly_less_than_expected of (int, int) error_container + | `Prover_SRS_not_loaded ] -> unit (** [string_of_commit_error error] returns an error string message for [error]. *) val string_of_commit_error : - [< `Invalid_degree_strictly_less_than_expected of (int, int) error_container] -> + [< `Invalid_degree_strictly_less_than_expected of (int, int) error_container + | `Prover_SRS_not_loaded ] -> string (** A portion of the data represented by a polynomial. *) @@ -329,8 +331,8 @@ val prove_commitment : t -> polynomial -> ( commitment_proof, - [> `Invalid_degree_strictly_less_than_expected of (int, int) error_container] - ) + [> `Invalid_degree_strictly_less_than_expected of (int, int) error_container + | `Prover_SRS_not_loaded ] ) Result.t (** [prove_page t polynomial n] produces a proof for the [n]-th page of @@ -359,7 +361,8 @@ val prove_page : int -> ( page_proof, [> `Invalid_degree_strictly_less_than_expected of (int, int) error_container - | `Page_index_out_of_range ] ) + | `Page_index_out_of_range + | `Prover_SRS_not_loaded ] ) Result.t (** The precomputation used to produce shard proofs. *) @@ -430,6 +433,11 @@ module Internal_for_tests : sig be around 1 minute for a size of 1MiB. *) val parameters_initialisation : parameters -> initialisation_parameters + (** Same as [parameters_initialisation] but the resulting + initialisation_parameters will be tagged for the verifier *) + val parameters_initialisation_verifier : + parameters -> initialisation_parameters + (** Same as {!val:load_parameters} except it erase parameters if they were already loaded. This is used to circumvent limitation from test frameworks where tests with various parameters could be @@ -551,4 +559,12 @@ module Config : sig ?srs_size_log2:int -> t -> unit Error_monad.tzresult Lwt.t + + (** For now, it’s a duplicate of [init_dal]. In the future it will initialize + the DAL verification, loading only the SRS part needed for verification *) + val init_dal_verifier : + find_srs_files:(unit -> (string * string) Error_monad.tzresult) -> + ?srs_size_log2:int -> + t -> + unit Error_monad.tzresult Lwt.t end diff --git a/src/lib_crypto_dal/test/test_dal_cryptobox.ml b/src/lib_crypto_dal/test/test_dal_cryptobox.ml index 97b59a3d6421..0b2138dca3f1 100644 --- a/src/lib_crypto_dal/test/test_dal_cryptobox.ml +++ b/src/lib_crypto_dal/test/test_dal_cryptobox.ml @@ -56,24 +56,31 @@ module Test = struct (* The set of parameters maximizing the SRS length, and which is in the codomain of [generate_parameters]. *) - let max_parameters = - lazy - (let max_parameters : Cryptobox.parameters = - { - (* The +1 is here to ensure that the SRS will be large enough for the - erasure polynomial *) - slot_size = 1 lsl (max_slot_size_log2 + 1); - page_size = 1 lsl max_page_size_log2; - redundancy_factor = 1 lsl max_redundancy_factor_log2; - number_of_shards = 1; - } - in - Cryptobox.Internal_for_tests.parameters_initialisation max_parameters) + let max_parameters, max_parameters_verifier = + let max_parameters : Cryptobox.parameters = + { + (* The +1 is here to ensure that the SRS will be large enough for the + erasure polynomial *) + slot_size = 1 lsl (max_slot_size_log2 + 1); + page_size = 1 lsl max_page_size_log2; + redundancy_factor = 1 lsl max_redundancy_factor_log2; + number_of_shards = 1; + } + in + ( lazy + (Cryptobox.Internal_for_tests.parameters_initialisation max_parameters), + lazy + (Cryptobox.Internal_for_tests.parameters_initialisation_verifier + max_parameters) ) (* Initializes the DAL parameters *) let init () = Cryptobox.Internal_for_tests.load_parameters (Lazy.force max_parameters) + let init_verifier () = + Cryptobox.Internal_for_tests.load_parameters + (Lazy.force max_parameters_verifier) + type parameters = { slot_size : int; page_size : int; @@ -374,6 +381,8 @@ module Test = struct (page_index * params.page_size) params.page_size in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in Cryptobox.verify_page t commitment ~page_index page page_proof) |> function | Ok () -> true @@ -405,6 +414,8 @@ module Test = struct (page_index * params.page_size) params.page_size in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in Cryptobox.verify_page t commitment ~page_index page altered_proof) |> function | Error `Invalid_page -> true @@ -440,6 +451,8 @@ module Test = struct (the queried index is out of bounds) doesn't happen. *) assert false | Some shard -> + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in Cryptobox.verify_shard t commitment @@ -499,6 +512,8 @@ module Test = struct Cryptobox.Internal_for_tests.alter_shard_proof shard_proofs.(shard_index) in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in Cryptobox.verify_shard t commitment shard altered_proof) |> function | Error `Invalid_shard -> true @@ -520,6 +535,8 @@ module Test = struct let* polynomial = Cryptobox.polynomial_from_slot t params.slot in let* commitment = Cryptobox.commit t polynomial in let* commitment_proof = Cryptobox.prove_commitment t polynomial in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in return (Cryptobox.verify_commitment t commitment commitment_proof)) |> function | Ok true -> true @@ -542,6 +559,8 @@ module Test = struct let altered_proof = Cryptobox.Internal_for_tests.alter_commitment_proof commitment_proof in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in return (Cryptobox.verify_commitment t commitment altered_proof)) |> function | Ok false -> true @@ -744,6 +763,8 @@ module Test = struct let page_index = randrange (Cryptobox.Internal_for_tests.number_of_pages t) in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in Cryptobox.verify_page t commitment ~page_index page page_proof) |> function | Error `Page_length_mismatch -> true @@ -773,6 +794,8 @@ module Test = struct let shard_proof = Cryptobox.Internal_for_tests.dummy_shard_proof ~state () in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in Cryptobox.verify_shard t commitment shard shard_proof) |> function | Error `Shard_length_mismatch -> true @@ -827,6 +850,8 @@ module Test = struct ~min:0 ~max:(Cryptobox.Internal_for_tests.number_of_pages t) in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in Cryptobox.verify_page t commitment ~page_index page page_proof) |> function | Error `Page_index_out_of_range -> true @@ -861,6 +886,8 @@ module Test = struct ~index:shard_index ~length:(Cryptobox.Internal_for_tests.shard_length t) in + init_verifier () ; + let* t = Cryptobox.make (get_cryptobox_parameters params) in Cryptobox.verify_shard t commitment shard shard_proof) |> function | Error (`Shard_index_out_of_range _) -> true -- GitLab From d88f86472e7d77ea3cfa4d80d1c13c4dc7081903 Mon Sep 17 00:00:00 2001 From: Anne-Laure Date: Mon, 15 Jan 2024 11:14:00 +0100 Subject: [PATCH 2/4] Crypto_dal/Cryptobox: update comments --- src/lib_crypto_dal/cryptobox.ml | 2 ++ src/lib_crypto_dal/cryptobox.mli | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lib_crypto_dal/cryptobox.ml b/src/lib_crypto_dal/cryptobox.ml index 332945e97199..7da8ecd04984 100644 --- a/src/lib_crypto_dal/cryptobox.ml +++ b/src/lib_crypto_dal/cryptobox.ml @@ -1314,6 +1314,8 @@ module Internal_for_tests = struct in Prover_init_param {srs_g1; srs_g2} + (* This function is duplicated from parameters_initialisation for now. + At some point the two functions will differ *) let parameters_initialisation_verifier {slot_size; page_size; number_of_shards; redundancy_factor; _} = let length = slot_as_polynomial_length ~slot_size ~page_size in diff --git a/src/lib_crypto_dal/cryptobox.mli b/src/lib_crypto_dal/cryptobox.mli index 463a198a03da..970d1037c87c 100644 --- a/src/lib_crypto_dal/cryptobox.mli +++ b/src/lib_crypto_dal/cryptobox.mli @@ -196,7 +196,10 @@ val polynomial_to_slot : t -> polynomial -> slot polynomial [p]. Fails with [`Invalid_degree_strictly_less_than_expected _] - if the degree of [p] exceeds the SRS size. *) + if the degree of [p] exceeds the SRS size. + + Fails with [`Prover_SRS_not_loaded] if the prover’s SRS is not loaded + (ie: [init_dal_verifier] has been used to load the SRS). *) val commit : t -> polynomial -> @@ -326,7 +329,9 @@ val verify_shard : Fails with: - [Error `Invalid_degree_strictly_less_than_expected _] if the SRS - contained in [t] is too small to produce the proof *) + contained in [t] is too small to produce the proof + - [Error `Prover_SRS_not_loaded] if the prover’s SRS is not loaded + (ie: [init_dal_verifier] has been used to load the SRS). *) val prove_commitment : t -> polynomial -> @@ -347,6 +352,8 @@ val prove_commitment : - [Error (`Page_index_out_of_range msg)] if the page index is not within the range [0, slot_size/page_size - 1] (where [slot_size] and [page_size] are found in [t]). + - [Error `Prover_SRS_not_loaded] if the SRS has been loaded with + [init_dal_verifier]. Ensures: - [verify_page t commitment ~page_index page page_proof = Ok ()] if -- GitLab From e0026bed665829712b056475b31961a5e7c2923b Mon Sep 17 00:00:00 2001 From: Anne-Laure Date: Mon, 15 Jan 2024 11:43:10 +0100 Subject: [PATCH 3/4] =?UTF-8?q?DAL=20node,=20Protocol:=20adapt=20the=20cod?= =?UTF-8?q?e=20to=20the=20new=20DAL=E2=80=99s=20error=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bin_dal_node/RPC_server.ml | 4 +++- src/bin_dal_node/daemon.ml | 1 + src/bin_dal_node/slot_manager.ml | 2 ++ src/bin_dal_node/slot_manager_legacy.ml | 13 ++++++++++++- .../lib_protocol/test/helpers/dal_helpers.ml | 8 ++++++-- .../lib_sc_rollup_node/refutation_game_helpers.ml | 3 ++- .../lib_benchmarks_proto/dal_benchmarks.ml | 1 + .../lib_protocol/test/helpers/dal_helpers.ml | 8 ++++++-- .../lib_sc_rollup_node/refutation_game_helpers.ml | 3 ++- .../lib_benchmarks_proto/dal_benchmarks.ml | 1 + .../lib_protocol/test/helpers/dal_helpers.ml | 8 ++++++-- .../lib_sc_rollup_node/refutation_game_helpers.ml | 3 ++- tezt/lib_tezos/dal_common.ml | 3 ++- tezt/lib_tezos/dal_common.mli | 1 + tezt/tests/dal.ml | 4 +++- 15 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/bin_dal_node/RPC_server.ml b/src/bin_dal_node/RPC_server.ml index 9f1de7d10698..233401b28d7d 100644 --- a/src/bin_dal_node/RPC_server.ml +++ b/src/bin_dal_node/RPC_server.ml @@ -109,7 +109,9 @@ module Slots_handlers = struct (* [polynomial] was produced with the parameters from [cryptobox], thus we can always compute the proof from [polynomial] except if an error happens with the loading of the SRS. *) - | Error (`Invalid_degree_strictly_less_than_expected _) -> + | Error + ( `Invalid_degree_strictly_less_than_expected _ + | `Prover_SRS_not_loaded ) -> tzfail (Cryptobox_error ( "prove_commitment", diff --git a/src/bin_dal_node/daemon.ml b/src/bin_dal_node/daemon.ml index 2503b9667ab7..401517741ac9 100644 --- a/src/bin_dal_node/daemon.ml +++ b/src/bin_dal_node/daemon.ml @@ -132,6 +132,7 @@ module Handler = struct | `Shard_index_out_of_range s -> Format.sprintf "Shard_index_out_of_range(%s)" s | `Shard_length_mismatch -> "Shard_length_mismatch" + | `Prover_SRS_not_loaded -> "Prover_SRS_not_loaded" in Event.( emit__dont_wait__use_with_care diff --git a/src/bin_dal_node/slot_manager.ml b/src/bin_dal_node/slot_manager.ml index 86442c26033d..030f8a705621 100644 --- a/src/bin_dal_node/slot_manager.ml +++ b/src/bin_dal_node/slot_manager.ml @@ -28,6 +28,7 @@ include Slot_manager_legacy type error += | Invalid_slot_size of {provided : int; expected : int} | Invalid_degree of string + | No_prover_SRS let () = register_error_kind @@ -76,6 +77,7 @@ let commit cryptobox polynomial = Error (Errors.other [Invalid_degree (Cryptobox.string_of_commit_error commit_error)]) + | Error `Prover_SRS_not_loaded -> Error (Errors.other [No_prover_SRS]) let commitment_should_exist node_store cryptobox commitment = let open Lwt_result_syntax in diff --git a/src/bin_dal_node/slot_manager_legacy.ml b/src/bin_dal_node/slot_manager_legacy.ml index 0f4183b2492a..07c9b69db46f 100644 --- a/src/bin_dal_node/slot_manager_legacy.ml +++ b/src/bin_dal_node/slot_manager_legacy.ml @@ -32,6 +32,7 @@ type error += | Illformed_pages | Invalid_shards_commitment_association | Invalid_degree_strictly_less_than_expected of {given : int; expected : int} + | Prover_SRS_not_loaded let () = register_error_kind @@ -122,7 +123,16 @@ let () = Some (given, expected) | _ -> None) (fun (given, expected) -> - Invalid_degree_strictly_less_than_expected {given; expected}) + Invalid_degree_strictly_less_than_expected {given; expected}) ; + register_error_kind + `Permanent + ~id:"dal.node.prover_srs_not_loaded" + ~title:"Prover SRS not loaded" + ~description:"The SRS for the prover was not loaded." + ~pp:(fun ppf () -> Cryptobox.pp_commit_error ppf `Prover_SRS_not_loaded) + Data_encoding.(unit) + (function Prover_SRS_not_loaded -> Some () | _ -> None) + (fun () -> Prover_SRS_not_loaded) type slot = bytes @@ -142,6 +152,7 @@ let commit cryptobox polynomial = (`Invalid_degree_strictly_less_than_expected Cryptobox.{given; expected}) -> Error [Invalid_degree_strictly_less_than_expected {given; expected}] + | Error `Prover_SRS_not_loaded -> Error [Prover_SRS_not_loaded] let save_shards store cryptobox commitment shards = let open Lwt_result_syntax in diff --git a/src/proto_017_PtNairob/lib_protocol/test/helpers/dal_helpers.ml b/src/proto_017_PtNairob/lib_protocol/test/helpers/dal_helpers.ml index 9aec26826fca..342430288665 100644 --- a/src/proto_017_PtNairob/lib_protocol/test/helpers/dal_helpers.ml +++ b/src/proto_017_PtNairob/lib_protocol/test/helpers/dal_helpers.ml @@ -105,7 +105,9 @@ struct let open Result_syntax in match Cryptobox.commit cryptobox polynomial with | Ok cm -> return cm - | Error (`Invalid_degree_strictly_less_than_expected _ as commit_error) -> + | Error + ((`Invalid_degree_strictly_less_than_expected _ | `Prover_SRS_not_loaded) + as commit_error) -> fail [Test_failure (Cryptobox.string_of_commit_error commit_error)] let dal_mk_prove_page polynomial page_id = @@ -115,7 +117,9 @@ struct | Ok p -> return p | Error `Page_index_out_of_range -> fail [Test_failure "compute_proof_segment: Page_index_out_of_range"] - | Error (`Invalid_degree_strictly_less_than_expected _ as commit_error) -> + | Error + ((`Invalid_degree_strictly_less_than_expected _ | `Prover_SRS_not_loaded) + as commit_error) -> fail [Test_failure (Cryptobox.string_of_commit_error commit_error)] let mk_slot ?(level = level_one) ?(index = Slot_index.zero) diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/refutation_game_helpers.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/refutation_game_helpers.ml index f0e61a5e4255..d6bf05efad95 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/refutation_game_helpers.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/refutation_game_helpers.ml @@ -55,7 +55,8 @@ let page_membership_proof params page_index slot_data = | `Fail s -> "Fail " ^ s | `Page_index_out_of_range -> "Page_index_out_of_range" | `Slot_wrong_size s -> "Slot_wrong_size: " ^ s - | `Invalid_degree_strictly_less_than_expected _ as commit_error -> + | ( `Invalid_degree_strictly_less_than_expected _ + | `Prover_SRS_not_loaded ) as commit_error -> Cryptobox.string_of_commit_error commit_error) (** When the PVM is waiting for a Dal page input, this function attempts to diff --git a/src/proto_018_Proxford/lib_benchmarks_proto/dal_benchmarks.ml b/src/proto_018_Proxford/lib_benchmarks_proto/dal_benchmarks.ml index 763efd2837fb..26b8ddea1581 100644 --- a/src/proto_018_Proxford/lib_benchmarks_proto/dal_benchmarks.ml +++ b/src/proto_018_Proxford/lib_benchmarks_proto/dal_benchmarks.ml @@ -104,6 +104,7 @@ module Publish_slot_header : Benchmark.S = struct expected=%d}" given expected + | `Prover_SRS_not_loaded -> "Prover_SRS_not_loaded" in failwith "Dal_benchmarks: failed to generate operation (%s)" msg in diff --git a/src/proto_018_Proxford/lib_protocol/test/helpers/dal_helpers.ml b/src/proto_018_Proxford/lib_protocol/test/helpers/dal_helpers.ml index 4f0a0ff51e65..141643b6a640 100644 --- a/src/proto_018_Proxford/lib_protocol/test/helpers/dal_helpers.ml +++ b/src/proto_018_Proxford/lib_protocol/test/helpers/dal_helpers.ml @@ -105,7 +105,9 @@ struct let open Result_syntax in match Cryptobox.commit cryptobox polynomial with | Ok cm -> return cm - | Error (`Invalid_degree_strictly_less_than_expected _ as commit_error) -> + | Error + ((`Invalid_degree_strictly_less_than_expected _ | `Prover_SRS_not_loaded) + as commit_error) -> fail [Test_failure (Cryptobox.string_of_commit_error commit_error)] let dal_mk_prove_page polynomial page_id = @@ -115,7 +117,9 @@ struct | Ok p -> return p | Error `Page_index_out_of_range -> fail [Test_failure "compute_proof_segment: Page_index_out_of_range"] - | Error (`Invalid_degree_strictly_less_than_expected _ as commit_error) -> + | Error + ((`Invalid_degree_strictly_less_than_expected _ | `Prover_SRS_not_loaded) + as commit_error) -> fail [Test_failure (Cryptobox.string_of_commit_error commit_error)] let mk_slot ?(level = level_one) ?(index = Slot_index.zero) diff --git a/src/proto_018_Proxford/lib_sc_rollup_node/refutation_game_helpers.ml b/src/proto_018_Proxford/lib_sc_rollup_node/refutation_game_helpers.ml index 0d27c636cd6e..abe1f5a62758 100644 --- a/src/proto_018_Proxford/lib_sc_rollup_node/refutation_game_helpers.ml +++ b/src/proto_018_Proxford/lib_sc_rollup_node/refutation_game_helpers.ml @@ -55,7 +55,8 @@ let page_membership_proof params page_index slot_data = | `Fail s -> "Fail " ^ s | `Page_index_out_of_range -> "Page_index_out_of_range" | `Slot_wrong_size s -> "Slot_wrong_size: " ^ s - | `Invalid_degree_strictly_less_than_expected _ as commit_error -> + | ( `Invalid_degree_strictly_less_than_expected _ + | `Prover_SRS_not_loaded ) as commit_error -> Cryptobox.string_of_commit_error commit_error) (** When the PVM is waiting for a Dal page input, this function attempts to diff --git a/src/proto_alpha/lib_benchmarks_proto/dal_benchmarks.ml b/src/proto_alpha/lib_benchmarks_proto/dal_benchmarks.ml index 763efd2837fb..26b8ddea1581 100644 --- a/src/proto_alpha/lib_benchmarks_proto/dal_benchmarks.ml +++ b/src/proto_alpha/lib_benchmarks_proto/dal_benchmarks.ml @@ -104,6 +104,7 @@ module Publish_slot_header : Benchmark.S = struct expected=%d}" given expected + | `Prover_SRS_not_loaded -> "Prover_SRS_not_loaded" in failwith "Dal_benchmarks: failed to generate operation (%s)" msg in diff --git a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml index 4f0a0ff51e65..141643b6a640 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/dal_helpers.ml @@ -105,7 +105,9 @@ struct let open Result_syntax in match Cryptobox.commit cryptobox polynomial with | Ok cm -> return cm - | Error (`Invalid_degree_strictly_less_than_expected _ as commit_error) -> + | Error + ((`Invalid_degree_strictly_less_than_expected _ | `Prover_SRS_not_loaded) + as commit_error) -> fail [Test_failure (Cryptobox.string_of_commit_error commit_error)] let dal_mk_prove_page polynomial page_id = @@ -115,7 +117,9 @@ struct | Ok p -> return p | Error `Page_index_out_of_range -> fail [Test_failure "compute_proof_segment: Page_index_out_of_range"] - | Error (`Invalid_degree_strictly_less_than_expected _ as commit_error) -> + | Error + ((`Invalid_degree_strictly_less_than_expected _ | `Prover_SRS_not_loaded) + as commit_error) -> fail [Test_failure (Cryptobox.string_of_commit_error commit_error)] let mk_slot ?(level = level_one) ?(index = Slot_index.zero) diff --git a/src/proto_alpha/lib_sc_rollup_node/refutation_game_helpers.ml b/src/proto_alpha/lib_sc_rollup_node/refutation_game_helpers.ml index 3fd78b511299..629c6e8a52ba 100644 --- a/src/proto_alpha/lib_sc_rollup_node/refutation_game_helpers.ml +++ b/src/proto_alpha/lib_sc_rollup_node/refutation_game_helpers.ml @@ -54,7 +54,8 @@ let page_membership_proof params page_index slot_data = | `Fail s -> "Fail " ^ s | `Page_index_out_of_range -> "Page_index_out_of_range" | `Slot_wrong_size s -> "Slot_wrong_size: " ^ s - | `Invalid_degree_strictly_less_than_expected _ as commit_error -> + | ( `Invalid_degree_strictly_less_than_expected _ + | `Prover_SRS_not_loaded ) as commit_error -> Cryptobox.string_of_commit_error commit_error) (** When the PVM is waiting for a Dal page input, this function attempts to diff --git a/tezt/lib_tezos/dal_common.ml b/tezt/lib_tezos/dal_common.ml index a49541c9890a..082b53818230 100644 --- a/tezt/lib_tezos/dal_common.ml +++ b/tezt/lib_tezos/dal_common.ml @@ -456,7 +456,8 @@ module Commitment = struct function | `Slot_wrong_size str -> Test.fail "Dal_common.dummy_commitment failed: %s" str - | `Invalid_degree_strictly_less_than_expected _ as commit_error -> + | ( `Invalid_degree_strictly_less_than_expected _ + | `Prover_SRS_not_loaded ) as commit_error -> Test.fail "%s" (Cryptobox.string_of_commit_error commit_error)) cryptobox message = let parameters = Cryptobox.Verifier.parameters cryptobox in diff --git a/tezt/lib_tezos/dal_common.mli b/tezt/lib_tezos/dal_common.mli index fd82860bc83d..e5e5016171f2 100644 --- a/tezt/lib_tezos/dal_common.mli +++ b/tezt/lib_tezos/dal_common.mli @@ -223,6 +223,7 @@ module Commitment : sig ?on_error: ([ `Invalid_degree_strictly_less_than_expected of (int, int) Cryptobox.error_container + | `Prover_SRS_not_loaded | `Slot_wrong_size of Helpers.slot ] -> Cryptobox.commitment * Cryptobox.commitment_proof) -> Cryptobox.t -> diff --git a/tezt/tests/dal.ml b/tezt/tests/dal.ml index 526b260b85d5..178a92f9f977 100644 --- a/tezt/tests/dal.ml +++ b/tezt/tests/dal.ml @@ -1520,7 +1520,9 @@ let commitment_of_slot cryptobox slot = in match Cryptobox.commit cryptobox polynomial with | Ok cm -> cm - | Error (`Invalid_degree_strictly_less_than_expected _ as commit_error) -> + | Error + ((`Invalid_degree_strictly_less_than_expected _ | `Prover_SRS_not_loaded) + as commit_error) -> Test.fail "%s" (Cryptobox.string_of_commit_error commit_error) let test_dal_node_test_post_commitments _protocol parameters cryptobox _node -- GitLab From 2d746c390855764af866592b0041431d38f38074 Mon Sep 17 00:00:00 2001 From: Anne-Laure Date: Wed, 17 Jan 2024 12:48:41 +0100 Subject: [PATCH 4/4] Bin_dal_node/Slot_manager_legacy: replace `Data_encoding.(unit)` by `Data_encoding.unit` --- src/bin_dal_node/slot_manager_legacy.ml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bin_dal_node/slot_manager_legacy.ml b/src/bin_dal_node/slot_manager_legacy.ml index 07c9b69db46f..9be5d5f38b46 100644 --- a/src/bin_dal_node/slot_manager_legacy.ml +++ b/src/bin_dal_node/slot_manager_legacy.ml @@ -76,7 +76,7 @@ let () = ~title:"Slot not found" ~description:"Slot not found at this slot header" ~pp:(fun ppf () -> Format.fprintf ppf "Slot not found on given slot header") - Data_encoding.(unit) + Data_encoding.unit (function Slot_not_found -> Some () | _ -> None) (fun () -> Slot_not_found) ; register_error_kind @@ -85,7 +85,7 @@ let () = ~title:"Illformed shard" ~description:"Illformed shard found in the store" ~pp:(fun ppf () -> Format.fprintf ppf "Illformed shard found in the store") - Data_encoding.(unit) + Data_encoding.unit (function Illformed_shard -> Some () | _ -> None) (fun () -> Illformed_shard) ; register_error_kind @@ -94,7 +94,7 @@ let () = ~title:"Illformed pages" ~description:"Illformed pages found in the store" ~pp:(fun ppf () -> Format.fprintf ppf "Illformed pages found in the store") - Data_encoding.(unit) + Data_encoding.unit (function Illformed_pages -> Some () | _ -> None) (fun () -> Illformed_pages) ; register_error_kind @@ -104,7 +104,7 @@ let () = ~description:"Shards commit to a different slot header." ~pp:(fun ppf () -> Format.fprintf ppf "Association between shards and slot header is invalid") - Data_encoding.(unit) + Data_encoding.unit (function Invalid_shards_commitment_association -> Some () | _ -> None) (fun () -> Invalid_shards_commitment_association) ; register_error_kind @@ -130,7 +130,7 @@ let () = ~title:"Prover SRS not loaded" ~description:"The SRS for the prover was not loaded." ~pp:(fun ppf () -> Cryptobox.pp_commit_error ppf `Prover_SRS_not_loaded) - Data_encoding.(unit) + Data_encoding.unit (function Prover_SRS_not_loaded -> Some () | _ -> None) (fun () -> Prover_SRS_not_loaded) -- GitLab