Baker: do not generate empty endorsements

This commit is contained in:
Benjamin Canou 2018-06-18 18:56:52 +02:00 committed by Grégoire Henry
parent 7500743a4d
commit 41707f58d8
2 changed files with 40 additions and 33 deletions

View File

@ -19,8 +19,8 @@ let get_signing_slots cctxt ?(chain = `Main) block delegate level =
~levels:[level]
~delegates:[delegate]
(chain, block) >>=? function
| [{ slots }] -> return slots
| _ -> (* TODO? log this case *) return []
| [{ slots }] -> return (Some slots)
| _ -> return None
let inject_endorsement
(cctxt : #Proto_alpha.full)
@ -73,8 +73,8 @@ let forge_endorsement (cctxt : #Proto_alpha.full)
| None ->
get_signing_slots
cctxt ~chain block src_pkh level >>=? function
| [] -> cctxt#error "No slot found at level %a" Raw_level.pp level
| slots -> return slots
| None -> cctxt#error "No slot found at level %a" Raw_level.pp level
| Some slots -> return slots
end >>=? fun slots ->
Shell_services.Blocks.hash cctxt ~chain ~block () >>=? fun hash ->
inject_endorsement cctxt ~chain ?async block hash level src_sk slots src_pkh >>=? fun oph ->
@ -167,33 +167,39 @@ let allowed_to_endorse cctxt state (block: Client_baking_blocks.block_info) dele
let b = `Hash (block.hash, 0) in
let level = block.level in
get_signing_slots cctxt b delegate level >>=? fun slots ->
lwt_debug "Found slots for %a/%s (%d)"
Block_hash.pp_short block.hash name (List.length slots) >>= fun () ->
previously_endorsed_level cctxt delegate level >>=? function
| true ->
lwt_debug "Level %a (or higher) previously endorsed: do not endorse."
Raw_level.pp level >>= return
| false ->
match Client_baking_scheduling.sleep_until time with
| None ->
lwt_debug "Endorsment opportunity is passed." >>= fun () ->
return ()
| Some timeout ->
let neu = { time ; timeout ; delegate ; block; slots } in
match List.find_opt (fun { delegate = d } -> delegate = d) state.to_endorse with
match slots with
| None ->
lwt_debug "No slot found for %a/%s"
Block_hash.pp_short block.hash name >>= fun () ->
return ()
| Some slots ->
lwt_debug "Found slots for %a/%s (%d)"
Block_hash.pp_short block.hash name (List.length slots) >>= fun () ->
previously_endorsed_level cctxt delegate level >>=? function
| true ->
lwt_debug "Level %a (or higher) previously endorsed: do not endorse."
Raw_level.pp level >>= return
| false ->
match Client_baking_scheduling.sleep_until time with
| None ->
state.to_endorse <- neu :: state.to_endorse;
lwt_debug "Endorsment opportunity is passed." >>= fun () ->
return ()
| Some old ->
if Fitness.compare old.block.fitness neu.block.fitness < 0 then begin
let without_old =
List.filter (fun to_end -> to_end <> old) state.to_endorse in
state.to_endorse <- neu :: without_old;
return ()
end else
lwt_debug "Block %a is not the fittest: do not endorse."
Block_hash.pp_short neu.block.hash >>= fun () ->
return ()
| Some timeout ->
let neu = { time ; timeout ; delegate ; block; slots } in
match List.find_opt (fun { delegate = d } -> delegate = d) state.to_endorse with
| None ->
state.to_endorse <- neu :: state.to_endorse;
return ()
| Some old ->
if Fitness.compare old.block.fitness neu.block.fitness < 0 then begin
let without_old =
List.filter (fun to_end -> to_end <> old) state.to_endorse in
state.to_endorse <- neu :: without_old;
return ()
end else
lwt_debug "Block %a is not the fittest: do not endorse."
Block_hash.pp_short neu.block.hash >>= fun () ->
return ()
let prepare_endorsement (cctxt : #Proto_alpha.full) ~(max_past:int64) state bi =
get_delegates cctxt state >>=? fun delegates ->

View File

@ -514,7 +514,8 @@ let pop_baking_slots state =
let filter_invalid_operations (cctxt : #full) state block_info (operations : packed_operation list list) =
let open Client_baking_simulator in
lwt_debug "Starting client-side validation" >>= fun () ->
lwt_debug "Starting client-side validation %a"
Block_hash.pp block_info.Client_baking_blocks.hash >>= fun () ->
begin_construction cctxt state.index block_info >>=? fun initial_inc ->
let endorsements = List.nth operations 0 in
let votes = List.nth operations 1 in
@ -656,9 +657,8 @@ let fit_enough (state: state) (shell_header: Block_header.shell_header) =
|| (Fitness.compare state.best.fitness shell_header.fitness = 0
&& Time.compare shell_header.timestamp state.best.timestamp < 0)
let record_nonce_hash cctxt level block_hash seed_nonce seed_nonce_hash pkh =
let record_nonce_hash cctxt block_hash seed_nonce seed_nonce_hash =
if seed_nonce_hash <> None then
State.record cctxt pkh level >>=? fun () ->
Client_baking_nonces.add cctxt block_hash seed_nonce
|> trace_exn (Failure "Error while recording block")
else
@ -712,7 +712,8 @@ let bake (cctxt : #Proto_alpha.full) state =
(* /core function; back to logging and info *)
|> trace_exn (Failure "Error while injecting block") >>=? fun block_hash ->
record_nonce_hash cctxt level block_hash seed_nonce seed_nonce_hash src_pkh >>=? fun () ->
State.record cctxt src_pkh level >>=? fun () ->
record_nonce_hash cctxt block_hash seed_nonce seed_nonce_hash >>=? fun () ->
Client_keys.Public_key_hash.name cctxt delegate >>=? fun name ->
cctxt#message
"Injected block %a for %s after %a (level %a, slot %d, fitness %a, operations %a)"