From 057ad3812eff2e12f3fd5e576f11354ecb2788a4 Mon Sep 17 00:00:00 2001 From: georgeee Date: Tue, 21 Jan 2025 11:37:39 +0000 Subject: [PATCH] Decouple Mina_block.{Stable.Latest.t, t} Remove `Stable.Latest.t = t` from interfaces. This is a preparation step for removing the equality in the implementation as well. --- src/app/archive/lib/diff.ml | 3 +- src/app/archive/lib/processor.ml | 3 ++ .../cli/src/init/test_ledger_application.ml | 3 +- .../delegation_verify/delegation_verify.ml | 2 +- src/app/delegation_verify/known_blocks.ml | 4 +-- src/app/dump_blocks/encoding.ml | 16 ++++++---- src/lib/best_tip_prover/wrap_for_block.ml | 16 ++++++---- .../bootstrap_controller.ml | 8 ++++- src/lib/gossip_net/libp2p.ml | 10 ++++-- src/lib/gossip_net/message.ml | 3 +- src/lib/ledger_catchup/normal_catchup.ml | 8 ++++- src/lib/ledger_catchup/super_catchup.ml | 4 ++- src/lib/mina_block/block.ml | 19 ++++++++--- src/lib/mina_block/block.mli | 12 +++++-- src/lib/mina_block/validated_block.ml | 3 +- src/lib/mina_networking/mina_networking.mli | 20 +++++++----- src/lib/mina_networking/rpcs.ml | 32 ++++++++++++------- .../proof_carrying_data.ml | 2 ++ .../persistent_frontier/database.ml | 18 ++++++++--- .../transition_router/transition_router.ml | 22 ++++++++----- src/lib/uptime_service/uptime_service.ml | 1 + 21 files changed, 145 insertions(+), 64 deletions(-) diff --git a/src/app/archive/lib/diff.ml b/src/app/archive/lib/diff.ml index 22867c73404..20a469be325 100644 --- a/src/app/archive/lib/diff.ml +++ b/src/app/archive/lib/diff.ml @@ -135,7 +135,8 @@ module Builder = struct (Time.diff account_created_time accounts_accessed_time) ) ) ] ; Transition_frontier.Breadcrumb_added - { block = block_with_hash + { block = + With_hash.map ~f:Mina_block.read_all_proofs_from_disk block_with_hash ; accounts_accessed ; accounts_created ; tokens_used diff --git a/src/app/archive/lib/processor.ml b/src/app/archive/lib/processor.ml index 9396084b92b..05636d50167 100644 --- a/src/app/archive/lib/processor.ml +++ b/src/app/archive/lib/processor.ml @@ -4708,6 +4708,9 @@ let run pool reader ~genesis_constants ~constraint_constants ~logger { block; accounts_accessed; accounts_created; tokens_used; _ } ) -> ( let add_block = Block.add_if_doesn't_exist ~constraint_constants in let hash = State_hash.With_state_hashes.state_hash in + let block = + With_hash.map ~f:Mina_block.write_all_proofs_to_disk block + in match%bind add_block_aux ~logger ~genesis_constants ~pool ~delete_older_than ~hash ~add_block ~accounts_accessed ~accounts_created ~tokens_used diff --git a/src/app/cli/src/init/test_ledger_application.ml b/src/app/cli/src/init/test_ledger_application.ml index 7adddbef204..bcc040790b4 100644 --- a/src/app/cli/src/init/test_ledger_application.ml +++ b/src/app/cli/src/init/test_ledger_application.ml @@ -186,7 +186,8 @@ let test ~privkey_path ~ledger_path ?prev_block_path ~first_partition_slots let prev_block = Binable.of_string (module Mina_block.Stable.Latest) prev_block_data in - Mina_block.header prev_block |> Mina_block.Header.protocol_state + Mina_block.Stable.Latest.header prev_block + |> Mina_block.Header.protocol_state in let consensus_constants = Consensus.Constants.create ~constraint_constants diff --git a/src/app/delegation_verify/delegation_verify.ml b/src/app/delegation_verify/delegation_verify.ml index 0d90a7204a2..580a1d07558 100644 --- a/src/app/delegation_verify/delegation_verify.ml +++ b/src/app/delegation_verify/delegation_verify.ml @@ -85,7 +85,7 @@ module Make_verifier (Source : Submission.Data_source) = struct verify_snark_work ~verify_transaction_snarks ~proof ~message else return () in - let header = Mina_block.header block in + let header = Mina_block.Stable.Latest.header block in let protocol_state = Mina_block.Header.protocol_state header in let consensus_state = Mina_state.Protocol_state.consensus_state protocol_state diff --git a/src/app/delegation_verify/known_blocks.ml b/src/app/delegation_verify/known_blocks.ml index 92913e96416..b92b8d56a44 100644 --- a/src/app/delegation_verify/known_blocks.ml +++ b/src/app/delegation_verify/known_blocks.ml @@ -11,7 +11,7 @@ end module Deferred_block = struct type t = - { block : Mina_block.t Deferred.Or_error.t + { block : Mina_block.Stable.Latest.t Deferred.Or_error.t ; valid : unit Deferred.Or_error.t (* Raises if block is invalid. *) } @@ -26,7 +26,7 @@ module Deferred_block = struct Deferred.create compute let verify_block ~verify_blockchain_snarks block = - let header = Mina_block.header block in + let header = Mina_block.Stable.Latest.header block in let open Mina_block.Header in verify_blockchain_snarks [ (protocol_state header, protocol_state_proof header) ] diff --git a/src/app/dump_blocks/encoding.ml b/src/app/dump_blocks/encoding.ml index 7a8f2d60382..c4b0924e6cb 100644 --- a/src/app/dump_blocks/encoding.ml +++ b/src/app/dump_blocks/encoding.ml @@ -3,7 +3,7 @@ open Core type t = Sexp | Json | Binary type 'a content = - | Block : Mina_block.t content + | Block : Mina_block.Stable.Latest.t content | Precomputed : Mina_block.Precomputed.t content let append_newline s = s ^ "\n" @@ -13,7 +13,7 @@ let block_of_breadcrumb ?with_parent_statehash breadcrumb = let block = Frontier_base.Breadcrumb.block breadcrumb in match with_parent_statehash with | None -> - block + block |> Mina_block.read_all_proofs_from_disk | Some hash -> let previous_state_hash = Mina_base.State_hash.of_base58_check_exn hash in let h = header block in @@ -29,6 +29,7 @@ let block_of_breadcrumb ?with_parent_statehash breadcrumb = () in Mina_block.create ~header ~body:(body block) + |> Mina_block.read_all_proofs_from_disk module type S = sig type t @@ -43,8 +44,8 @@ module type S = sig val of_string : string -> t end -module Sexp_block : S with type t = Mina_block.t = struct - type t = Mina_block.t +module Sexp_block : S with type t = Mina_block.Stable.Latest.t = struct + type t = Mina_block.Stable.Latest.t let name = "sexp" @@ -56,8 +57,8 @@ module Sexp_block : S with type t = Mina_block.t = struct let of_string s = Sexp.of_string s |> Mina_block.Stable.Latest.t_of_sexp end -module Binary_block : S with type t = Mina_block.t = struct - type t = Mina_block.t +module Binary_block : S with type t = Mina_block.Stable.Latest.t = struct + type t = Mina_block.Stable.Latest.t let name = "binary" @@ -84,7 +85,8 @@ let precomputed_of_breadcrumb ?with_parent_statehash breadcrumb = let block = block_of_breadcrumb ?with_parent_statehash breadcrumb in let staged_ledger = Transition_frontier.Breadcrumb.staged_ledger breadcrumb in let scheduled_time = - Mina_block.(Header.protocol_state @@ header block) + Mina_block.Stable.Latest.header block + |> Mina_block.Header.protocol_state |> Mina_state.Protocol_state.blockchain_state |> Mina_state.Blockchain_state.timestamp in diff --git a/src/lib/best_tip_prover/wrap_for_block.ml b/src/lib/best_tip_prover/wrap_for_block.ml index fe5272e6e3b..1ad1c3e024d 100644 --- a/src/lib/best_tip_prover/wrap_for_block.ml +++ b/src/lib/best_tip_prover/wrap_for_block.ml @@ -1,14 +1,18 @@ -let map ~f +let to_header_data ~to_header { Proof_carrying_data.proof = merkle_list, root_unverified ; data = best_tip_unverified } = + { Proof_carrying_data.proof = (merkle_list, to_header root_unverified) + ; data = to_header best_tip_unverified + } + +let map ~f + ( { Proof_carrying_data.proof = _, root_unverified + ; data = best_tip_unverified + } as pcd ) = let%map.Async_kernel.Deferred.Or_error ( `Root root_header , `Best_tip best_tip_header ) = - f - { Proof_carrying_data.proof = - (merkle_list, Mina_block.header root_unverified) - ; data = Mina_block.header best_tip_unverified - } + f (to_header_data ~to_header:Mina_block.header pcd) in let root = Mina_block.Validation.with_body root_header diff --git a/src/lib/bootstrap_controller/bootstrap_controller.ml b/src/lib/bootstrap_controller/bootstrap_controller.ml index 3fb2793bc17..70a0524bd9d 100644 --- a/src/lib/bootstrap_controller/bootstrap_controller.ml +++ b/src/lib/bootstrap_controller/bootstrap_controller.ml @@ -174,13 +174,19 @@ let on_transition ({ context = (module Context); _ } as t) ~sender $error" ; Deferred.return `Ignored | Ok peer_root_with_proof -> ( + let pcd = + peer_root_with_proof.data + |> Proof_carrying_data.map ~f:Mina_block.write_all_proofs_to_disk + |> Proof_carrying_data.map_proof + ~f:(Tuple2.map_snd ~f:Mina_block.write_all_proofs_to_disk) + in match%bind Best_tip_prover.Wrap_for_block.map ~f: (Sync_handler.Root.verify ~context:(module Context) ~verifier:t.verifier candidate_consensus_state ) - peer_root_with_proof.data + pcd with | Ok (`Root root, `Best_tip best_tip) -> if done_syncing_root root_sync_ledger then return `Ignored diff --git a/src/lib/gossip_net/libp2p.ml b/src/lib/gossip_net/libp2p.ml index 4de2c63250c..a8c1308b76e 100644 --- a/src/lib/gossip_net/libp2p.ml +++ b/src/lib/gossip_net/libp2p.ml @@ -485,8 +485,12 @@ module Make (Rpc_interface : RPC_INTERFACE) : ~fn:(fun (env, vc) -> match Envelope.Incoming.data env with | Message.Latest.T.New_state state -> + let state_cached = + Mina_block.write_all_proofs_to_disk state + in Sinks.Block_sink.push sink_block - ( `Block (Envelope.Incoming.map ~f:(const state) env) + ( `Block + (Envelope.Incoming.map ~f:(const state_cached) env) , `Time_received (Block_time.now config.time_controller) , `Valid_cb vc ) | Message.Latest.T.Transaction_pool_diff @@ -951,7 +955,9 @@ module Make (Rpc_interface : RPC_INTERFACE) : guard_topic ?origin_topic v1_topic_block pfs.publish_v1_block (Mina_block.header state) in - guard_topic ?origin_topic v0_topic pfs.publish_v0 (Message.New_state state) + let state_unwrapped = Mina_block.read_all_proofs_from_disk state in + guard_topic ?origin_topic v0_topic pfs.publish_v0 + (Message.New_state state_unwrapped) let broadcast_transaction_pool_diff ?origin_topic ?(nonce = 0) t diff = let pfs = !(t.publish_functions) in diff --git a/src/lib/gossip_net/message.ml b/src/lib/gossip_net/message.ml index 855a0365a3c..0c686db8b0c 100644 --- a/src/lib/gossip_net/message.ml +++ b/src/lib/gossip_net/message.ml @@ -6,12 +6,11 @@ open Network_peer module Master = struct module T = struct type msg = - | New_state of Mina_block.t + | New_state of Mina_block.Stable.Latest.t | Snark_pool_diff of Snark_pool.Resource_pool.Diff.t Network_pool.With_nonce.t | Transaction_pool_diff of Transaction_pool.Resource_pool.Diff.t Network_pool.With_nonce.t - [@@deriving to_yojson] type snark_pool_diff_msg = Snark_pool.Resource_pool.Diff.t diff --git a/src/lib/ledger_catchup/normal_catchup.ml b/src/lib/ledger_catchup/normal_catchup.ml index 512f78bc66e..8b61b67cdab 100644 --- a/src/lib/ledger_catchup/normal_catchup.ml +++ b/src/lib/ledger_catchup/normal_catchup.ml @@ -467,7 +467,7 @@ let download_transitions ~target_hash ~logger ~trust_system ~network ~hash_data: (Fn.compose Mina_state.Protocol_state.hashes (Fn.compose Mina_block.Header.protocol_state - Mina_block.header ) ) ) + Mina_block.Stable.Latest.header ) ) ) in if not @@ verify_against_hashes hashed_transitions hashes then ( let error_msg = @@ -822,6 +822,12 @@ let run ~context:(module Context : CONTEXT) ~trust_system ~verifier ~network else download_transitions ~logger ~trust_system ~network ~preferred_peer ~hashes_of_missing_transitions ~target_hash + >>| List.map + ~f: + (Envelope.Incoming.map + ~f: + (With_hash.map + ~f:Mina_block.write_all_proofs_to_disk ) ) in [%log debug] ~metadata:[ ("target_hash", State_hash.to_yojson target_hash) ] diff --git a/src/lib/ledger_catchup/super_catchup.ml b/src/lib/ledger_catchup/super_catchup.ml index fd4b8687b8a..585fde20d82 100644 --- a/src/lib/ledger_catchup/super_catchup.ml +++ b/src/lib/ledger_catchup/super_catchup.ml @@ -1168,7 +1168,9 @@ let run_catchup ~context:(module Context : CONTEXT) ~trust_system ~verifier in Mina_networking.get_transition_chain ~heartbeat_timeout:(Time_ns.Span.of_sec sec) - ~timeout:(Time.Span.of_sec sec) network peer (List.map hs ~f:fst) ) + ~timeout:(Time.Span.of_sec sec) network peer (List.map hs ~f:fst) + |> Deferred.Or_error.map + ~f:(List.map ~f:Mina_block.write_all_proofs_to_disk) ) ~peers:(fun () -> Mina_networking.peers network) ~knowledge_context: (Broadcast_pipe.map best_tip_r diff --git a/src/lib/mina_block/block.ml b/src/lib/mina_block/block.ml index da015d82aec..85d9340b88a 100644 --- a/src/lib/mina_block/block.ml +++ b/src/lib/mina_block/block.ml @@ -4,6 +4,8 @@ open Mina_state [%%versioned module Stable = struct + [@@@no_toplevel_latest_type] + module V2 = struct type t = { header : Header.Stable.V2.t @@ -18,7 +20,8 @@ module Stable = struct type nonrec t = t - type 'a creator = header:Header.t -> body:Staged_ledger_diff.Body.t -> 'a + type 'a creator = + header:Header.t -> body:Staged_ledger_diff.Body.Stable.Latest.t -> 'a let map_creator c ~f ~header ~body = f (c ~header ~body) @@ -40,6 +43,10 @@ module Stable = struct end end] +type t = Stable.Latest.t = + { header : Header.t; body : Staged_ledger_diff.Body.t } +[@@deriving fields] + type with_hash = t State_hash.With_state_hashes.t let to_yojson t = @@ -60,7 +67,7 @@ let to_yojson t = ~default:"" ~f:Protocol_version.to_string ) ) ] -[%%define_locally Stable.Latest.(create, header, body)] +let create ~header ~body = { header; body } let wrap_with_hash block = With_hash.of_data block @@ -74,10 +81,10 @@ let timestamp block = let transactions ~constraint_constants block = let consensus_state = - block |> header |> Header.protocol_state |> Protocol_state.consensus_state + Header.protocol_state block.header |> Protocol_state.consensus_state in let staged_ledger_diff = - block |> body |> Staged_ledger_diff.Body.staged_ledger_diff + Staged_ledger_diff.Body.staged_ledger_diff block.body in let coinbase_receiver = Consensus.Data.Consensus_state.coinbase_receiver consensus_state @@ -97,3 +104,7 @@ let account_ids_accessed ~constraint_constants t = |> List.concat |> List.dedup_and_sort ~compare:[%compare: Account_id.t * [ `Accessed | `Not_accessed ]] + +let write_all_proofs_to_disk = Fn.id + +let read_all_proofs_from_disk = Fn.id diff --git a/src/lib/mina_block/block.mli b/src/lib/mina_block/block.mli index cd52834f253..e978fe9d775 100644 --- a/src/lib/mina_block/block.mli +++ b/src/lib/mina_block/block.mli @@ -6,11 +6,15 @@ module Stable : sig [@@@no_toplevel_latest_type] module V2 : sig - type t [@@deriving sexp, equal] + type t [@@deriving equal, sexp] + + val header : t -> Header.Stable.V2.t + + val body : t -> Staged_ledger_diff.Body.Stable.V1.t end end] -type t = Stable.Latest.t [@@deriving to_yojson] +type t [@@deriving to_yojson] type with_hash = t State_hash.With_state_hashes.t @@ -39,3 +43,7 @@ val account_ids_accessed : constraint_constants:Genesis_constants.Constraint_constants.t -> t -> (Account_id.t * [ `Accessed | `Not_accessed ]) list + +val write_all_proofs_to_disk : Stable.Latest.t -> t + +val read_all_proofs_from_disk : t -> Stable.Latest.t diff --git a/src/lib/mina_block/validated_block.ml b/src/lib/mina_block/validated_block.ml index 6cc280af77a..7369bedc90d 100644 --- a/src/lib/mina_block/validated_block.ml +++ b/src/lib/mina_block/validated_block.ml @@ -75,4 +75,5 @@ let is_genesis t = header t |> Header.protocol_state |> Mina_state.Protocol_state.consensus_state |> Consensus.Data.Consensus_state.is_genesis_state -let read_all_proofs_from_disk = Fn.id +let read_all_proofs_from_disk ((b, v) : t) : Stable.Latest.t = + (With_hash.map ~f:Block.read_all_proofs_from_disk b, v) diff --git a/src/lib/mina_networking/mina_networking.mli b/src/lib/mina_networking/mina_networking.mli index 8906c1ada68..dea9a0899d8 100644 --- a/src/lib/mina_networking/mina_networking.mli +++ b/src/lib/mina_networking/mina_networking.mli @@ -68,7 +68,7 @@ module Rpcs : sig module Get_transition_chain : sig type query = State_hash.t list - type response = Mina_block.t list option + type response = Mina_block.Stable.Latest.t list option end module Get_transition_chain_proof : sig @@ -88,8 +88,8 @@ module Rpcs : sig (Consensus.Data.Consensus_state.Value.t, State_hash.t) With_hash.t type response = - ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) + ( Mina_block.Stable.Latest.t + , State_body_hash.t list * Mina_block.Stable.Latest.t ) Proof_carrying_data.t option end @@ -105,8 +105,8 @@ module Rpcs : sig type query = unit type response = - ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) + ( Mina_block.Stable.Latest.t + , State_body_hash.t list * Mina_block.Stable.Latest.t ) Proof_carrying_data.t option end @@ -189,7 +189,9 @@ val get_ancestry : t -> Peer.Id.t -> (Consensus.Data.Consensus_state.Value.t, State_hash.t) With_hash.t - -> (Mina_block.t, State_body_hash.t list * Mina_block.t) Proof_carrying_data.t + -> ( Mina_block.Stable.Latest.t + , State_body_hash.t list * Mina_block.Stable.Latest.t ) + Proof_carrying_data.t Envelope.Incoming.t Deferred.Or_error.t @@ -198,7 +200,9 @@ val get_best_tip : -> ?timeout:Time.Span.t -> t -> Network_peer.Peer.t - -> (Mina_block.t, State_body_hash.t list * Mina_block.t) Proof_carrying_data.t + -> ( Mina_block.Stable.Latest.t + , State_body_hash.t list * Mina_block.Stable.Latest.t ) + Proof_carrying_data.t Deferred.Or_error.t val get_transition_chain_proof : @@ -215,7 +219,7 @@ val get_transition_chain : -> t -> Network_peer.Peer.t -> State_hash.t list - -> Mina_block.t list Deferred.Or_error.t + -> Mina_block.Stable.Latest.t list Deferred.Or_error.t val get_staged_ledger_aux_and_pending_coinbases_at_hash : t diff --git a/src/lib/mina_networking/rpcs.ml b/src/lib/mina_networking/rpcs.ml index 26b9ff42d7f..fc0230f47fa 100644 --- a/src/lib/mina_networking/rpcs.ml +++ b/src/lib/mina_networking/rpcs.ml @@ -504,7 +504,7 @@ module Get_transition_chain = struct module T = struct type query = State_hash.t list [@@deriving sexp, to_yojson] - type response = Mina_block.t list option + type response = Mina_block.Stable.Latest.t list option end module Caller = T @@ -582,7 +582,8 @@ module Get_transition_chain = struct ~sender:(Envelope.Incoming.sender request) blocks in - Option.some_if valid_versions blocks + Option.some_if valid_versions + @@ List.map ~f:Mina_block.read_all_proofs_from_disk blocks | None -> let%map () = Trust_system.( @@ -891,8 +892,8 @@ module Get_ancestry = struct [@@deriving sexp, to_yojson] type response = - ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) + ( Mina_block.Stable.Latest.t + , State_body_hash.t list * Mina_block.Stable.Latest.t ) Proof_carrying_data.t option end @@ -987,14 +988,18 @@ module Get_ancestry = struct )) in None - | Some { proof = _, block; _ } -> + | Some { proof = chain, base_block; data = block } -> let%map valid_versions = validate_protocol_versions ~logger ~trust_system ~rpc_name:"Get_ancestry" ~sender:(Envelope.Incoming.sender request) - [ block ] + [ base_block ] in - if valid_versions then result else None + Option.some_if valid_versions + { Proof_carrying_data.proof = + (chain, Mina_block.read_all_proofs_from_disk base_block) + ; data = Mina_block.read_all_proofs_from_disk block + } let rate_limit_budget = (5, `Per Time.Span.minute) @@ -1096,8 +1101,8 @@ module Get_best_tip = struct type query = unit [@@deriving sexp, to_yojson] type response = - ( Mina_block.t - , State_body_hash.t list * Mina_block.t ) + ( Mina_block.Stable.Latest.t + , State_body_hash.t list * Mina_block.Stable.Latest.t ) Proof_carrying_data.t option end @@ -1186,7 +1191,7 @@ module Get_best_tip = struct (Requested_unknown_item, Some (receipt_trust_action_message ()))) in None - | Some { data = data_block; proof = _, proof_block } -> + | Some { data = data_block; proof = chain, proof_block } -> let%map data_valid_versions = validate_protocol_versions ~logger ~trust_system ~rpc_name:"Get_best_tip (data)" @@ -1198,7 +1203,12 @@ module Get_best_tip = struct ~sender:(Envelope.Incoming.sender request) [ proof_block ] in - if data_valid_versions && proof_valid_versions then result else None + Option.some_if + (data_valid_versions && proof_valid_versions) + { Proof_carrying_data.data = + Mina_block.read_all_proofs_from_disk data_block + ; proof = (chain, Mina_block.read_all_proofs_from_disk proof_block) + } let rate_limit_budget = (3, `Per Time.Span.minute) diff --git a/src/lib/proof_carrying_data/proof_carrying_data.ml b/src/lib/proof_carrying_data/proof_carrying_data.ml index 4e4414fd470..e908c832b9e 100644 --- a/src/lib/proof_carrying_data/proof_carrying_data.ml +++ b/src/lib/proof_carrying_data/proof_carrying_data.ml @@ -12,3 +12,5 @@ module Stable = struct end] let map { data; proof } ~f = { data = f data; proof } + +let map_proof { data; proof } ~f = { data; proof = f proof } diff --git a/src/lib/transition_frontier/persistent_frontier/database.ml b/src/lib/transition_frontier/persistent_frontier/database.ml index ea36778b976..0303606576b 100644 --- a/src/lib/transition_frontier/persistent_frontier/database.ml +++ b/src/lib/transition_frontier/persistent_frontier/database.ml @@ -283,7 +283,8 @@ let check t ~genesis_state_hash = let%bind () = check_version () in let%bind root_hash, root_block = check_base () in let root_protocol_state = - root_block |> Mina_block.header |> Mina_block.Header.protocol_state + root_block |> Mina_block.Stable.Latest.header + |> Mina_block.Header.protocol_state in let%bind () = let persisted_genesis_state_hash = @@ -294,7 +295,7 @@ let check t ~genesis_state_hash = else Error (`Genesis_state_mismatch persisted_genesis_state_hash) in let%map () = check_arcs root_hash in - root_block |> Mina_block.header |> Header.protocol_state + root_block |> Mina_block.Stable.Latest.header |> Header.protocol_state |> Mina_state.Protocol_state.blockchain_state |> Mina_state.Blockchain_state.snarked_ledger_hash ) |> Result.map_error ~f:(fun err -> `Corrupt (`Raised err)) @@ -308,6 +309,7 @@ let initialize t ~root_data = ( State_hash.With_state_hashes.state_hash t , State_hash.With_state_hashes.data t ) in + let root_transition = Mina_block.read_all_proofs_from_disk root_transition in [%log' trace t.logger] ~metadata:[ ("root_data", Root_data.Limited.to_yojson root_data) ] "Initializing persistent frontier database with $root_data" ; @@ -362,8 +364,11 @@ let add ~arcs_cache ~transition = let parent_arcs = State_hash.Table.find_exn arcs_cache parent_hash in State_hash.Table.set arcs_cache ~key:parent_hash ~data:(hash :: parent_arcs) ; State_hash.Table.set arcs_cache ~key:hash ~data:[] ; + let transition_unwrapped = + With_hash.data transition |> Mina_block.read_all_proofs_from_disk + in fun batch -> - Batch.set batch ~key:(Transition hash) ~data:(With_hash.data transition) ; + Batch.set batch ~key:(Transition hash) ~data:transition_unwrapped ; Batch.set batch ~key:(Arcs hash) ~data:[] ; Batch.set batch ~key:(Arcs parent_hash) ~data:(hash :: parent_arcs) @@ -401,14 +406,17 @@ let get_transition t hash = } in let parent_hash = - block |> With_hash.data |> Mina_block.header + block |> With_hash.data |> Mina_block.Stable.Latest.header |> Mina_block.Header.protocol_state |> Mina_state.Protocol_state.previous_state_hash in + let cached_block = + With_hash.map ~f:Mina_block.write_all_proofs_to_disk block + in (* TODO: the delta transition chain proof is incorrect (same behavior the daemon used to have, but we should probably fix this?) *) Mina_block.Validated.unsafe_of_trusted_block ~delta_block_chain_proof:(Mina_stdlib.Nonempty_list.singleton parent_hash) - (`This_block_is_trusted_to_be_safe block) + (`This_block_is_trusted_to_be_safe cached_block) let get_arcs t hash = get t.db ~key:(Arcs hash) ~error:(`Not_found (`Arcs hash)) diff --git a/src/lib/transition_router/transition_router.ml b/src/lib/transition_router/transition_router.ml index eae0fca36af..b8ad440ca5a 100644 --- a/src/lib/transition_router/transition_router.ml +++ b/src/lib/transition_router/transition_router.ml @@ -247,16 +247,16 @@ let download_best_tip ~context:(module Context : CONTEXT) ~notify_online [ ("peer", Network_peer.Peer.to_yojson peer) ; ( "length" , Length.to_yojson - (Mina_block.blockchain_length peer_best_tip.data) ) + ( Mina_block.Stable.Latest.header peer_best_tip.data + |> Mina_block.Header.blockchain_length ) ) ] "Successfully downloaded best tip with $length from $peer" ; (* TODO: Use batch verification instead *) match%bind - Best_tip_prover.Wrap_for_block.map - ~f: - (Best_tip_prover.verify ~verifier ~genesis_constants - ~precomputed_values ) - peer_best_tip + Best_tip_prover.verify ~verifier ~genesis_constants + ~precomputed_values + @@ Best_tip_prover.Wrap_for_block.to_header_data + ~to_header:Mina_block.Stable.Latest.header peer_best_tip with | Error e -> [%log warn] @@ -278,10 +278,16 @@ let download_best_tip ~context:(module Context : CONTEXT) ~notify_online [%log debug] ~metadata:[ ("peer", Network_peer.Peer.to_yojson peer) ] "Successfully verified best tip from $peer" ; + let body = Mina_block.Stable.Latest.body peer_best_tip.data in return (Some (Envelope.Incoming.wrap_peer - ~data:{ peer_best_tip with data = candidate_best_tip } + ~data: + { peer_best_tip with + data = + Mina_block.Validation.with_body candidate_best_tip + body + } ~sender:peer ) ) ) ) in [%log debug] @@ -332,7 +338,7 @@ let download_best_tip ~context:(module Context : CONTEXT) ~notify_online { Proof_carrying_data.data = Mina_block.Validation.block_with_hash data |> Mina_base.State_hash.With_state_hashes.state_hash - ; proof = (path, Mina_block.header root) + ; proof = (path, Mina_block.Stable.Latest.header root) } ; data ) ) diff --git a/src/lib/uptime_service/uptime_service.ml b/src/lib/uptime_service/uptime_service.ml index 52837de0f18..c7a535e7b54 100644 --- a/src/lib/uptime_service/uptime_service.ml +++ b/src/lib/uptime_service/uptime_service.ml @@ -153,6 +153,7 @@ let send_uptime_data ~logger ~interruptor ~(submitter_keypair : Keypair.t) ~url let block_base64_of_breadcrumb breadcrumb = let external_transition = breadcrumb |> Transition_frontier.Breadcrumb.block + |> Mina_block.read_all_proofs_from_disk in let block_string = Binable.to_string (module Mina_block.Stable.Latest) external_transition