Client/Baker: let the baking daemon reveal nonces

This commit is contained in:
Grégoire Henry 2017-02-14 10:33:34 +01:00
parent f7a70f355c
commit 34e1764bce
4 changed files with 50 additions and 37 deletions

View File

@ -280,7 +280,44 @@ let compute_timeout { future_slots } =
else
Lwt_unix.sleep (Int64.to_float delay)
let insert_block cctxt ?max_priority state (bi: Client_mining_blocks.block_info) =
let get_unrevealed_nonces cctxt ?(force = false) block =
Client_proto_rpcs.Context.next_level cctxt block >>=? fun level ->
let cur_cycle = level.cycle in
match Cycle.pred cur_cycle with
| None -> return []
| Some cycle ->
Client_mining_blocks.blocks_from_cycle
cctxt block cycle >>=? fun block_infos ->
map_filter_s (fun (bi : Client_mining_blocks.block_info) ->
Client_proto_nonces.find cctxt bi.hash >>= function
| None -> return None
| Some nonce ->
if force then
return (Some (bi.hash, (bi.level.level, nonce)))
else
Client_proto_rpcs.Context.Nonce.get
cctxt block bi.level.level >>=? function
| Missing nonce_hash
when Nonce.check_hash nonce nonce_hash ->
cctxt.warning "Found nonce for %a (level: %a)@."
Block_hash.pp_short bi.hash
Level.pp bi.level >>= fun () ->
return (Some (bi.hash, (bi.level.level, nonce)))
| Missing _nonce_hash ->
cctxt.error "Incoherent nonce for level %a"
Raw_level.pp bi.level.level >>= fun () ->
return None
| Forgotten -> return None
| Revealed _ -> return None)
block_infos
let insert_block
cctxt ?max_priority state (bi: Client_mining_blocks.block_info) =
begin
get_unrevealed_nonces cctxt (`Hash bi.hash) >>=? fun nonces ->
Client_mining_revelation.forge_seed_nonce_revelation
cctxt ~force:true (`Hash bi.hash) (List.map snd nonces)
end >>= fun _ignore_error ->
if Fitness.compare state.best_fitness bi.fitness < 0 then
state.best_fitness <- bi.fitness ;
get_mining_slot cctxt ?max_priority bi state.delegates >>= function

View File

@ -52,3 +52,9 @@ val create:
Client_mining_blocks.block_info list Lwt_stream.t ->
Client_mining_operations.valid_endorsement Lwt_stream.t ->
unit Lwt.t
val get_unrevealed_nonces:
Client_commands.context ->
?force:bool ->
Client_proto_rpcs.block ->
(Block_hash.t * (Raw_level.t * Nonce.t)) list tzresult Lwt.t

View File

@ -86,19 +86,9 @@ let reveal_block_nonces cctxt ?force block_hashes =
let reveal_nonces cctxt ?force () =
let block = Client_proto_args.block () in
Client_proto_rpcs.Context.next_level cctxt block >>=? fun level ->
let cur_cycle = level.cycle in
get_predecessor_cycle cctxt cur_cycle >>= fun cycle ->
Client_mining_blocks.blocks_from_cycle cctxt block cycle >>=? fun block_infos ->
map_filter_s (fun (bi : Client_mining_blocks.block_info) ->
Client_proto_nonces.find cctxt bi.hash >>= function
| None -> return None
| Some nonce ->
cctxt.warning "Found nonce for %a (level: %a)@."
Block_hash.pp_short bi.hash Level.pp bi.level >>= fun () ->
return (Some (bi.hash, (bi.level.level, nonce))))
block_infos >>=? fun blocks ->
do_reveal cctxt ?force block blocks
Client_mining_forge.get_unrevealed_nonces
cctxt ?force block >>=? fun nonces ->
do_reveal cctxt ?force block nonces
open Client_proto_args

View File

@ -24,29 +24,9 @@ let inject_seed_nonce_revelation cctxt block ?force ?wait nonces =
type Error_monad.error += Bad_revelation
let forge_seed_nonce_revelation cctxt
block ?(force = false) redempted_nonces =
begin
if force then return redempted_nonces else
map_filter_s (fun (level, nonce) ->
Client_proto_rpcs.Context.Nonce.get cctxt block level >>=? function
| Forgotten ->
cctxt.message "Too late revelation for level %a"
Raw_level.pp level >>= fun () ->
return None
| Revealed _ ->
cctxt.message "Ignoring previously-revealed nonce for level %a"
Raw_level.pp level >>= fun () ->
return None
| Missing nonce_hash ->
if Nonce.check_hash nonce nonce_hash then
return (Some (level, nonce))
else
lwt_log_error "Incoherent nonce for level %a"
Raw_level.pp level >>= fun () ->
return None)
redempted_nonces
end >>=? fun nonces ->
let forge_seed_nonce_revelation
(cctxt: Client_commands.context)
block ?(force = false) nonces =
match nonces with
| [] ->
cctxt.message "No nonce to reveal" >>= fun () ->