From 2fd0c7c0323ae0961eb6d49b54325f822b2a2dba Mon Sep 17 00:00:00 2001 From: Paul Steckler Date: Wed, 13 Sep 2023 16:52:14 -0700 Subject: [PATCH 1/5] Remove constructors for account precondition --- src/app/archive/drop_tables.sql | 4 - src/app/archive/lib/load_data.ml | 229 ++++++++---------- src/app/archive/lib/processor.ml | 73 +----- src/app/archive/zkapp_tables.sql | 36 +-- src/app/zkapps_examples/zkapps_examples.ml | 39 ++- src/lib/mina_base/account_update.ml | 107 +++----- src/lib/mina_base/zkapp_precondition.ml | 12 + .../zkapp_command_generators.ml | 20 +- .../mina_base/mina_base_account_update.ml | 5 +- src/lib/network_pool/transaction_pool.ml | 30 +-- .../mina_transaction_logic.ml | 29 +-- src/lib/transaction_snark/test/ring_sig.ml | 6 +- .../transaction_snark/transaction_snark.ml | 20 +- .../zkapp_command_builder.ml | 2 +- 14 files changed, 234 insertions(+), 378 deletions(-) diff --git a/src/app/archive/drop_tables.sql b/src/app/archive/drop_tables.sql index 5711087747d5..571327de8136 100644 --- a/src/app/archive/drop_tables.sql +++ b/src/app/archive/drop_tables.sql @@ -52,8 +52,6 @@ DROP TABLE zkapp_network_precondition; DROP TABLE zkapp_account_precondition; -DROP TABLE zkapp_account_precondition_values; - DROP TABLE zkapp_accounts; DROP TABLE zkapp_epoch_data; @@ -88,8 +86,6 @@ DROP TABLE zkapp_token_id_bounds; DROP TYPE zkapp_auth_required_type; -DROP TYPE zkapp_precondition_type; - DROP TABLE snarked_ledger_hashes; DROP TABLE timing_info; diff --git a/src/app/archive/lib/load_data.ml b/src/app/archive/lib/load_data.ml index 03950d74835a..0dc3c4bb1bcf 100644 --- a/src/app/archive/lib/load_data.ml +++ b/src/app/archive/lib/load_data.ml @@ -462,139 +462,118 @@ let get_account_update_body ~pool body_id = protocol_state_precondition_of_id pool zkapp_network_precondition_id in let%bind account_precondition = - let%bind ({ kind; account_precondition_values_id; nonce } + let%bind ({ balance_id + ; nonce_id + ; receipt_chain_hash + ; delegate_id + ; state_id + ; action_state_id + ; proved_state + ; is_new + } : Processor.Zkapp_account_precondition.t ) = query_db ~f:(fun db -> Processor.Zkapp_account_precondition.load db zkapp_account_precondition_id ) in - match kind with - | Nonce -> - assert (Option.is_some nonce) ; - let nonce = - Option.value_exn nonce |> Unsigned.UInt32.of_int64 - |> Mina_numbers.Account_nonce.of_uint32 - in - return @@ Account_update.Account_precondition.Nonce nonce - | Accept -> - return Account_update.Account_precondition.Accept - | Full -> - assert (Option.is_some account_precondition_values_id) ; - let%bind { balance_id - ; nonce_id - ; receipt_chain_hash - ; delegate_id - ; state_id - ; action_state_id - ; proved_state - ; is_new - } = - query_db ~f:(fun db -> - Processor.Zkapp_account_precondition_values.load db - (Option.value_exn account_precondition_values_id) ) - in - let%bind balance = - let%map balance_opt = - Option.value_map balance_id ~default:(return None) ~f:(fun id -> - let%map { balance_lower_bound; balance_upper_bound } = - query_db ~f:(fun db -> - Processor.Zkapp_balance_bounds.load db id ) - in - let lower = Currency.Balance.of_string balance_lower_bound in - let upper = Currency.Balance.of_string balance_upper_bound in - Some ({ lower; upper } : _ Zkapp_precondition.Closed_interval.t) ) - in - Or_ignore.of_option balance_opt - in - let%bind nonce = - let%map nonce_opt = - Option.value_map nonce_id ~default:(return None) ~f:(fun id -> - let%map { nonce_lower_bound; nonce_upper_bound } = - query_db ~f:(fun db -> - Processor.Zkapp_nonce_bounds.load db id ) - in - let balance_of_int64 int64 = - int64 |> Unsigned.UInt32.of_int64 - |> Mina_numbers.Account_nonce.of_uint32 - in - let lower = balance_of_int64 nonce_lower_bound in - let upper = balance_of_int64 nonce_upper_bound in - Some ({ lower; upper } : _ Zkapp_precondition.Closed_interval.t) ) - in - Or_ignore.of_option nonce_opt - in - let receipt_chain_hash = - Option.map receipt_chain_hash - ~f:Receipt.Chain_hash.of_base58_check_exn - |> Or_ignore.of_option - in - let get_pk id = - let%map pk_opt = - Option.value_map id ~default:(return None) ~f:(fun id -> - let%map pk = pk_of_id id in - Some pk ) - in - Or_ignore.of_option pk_opt - in - let%bind delegate = get_pk delegate_id in - let%bind state = - let%bind { element0 - ; element1 - ; element2 - ; element3 - ; element4 - ; element5 - ; element6 - ; element7 - } = - query_db ~f:(fun db -> - Processor.Zkapp_states_nullable.load db state_id ) - in - let elements = - [ element0 - ; element1 - ; element2 - ; element3 - ; element4 - ; element5 - ; element6 - ; element7 - ] - in - let%map fields = - Deferred.List.map elements ~f:(fun id_opt -> - Option.value_map id_opt ~default:(return None) ~f:(fun id -> - let%map field_str = - query_db ~f:(fun db -> Processor.Zkapp_field.load db id) - in - Some (Zkapp_basic.F.of_string field_str) ) ) - in - List.map fields ~f:Or_ignore.of_option |> Zkapp_state.V.of_list_exn - in - let%bind action_state = - let%map action_state_opt = - Option.value_map action_state_id ~default:(return None) - ~f:(fun id -> + let%bind balance = + let%map balance_opt = + Option.value_map balance_id ~default:(return None) ~f:(fun id -> + let%map { balance_lower_bound; balance_upper_bound } = + query_db ~f:(fun db -> Processor.Zkapp_balance_bounds.load db id) + in + let lower = Currency.Balance.of_string balance_lower_bound in + let upper = Currency.Balance.of_string balance_upper_bound in + Some ({ lower; upper } : _ Zkapp_precondition.Closed_interval.t) ) + in + Or_ignore.of_option balance_opt + in + let%bind nonce = + let%map nonce_opt = + Option.value_map nonce_id ~default:(return None) ~f:(fun id -> + let%map { nonce_lower_bound; nonce_upper_bound } = + query_db ~f:(fun db -> Processor.Zkapp_nonce_bounds.load db id) + in + let balance_of_int64 int64 = + int64 |> Unsigned.UInt32.of_int64 + |> Mina_numbers.Account_nonce.of_uint32 + in + let lower = balance_of_int64 nonce_lower_bound in + let upper = balance_of_int64 nonce_upper_bound in + Some ({ lower; upper } : _ Zkapp_precondition.Closed_interval.t) ) + in + Or_ignore.of_option nonce_opt + in + let receipt_chain_hash = + Option.map receipt_chain_hash ~f:Receipt.Chain_hash.of_base58_check_exn + |> Or_ignore.of_option + in + let get_pk id = + let%map pk_opt = + Option.value_map id ~default:(return None) ~f:(fun id -> + let%map pk = pk_of_id id in + Some pk ) + in + Or_ignore.of_option pk_opt + in + let%bind delegate = get_pk delegate_id in + let%bind state = + let%bind { element0 + ; element1 + ; element2 + ; element3 + ; element4 + ; element5 + ; element6 + ; element7 + } = + query_db ~f:(fun db -> + Processor.Zkapp_states_nullable.load db state_id ) + in + let elements = + [ element0 + ; element1 + ; element2 + ; element3 + ; element4 + ; element5 + ; element6 + ; element7 + ] + in + let%map fields = + Deferred.List.map elements ~f:(fun id_opt -> + Option.value_map id_opt ~default:(return None) ~f:(fun id -> let%map field_str = query_db ~f:(fun db -> Processor.Zkapp_field.load db id) in - Some (Zkapp_basic.F.of_string field_str) ) - in - Or_ignore.of_option action_state_opt - in - let proved_state = Or_ignore.of_option proved_state in - let is_new = Or_ignore.of_option is_new in - return - (Account_update.Account_precondition.Full - { balance - ; nonce - ; receipt_chain_hash - ; delegate - ; state - ; action_state - ; proved_state - ; is_new - } ) + Some (Zkapp_basic.F.of_string field_str) ) ) + in + List.map fields ~f:Or_ignore.of_option |> Zkapp_state.V.of_list_exn + in + let%bind action_state = + let%map action_state_opt = + Option.value_map action_state_id ~default:(return None) ~f:(fun id -> + let%map field_str = + query_db ~f:(fun db -> Processor.Zkapp_field.load db id) + in + Some (Zkapp_basic.F.of_string field_str) ) + in + Or_ignore.of_option action_state_opt + in + let proved_state = Or_ignore.of_option proved_state in + let is_new = Or_ignore.of_option is_new in + return + ( { balance + ; nonce + ; receipt_chain_hash + ; delegate + ; state + ; action_state + ; proved_state + ; is_new + } + : Zkapp_precondition.Account.t ) in let%bind valid_while_precondition = get_global_slot_bounds pool zkapp_valid_while_precondition_id diff --git a/src/app/archive/lib/processor.ml b/src/app/archive/lib/processor.ml index 34829de06e99..1553ee5d2eeb 100644 --- a/src/app/archive/lib/processor.ml +++ b/src/app/archive/lib/processor.ml @@ -856,7 +856,7 @@ module Zkapp_nonce_bounds = struct id end -module Zkapp_account_precondition_values = struct +module Zkapp_account_precondition = struct type t = { balance_id : int option ; nonce_id : int option @@ -882,7 +882,7 @@ module Zkapp_account_precondition_values = struct ; option bool ] - let table_name = "zkapp_account_precondition_values" + let table_name = "zkapp_account_precondition" let add_if_doesn't_exist (module Conn : CONNECTION) (acct : Zkapp_precondition.Account.t) = @@ -940,75 +940,6 @@ module Zkapp_account_precondition_values = struct id end -module Zkapp_account_precondition = struct - type t = - { kind : Account_update.Account_precondition.Tag.t - ; account_precondition_values_id : int option - ; nonce : int64 option - } - [@@deriving fields, hlist] - - let zkapp_account_precondition_kind_typ = - let encode = function - | Account_update.Account_precondition.Tag.Full -> - "full" - | Nonce -> - "nonce" - | Accept -> - "accept" - in - let decode = function - | "full" -> - Result.return Account_update.Account_precondition.Tag.Full - | "nonce" -> - Result.return Account_update.Account_precondition.Tag.Nonce - | "accept" -> - Result.return Account_update.Account_precondition.Tag.Accept - | _ -> - Result.failf "Failed to decode zkapp_account_precondition_kind_typ" - in - Caqti_type.enum "zkapp_precondition_type" ~encode ~decode - - let typ = - Mina_caqti.Type_spec.custom_type ~to_hlist ~of_hlist - Caqti_type. - [ zkapp_account_precondition_kind_typ; option int; option int64 ] - - let table_name = "zkapp_account_precondition" - - let add_if_doesn't_exist (module Conn : CONNECTION) - (account_precondition : Account_update.Account_precondition.t) = - let open Deferred.Result.Let_syntax in - let%bind account_precondition_values_id = - match account_precondition with - | Account_update.Account_precondition.Full acct -> - Zkapp_account_precondition_values.add_if_doesn't_exist - (module Conn) - acct - >>| Option.some - | _ -> - return None - in - let kind = Account_update.Account_precondition.tag account_precondition in - let nonce = - match account_precondition with - | Account_update.Account_precondition.Nonce nonce -> - Option.some @@ Unsigned.UInt32.to_int64 nonce - | _ -> - None - in - Mina_caqti.select_insert_into_cols ~select:("id", Caqti_type.int) - ~table_name ~cols:(Fields.names, typ) - (module Conn) - { kind; account_precondition_values_id; nonce } - - let load (module Conn : CONNECTION) id = - Conn.find - (Caqti_request.find Caqti_type.int typ - (Mina_caqti.select_cols_from_id ~table_name ~cols:Fields.names) ) - id -end - module Zkapp_token_id_bounds = struct type t = { token_id_lower_bound : string; token_id_upper_bound : string } [@@deriving fields, hlist] diff --git a/src/app/archive/zkapp_tables.sql b/src/app/archive/zkapp_tables.sql index ae6c71c93645..03445a146aaa 100644 --- a/src/app/archive/zkapp_tables.sql +++ b/src/app/archive/zkapp_tables.sql @@ -151,40 +151,28 @@ CREATE TABLE zkapp_nonce_bounds , nonce_upper_bound bigint NOT NULL ); -CREATE TYPE zkapp_precondition_type AS ENUM ('full', 'nonce', 'accept'); - /* NULL convention */ -CREATE TABLE zkapp_account_precondition_values -( id serial PRIMARY KEY -, balance_id int REFERENCES zkapp_balance_bounds(id) -, nonce_id int REFERENCES zkapp_nonce_bounds(id) +CREATE TABLE zkapp_account_precondition +( id serial PRIMARY KEY +, balance_id int REFERENCES zkapp_balance_bounds(id) +, nonce_id int REFERENCES zkapp_nonce_bounds(id) , receipt_chain_hash text -, delegate_id int REFERENCES public_keys(id) -, state_id int NOT NULL REFERENCES zkapp_states_nullable(id) -, action_state_id int REFERENCES zkapp_field(id) +, delegate_id int REFERENCES public_keys(id) +, state_id int NOT NULL REFERENCES zkapp_states_nullable(id) +, action_state_id int REFERENCES zkapp_field(id) , proved_state boolean , is_new boolean ); -/* invariants: precondition_account id is not NULL iff kind is 'full' - nonce is not NULL iff kind is 'nonce' -*/ -CREATE TABLE zkapp_account_precondition -( id serial PRIMARY KEY -, kind zkapp_precondition_type NOT NULL -, account_precondition_values_id int REFERENCES zkapp_account_precondition_values(id) -, nonce bigint -); - CREATE TABLE zkapp_accounts ( id serial PRIMARY KEY -, app_state_id int NOT NULL REFERENCES zkapp_states(id) -, verification_key_id int REFERENCES zkapp_verification_keys(id) +, app_state_id int NOT NULL REFERENCES zkapp_states(id) +, verification_key_id int REFERENCES zkapp_verification_keys(id) , zkapp_version bigint NOT NULL -, action_state_id int NOT NULL REFERENCES zkapp_action_states(id) -, last_action_slot bigint NOT NULL +, action_state_id int NOT NULL REFERENCES zkapp_action_states(id) +, last_action_slot bigint NOT NULL , proved_state bool NOT NULL -, zkapp_uri_id int NOT NULL REFERENCES zkapp_uris(id) +, zkapp_uri_id int NOT NULL REFERENCES zkapp_uris(id) ); CREATE TABLE zkapp_token_id_bounds diff --git a/src/app/zkapps_examples/zkapps_examples.ml b/src/app/zkapps_examples/zkapps_examples.ml index b1c1c04f2566..0dcac898cd21 100644 --- a/src/app/zkapps_examples/zkapps_examples.ml +++ b/src/app/zkapps_examples/zkapps_examples.ml @@ -27,25 +27,24 @@ module Account_update_under_construction = struct let default = var_of_t (Account_update.Account_precondition.typ ()) - (Full - { balance = Ignore - ; nonce = Ignore - ; receipt_chain_hash = Ignore - ; delegate = Ignore - ; state = - [ Ignore - ; Ignore - ; Ignore - ; Ignore - ; Ignore - ; Ignore - ; Ignore - ; Ignore - ] - ; action_state = Ignore - ; proved_state = Ignore - ; is_new = Ignore - } ) + { balance = Ignore + ; nonce = Ignore + ; receipt_chain_hash = Ignore + ; delegate = Ignore + ; state = + [ Ignore + ; Ignore + ; Ignore + ; Ignore + ; Ignore + ; Ignore + ; Ignore + ; Ignore + ] + ; action_state = Ignore + ; proved_state = Ignore + ; is_new = Ignore + } in let proved_state = (* TODO: This is not great. *) @@ -750,7 +749,7 @@ module Deploy_account_update = struct ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; authorization_kind = Signature diff --git a/src/lib/mina_base/account_update.ml b/src/lib/mina_base/account_update.ml index f2c2c9def7a5..5c363769116e 100644 --- a/src/lib/mina_base/account_update.ml +++ b/src/lib/mina_base/account_update.ml @@ -955,75 +955,44 @@ module Account_precondition = struct [%%versioned module Stable = struct module V1 = struct - type t = - Mina_wire_types.Mina_base.Account_update.Account_precondition.V1.t = - | Full of Zkapp_precondition.Account.Stable.V2.t - | Nonce of Account.Nonce.Stable.V1.t - | Accept + type t = Zkapp_precondition.Account.Stable.V2.t [@@deriving sexp, yojson, hash] - let to_latest = Fn.id - - let to_full = function - | Full s -> - s - | Nonce n -> - { Zkapp_precondition.Account.accept with - nonce = Check { lower = n; upper = n } - } - | Accept -> - Zkapp_precondition.Account.accept + let (_ : + ( t + , Mina_wire_types.Mina_base.Account_update.Account_precondition.V1.t + ) + Type_equal.t ) = + Type_equal.T - let equal p q = Zkapp_precondition.Account.equal (to_full p) (to_full q) + let to_latest = Fn.id - let compare p q = - Zkapp_precondition.Account.compare (to_full p) (to_full q) + [%%define_locally Zkapp_precondition.Account.(equal, compare)] end end] - [%%define_locally Stable.Latest.(to_full, equal, compare)] + [%%define_locally Stable.Latest.(equal, compare)] let gen : t Quickcheck.Generator.t = + (* we used to have 3 constructors, Full, Nonce, and Accept for the type t + nowadays, the generator creates these 3 different kinds of values, but all mapped to t + *) + let open Zkapp_basic in Quickcheck.Generator.variant3 Zkapp_precondition.Account.gen Account.Nonce.gen Unit.quickcheck_generator |> Quickcheck.Generator.map ~f:(function - | `A x -> - Full x - | `B x -> - Nonce x + | `A precondition -> + precondition + | `B n -> + Zkapp_precondition.Account.nonce n | `C () -> - Accept ) - - let of_full (p : Zkapp_precondition.Account.t) = - let module A = Zkapp_precondition.Account in - if A.equal p A.accept then Accept - else - match p.nonce with - | Ignore -> - Full p - | Check { lower; upper } as n -> - if - A.equal p { A.accept with nonce = n } - && Account.Nonce.equal lower upper - then Nonce lower - else Full p + Zkapp_precondition.Account.accept ) module Tag = struct type t = Full | Nonce | Accept [@@deriving equal, compare, sexp, yojson] end - let tag : t -> Tag.t = function - | Full _ -> - Full - | Nonce _ -> - Nonce - | Accept -> - Accept - - let deriver obj = - let open Fields_derivers_zkapps.Derivers in - iso_record ~of_record:of_full ~to_record:to_full - Zkapp_precondition.Account.deriver obj + let deriver obj = Zkapp_precondition.Account.deriver obj let digest (t : t) = let digest x = @@ -1031,7 +1000,7 @@ module Account_precondition = struct hash ~init:Hash_prefix_states.account_update_account_precondition (pack_input x)) in - to_full t |> Zkapp_precondition.Account.to_input |> digest + t |> Zkapp_precondition.Account.to_input |> digest module Checked = struct type t = Zkapp_precondition.Account.Checked.t @@ -1048,16 +1017,9 @@ module Account_precondition = struct end let typ () : (Zkapp_precondition.Account.Checked.t, t) Typ.t = - Typ.transport (Zkapp_precondition.Account.typ ()) ~there:to_full - ~back:(fun s -> Full s) - - let nonce = function - | Full { nonce; _ } -> - nonce - | Nonce nonce -> - Check { lower = nonce; upper = nonce } - | Accept -> - Ignore + Zkapp_precondition.Account.typ () + + let nonce ({ nonce; _ } : t) = nonce end module Preconditions = struct @@ -1089,8 +1051,7 @@ module Preconditions = struct let to_input ({ network; account; valid_while } : t) = List.reduce_exn ~f:Random_oracle_input.Chunked.append [ Zkapp_precondition.Protocol_state.to_input network - ; Zkapp_precondition.Account.to_input - (Account_precondition.to_full account) + ; Zkapp_precondition.Account.to_input account ; Zkapp_precondition.Valid_while.to_input valid_while ] @@ -1139,7 +1100,7 @@ module Preconditions = struct let accept = { network = Zkapp_precondition.Protocol_state.accept - ; account = Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } end @@ -1422,7 +1383,7 @@ module Body = struct ; upper = valid_until } } ) - ; account = Account_precondition.Nonce t.nonce + ; account = Zkapp_precondition.Account.nonce t.nonce ; valid_while = Ignore } ; use_full_commitment = true @@ -1454,7 +1415,7 @@ module Body = struct ; upper = valid_until } } ) - ; account = Account_precondition.Nonce t.nonce + ; account = Zkapp_precondition.Account.nonce t.nonce ; valid_while = Ignore } ; use_full_commitment = true @@ -1485,11 +1446,13 @@ module Body = struct (balance_change.magnitude |> Currency.Amount.to_uint64) in let nonce = - match preconditions.account with - | Nonce nonce -> - Mina_numbers.Account_nonce.of_uint32 nonce - | Full _ | Accept -> - failwith "Expected a nonce for fee payer account precondition" + if Zkapp_precondition.Account.is_nonce preconditions.account then + match preconditions.account.nonce with + | Check { lower; upper = _ } -> + lower + | Ignore -> + failwith "Unexpected Ignore for fee payer precondition nonce" + else failwith "Expected a nonce for fee payer account precondition" in let valid_until = match preconditions.network.global_slot_since_genesis with diff --git a/src/lib/mina_base/zkapp_precondition.ml b/src/lib/mina_base/zkapp_precondition.ml index b6cfb4378dc6..2a02dba4eee4 100644 --- a/src/lib/mina_base/zkapp_precondition.ml +++ b/src/lib/mina_base/zkapp_precondition.ml @@ -523,6 +523,18 @@ module Account = struct let is_accept : t -> bool = equal accept + let nonce (n : Account.Nonce.t) = + let nonce : _ Numeric.t = Check { lower = n; upper = n } in + { accept with nonce } + + let is_nonce (t : t) = + match t.nonce with + | Ignore -> + false + | Check { lower; upper } -> + Mina_numbers.Account_nonce.equal lower upper + && is_accept { t with nonce = Ignore } + let deriver obj = let open Fields_derivers_zkapps in let ( !. ) = ( !. ) ~t_fields_annots in diff --git a/src/lib/mina_generators/zkapp_command_generators.ml b/src/lib/mina_generators/zkapp_command_generators.ml index 9636bfcf5b03..619ed1d92d1b 100644 --- a/src/lib/mina_generators/zkapp_command_generators.ml +++ b/src/lib/mina_generators/zkapp_command_generators.ml @@ -25,8 +25,7 @@ let gen_account_precondition_from_account ?failure ?(ignore_sequence_events_precond = false) ?(no_account_precondition = false) ?(is_nonce_precondition = false) ~first_use_of_account account = let open Quickcheck.Let_syntax in - if no_account_precondition then - return Account_update.Account_precondition.Accept + if no_account_precondition then return Zkapp_precondition.Account.accept else let { Account.Poly.balance; nonce; delegate; receipt_chain_hash; zkapp; _ } = @@ -230,20 +229,17 @@ let gen_account_precondition_from_account ?failure in return { predicate_account with proved_state } in - return - (Account_update.Account_precondition.Full faulty_predicate_account) + return faulty_predicate_account | _ -> - return (Account_update.Account_precondition.Full predicate_account) + return predicate_account else (* Nonce *) let { Account.Poly.nonce; _ } = account in match failure with | Some Invalid_account_precondition -> - return - (Account_update.Account_precondition.Nonce - (Account.Nonce.succ nonce) ) + return @@ Zkapp_precondition.Account.nonce (Account.Nonce.succ nonce) | _ -> - return (Account_update.Account_precondition.Nonce nonce) + return @@ Zkapp_precondition.Account.nonce nonce let gen_fee ?fee_range ~num_updates (account : Account.t) = let balance = account.balance in @@ -322,8 +318,7 @@ let gen_use_full_commitment ~increment_nonce ~account_precondition increment_nonce && Zkapp_precondition.Numeric.is_constant Zkapp_precondition.Numeric.Tc.nonce - (Account_update.Account_precondition.to_full account_precondition) - .Zkapp_precondition.Account.nonce + account_precondition.Zkapp_precondition.Account.nonce in let does_not_use_a_signature = Control.(not (Tag.equal (tag authorization) Tag.Signature)) @@ -1081,7 +1076,8 @@ let gen_account_update_body_fee_payer ?global_slot ?fee_range ?failure () ) ~f_account_precondition:(fun ~first_use_of_account:_ acct -> account_precondition_gen acct ) - ~f_account_update_account_precondition:(fun nonce -> Nonce nonce) + ~f_account_update_account_precondition:(fun nonce -> + Zkapp_precondition.Account.nonce nonce ) ~gen_use_full_commitment:(fun ~account_precondition:_ -> return ()) ?protocol_state_view ~authorization_tag:Control.Tag.Signature () in 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 92fff862ef14..0d6c238efd26 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 @@ -49,10 +49,7 @@ end module Account_precondition = struct module V1 = struct - type t = - | Full of Mina_base_zkapp_precondition.Account.V2.t - | Nonce of Mina_numbers.Account_nonce.V1.t - | Accept + type t = Mina_base_zkapp_precondition.Account.V2.t end end diff --git a/src/lib/network_pool/transaction_pool.ml b/src/lib/network_pool/transaction_pool.ml index 84dac0ed2e4e..f097a7203377 100644 --- a/src/lib/network_pool/transaction_pool.ml +++ b/src/lib/network_pool/transaction_pool.ml @@ -1939,10 +1939,12 @@ let%test_module _ = { Account_update.Preconditions.network = protocol_state_precondition ; account = - Account_update.Account_precondition.Nonce - ( if Option.is_none fee_payer then - Account.Nonce.succ sender_nonce - else sender_nonce ) + (let nonce = + if Option.is_none fee_payer then + Account.Nonce.succ sender_nonce + else sender_nonce + in + Zkapp_precondition.Account.nonce nonce ) ; valid_while = Ignore } } @@ -2019,21 +2021,13 @@ let%test_module _ = preconditions = { p.body.preconditions with account = - ( match p.body.preconditions.account with - | Account_update.Account_precondition.Full - { nonce = - Zkapp_basic.Or_ignore.Check n as c - ; _ - } + ( match p.body.preconditions.account.nonce with + | Zkapp_basic.Or_ignore.Check n as c when Zkapp_precondition.Numeric.( is_constant Tc.nonce c) -> - Account_update.Account_precondition.Nonce - n.lower - | Account_update.Account_precondition.Full _ - -> - Account_update.Account_precondition.Accept - | pre -> - pre ) + Zkapp_precondition.Account.nonce n.lower + | _ -> + Zkapp_precondition.Account.accept ) } } } ) @@ -2808,7 +2802,7 @@ let%test_module _ = ~default: Account_update.Preconditions. { network = Zkapp_precondition.Protocol_state.accept - ; account = Account_update.Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } in diff --git a/src/lib/transaction_logic/mina_transaction_logic.ml b/src/lib/transaction_logic/mina_transaction_logic.ml index 63af1e58bad3..7bc07a237caa 100644 --- a/src/lib/transaction_logic/mina_transaction_logic.ml +++ b/src/lib/transaction_logic/mina_transaction_logic.ml @@ -1865,23 +1865,14 @@ module Make (L : Ledger_intf.S) : global_state.protocol_state |> fun or_err -> match or_err with Ok () -> true | Error _ -> false ) | Check_account_precondition - (account_update, account, new_account, local_state) -> ( - match account_update.body.preconditions.account with - | Accept -> - local_state - | Nonce n -> - let nonce_matches = Account.Nonce.equal account.nonce n in - Inputs.Local_state.add_check local_state - Account_nonce_precondition_unsatisfied nonce_matches - | Full precondition_account -> - let local_state = ref local_state in - let check failure b = - local_state := - Inputs.Local_state.add_check !local_state failure b - in - Zkapp_precondition.Account.check ~new_account ~check - precondition_account account ; - !local_state ) + (account_update, account, new_account, local_state) -> + let local_state = ref local_state in + let check failure b = + local_state := Inputs.Local_state.add_check !local_state failure b + in + Zkapp_precondition.Account.check ~new_account ~check + account_update.body.preconditions.account account ; + !local_state | Init_account { account_update = _; account = a } -> a end @@ -2757,7 +2748,7 @@ module For_tests = struct ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; may_use_token = No @@ -2784,7 +2775,7 @@ module For_tests = struct ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; may_use_token = No diff --git a/src/lib/transaction_snark/test/ring_sig.ml b/src/lib/transaction_snark/test/ring_sig.ml index f9e45755cb38..2927016d10a2 100644 --- a/src/lib/transaction_snark/test/ring_sig.ml +++ b/src/lib/transaction_snark/test/ring_sig.ml @@ -202,7 +202,9 @@ let%test_unit "ring-signature zkapp tx with 3 zkapp_command" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Nonce (Account.Nonce.succ sender_nonce) + ; account = + Zkapp_precondition.Account.nonce + (Account.Nonce.succ sender_nonce) ; valid_while = Ignore } ; may_use_token = No @@ -227,7 +229,7 @@ let%test_unit "ring-signature zkapp tx with 3 zkapp_command" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Full Zkapp_precondition.Account.accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; may_use_token = No diff --git a/src/lib/transaction_snark/transaction_snark.ml b/src/lib/transaction_snark/transaction_snark.ml index 9de8cc54c1cb..5a79879db500 100644 --- a/src/lib/transaction_snark/transaction_snark.ml +++ b/src/lib/transaction_snark/transaction_snark.ml @@ -4220,8 +4220,10 @@ module Make_str (A : Wire_types.Concrete) = struct ~default:Zkapp_precondition.Protocol_state.accept ; account = ( if sender_is_the_same_as_fee_payer then - Account_update.Account_precondition.Accept - else Nonce (Account.Nonce.succ sender_nonce) ) + Zkapp_precondition.Account.accept + else + Zkapp_precondition.Account.nonce + (Account.Nonce.succ sender_nonce) ) ; valid_while = Option.value_map preconditions ~f:(fun { valid_while; _ } -> valid_while) @@ -4314,7 +4316,8 @@ module Make_str (A : Wire_types.Concrete) = struct account = Option.map preconditions ~f:(fun { account; _ } -> account ) - |> Option.value ~default:Accept + |> Option.value + ~default:Zkapp_precondition.Account.accept } ; use_full_commitment = true ; implicit_account_creation_fee = false @@ -4358,7 +4361,10 @@ module Make_str (A : Wire_types.Concrete) = struct ; actions = [] ; call_data = Field.zero ; call_depth = 0 - ; preconditions = { preconditions' with account = Accept } + ; preconditions = + { preconditions' with + account = Zkapp_precondition.Account.accept + } ; use_full_commitment ; implicit_account_creation_fee = false ; may_use_token = No @@ -5015,7 +5021,9 @@ module Make_str (A : Wire_types.Concrete) = struct ; call_depth = 0 ; preconditions = { network = protocol_state_predicate - ; account = Nonce (Account.Nonce.succ sender_nonce) + ; account = + Zkapp_precondition.Account.nonce + (Account.Nonce.succ sender_nonce) ; valid_while = Ignore } ; use_full_commitment = false @@ -5039,7 +5047,7 @@ module Make_str (A : Wire_types.Concrete) = struct ; call_depth = 0 ; preconditions = { network = protocol_state_predicate - ; account = Full Zkapp_precondition.Account.accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; use_full_commitment = false diff --git a/src/lib/zkapp_command_builder/zkapp_command_builder.ml b/src/lib/zkapp_command_builder/zkapp_command_builder.ml index f28bd44ed72c..c48cffdec782 100644 --- a/src/lib/zkapp_command_builder/zkapp_command_builder.ml +++ b/src/lib/zkapp_command_builder/zkapp_command_builder.ml @@ -19,7 +19,7 @@ let mk_account_update_body ?preconditions ?(increment_nonce = false) ~default: Account_update.Preconditions. { network = Zkapp_precondition.Protocol_state.accept - ; account = Account_update.Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } in From b275df7cded581ecdc90c289b26a59745fe09007 Mon Sep 17 00:00:00 2001 From: Paul Steckler Date: Wed, 13 Sep 2023 17:40:36 -0700 Subject: [PATCH 2/5] fix test exec build --- src/app/test_executive/verification_key_update.ml | 2 +- src/app/test_executive/zkapps_nonce_test.ml | 8 ++++++-- src/app/test_executive/zkapps_timing.ml | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/app/test_executive/verification_key_update.ml b/src/app/test_executive/verification_key_update.ml index 7822816ca130..41eb76c335c9 100644 --- a/src/app/test_executive/verification_key_update.ml +++ b/src/app/test_executive/verification_key_update.ml @@ -185,7 +185,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; authorization_kind = Signature diff --git a/src/app/test_executive/zkapps_nonce_test.ml b/src/app/test_executive/zkapps_nonce_test.ml index dad202c8f297..911de08eab23 100644 --- a/src/app/test_executive/zkapps_nonce_test.ml +++ b/src/app/test_executive/zkapps_nonce_test.ml @@ -158,7 +158,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct ~preconditions: { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Nonce (Account.Nonce.of_int 1) + ; account = + Zkapp_precondition.Account.nonce + (Account.Nonce.of_int 1) ; valid_while = Ignore } ) [] @@ -183,7 +185,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct ~preconditions: { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Nonce (Account.Nonce.of_int 2) + ; account = + Zkapp_precondition.Account.nonce + (Account.Nonce.of_int 2) ; valid_while = Ignore } ) [] diff --git a/src/app/test_executive/zkapps_timing.ml b/src/app/test_executive/zkapps_timing.ml index bd65683c726a..fcfc75f378b1 100644 --- a/src/app/test_executive/zkapps_timing.ml +++ b/src/app/test_executive/zkapps_timing.ml @@ -559,7 +559,8 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct ; preconditions = Some { network = Zkapp_precondition.Protocol_state.accept - ; account = Nonce (Account.Nonce.succ nonce) + ; account = + Zkapp_precondition.Account.nonce (Account.Nonce.succ nonce) ; valid_while = Check Zkapp_precondition.Closed_interval. From f80adda99e373ef052e239a5548683aa2dc57f8b Mon Sep 17 00:00:00 2001 From: Paul Steckler Date: Wed, 13 Sep 2023 19:15:28 -0700 Subject: [PATCH 3/5] fix tests --- src/lib/mina_base/test/account_update_test.ml | 24 +++++------ .../network_pool/test/indexed_pool_tests.ml | 4 +- .../test/zkapp_cmd_builder.ml | 2 +- ...ransaction_snark_test_access_permission.ml | 6 ++- .../test/multisig_account/multisig_account.ml | 6 ++- .../test/zkapp_payments/zkapp_payments.ml | 4 +- .../zkapp_preconditions.ml | 40 ++++++++++--------- 7 files changed, 44 insertions(+), 42 deletions(-) diff --git a/src/lib/mina_base/test/account_update_test.ml b/src/lib/mina_base/test/account_update_test.ml index a5a03d1a405b..9325ef440b16 100644 --- a/src/lib/mina_base/test/account_update_test.ml +++ b/src/lib/mina_base/test/account_update_test.ml @@ -55,14 +55,16 @@ module Fd = Fields_derivers_zkapps.Derivers let precondition_json_roundtrip_accept () = let open Account_precondition in - let account_precondition : t = Accept in + let account_precondition : t = Zkapp_precondition.Account.accept in let full = deriver (Fd.o ()) in [%test_eq: t] account_precondition (account_precondition |> Fd.to_json full |> Fd.of_json full) let precondition_json_roundtrip_nonce () = let open Account_precondition in - let account_precondition : t = Nonce (Account_nonce.of_int 928472) in + let account_precondition : t = + Zkapp_precondition.Account.nonce (Account_nonce.of_int 928472) + in let full = deriver (Fd.o ()) in [%test_eq: t] account_precondition (account_precondition |> Fd.to_json full |> Fd.of_json full) @@ -70,12 +72,7 @@ let precondition_json_roundtrip_nonce () = let precondition_json_roundtrip_full_with_nonce () = let open Account_precondition in let n = Account_nonce.of_int 4321 in - let account_precondition : t = - Full - { Zkapp_precondition.Account.accept with - nonce = Check { lower = n; upper = n } - } - in + let account_precondition : t = Zkapp_precondition.Account.nonce n in let full = deriver (Fd.o ()) in [%test_eq: t] account_precondition (account_precondition |> Fd.to_json full |> Fd.of_json full) @@ -84,11 +81,8 @@ let precondition_json_roundtrip_full () = let open Account_precondition in let n = Account_nonce.of_int 4513 in let account_precondition : t = - Full - { Zkapp_precondition.Account.accept with - nonce = Check { lower = n; upper = n } - ; delegate = Check Public_key.Compressed.empty - } + let nonce_precondition = Zkapp_precondition.Account.nonce n in + { nonce_precondition with delegate = Check Public_key.Compressed.empty } in let full = deriver (Fd.o ()) in [%test_eq: t] account_precondition @@ -96,7 +90,9 @@ let precondition_json_roundtrip_full () = let precondition_to_json () = let open Account_precondition in - let account_precondition : t = Nonce (Account_nonce.of_int 34928) in + let account_precondition : t = + Zkapp_precondition.Account.nonce (Account_nonce.of_int 34928) + in let full = deriver (Fd.o ()) in [%test_eq: string] (account_precondition |> Fd.to_json full |> Yojson.Safe.to_string) diff --git a/src/lib/network_pool/test/indexed_pool_tests.ml b/src/lib/network_pool/test/indexed_pool_tests.ml index 1e3e02749129..878eb3ad9f63 100644 --- a/src/lib/network_pool/test/indexed_pool_tests.ml +++ b/src/lib/network_pool/test/indexed_pool_tests.ml @@ -532,7 +532,7 @@ let make_zkapp_command_payment ~(sender : Keypair.t) ~(receiver : Keypair.t) { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept ; account = - Account_update.Account_precondition.Nonce + Zkapp_precondition.Account.nonce (Account.Nonce.succ nonce) ; valid_while = Ignore } @@ -555,7 +555,7 @@ let make_zkapp_command_payment ~(sender : Keypair.t) ~(receiver : Keypair.t) ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Account_update.Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; may_use_token = No diff --git a/src/lib/transaction_logic/test/zkapp_cmd_builder.ml b/src/lib/transaction_logic/test/zkapp_cmd_builder.ml index c8ea8b0de278..9937f0c18298 100644 --- a/src/lib/transaction_logic/test/zkapp_cmd_builder.ml +++ b/src/lib/transaction_logic/test/zkapp_cmd_builder.ml @@ -40,7 +40,7 @@ let update_body ?preconditions ?(update = Account_update.Update.noop) ~account let%map nonce = get_nonce_exn account.pk in Account_update.Preconditions. { network = Zkapp_precondition.Protocol_state.accept - ; account = Account_precondition.Nonce nonce + ; account = Zkapp_precondition.Account.nonce nonce ; valid_while = Ignore } in diff --git a/src/lib/transaction_snark/test/access_permission/transaction_snark_test_access_permission.ml b/src/lib/transaction_snark/test/access_permission/transaction_snark_test_access_permission.ml index c609814a8231..504c3713878e 100644 --- a/src/lib/transaction_snark/test/access_permission/transaction_snark_test_access_permission.ml +++ b/src/lib/transaction_snark/test/access_permission/transaction_snark_test_access_permission.ml @@ -55,7 +55,9 @@ let%test_module "Access permission tests" = authorization_kind = auth_kind ; increment_nonce = true ; preconditions = - { account = Nonce Mina_numbers.Account_nonce.(succ zero) + { account = + Zkapp_precondition.Account.nonce + Mina_numbers.Account_nonce.(succ zero) ; network = account_update.body.preconditions.network ; valid_while = Ignore } @@ -80,7 +82,7 @@ let%test_module "Access permission tests" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; may_use_token = No diff --git a/src/lib/transaction_snark/test/multisig_account/multisig_account.ml b/src/lib/transaction_snark/test/multisig_account/multisig_account.ml index 932b250c814c..413baffc0f92 100644 --- a/src/lib/transaction_snark/test/multisig_account/multisig_account.ml +++ b/src/lib/transaction_snark/test/multisig_account/multisig_account.ml @@ -340,7 +340,9 @@ let%test_module "multisig_account" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Nonce (Account.Nonce.succ sender_nonce) + ; account = + Zkapp_precondition.Account.nonce + (Account.Nonce.succ sender_nonce) ; valid_while = Ignore } ; use_full_commitment = false @@ -366,7 +368,7 @@ let%test_module "multisig_account" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Full Zkapp_precondition.Account.accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; use_full_commitment = false diff --git a/src/lib/transaction_snark/test/zkapp_payments/zkapp_payments.ml b/src/lib/transaction_snark/test/zkapp_payments/zkapp_payments.ml index e595e7695416..5740a37fe0f6 100644 --- a/src/lib/transaction_snark/test/zkapp_payments/zkapp_payments.ml +++ b/src/lib/transaction_snark/test/zkapp_payments/zkapp_payments.ml @@ -74,7 +74,7 @@ let%test_module "Zkapp payments tests" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; use_full_commitment = false @@ -97,7 +97,7 @@ let%test_module "Zkapp payments tests" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; use_full_commitment = false diff --git a/src/lib/transaction_snark/test/zkapp_preconditions/zkapp_preconditions.ml b/src/lib/transaction_snark/test/zkapp_preconditions/zkapp_preconditions.ml index bd996ed5cf54..508034325b7d 100644 --- a/src/lib/transaction_snark/test/zkapp_preconditions/zkapp_preconditions.ml +++ b/src/lib/transaction_snark/test/zkapp_preconditions/zkapp_preconditions.ml @@ -40,7 +40,7 @@ let%test_module "Valid_while precondition tests" = Some { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Account_update.Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Check { lower = global_slot; upper = global_slot } } } @@ -170,7 +170,7 @@ let%test_module "Protocol state precondition tests" = { Account_update.Preconditions.network = precondition_exact (Mina_state.Protocol_state.Body.view state_body) - ; account = Account_update.Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } } @@ -212,7 +212,7 @@ let%test_module "Protocol state precondition tests" = ; preconditions = Some { Account_update.Preconditions.network = network_precondition - ; account = Account_update.Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } } @@ -287,7 +287,9 @@ let%test_module "Protocol state precondition tests" = ; preconditions = { Account_update.Preconditions.network = invalid_network_precondition - ; account = Nonce (Account.Nonce.succ sender_nonce) + ; account = + Zkapp_precondition.Account.nonce + (Account.Nonce.succ sender_nonce) ; valid_while = Ignore } ; use_full_commitment = false @@ -320,8 +322,7 @@ let%test_module "Protocol state precondition tests" = ; preconditions = { Account_update.Preconditions.network = invalid_network_precondition - ; account = - Account_update.Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; use_full_commitment = true @@ -482,7 +483,7 @@ let%test_module "Account precondition tests" = ; is_new } in - Account_update.Account_precondition.Full predicate_account + predicate_account let%test_unit "exact account predicate" = Quickcheck.test ~trials:1 U.gen_snapp_ledger @@ -604,16 +605,15 @@ let%test_module "Account precondition tests" = Pickles_types.Vector.init Zkapp_state.Max_state_size.n ~f:(fun _ -> Ignore ) in - Full - { balance = Ignore - ; nonce = Ignore - ; receipt_chain_hash = Ignore - ; delegate = Check pk - ; state - ; action_state = Ignore - ; proved_state = Ignore - ; is_new = Check true - } + { balance = Ignore + ; nonce = Ignore + ; receipt_chain_hash = Ignore + ; delegate = Check pk + ; state + ; action_state = Ignore + ; proved_state = Ignore + ; is_new = Check true + } let add_account_precondition ~at precondition account_updates = Zkapp_command.Call_forest.mapi account_updates @@ -876,7 +876,9 @@ let%test_module "Account precondition tests" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Nonce (Account.Nonce.succ sender_nonce) + ; account = + Zkapp_precondition.Account.nonce + (Account.Nonce.succ sender_nonce) ; valid_while = Ignore } ; use_full_commitment = false @@ -907,7 +909,7 @@ let%test_module "Account precondition tests" = ; preconditions = { Account_update.Preconditions.network = Zkapp_precondition.Protocol_state.accept - ; account = Account_update.Account_precondition.Accept + ; account = Zkapp_precondition.Account.accept ; valid_while = Ignore } ; use_full_commitment = true From 194f3d05624b367e89ab26525823c21bea14f618 Mon Sep 17 00:00:00 2001 From: Paul Steckler Date: Thu, 14 Sep 2023 09:52:27 -0700 Subject: [PATCH 4/5] fix txn hash test --- src/lib/transaction/transaction_hash.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/transaction/transaction_hash.ml b/src/lib/transaction/transaction_hash.ml index 7b30e1bcab75..732d53fb893f 100644 --- a/src/lib/transaction/transaction_hash.ml +++ b/src/lib/transaction/transaction_hash.ml @@ -272,10 +272,10 @@ let%test_module "Transaction hashes" = let%test "zkApp v1 hash from transaction id" = let transaction_id = - "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" in let expected_hash = - "5Jv9H3FWr4Uepj8FWhpMQErTaxuXUuk6zGeVziMSCZM5rdaTvY3B" + "5JtWZqwvKEgSMSHbDhYXg6s76GhfBNscQtxLKXnT6YYTsUKQkcpV" in run_test ~transaction_id ~expected_hash end ) From f107ac02ceef332756fb0a9b645142b09aa297f5 Mon Sep 17 00:00:00 2001 From: Paul Steckler Date: Thu, 21 Sep 2023 11:08:21 -0700 Subject: [PATCH 5/5] add comment --- src/lib/mina_base/zkapp_precondition.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/mina_base/zkapp_precondition.ml b/src/lib/mina_base/zkapp_precondition.ml index 2a02dba4eee4..dd276dec37be 100644 --- a/src/lib/mina_base/zkapp_precondition.ml +++ b/src/lib/mina_base/zkapp_precondition.ml @@ -532,6 +532,7 @@ module Account = struct | Ignore -> false | Check { lower; upper } -> + (* nonce is exact, all other fields are Ignore *) Mina_numbers.Account_nonce.equal lower upper && is_accept { t with nonce = Ignore }