ligo/bin_node/node_identity_file.ml

85 lines
3.2 KiB
OCaml

(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2017. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
type error += No_identity_file of string
type error += Insufficient_proof_of_work of { expected: float }
let () =
register_error_kind
`Permanent
~id:"main.identity.no_file"
~title:"TODO"
~description:"TODO"
~pp:(fun ppf file ->
Format.fprintf ppf
"Cannot read the identity file: `%s`. \
See `%s identity --help` on how to generate an identity."
file Sys.argv.(0))
Data_encoding.(obj1 (req "file" string))
(function No_identity_file file -> Some file | _ -> None)
(fun file -> No_identity_file file)
let () =
register_error_kind
`Permanent
~id:"main.identity.insufficient_proof_of_work"
~title:"TODO"
~description:"TODO"
~pp:(fun ppf expected ->
Format.fprintf ppf
"The current identity does not embed a sufficient stamp of proof-of-work. \
(expected level: %.2f). \
See `%s identity --help` on how to generate a new identity."
expected Sys.argv.(0))
Data_encoding.(obj1 (req "expected" float))
(function Insufficient_proof_of_work { expected } -> Some expected | _ -> None)
(fun expected -> Insufficient_proof_of_work { expected })
let read ?expected_pow file =
Lwt_unix.file_exists file >>= function
| false ->
fail (No_identity_file file)
| true ->
Data_encoding_ezjsonm.read_file file >>=? fun json ->
let id = Data_encoding.Json.destruct P2p.Identity.encoding json in
match expected_pow with
| None -> return id
| Some expected ->
let target = Crypto_box.make_target expected in
if (Crypto_box.check_proof_of_work
id.public_key id.proof_of_work_stamp target) then
return id
else
fail (Insufficient_proof_of_work { expected })
type error += Existent_identity_file of string
let () =
register_error_kind
`Permanent
~id:"main.identity.existent_file"
~title:"TODO"
~description:"TODO"
~pp:(fun ppf file ->
Format.fprintf ppf
"Cannot implicitely overwrite the current identity file: '%s'. \
See `%s identity --help` on how to generate a new identity."
file Sys.argv.(0))
Data_encoding.(obj1 (req "file" string))
(function Existent_identity_file file -> Some file | _ -> None)
(fun file -> Existent_identity_file file)
let write file identity =
if Sys.file_exists file then
fail (Existent_identity_file file)
else
Node_data_version.ensure_data_dir (Filename.dirname file) >>=? fun () ->
Data_encoding_ezjsonm.write_file file
(Data_encoding.Json.construct P2p.Identity.encoding identity)