-
Notifications
You must be signed in to change notification settings - Fork 529
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Standalone snarkwork process to submit proofs via graphql #16367
Open
deepthiskumar
wants to merge
2
commits into
feature/graphql-add-snark-work
Choose a base branch
from
feature/snarkworker-standalone
base: feature/graphql-add-snark-work
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+147
−19
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,12 +2,82 @@ open Core_kernel | |||||||||||||||||||||||||||||||||||||||||||||||||
open Async | ||||||||||||||||||||||||||||||||||||||||||||||||||
module Prod = Snark_worker__Prod.Inputs | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
module Graphql_client = Graphql_lib.Client.Make (struct | ||||||||||||||||||||||||||||||||||||||||||||||||||
let preprocess_variables_string = Fn.id | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
let headers = String.Map.empty | ||||||||||||||||||||||||||||||||||||||||||||||||||
end) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
module Encoders = Mina_graphql.Types.Input | ||||||||||||||||||||||||||||||||||||||||||||||||||
module Scalars = Graphql_lib.Scalars | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
module Send_proof_mutation = | ||||||||||||||||||||||||||||||||||||||||||||||||||
[%graphql | ||||||||||||||||||||||||||||||||||||||||||||||||||
({| | ||||||||||||||||||||||||||||||||||||||||||||||||||
mutation ($input: ProofBundleInput!) @encoders(module: "Encoders"){ | ||||||||||||||||||||||||||||||||||||||||||||||||||
sendProofBundle(input: $input) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|} | ||||||||||||||||||||||||||||||||||||||||||||||||||
[@encoders Encoders] )] | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
let submit_graphql input graphql_endpoint = | ||||||||||||||||||||||||||||||||||||||||||||||||||
let obj = Send_proof_mutation.(make @@ makeVariables ~input ()) in | ||||||||||||||||||||||||||||||||||||||||||||||||||
match%bind Graphql_client.query obj graphql_endpoint with | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Ok _s -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
Caml.Format.printf "Successfully generated proof bundle mutation" ; | ||||||||||||||||||||||||||||||||||||||||||||||||||
exit 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Error (`Failed_request s) -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
Caml.Format.printf !"Request failed: %s" s ; | ||||||||||||||||||||||||||||||||||||||||||||||||||
exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Error (`Graphql_error s) -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
Caml.Format.printf "Graphql error: %s" s ; | ||||||||||||||||||||||||||||||||||||||||||||||||||
exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
let perform (s : Prod.Worker_state.t) ~fee ~public_key | ||||||||||||||||||||||||||||||||||||||||||||||||||
(spec : | ||||||||||||||||||||||||||||||||||||||||||||||||||
(Transaction_witness.t, Ledger_proof.t) Snark_work_lib.Work.Single.Spec.t | ||||||||||||||||||||||||||||||||||||||||||||||||||
One_or_two.t ) = | ||||||||||||||||||||||||||||||||||||||||||||||||||
One_or_two.Deferred_result.map spec ~f:(fun w -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
let open Deferred.Or_error.Let_syntax in | ||||||||||||||||||||||||||||||||||||||||||||||||||
let%map proof, time = | ||||||||||||||||||||||||||||||||||||||||||||||||||
Prod.perform_single s | ||||||||||||||||||||||||||||||||||||||||||||||||||
~message:(Mina_base.Sok_message.create ~fee ~prover:public_key) | ||||||||||||||||||||||||||||||||||||||||||||||||||
w | ||||||||||||||||||||||||||||||||||||||||||||||||||
in | ||||||||||||||||||||||||||||||||||||||||||||||||||
( proof | ||||||||||||||||||||||||||||||||||||||||||||||||||
, (time, match w with Transition _ -> `Transition | Merge _ -> `Merge) ) ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|> Deferred.Or_error.map ~f:(function | ||||||||||||||||||||||||||||||||||||||||||||||||||
| `One (proof1, _) -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ Snark_work_lib.Work.Result_without_metrics.proofs = `One proof1 | ||||||||||||||||||||||||||||||||||||||||||||||||||
; statements = | ||||||||||||||||||||||||||||||||||||||||||||||||||
One_or_two.map spec ~f:Snark_work_lib.Work.Single.Spec.statement | ||||||||||||||||||||||||||||||||||||||||||||||||||
; prover = public_key | ||||||||||||||||||||||||||||||||||||||||||||||||||
; fee | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| `Two ((proof1, _), (proof2, _)) -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ Snark_work_lib.Work.Result_without_metrics.proofs = | ||||||||||||||||||||||||||||||||||||||||||||||||||
`Two (proof1, proof2) | ||||||||||||||||||||||||||||||||||||||||||||||||||
; statements = | ||||||||||||||||||||||||||||||||||||||||||||||||||
One_or_two.map spec ~f:Snark_work_lib.Work.Single.Spec.statement | ||||||||||||||||||||||||||||||||||||||||||||||||||
; prover = public_key | ||||||||||||||||||||||||||||||||||||||||||||||||||
; fee | ||||||||||||||||||||||||||||||||||||||||||||||||||
} ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+49
to
+64
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
let command = | ||||||||||||||||||||||||||||||||||||||||||||||||||
let open Command.Let_syntax in | ||||||||||||||||||||||||||||||||||||||||||||||||||
Command.async ~summary:"Run snark worker directly" | ||||||||||||||||||||||||||||||||||||||||||||||||||
(let%map_open spec = | ||||||||||||||||||||||||||||||||||||||||||||||||||
flag "--spec-sexp" ~doc:"" | ||||||||||||||||||||||||||||||||||||||||||||||||||
(required (sexp_conv Prod.single_spec_of_sexp)) | ||||||||||||||||||||||||||||||||||||||||||||||||||
(let%map_open spec_json = | ||||||||||||||||||||||||||||||||||||||||||||||||||
flag "--spec-json" | ||||||||||||||||||||||||||||||||||||||||||||||||||
~doc: | ||||||||||||||||||||||||||||||||||||||||||||||||||
"Snark work spec in json format (preferred over sexp format if both \ | ||||||||||||||||||||||||||||||||||||||||||||||||||
are passed)" | ||||||||||||||||||||||||||||||||||||||||||||||||||
(optional string) | ||||||||||||||||||||||||||||||||||||||||||||||||||
and spec_sexp = | ||||||||||||||||||||||||||||||||||||||||||||||||||
flag "--spec-sexp" | ||||||||||||||||||||||||||||||||||||||||||||||||||
~doc: | ||||||||||||||||||||||||||||||||||||||||||||||||||
"Snark work spec in sexp format(json format is preferred over sexp \ | ||||||||||||||||||||||||||||||||||||||||||||||||||
if both are passed)" | ||||||||||||||||||||||||||||||||||||||||||||||||||
(optional string) | ||||||||||||||||||||||||||||||||||||||||||||||||||
and config_file = Cli_lib.Flag.config_files | ||||||||||||||||||||||||||||||||||||||||||||||||||
and cli_proof_level = | ||||||||||||||||||||||||||||||||||||||||||||||||||
flag "--proof-level" ~doc:"" | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -17,6 +87,23 @@ let command = | |||||||||||||||||||||||||||||||||||||||||||||||||
; ("Check", Check) | ||||||||||||||||||||||||||||||||||||||||||||||||||
; ("None", No_check) | ||||||||||||||||||||||||||||||||||||||||||||||||||
] ) ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
and snark_work_fee = | ||||||||||||||||||||||||||||||||||||||||||||||||||
flag "--snark-worker-fee" ~aliases:[ "snark-worker-fee" ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
~doc: | ||||||||||||||||||||||||||||||||||||||||||||||||||
(sprintf | ||||||||||||||||||||||||||||||||||||||||||||||||||
"FEE Amount a worker wants to get compensated for generating a \ | ||||||||||||||||||||||||||||||||||||||||||||||||||
snark proof" ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
(optional Cli_lib.Arg_type.txn_fee) | ||||||||||||||||||||||||||||||||||||||||||||||||||
and snark_worker_key = | ||||||||||||||||||||||||||||||||||||||||||||||||||
flag "--snark-worker-public-key" | ||||||||||||||||||||||||||||||||||||||||||||||||||
~aliases:[ "snark-worker-public-key" ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
~doc: | ||||||||||||||||||||||||||||||||||||||||||||||||||
(sprintf "PUBLICKEY Run the SNARK worker with this public key. %s" | ||||||||||||||||||||||||||||||||||||||||||||||||||
Cli_lib.Default.receiver_key_warning ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
(optional Cli_lib.Arg_type.public_key_compressed) | ||||||||||||||||||||||||||||||||||||||||||||||||||
and proof_submission_graphql_endpoint = | ||||||||||||||||||||||||||||||||||||||||||||||||||
flag "--graphql-uri" ~doc:"Graphql endpoint to submit proofs" | ||||||||||||||||||||||||||||||||||||||||||||||||||
(optional Cli_lib.Arg_type.uri) | ||||||||||||||||||||||||||||||||||||||||||||||||||
in | ||||||||||||||||||||||||||||||||||||||||||||||||||
fun () -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
let open Async in | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -32,17 +119,51 @@ let command = | |||||||||||||||||||||||||||||||||||||||||||||||||
let%bind worker_state = | ||||||||||||||||||||||||||||||||||||||||||||||||||
Prod.Worker_state.create ~constraint_constants ~proof_level () | ||||||||||||||||||||||||||||||||||||||||||||||||||
in | ||||||||||||||||||||||||||||||||||||||||||||||||||
let public_key = fst Key_gen.Sample_keypairs.genesis_winner in | ||||||||||||||||||||||||||||||||||||||||||||||||||
let fee = Currency.Fee.of_nanomina_int_exn 10 in | ||||||||||||||||||||||||||||||||||||||||||||||||||
let message = Mina_base.Sok_message.create ~fee ~prover:public_key in | ||||||||||||||||||||||||||||||||||||||||||||||||||
match%bind Prod.perform_single worker_state ~message spec with | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Ok (proof, time) -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
let spec = | ||||||||||||||||||||||||||||||||||||||||||||||||||
match spec_json with | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Some json -> ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
match | ||||||||||||||||||||||||||||||||||||||||||||||||||
Yojson.Safe.from_string json | ||||||||||||||||||||||||||||||||||||||||||||||||||
|> One_or_two.of_yojson | ||||||||||||||||||||||||||||||||||||||||||||||||||
(Snark_work_lib.Work.Single.Spec.of_yojson | ||||||||||||||||||||||||||||||||||||||||||||||||||
Transaction_witness.of_yojson Ledger_proof.of_yojson ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
with | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Ok spec -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
spec | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Error e -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
failwith (sprintf "Failed to read json spec. Error: %s" e) ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
| None -> ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
match spec_sexp with | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Some spec -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
One_or_two.t_of_sexp | ||||||||||||||||||||||||||||||||||||||||||||||||||
(Snark_work_lib.Work.Single.Spec.t_of_sexp | ||||||||||||||||||||||||||||||||||||||||||||||||||
Transaction_witness.t_of_sexp Ledger_proof.t_of_sexp ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
(Sexp.of_string spec) | ||||||||||||||||||||||||||||||||||||||||||||||||||
| None -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
failwith "Provide a spec either in json or sexp format" ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
in | ||||||||||||||||||||||||||||||||||||||||||||||||||
let public_key = | ||||||||||||||||||||||||||||||||||||||||||||||||||
Option.value | ||||||||||||||||||||||||||||||||||||||||||||||||||
~default:(fst Key_gen.Sample_keypairs.genesis_winner) | ||||||||||||||||||||||||||||||||||||||||||||||||||
snark_worker_key | ||||||||||||||||||||||||||||||||||||||||||||||||||
in | ||||||||||||||||||||||||||||||||||||||||||||||||||
let fee = | ||||||||||||||||||||||||||||||||||||||||||||||||||
Option.value | ||||||||||||||||||||||||||||||||||||||||||||||||||
~default:(Currency.Fee.of_nanomina_int_exn 10) | ||||||||||||||||||||||||||||||||||||||||||||||||||
snark_work_fee | ||||||||||||||||||||||||||||||||||||||||||||||||||
in | ||||||||||||||||||||||||||||||||||||||||||||||||||
match%bind perform worker_state ~fee ~public_key spec with | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Ok result -> ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
Caml.Format.printf | ||||||||||||||||||||||||||||||||||||||||||||||||||
!"@[<v>Successfully proved in %{sexp: Time.Span.t}.@,\ | ||||||||||||||||||||||||||||||||||||||||||||||||||
Proof was:@,\ | ||||||||||||||||||||||||||||||||||||||||||||||||||
%{sexp: Transaction_snark.t}@]@." | ||||||||||||||||||||||||||||||||||||||||||||||||||
time proof ; | ||||||||||||||||||||||||||||||||||||||||||||||||||
exit 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||
!"@[<v>Successfully proved. Result: \n\ | ||||||||||||||||||||||||||||||||||||||||||||||||||
\ %{sexp: Ledger_proof.t \ | ||||||||||||||||||||||||||||||||||||||||||||||||||
Snark_work_lib.Work.Result_without_metrics.t}@]@." | ||||||||||||||||||||||||||||||||||||||||||||||||||
result ; | ||||||||||||||||||||||||||||||||||||||||||||||||||
match proof_submission_graphql_endpoint with | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Some endpoint -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
submit_graphql result endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||
| _ -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
Deferred.unit ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Error err -> | ||||||||||||||||||||||||||||||||||||||||||||||||||
Caml.Format.printf | ||||||||||||||||||||||||||||||||||||||||||||||||||
!"Proving failed with error: %s@." | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like this change triggers an error when building: