Skip to content

Commit f58eb9a

Browse files
committed
for uptime snark, if terminal tx is zkapp tx, only use last segment
1 parent 8f3930e commit f58eb9a

File tree

2 files changed

+82
-10
lines changed

2 files changed

+82
-10
lines changed

src/lib/mina_lib/mina_lib.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1528,7 +1528,8 @@ let start t =
15281528
~graphql_control_port:t.config.graphql_control_port ~built_with_commit_sha
15291529
~get_next_producer_timing:(fun () -> t.next_producer_timing)
15301530
~get_snark_work_fee:(fun () -> snark_work_fee t)
1531-
~get_peer:(fun () -> t.config.gossip_net_params.addrs_and_ports.peer) ;
1531+
~get_peer:(fun () -> t.config.gossip_net_params.addrs_and_ports.peer)
1532+
~signature_kind:t.signature_kind ;
15321533
stop_long_running_daemon t ;
15331534
Snark_worker.start t
15341535

src/lib/uptime_service/uptime_service.ml

Lines changed: 80 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
203229
let 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
373443
let 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

Comments
 (0)