Alpha/Baker: add a context's consistency check before starting the baker
This commit is contained in:
parent
a475ef701a
commit
8d2e302f1a
@ -991,6 +991,7 @@ let create
|
|||||||
let constants =
|
let constants =
|
||||||
tzlazy (fun () -> Alpha_services.Constants.all cctxt (`Main, `Hash (bi.Client_baking_blocks.hash, 0))) in
|
tzlazy (fun () -> Alpha_services.Constants.all cctxt (`Main, `Hash (bi.Client_baking_blocks.hash, 0))) in
|
||||||
Client_baking_simulator.load_context ~context_path >>= fun index ->
|
Client_baking_simulator.load_context ~context_path >>= fun index ->
|
||||||
|
Client_baking_simulator.check_context_consistency index bi.context >>=? fun () ->
|
||||||
let state = create_state ?fee_threshold ~max_waiting_time genesis_hash context_path index delegates constants in
|
let state = create_state ?fee_threshold ~max_waiting_time genesis_hash context_path index delegates constants in
|
||||||
return state
|
return state
|
||||||
in
|
in
|
||||||
|
@ -26,21 +26,33 @@
|
|||||||
open Proto_alpha
|
open Proto_alpha
|
||||||
open Alpha_context
|
open Alpha_context
|
||||||
|
|
||||||
type error +=
|
type error += Failed_to_checkout_context
|
||||||
| Failed_to_checkout_context
|
type error += Invalid_context
|
||||||
|
|
||||||
let () =
|
let () =
|
||||||
register_error_kind
|
register_error_kind
|
||||||
`Permanent
|
`Permanent
|
||||||
~id:"Client_baking_simulator.failed_to_checkout_context"
|
~id:"Client_baking_simulator.failed_to_checkout_context"
|
||||||
~title: "Fail during checkout context"
|
~title: "Failed to checkout context"
|
||||||
~description: ""
|
~description: "The given context hash does not exists in the context."
|
||||||
~pp:(fun ppf () -> Format.fprintf ppf "@[Failed to checkout the context@]")
|
~pp:(fun ppf () -> Format.fprintf ppf "Failed to checkout the context")
|
||||||
Data_encoding.unit
|
Data_encoding.unit
|
||||||
(function
|
(function
|
||||||
| Failed_to_checkout_context -> Some ()
|
| Failed_to_checkout_context -> Some ()
|
||||||
| _ -> None)
|
| _ -> None)
|
||||||
(fun () -> Failed_to_checkout_context)
|
(fun () -> Failed_to_checkout_context) ;
|
||||||
|
register_error_kind
|
||||||
|
`Permanent
|
||||||
|
~id:"Client_baking_simulator.invalid_context"
|
||||||
|
~title: "Invalid context"
|
||||||
|
~description: "Occurs when the context is inconsistent."
|
||||||
|
~pp:(fun ppf () ->
|
||||||
|
Format.fprintf ppf "The given context is invalid.")
|
||||||
|
Data_encoding.unit
|
||||||
|
(function
|
||||||
|
| Invalid_context -> Some ()
|
||||||
|
| _ -> None)
|
||||||
|
(fun () -> Invalid_context)
|
||||||
|
|
||||||
type incremental = {
|
type incremental = {
|
||||||
predecessor: Client_baking_blocks.block_info ;
|
predecessor: Client_baking_blocks.block_info ;
|
||||||
@ -53,6 +65,16 @@ type incremental = {
|
|||||||
let load_context ~context_path =
|
let load_context ~context_path =
|
||||||
Context.init ~readonly:true context_path
|
Context.init ~readonly:true context_path
|
||||||
|
|
||||||
|
let check_context_consistency index context_hash =
|
||||||
|
(* Hypothesis : the version key exists *)
|
||||||
|
let version_key = ["version"] in
|
||||||
|
Context.checkout index context_hash >>= function
|
||||||
|
| None -> fail Failed_to_checkout_context
|
||||||
|
| Some context ->
|
||||||
|
Context.mem context version_key >>= function
|
||||||
|
| true -> return_unit
|
||||||
|
| false -> fail Invalid_context
|
||||||
|
|
||||||
let begin_construction ~timestamp ?protocol_data index predecessor =
|
let begin_construction ~timestamp ?protocol_data index predecessor =
|
||||||
let { Client_baking_blocks.context } = predecessor in
|
let { Client_baking_blocks.context } = predecessor in
|
||||||
Context.checkout index context >>= function
|
Context.checkout index context >>= function
|
||||||
|
@ -36,6 +36,9 @@ type incremental = {
|
|||||||
|
|
||||||
val load_context : context_path:string -> Context.index Lwt.t
|
val load_context : context_path:string -> Context.index Lwt.t
|
||||||
|
|
||||||
|
(** Make sure that the given context is consistent by trying to read in it *)
|
||||||
|
val check_context_consistency : Context.index -> Context_hash.t -> unit tzresult Lwt.t
|
||||||
|
|
||||||
val begin_construction : timestamp:Time.t -> ?protocol_data: block_header_data -> Context.index -> Client_baking_blocks.block_info -> incremental tzresult Lwt.t
|
val begin_construction : timestamp:Time.t -> ?protocol_data: block_header_data -> Context.index -> Client_baking_blocks.block_info -> incremental tzresult Lwt.t
|
||||||
|
|
||||||
val add_operation : incremental -> Operation.packed -> incremental tzresult Lwt.t
|
val add_operation : incremental -> Operation.packed -> incremental tzresult Lwt.t
|
||||||
|
Loading…
Reference in New Issue
Block a user