Skip to content
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

Transaction snark rewrite #5876

Merged
merged 5 commits into from
Sep 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions src/app/cli/src/init/transaction_snark_profiler.ml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ let curr_global_slot =
state_body |> Coda_state.Protocol_state.Body.consensus_state
|> Consensus.Data.Consensus_state.curr_global_slot )

let curr_state_view =
Lazy.map state_body ~f:Coda_state.Protocol_state.Body.view

let state_body_hash =
Lazy.map ~f:Coda_state.Protocol_state.Body.hash state_body

Expand All @@ -147,7 +150,7 @@ let pending_coinbase_stack_target (t : Transaction.t) stack =
let profile (module T : Transaction_snark.S) sparse_ledger0
(transitions : Transaction.t list) _ =
let constraint_constants = Genesis_constants.Constraint_constants.compiled in
let txn_global_slot = Lazy.force curr_global_slot in
let txn_state_view = Lazy.force curr_state_view in
let (base_proof_time, _, _), base_proofs =
List.fold_map transitions
~init:(Time.Span.zero, sparse_ledger0, Pending_coinbase.Stack.empty)
Expand All @@ -157,7 +160,7 @@ let profile (module T : Transaction_snark.S) sparse_ledger0
in
let sparse_ledger' =
Sparse_ledger.apply_transaction_exn ~constraint_constants
~txn_global_slot sparse_ledger t
~txn_state_view sparse_ledger t
in
let next_available_token_after =
Sparse_ledger.next_available_token sparse_ledger'
Expand All @@ -174,6 +177,7 @@ let profile (module T : Transaction_snark.S) sparse_ledger0
~next_available_token_after
~pending_coinbase_stack_state:
{source= coinbase_stack_source; target= coinbase_stack_target}
~snapp_account1:None ~snapp_account2:None
{ Transaction_protocol_state.Poly.transaction= t
; block_data= Lazy.force state_body }
(unstage (Sparse_ledger.handler sparse_ledger)) )
Expand Down Expand Up @@ -210,14 +214,14 @@ let check_base_snarks sparse_ledger0 (transitions : Transaction.t list) preeval
~prover:
Public_key.(compress (of_private_key_exn (Private_key.create ())))
in
let txn_global_slot = Lazy.force curr_global_slot in
let txn_state_view = Lazy.force curr_state_view in
List.fold transitions ~init:sparse_ledger0 ~f:(fun sparse_ledger t ->
let next_available_token_before =
Sparse_ledger.next_available_token sparse_ledger
in
let sparse_ledger' =
Sparse_ledger.apply_transaction_exn ~constraint_constants
~txn_global_slot sparse_ledger t
~txn_state_view sparse_ledger t
in
let next_available_token_after =
Sparse_ledger.next_available_token sparse_ledger'
Expand All @@ -235,6 +239,7 @@ let check_base_snarks sparse_ledger0 (transitions : Transaction.t list) preeval
~pending_coinbase_stack_state:
{ source= Pending_coinbase.Stack.empty
; target= coinbase_stack_target }
~snapp_account1:None ~snapp_account2:None
{ Transaction_protocol_state.Poly.block_data= Lazy.force state_body
; transaction= t }
(unstage (Sparse_ledger.handler sparse_ledger))
Expand All @@ -252,14 +257,14 @@ let generate_base_snarks_witness sparse_ledger0
~prover:
Public_key.(compress (of_private_key_exn (Private_key.create ())))
in
let txn_global_slot = Lazy.force curr_global_slot in
let txn_state_view = Lazy.force curr_state_view in
List.fold transitions ~init:sparse_ledger0 ~f:(fun sparse_ledger t ->
let next_available_token_before =
Sparse_ledger.next_available_token sparse_ledger
in
let sparse_ledger' =
Sparse_ledger.apply_transaction_exn ~constraint_constants
~txn_global_slot sparse_ledger t
~txn_state_view sparse_ledger t
in
let next_available_token_after =
Sparse_ledger.next_available_token sparse_ledger'
Expand All @@ -278,6 +283,7 @@ let generate_base_snarks_witness sparse_ledger0
{ Transaction_snark.Pending_coinbase_stack_state.source=
Pending_coinbase.Stack.empty
; target= coinbase_stack_target }
~snapp_account1:None ~snapp_account2:None
{ Transaction_protocol_state.Poly.transaction= t
; block_data= Lazy.force state_body }
(unstage (Sparse_ledger.handler sparse_ledger))
Expand Down
19 changes: 13 additions & 6 deletions src/lib/coda_base/account.ml
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ type var =
, State_hash.var
, Timing.var
, Permissions.Checked.t
, Field.Var.t * Snapp_account.t option
, Field.Var.t * Snapp_account.t option As_prover.Ref.t
(* TODO: This is a hack that lets us avoid unhashing snapp accounts when we don't need to *)
)
Poly.t
Expand All @@ -260,17 +260,24 @@ let identifier_of_var ({public_key; token_id; _} : var) =

let typ : (var, value) Typ.t =
let snapp :
(Field.Var.t * Snapp_account.t option, Snapp_account.t option) Typ.t =
( Field.Var.t * Snapp_account.t option As_prover.Ref.t
, Snapp_account.t option )
Typ.t =
let account :
(Snapp_account.t option As_prover.Ref.t, Snapp_account.t option) Typ.t
=
Typ.Internal.ref ()
in
let alloc =
let open Typ.Alloc in
let%map x = Typ.field.alloc in
(x, None)
let%map x = Typ.field.alloc and y = account.alloc in
(x, y)
in
let read (_, y) = Typ.Read.return y in
let read (_, y) = account.read y in
let store y =
let open Typ.Store in
let x = hash_snapp_account_opt y in
let%map x = Typ.field.store x in
let%map x = Typ.field.store x and y = account.store y in
(x, y)
in
let check (x, _) = Typ.field.check x in
Expand Down
7 changes: 7 additions & 0 deletions src/lib/coda_base/ledger.mli
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,13 @@ val undo :
-> Undo.t
-> unit Or_error.t

val merkle_root_after_snapp_command_exn :
constraint_constants:Genesis_constants.Constraint_constants.t
-> txn_state_view:Snapp_predicate.Protocol_state.View.t
-> t
-> Snapp_command.Valid.t
-> Ledger_hash.t * [`Next_available_token of Token_id.t]

val merkle_root_after_user_command_exn :
constraint_constants:Genesis_constants.Constraint_constants.t
-> txn_global_slot:Coda_numbers.Global_slot.t
Expand Down
8 changes: 8 additions & 0 deletions src/lib/coda_base/ledger_hash_intf.ml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ module type S = sig

val of_digest : Random_oracle.Digest.t -> t

val modify_account :
depth:int
-> var
-> Account_id.var
-> filter:(Account.var -> ('a, 's) Checked.t)
-> f:('a -> Account.var -> (Account.var, 's) Checked.t)
-> (var, 's) Checked.t

val modify_account_send :
depth:int
-> var
Expand Down
Loading