@@ -200,10 +200,36 @@ let read_all_proofs_for_work_single_spec =
200200 ~f_proof: Ledger_proof.Cached. read_proof_from_disk
201201 ~f_witness: Transaction_witness. read_all_proofs_from_disk
202202
203+ let extract_terminal_zk_segment ~(m : (module Transaction_snark.S) ) ~witness
204+ ~input ~zkapp_command ~staged_ledger_hash =
205+ let % bind.Result final_segment =
206+ Work_partitioner. make_zkapp_segments ~m ~input ~witness ~zkapp_command
207+ |> Result. map_error
208+ ~f:
209+ Work_partitioner.Snark_worker_shared. Failed_to_generate_inputs
210+ .error_of_t
211+ |> Result. map ~f: Mina_stdlib.Nonempty_list. last
212+ in
213+ match final_segment with
214+ | Snark_work_lib.Spec.Sub_zkapp.Stable.V1. Segment s as res ->
215+ let expected = Staged_ledger_hash. ledger_hash staged_ledger_hash in
216+ if Ledger_hash. (s.statement.target.second_pass_ledger = expected) then
217+ Ok res
218+ else
219+ Error
220+ ( Error. of_string
221+ @@ sprintf " Mismatch segment target hash, expected %s, got %s"
222+ (Ledger_hash0. to_base58_check expected)
223+ (Ledger_hash0. to_base58_check
224+ s.statement.target.second_pass_ledger ) )
225+ | _ ->
226+ Error
227+ (Error. of_string " Expected last zkapp segment to be segment, not merge" )
228+
203229let send_block_and_transaction_snark ~logger ~constraint_constants ~interruptor
204230 ~url ~snark_worker ~transition_frontier ~peer_id
205231 ~(submitter_keypair : Keypair.t ) ~snark_work_fee ~graphql_control_port
206- ~built_with_commit_sha =
232+ ~built_with_commit_sha ~ signature_kind =
207233 match Broadcast_pipe.Reader. peek transition_frontier with
208234 | None ->
209235 (* expected during daemon boot, so not logging as error *)
@@ -327,12 +353,56 @@ let send_block_and_transaction_snark ~logger ~constraint_constants ~interruptor
327353 send_uptime_data ~logger ~interruptor ~submitter_keypair ~url
328354 ~state_hash ~produced: false block_data
329355 | Some single_spec -> (
330- match % bind
331- make_interruptible
332- (Uptime_snark_worker. perform_single snark_worker
333- ( message
334- , read_all_proofs_for_work_single_spec single_spec ) )
335- with
356+ let s =
357+ match single_spec with
358+ | Transition (input , witness ) -> (
359+ match witness.transaction with
360+ | Command (Zkapp_command zkapp_command ) ->
361+ let module T = Transaction_snark. Make (struct
362+ let signature_kind = signature_kind
363+
364+ let constraint_constants = constraint_constants
365+
366+ let proof_level = Genesis_constants.Proof_level. Full
367+ end ) in
368+ let % map.Result final_segment =
369+ extract_terminal_zk_segment
370+ ~m: (module T )
371+ ~input ~witness ~zkapp_command ~staged_ledger_hash
372+ in
373+ `Zk_app final_segment
374+ | Command (Signed_command _) | Fee_transfer _ | Coinbase _
375+ ->
376+ Ok (`Transaction single_spec) )
377+ | Merge _ ->
378+ Error
379+ (Error. of_string " Undexpecetd merge operation in spec" )
380+ in
381+ let work =
382+ match s with
383+ | Ok (`Zk_app final_segment ) ->
384+ let job =
385+ Snark_work_lib.With_job_meta.
386+ { spec = final_segment
387+ ; job_id = failwith " " (* TODO*)
388+ ; sok_message = message
389+ }
390+ in
391+ make_interruptible
392+ @@ Uptime_snark_worker. perform_partitioned snark_worker
393+ (Snark_work_lib.Spec.Partitioned. Poly
394+ .Sub_zkapp_command
395+ job )
396+ | Ok (`Transaction single_spec ) ->
397+ make_interruptible
398+ (Uptime_snark_worker. perform_single snark_worker
399+ ( message
400+ , read_all_proofs_for_work_single_spec single_spec ) )
401+ | Error error ->
402+ Interruptible. return (Error error)
403+ in
404+
405+ match % bind work with
336406 | Error e ->
337407 (* error in submitting to process *)
338408 [% log error]
@@ -373,7 +443,8 @@ let send_block_and_transaction_snark ~logger ~constraint_constants ~interruptor
373443let start ~logger ~uptime_url ~snark_worker_opt ~constraint_constants
374444 ~protocol_constants ~transition_frontier ~time_controller
375445 ~block_produced_bvar ~uptime_submitter_keypair ~get_next_producer_timing
376- ~get_snark_work_fee ~get_peer ~graphql_control_port ~built_with_commit_sha =
446+ ~get_snark_work_fee ~get_peer ~graphql_control_port ~built_with_commit_sha
447+ ~signature_kind =
377448 match uptime_url with
378449 | None ->
379450 [% log info] " Not running uptime service, no URL given" ;
@@ -475,7 +546,7 @@ let start ~logger ~uptime_url ~snark_worker_opt ~constraint_constants
475546 send_block_and_transaction_snark ~logger ~interruptor ~url
476547 ~constraint_constants ~snark_worker ~transition_frontier
477548 ~peer_id ~submitter_keypair ~snark_work_fee
478- ~graphql_control_port ~built_with_commit_sha
549+ ~graphql_control_port ~built_with_commit_sha ~signature_kind
479550 in
480551 match get_next_producer_time_opt () with
481552 | None ->
0 commit comments