From a01109d2816392098057b8ffd31790942ece4849 Mon Sep 17 00:00:00 2001 From: Paul Steckler Date: Wed, 26 Oct 2022 16:04:44 -0700 Subject: [PATCH] Move zkapp_uri to Zkapp_account --- src/app/archive/lib/load_data.ml | 22 +++--- src/app/archive/lib/processor.ml | 15 ++-- .../lib/genesis_ledger_helper_lib.ml | 6 +- src/lib/mina_base/account.ml | 60 ++------------- src/lib/mina_base/account_update.ml | 36 ++++----- src/lib/mina_base/zkapp_account.ml | 73 +++++++++++++++---- src/lib/mina_graphql/mina_graphql.ml | 14 +--- .../mina_base/mina_base_account_update.ml | 2 +- src/lib/runtime_config/runtime_config.ml | 5 +- .../mina_transaction_logic.ml | 17 +++-- .../transaction_snark/transaction_snark.ml | 9 ++- .../transaction_snark/transaction_snark.mli | 3 +- 12 files changed, 132 insertions(+), 130 deletions(-) diff --git a/src/app/archive/lib/load_data.ml b/src/app/archive/lib/load_data.ml index e2ac275f870f..b8544da4f789 100644 --- a/src/app/archive/lib/load_data.ml +++ b/src/app/archive/lib/load_data.ml @@ -775,8 +775,8 @@ let get_account_accessed ~pool (account : Processor.Accounts_accessed.t) : ; zkapp_version ; sequence_state_id ; last_sequence_slot - ; proved_state (* TODO : we'll have this at some point *) - ; zkapp_uri_id = _ + ; proved_state + ; zkapp_uri_id } -> let%bind { element0 @@ -838,7 +838,7 @@ let get_account_accessed ~pool (account : Processor.Accounts_accessed.t) : Processor.Zkapp_sequence_states.load db sequence_state_id ) in let elements = [ element0; element1; element2; element3; element4 ] in - let%map sequence_state = + let%bind sequence_state = let%map field_strs = Deferred.List.map elements ~f:(fun id -> query_db ~f:(fun db -> Processor.Zkapp_state_data.load db id) ) @@ -850,6 +850,14 @@ let get_account_accessed ~pool (account : Processor.Accounts_accessed.t) : last_sequence_slot |> Unsigned.UInt32.of_int64 |> Mina_numbers.Global_slot.of_uint32 in + let%map zkapp_uri = + Option.value_map zkapp_uri_id ~default:(return None) + ~f:(fun zkapp_uri_id -> + let%map uri = + query_db ~f:(fun db -> Processor.Zkapp_uri.load db zkapp_uri_id) + in + Some uri ) + in Some ( { app_state ; verification_key @@ -857,15 +865,10 @@ let get_account_accessed ~pool (account : Processor.Accounts_accessed.t) : ; sequence_state ; last_sequence_slot ; proved_state + ; zkapp_uri } : Mina_base.Zkapp_account.t ) ) in - (* TODO: the URI will be moved to the zkApp, no longer in the account *) - let%bind zkapp_uri = - Option.value_map zkapp_db ~default:(return "https://dummy.com") - ~f:(fun zkapp -> - query_db ~f:(fun db -> Processor.Zkapp_uri.load db zkapp.zkapp_uri_id) ) - in (* TODO: token permissions is going away *) let account = ( { public_key @@ -881,7 +884,6 @@ let get_account_accessed ~pool (account : Processor.Accounts_accessed.t) : ; timing ; permissions ; zkapp - ; zkapp_uri } : Mina_base.Account.t ) in diff --git a/src/app/archive/lib/processor.ml b/src/app/archive/lib/processor.ml index 7bcdaaf2215c..824a5907962e 100644 --- a/src/app/archive/lib/processor.ml +++ b/src/app/archive/lib/processor.ml @@ -2445,18 +2445,17 @@ module Zkapp_account = struct ; sequence_state_id : int ; last_sequence_slot : int64 ; proved_state : bool - ; zkapp_uri_id : int + ; zkapp_uri_id : int option } [@@deriving fields, hlist] let typ = Mina_caqti.Type_spec.custom_type ~to_hlist ~of_hlist - Caqti_type.[ int; option int; int64; int; int64; bool; int ] + Caqti_type.[ int; option int; int64; int; int64; bool; option int ] let table_name = "zkapp_accounts" - (* TODO: when zkapp_uri moved to Zkapp.Account in OCaml, no need to pass it in separately *) - let add_if_doesn't_exist (module Conn : CONNECTION) zkapp_uri zkapp_account = + let add_if_doesn't_exist (module Conn : CONNECTION) zkapp_account = let open Deferred.Result.Let_syntax in let ({ app_state ; verification_key @@ -2464,6 +2463,7 @@ module Zkapp_account = struct ; sequence_state ; last_sequence_slot ; proved_state + ; zkapp_uri } : Mina_base.Zkapp_account.t ) = zkapp_account @@ -2487,7 +2487,9 @@ module Zkapp_account = struct |> Unsigned.UInt32.to_int64 in let%bind zkapp_uri_id = - Zkapp_uri.add_if_doesn't_exist (module Conn) zkapp_uri + Option.value_map zkapp_uri ~default:(return None) ~f:(fun zkapp_uri -> + let%map id = Zkapp_uri.add_if_doesn't_exist (module Conn) zkapp_uri in + Some id ) in Mina_caqti.select_insert_into_cols ~select:("id", Caqti_type.int) ~table_name ~cols:(Fields.names, typ) @@ -2599,9 +2601,8 @@ module Accounts_accessed = struct account.permissions in let%bind zkapp_id = - (* TODO: when zkapp_uri part of Zkapp.Account.t, don't pass it separately here *) Mina_caqti.add_if_some - (Zkapp_account.add_if_doesn't_exist (module Conn) account.zkapp_uri) + (Zkapp_account.add_if_doesn't_exist (module Conn)) account.zkapp in let account_accessed : t = diff --git a/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml b/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml index 4e8f7f54a8c6..8164e1eb2f17 100644 --- a/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml +++ b/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml @@ -119,6 +119,7 @@ module Accounts = struct ; sequence_state ; last_sequence_slot ; proved_state + ; zkapp_uri } -> let%bind app_state = if @@ -157,6 +158,7 @@ module Accounts = struct ; sequence_state ; last_sequence_slot ; proved_state + ; zkapp_uri } in ( { public_key = account.public_key @@ -177,7 +179,6 @@ module Accounts = struct ~f:Mina_base.State_hash.of_base58_check_exn t.voting_for ; zkapp ; permissions - ; zkapp_uri = Option.value ~default:"" t.zkapp_uri } : Mina_base.Account.t ) @@ -268,6 +269,7 @@ module Accounts = struct ; sequence_state ; last_sequence_slot ; proved_state + ; zkapp_uri } -> let state = Zkapp_state.V.to_list app_state in @@ -284,6 +286,7 @@ module Accounts = struct ; sequence_state ; last_sequence_slot ; proved_state + ; zkapp_uri } ) in { pk = @@ -308,7 +311,6 @@ module Accounts = struct ; zkapp ; permissions ; token_symbol = Some account.token_symbol - ; zkapp_uri = Some account.zkapp_uri } end diff --git a/src/lib/mina_base/account.ml b/src/lib/mina_base/account.ml index 84cca26e09c7..066e70bedf61 100644 --- a/src/lib/mina_base/account.ml +++ b/src/lib/mina_base/account.ml @@ -234,8 +234,7 @@ module Poly = struct , 'state_hash , 'timing , 'permissions - , 'zkapp_opt - , 'zkapp_uri ) + , 'zkapp_opt ) t = { public_key : 'pk ; token_id : 'id @@ -249,7 +248,6 @@ module Poly = struct ; timing : 'timing ; permissions : 'permissions ; zkapp : 'zkapp_opt - ; zkapp_uri : 'zkapp_uri } [@@deriving sexp, equal, compare, hash, yojson, fields, hlist] @@ -322,8 +320,7 @@ module Binable_arg = struct , State_hash.Stable.V1.t , Timing.Stable.V1.t , Permissions.Stable.V2.t - , Zkapp_account.Stable.V2.t option - , string ) + , Zkapp_account.Stable.V2.t option ) (* TODO: Cache the digest of this? *) Poly.Stable.V2.t [@@deriving sexp, equal, hash, compare, yojson] @@ -377,8 +374,7 @@ type value = , State_hash.t , Timing.t , Permissions.t - , Zkapp_account.t option - , string ) + , Zkapp_account.t option ) Poly.t [@@deriving sexp] @@ -403,7 +399,6 @@ let initialize account_id : t = ; timing = Timing.Untimed ; permissions = Permissions.user_default ; zkapp = None - ; zkapp_uri = "" } let hash_zkapp_account_opt = function @@ -412,38 +407,6 @@ let hash_zkapp_account_opt = function | Some (a : Zkapp_account.t) -> Zkapp_account.digest a -(* This preimage cannot be attained by any string, due to the trailing [true] - added below. -*) -let zkapp_uri_non_preimage = - lazy (Random_oracle_input.Chunked.field_elements [| Field.zero; Field.zero |]) - -let hash_zkapp_uri_opt (zkapp_uri_opt : string option) = - let input = - match zkapp_uri_opt with - | Some zkapp_uri -> - (* We use [length*8 + 1] to pass a final [true] after the end of the - string, to ensure that trailing null bytes don't alias in the hash - preimage. - *) - let bits = Array.create ~len:((String.length zkapp_uri * 8) + 1) true in - String.foldi zkapp_uri ~init:() ~f:(fun i () c -> - let c = Char.to_int c in - (* Insert the bits into [bits], LSB order. *) - for j = 0 to 7 do - (* [Int.test_bit c j] *) - bits.((i * 8) + j) <- Int.bit_and c (1 lsl j) <> 0 - done ) ; - Random_oracle_input.Chunked.packeds - (Array.map ~f:(fun b -> (field_of_bool b, 1)) bits) - | None -> - Lazy.force zkapp_uri_non_preimage - in - Random_oracle.pack_input input - |> Random_oracle.hash ~init:Hash_prefix_states.zkapp_uri - -let hash_zkapp_uri (zkapp_uri : string) = hash_zkapp_uri_opt (Some zkapp_uri) - let delegate_opt = Option.value ~default:Public_key.Compressed.empty let to_input (t : t) = @@ -459,7 +422,6 @@ let to_input (t : t) = ~voting_for:(f State_hash.to_input) ~timing:(f Timing.to_input) ~zkapp:(f (Fn.compose field hash_zkapp_account_opt)) ~permissions:(f Permissions.to_input) - ~zkapp_uri:(f (Fn.compose field hash_zkapp_uri)) |> List.reduce_exn ~f:append let crypto_hash_prefix = Hash_prefix.account @@ -482,9 +444,8 @@ type var = , State_hash.var , Timing.var , Permissions.Checked.t - , Field.Var.t * Zkapp_account.t option As_prover.Ref.t - (* TODO: This is a hack that lets us avoid unhashing zkApp accounts when we don't need to *) - , string Data_as_hash.t ) + (* TODO: This is a hack that lets us avoid unhashing zkApp accounts when we don't need to *) + , Field.Var.t * Zkapp_account.t option As_prover.Ref.t ) Poly.t let identifier_of_var ({ public_key; token_id; _ } : var) = @@ -507,7 +468,6 @@ let typ' zkapp = ; Timing.typ ; Permissions.typ ; zkapp - ; Data_as_hash.typ ~hash:hash_zkapp_uri ] ~var_to_hlist:Poly.to_hlist ~var_of_hlist:Poly.of_hlist ~value_to_hlist:Poly.to_hlist ~value_of_hlist:Poly.of_hlist @@ -539,7 +499,6 @@ let var_of_t ; timing ; permissions ; zkapp - ; zkapp_uri } : value ) = { Poly.public_key = Public_key.Compressed.var_of_t public_key @@ -554,7 +513,6 @@ let var_of_t ; timing = Timing.var_of_t timing ; permissions = Permissions.Checked.constant permissions ; zkapp = Field.Var.constant (hash_zkapp_account_opt zkapp) - ; zkapp_uri = Field.Var.constant (hash_zkapp_uri zkapp_uri) } module Checked = struct @@ -571,8 +529,7 @@ module Checked = struct , State_hash.var , Timing.var , Permissions.Checked.t - , Zkapp_account.Checked.t - , string Data_as_hash.t ) + , Zkapp_account.Checked.t ) Poly.t let typ : (t, Stable.Latest.t) Typ.t = @@ -597,7 +554,7 @@ module Checked = struct ~receipt_chain_hash:(f Receipt.Chain_hash.var_to_input) ~delegate:(f Public_key.Compressed.Checked.to_input) ~voting_for:(f State_hash.var_to_input) - ~timing:(f Timing.var_to_input) ~zkapp_uri:(f Data_as_hash.to_input) ) + ~timing:(f Timing.var_to_input) ) let digest t = make_checked (fun () -> @@ -695,7 +652,6 @@ let empty = Permissions.user_default (* TODO: This should maybe be Permissions.empty *) ; zkapp = None - ; zkapp_uri = "" } let empty_digest = digest empty @@ -719,7 +675,6 @@ let create account_id balance = ; timing = Timing.Untimed ; permissions = Permissions.user_default ; zkapp = None - ; zkapp_uri = "" } let create_timed account_id balance ~initial_minimum_balance ~cliff_time @@ -756,7 +711,6 @@ let create_timed account_id balance ~initial_minimum_balance ~cliff_time ; vesting_period ; vesting_increment } - ; zkapp_uri = "" } (* no vesting after cliff time + 1 slot *) diff --git a/src/lib/mina_base/account_update.ml b/src/lib/mina_base/account_update.ml index 13f6af1ca355..f3918cf22b86 100644 --- a/src/lib/mina_base/account_update.ml +++ b/src/lib/mina_base/account_update.ml @@ -323,7 +323,7 @@ module Update = struct ; verification_key : Verification_key_wire.Stable.V1.t Set_or_keep.Stable.V1.t ; permissions : Permissions.Stable.V2.t Set_or_keep.Stable.V1.t - ; zkapp_uri : string Set_or_keep.Stable.V1.t + ; zkapp_uri : string option Set_or_keep.Stable.V1.t ; token_symbol : Account.Token_symbol.Stable.V1.t Set_or_keep.Stable.V1.t ; timing : Timing_info.Stable.V1.t Set_or_keep.Stable.V1.t @@ -374,11 +374,13 @@ module Update = struct let%bind zkapp_uri = let uri_gen = Quickcheck.Generator.of_list - [ "https://www.example.com" - ; "https://www.minaprotocol.com" - ; "https://www.gurgle.com" - ; "https://faceplant.com" - ] + (List.map + [ "https://www.example.com" + ; "https://www.minaprotocol.com" + ; "https://www.gurgle.com" + ; "https://faceplant.com" + ] + ~f:Option.some ) in Set_or_keep.gen uri_gen in @@ -421,7 +423,7 @@ module Update = struct Zkapp_basic.Flagged_option.t Set_or_keep.Checked.t ; permissions : Permissions.Checked.t Set_or_keep.Checked.t - ; zkapp_uri : string Data_as_hash.t Set_or_keep.Checked.t + ; zkapp_uri : string option Data_as_hash.t Set_or_keep.Checked.t ; token_symbol : Account.Token_symbol.var Set_or_keep.Checked.t ; timing : Timing_info.Checked.t Set_or_keep.Checked.t ; voting_for : State_hash.var Set_or_keep.Checked.t @@ -494,10 +496,8 @@ module Update = struct ~dummy:Field.zero ~f:field ; Set_or_keep.to_input permissions ~dummy:Permissions.user_default ~f:Permissions.to_input - ; Set_or_keep.to_input - (Set_or_keep.map ~f:Account.hash_zkapp_uri zkapp_uri) - ~dummy:(Account.hash_zkapp_uri_opt None) - ~f:field + ; Set_or_keep.to_input zkapp_uri ~dummy:None ~f:(fun zkapp_uri -> + Zkapp_account.zkapp_uri_to_input zkapp_uri ) ; Set_or_keep.to_input token_symbol ~dummy:Account.Token_symbol.default ~f:Account.Token_symbol.to_input ; Set_or_keep.to_input timing ~dummy:Timing_info.dummy @@ -535,9 +535,9 @@ module Update = struct } ) ) ; Set_or_keep.typ ~dummy:Permissions.user_default Permissions.typ ; Set_or_keep.optional_typ - (Data_as_hash.optional_typ ~hash:Account.hash_zkapp_uri - ~non_preimage:(Account.hash_zkapp_uri_opt None) - ~dummy_value:"" ) + (Data_as_hash.optional_typ ~hash:Zkapp_account.hash_zkapp_uri_opt + ~non_preimage:(Zkapp_account.hash_zkapp_uri_opt None) + ~dummy_value:None ) ~to_option:Fn.id ~of_option:Fn.id ; Set_or_keep.typ ~dummy:Account.Token_symbol.default Account.Token_symbol.typ @@ -550,10 +550,10 @@ module Update = struct let deriver obj = let open Fields_derivers_zkapps in let ( !. ) = ( !. ) ~t_fields_annots in - let string_with_hash = + let string_opt_with_hash = with_checked ~checked:(Data_as_hash.deriver string) - ~name:"StringWithHash" string + ~name:"StringOptionWithHash" string in let token_symbol = with_checked @@ -566,7 +566,7 @@ module Update = struct ~delegate:!.(Set_or_keep.deriver public_key) ~verification_key:!.(Set_or_keep.deriver verification_key_with_hash) ~permissions:!.(Set_or_keep.deriver Permissions.deriver) - ~zkapp_uri:!.(Set_or_keep.deriver string_with_hash) + ~zkapp_uri:!.(Set_or_keep.deriver string_opt_with_hash) ~token_symbol:!.(Set_or_keep.deriver token_symbol) ~timing:!.(Set_or_keep.deriver Timing_info.deriver) ~voting_for:!.(Set_or_keep.deriver State_hash.deriver) @@ -592,7 +592,7 @@ module Update = struct ; delegate = Set_or_keep.Set Public_key.Compressed.empty ; verification_key ; permissions = Set_or_keep.Set Permissions.user_default - ; zkapp_uri = Set_or_keep.Set "https://www.example.com" + ; zkapp_uri = Set_or_keep.Set (Some "https://www.example.com") ; token_symbol = Set_or_keep.Set "TOKEN" ; timing = Set_or_keep.Set Timing_info.dummy ; voting_for = Set_or_keep.Set State_hash.dummy diff --git a/src/lib/mina_base/zkapp_account.ml b/src/lib/mina_base/zkapp_account.ml index 8052eec46dc5..d1e568092a1c 100644 --- a/src/lib/mina_base/zkapp_account.ml +++ b/src/lib/mina_base/zkapp_account.ml @@ -185,27 +185,29 @@ module Poly = struct [%%versioned module Stable = struct module V2 = struct - type ('app_state, 'vk, 'zkapp_version, 'field, 'slot, 'bool) t = + type ('app_state, 'vk, 'zkapp_version, 'field, 'slot, 'bool, 'zkapp_uri) t = { app_state : 'app_state ; verification_key : 'vk ; zkapp_version : 'zkapp_version ; sequence_state : 'field Pickles_types.Vector.Vector_5.Stable.V1.t ; last_sequence_slot : 'slot ; proved_state : 'bool + ; zkapp_uri : 'zkapp_uri } [@@deriving sexp, equal, compare, hash, yojson, hlist, fields] end end] end -type ('app_state, 'vk, 'zkapp_version, 'field, 'slot, 'bool) t_ = - ('app_state, 'vk, 'zkapp_version, 'field, 'slot, 'bool) Poly.t = +type ('app_state, 'vk, 'zkapp_version, 'field, 'slot, 'bool, 'zkapp_uri) t_ = + ('app_state, 'vk, 'zkapp_version, 'field, 'slot, 'bool, 'zkapp_uri) Poly.t = { app_state : 'app_state ; verification_key : 'vk ; zkapp_version : 'zkapp_version ; sequence_state : 'field Pickles_types.Vector.Vector_5.t ; last_sequence_slot : 'slot ; proved_state : 'bool + ; zkapp_uri : 'zkapp_uri } [%%versioned @@ -219,7 +221,8 @@ module Stable = struct , Mina_numbers.Zkapp_version.Stable.V1.t , F.Stable.V1.t , Mina_numbers.Global_slot.Stable.V1.t - , bool ) + , bool + , string option ) Poly.Stable.V2.t [@@deriving sexp, equal, compare, hash, yojson] @@ -233,7 +236,8 @@ type t = , Mina_numbers.Zkapp_version.t , F.t , Mina_numbers.Global_slot.t - , bool ) + , bool + , string option ) Poly.t [@@deriving sexp, equal, compare, hash, yojson] @@ -253,31 +257,36 @@ module Checked = struct , Mina_numbers.Zkapp_version.Checked.t , Pickles.Impls.Step.Field.t , Mina_numbers.Global_slot.Checked.t - , Boolean.var ) + , Boolean.var + , string option Data_as_hash.t ) Poly.t open Pickles_types - let to_input' (t : _ Poly.t) = + let to_input' (t : _ Poly.t) : + Snark_params.Tick.Field.Var.t Random_oracle.Input.Chunked.t = let open Random_oracle.Input.Chunked in let f mk acc field = mk (Core_kernel.Field.get field t) :: acc in let app_state v = Random_oracle.Input.Chunked.field_elements (Vector.to_array v) in Poly.Fields.fold ~init:[] ~app_state:(f app_state) - ~verification_key:(f (fun x -> field x)) - ~zkapp_version:(f (fun x -> Mina_numbers.Zkapp_version.Checked.to_input x)) + ~verification_key:(f field) + ~zkapp_version:(f Mina_numbers.Zkapp_version.Checked.to_input) ~sequence_state:(f app_state) - ~last_sequence_slot: - (f (fun x -> Mina_numbers.Global_slot.Checked.to_input x)) + ~last_sequence_slot:(f Mina_numbers.Global_slot.Checked.to_input) ~proved_state: (f (fun (b : Boolean.var) -> Random_oracle.Input.Chunked.packed ((b :> Field.Var.t), 1) ) ) + ~zkapp_uri:(f field) |> List.reduce_exn ~f:append let to_input (t : t) = to_input' - { t with verification_key = Data_as_hash.hash t.verification_key.data } + { t with + verification_key = Data_as_hash.hash t.verification_key.data + ; zkapp_uri = Data_as_hash.hash t.verification_key.data + } let digest_vk t = Random_oracle.Checked.( @@ -295,6 +304,32 @@ end [%%define_locally Verification_key_wire.(digest_vk, dummy_vk_hash)] +let hash_zkapp_uri_opt (zkapp_uri_opt : string option) : + Snark_params.Tick.Field.t = + match zkapp_uri_opt with + | Some zkapp_uri -> + (* We use [length*8 + 1] to pass a final [true] after the end of the + string, to ensure that trailing null bytes don't alias in the hash + preimage. + *) + let bits = Array.create ~len:((String.length zkapp_uri * 8) + 1) true in + String.foldi zkapp_uri ~init:() ~f:(fun i () c -> + let c = Char.to_int c in + (* Insert the bits into [bits], LSB order. *) + for j = 0 to 7 do + (* [Int.test_bit c j] *) + bits.((i * 8) + j) <- Int.bit_and c (1 lsl j) <> 0 + done ) ; + (* REVIEWER: IS THIS OK? *) + Field.project (Array.to_list bits) + | None -> + (* This zero value cannot be attained by any string, due to the trailing [true] + added above + *) + Field.zero + +let hash_zkapp_uri (zkapp_uri : string) = hash_zkapp_uri_opt (Some zkapp_uri) + let typ : (Checked.t, t) Typ.t = let open Poly in Typ.of_hlistable @@ -310,13 +345,17 @@ let typ : (Checked.t, t) Typ.t = ; Pickles_types.Vector.typ Field.typ Pickles_types.Nat.N5.n ; Mina_numbers.Global_slot.typ ; Boolean.typ + ; Data_as_hash.typ ~hash:hash_zkapp_uri_opt ] ~var_to_hlist:to_hlist ~var_of_hlist:of_hlist ~value_to_hlist:to_hlist ~value_of_hlist:of_hlist [%%endif] -let to_input (t : t) = +let zkapp_uri_to_input zkapp_uri = + Random_oracle.Input.Chunked.field @@ hash_zkapp_uri_opt zkapp_uri + +let to_input (t : t) : _ Random_oracle.Input.Chunked.t = let open Random_oracle.Input.Chunked in let f mk acc field = mk (Core_kernel.Field.get field t) :: acc in let app_state v = @@ -332,6 +371,7 @@ let to_input (t : t) = ~last_sequence_slot:(f Mina_numbers.Global_slot.to_input) ~proved_state: (f (fun b -> Random_oracle.Input.Chunked.packed (field_of_bool b, 1))) + ~zkapp_uri:(f zkapp_uri_to_input) |> List.reduce_exn ~f:append let default : _ Poly.t = @@ -346,6 +386,7 @@ let default : _ Poly.t = [ empty; empty; empty; empty; empty ] ) ; last_sequence_slot = Mina_numbers.Global_slot.zero ; proved_state = false + ; zkapp_uri = None } let digest (t : t) = @@ -353,3 +394,9 @@ let digest (t : t) = hash ~init:Hash_prefix_states.zkapp_account (pack_input (to_input t))) let default_digest = lazy (digest default) + +let hash_zkapp_account_opt' = function + | None -> + Lazy.force default_digest + | Some (a : t) -> + digest a diff --git a/src/lib/mina_graphql/mina_graphql.ml b/src/lib/mina_graphql/mina_graphql.ml index f54def472529..ae7eedcd00c8 100644 --- a/src/lib/mina_graphql/mina_graphql.ml +++ b/src/lib/mina_graphql/mina_graphql.ml @@ -914,7 +914,6 @@ module Types = struct ; timing ; permissions ; zkapp - ; zkapp_uri } = let open Option.Let_syntax in let%bind token_permissions = token_permissions in @@ -922,8 +921,7 @@ module Types = struct let%bind nonce = nonce in let%bind receipt_chain_hash = receipt_chain_hash in let%bind voting_for = voting_for in - let%bind permissions = permissions in - let%map zkapp_uri = zkapp_uri in + let%map permissions = permissions in { Account.Poly.public_key ; token_id ; token_permissions @@ -936,7 +934,6 @@ module Types = struct ; timing ; permissions ; zkapp - ; zkapp_uri } let of_full_account ?breadcrumb @@ -952,7 +949,6 @@ module Types = struct ; timing ; permissions ; zkapp - ; zkapp_uri } = { Account.Poly.public_key ; token_id @@ -971,7 +967,6 @@ module Types = struct ; timing ; permissions = Some permissions ; zkapp - ; zkapp_uri = Some zkapp_uri } let of_account_id mina account_id = @@ -1008,7 +1003,6 @@ module Types = struct ; timing = Timing.Untimed ; permissions = None ; zkapp = None - ; zkapp_uri = None } let of_pk mina pk = @@ -1028,8 +1022,7 @@ module Types = struct , State_hash.t option , Account.Timing.t , Permissions.t option - , Zkapp_account.t option - , string option ) + , Zkapp_account.t option ) Account.Poly.t ; locked : bool option ; is_actively_staking : bool @@ -1389,7 +1382,8 @@ module Types = struct the zkApp source code" ~args:Arg.[] ~resolve:(fun _ { account; _ } -> - account.Account.Poly.zkapp_uri ) + Option.value_map account.zkapp ~default:None ~f:(fun zkapp -> + zkapp.zkapp_uri ) ) ; field "zkappState" ~typ: ( list @@ non_null diff --git a/src/lib/mina_wire_types/mina_base/mina_base_account_update.ml b/src/lib/mina_wire_types/mina_base/mina_base_account_update.ml index e1b593a783a1..c02bad8f52bf 100644 --- a/src/lib/mina_wire_types/mina_base/mina_base_account_update.ml +++ b/src/lib/mina_wire_types/mina_base/mina_base_account_update.ml @@ -29,7 +29,7 @@ module Update = struct Mina_base_zkapp_basic.Set_or_keep.V1.t ; permissions : Mina_base_permissions.V2.t Mina_base_zkapp_basic.Set_or_keep.V1.t - ; zkapp_uri : string Mina_base_zkapp_basic.Set_or_keep.V1.t + ; zkapp_uri : string option Mina_base_zkapp_basic.Set_or_keep.V1.t ; token_symbol : Mina_base_account.Token_symbol.V1.t Mina_base_zkapp_basic.Set_or_keep.V1.t diff --git a/src/lib/runtime_config/runtime_config.ml b/src/lib/runtime_config/runtime_config.ml index 49a105314038..46323edfd760 100644 --- a/src/lib/runtime_config/runtime_config.ml +++ b/src/lib/runtime_config/runtime_config.ml @@ -193,6 +193,7 @@ module Json_layout = struct ; sequence_state : Field.t list ; last_sequence_slot : int ; proved_state : bool + ; zkapp_uri : string option } [@@deriving sexp, fields, dhall_type, yojson, bin_io_unversioned] @@ -216,7 +217,6 @@ module Json_layout = struct ; zkapp : Zkapp_account.t option [@default None] ; permissions : Permissions.t option [@default None] ; token_symbol : string option [@default None] - ; zkapp_uri : string option [@default None] } [@@deriving sexp, fields, yojson, dhall_type] @@ -238,7 +238,6 @@ module Json_layout = struct ; zkapp = None ; permissions = None ; token_symbol = None - ; zkapp_uri = None } end @@ -445,7 +444,6 @@ module Accounts = struct ; zkapp : Zkapp_account.t option ; permissions : Permissions.t option ; token_symbol : string option - ; zkapp_uri : string option } [@@deriving bin_io_unversioned, sexp] @@ -476,7 +474,6 @@ module Accounts = struct ; zkapp : Single.Zkapp_account.t option ; permissions : Single.Permissions.t option ; token_symbol : string option - ; zkapp_uri : string option } type t = Single.t list [@@deriving bin_io_unversioned] diff --git a/src/lib/transaction_logic/mina_transaction_logic.ml b/src/lib/transaction_logic/mina_transaction_logic.ml index 9bb9e5ba2f59..0e6910976b67 100644 --- a/src/lib/transaction_logic/mina_transaction_logic.ml +++ b/src/lib/transaction_logic/mina_transaction_logic.ml @@ -1223,7 +1223,7 @@ module Make (L : Ledger_intf.S) : S with type ledger := L.t = struct end module Zkapp_uri = struct - type t = string + type t = string option let if_ = value_if end @@ -1359,9 +1359,14 @@ module Make (L : Ledger_intf.S) : S with type ledger := L.t = struct let set_sequence_state sequence_state (a : t) = set_zkapp a ~f:(fun zkapp -> { zkapp with sequence_state }) - let zkapp_uri (a : t) = a.zkapp_uri + let zkapp_uri (a : t) = + Option.value_map a.zkapp ~default:None ~f:(fun zkapp -> + zkapp.zkapp_uri ) - let set_zkapp_uri zkapp_uri (a : t) = { a with zkapp_uri } + let set_zkapp_uri zkapp_uri (a : t) : t = + { a with + zkapp = Option.map a.zkapp ~f:(fun zkapp -> { zkapp with zkapp_uri }) + } let token_symbol (a : t) = a.token_symbol @@ -1509,7 +1514,8 @@ module Make (L : Ledger_intf.S) : S with type ledger := L.t = struct account_update.body.sequence_events let zkapp_uri (account_update : t) = - account_update.body.update.zkapp_uri + Zkapp_basic.Set_or_keep.map ~f:Option.some + account_update.body.update.zkapp_uri let token_symbol (account_update : t) = account_update.body.update.token_symbol @@ -2159,8 +2165,7 @@ module For_tests = struct , State_hash.t , Account_timing.t , Permissions.t - , Zkapp_account.t option - , string ) + , Zkapp_account.t option ) Account.Poly.t [@@deriving sexp, compare] end diff --git a/src/lib/transaction_snark/transaction_snark.ml b/src/lib/transaction_snark/transaction_snark.ml index 9e5acb18b474..529e254b148b 100644 --- a/src/lib/transaction_snark/transaction_snark.ml +++ b/src/lib/transaction_snark/transaction_snark.ml @@ -1133,7 +1133,7 @@ module Base = struct end module Zkapp_uri = struct - type t = string Data_as_hash.t + type t = string option Data_as_hash.t let if_ = Data_as_hash.if_ end @@ -1275,10 +1275,11 @@ module Base = struct let set_sequence_state sequence_state ({ data = a; hash } : t) : t = { data = { a with zkapp = { a.zkapp with sequence_state } }; hash } - let zkapp_uri (a : t) = a.data.zkapp_uri + let zkapp_uri (a : t) = a.data.zkapp.zkapp_uri - let set_zkapp_uri zkapp_uri ({ data = a; hash } : t) : t = - { data = { a with zkapp_uri }; hash } + let set_zkapp_uri (zkapp_uri : Zkapp_uri.t) ({ data = a; hash } : t) : t + = + { data = { a with zkapp = { a.zkapp with zkapp_uri } }; hash } let token_symbol (a : t) = a.data.token_symbol diff --git a/src/lib/transaction_snark/transaction_snark.mli b/src/lib/transaction_snark/transaction_snark.mli index 98112ad30d53..1e2cb370741c 100644 --- a/src/lib/transaction_snark/transaction_snark.mli +++ b/src/lib/transaction_snark/transaction_snark.mli @@ -422,8 +422,7 @@ module Base : sig , Currency.Amount.var ) Account_timing.As_record.t , 'j - , 'k - , 'l ) + , 'k ) Account.Poly.t -> txn_amount:Currency.Amount.var option -> txn_global_slot:Mina_numbers.Global_slot.Checked.var