Skip to content

Commit

Permalink
Merge pull request #5876 from CodaProtocol/feature/snapp-transaction-…
Browse files Browse the repository at this point in the history
…snark-rewrite

Transaction snark rewrite
  • Loading branch information
mergify[bot] authored Sep 9, 2020
2 parents 1af8a6e + 4397147 commit 599d2e4
Show file tree
Hide file tree
Showing 16 changed files with 1,756 additions and 165 deletions.
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

0 comments on commit 599d2e4

Please sign in to comment.