Revision b615df1cabcd074cd216b490e99ec2260a69c324 authored by Corneliu Hoffman on 25 November 2022, 19:52:51 UTC, committed by Corneliu Hoffman on 07 December 2022, 09:16:00 UTC
1 parent dfa2482
Raw File
light.ml
(*****************************************************************************)
(*                                                                           *)
(* Open Source License                                                       *)
(* Copyright (c) 2021 Nomadic Labs, <contact@nomadic-labs.com>               *)
(*                                                                           *)
(* 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.                                                 *)
(*                                                                           *)
(*****************************************************************************)

type sources_config = {min_agreement : float; uris : Uri.t list}

let sources_config_to_uris ({uris; _} : sources_config) = uris

let default_agreement = 1.0

let sources_encoding =
  let open Data_encoding in
  obj2 (opt "min_agreement" float) (req "uris" (list string))

let sources_config_encoding =
  let open Data_encoding in
  conv
    (fun srcs_config ->
      (Some srcs_config.min_agreement, List.map Uri.to_string srcs_config.uris))
    (fun (min_agreement, uris) ->
      {
        min_agreement = Option.value min_agreement ~default:default_agreement;
        uris = List.map Uri.of_string uris;
      })
    sources_encoding

let mk_sources_config ~min_agreement ~uris =
  if min_agreement <= 0.0 || 1.0 < min_agreement then
    Error
      Format.(
        sprintf
          "min_agreement value must be within 0 (exclusive) and 1 (inclusive) \
           but you provided %f"
          min_agreement)
  else if Compare.List_length_with.(uris < 2) then
    Error
      Format.(
        asprintf
          "A minimum of 2 endpoints is required in Light mode: one endpoint to \
           retrieve data and one to validate data. You only provided %a"
          (pp_print_list Uri.pp_hum)
          uris)
  else Ok {min_agreement; uris}

let example_sources =
  {|{"min_agreement": 1.0, "uris": ["http://localhost:8732", "https://localhost:8733"]}|}

let destruct_sources_config json =
  let {min_agreement; uris} =
    Data_encoding.Json.destruct sources_config_encoding json
  in
  mk_sources_config ~min_agreement ~uris

type sources = {
  min_agreement : float;
  endpoints : (Uri.t * Tezos_rpc.Context.simple) list;
}

let sources_config_to_sources rpc_context_builder {min_agreement; uris} =
  let endpoints = List.map (fun u -> (u, rpc_context_builder u)) uris in
  {min_agreement; endpoints}

let hash_of_block (block : Tezos_shell_services.Block_services.block) :
    Tezos_crypto.Block_hash.t option =
  match block with
  | `Hash (h, 0) -> Some h
  | `Alias (_, _) | `Genesis | `Head _ | `Level _ | `Hash (_, _) -> None
back to top