Skip to content

Commit 1daa6ed

Browse files
authored
Merge pull request #16568 from MinaProtocol/georgeee/no-staged-ledger-hash-in-rpc
Don't compute staged ledger hash on every RPC call
2 parents e709c89 + 82bc5f2 commit 1daa6ed

File tree

10 files changed

+44
-63
lines changed

10 files changed

+44
-63
lines changed

src/lib/bootstrap_controller/bootstrap_controller.ml

+10-4
Original file line numberDiff line numberDiff line change
@@ -1031,10 +1031,16 @@ let%test_module "Bootstrap_controller tests" =
10311031
~pending_coinbases ~get_state
10321032
|> Deferred.Or_error.ok_exn
10331033
in
1034-
assert (
1035-
Staged_ledger_hash.equal
1036-
(Staged_ledger.hash staged_ledger)
1037-
(Staged_ledger.hash actual_staged_ledger) ) ) )
1034+
let height =
1035+
Transition_frontier.Breadcrumb.consensus_state breadcrumb
1036+
|> Consensus.Data.Consensus_state.blockchain_length
1037+
|> Mina_numbers.Length.to_int
1038+
in
1039+
[%test_eq: Staged_ledger_hash.t]
1040+
~message:
1041+
(sprintf "mismatch of staged ledger hash height %d" height)
1042+
(Transition_frontier.Breadcrumb.staged_ledger_hash breadcrumb)
1043+
(Staged_ledger.hash actual_staged_ledger) ) )
10381044

10391045
(*
10401046
let%test_unit "if we see a new transition that is better than the \

src/lib/genesis_proof/genesis_proof.ml

-46
Original file line numberDiff line numberDiff line change
@@ -150,52 +150,6 @@ end
150150

151151
include T
152152

153-
let base_proof (module B : Blockchain_snark.Blockchain_snark_state.S)
154-
(t : Inputs.t) =
155-
let genesis_ledger = Genesis_ledger.Packed.t t.genesis_ledger in
156-
let constraint_constants = t.constraint_constants in
157-
let consensus_constants = t.consensus_constants in
158-
let prev_state =
159-
Protocol_state.negative_one ~genesis_ledger
160-
~genesis_epoch_data:t.genesis_epoch_data ~constraint_constants
161-
~consensus_constants ~genesis_body_reference:t.genesis_body_reference
162-
in
163-
let curr = t.protocol_state_with_hashes.data in
164-
let dummy_txn_stmt : Transaction_snark.Statement.With_sok.t =
165-
let t =
166-
Blockchain_state.ledger_proof_statement
167-
(Protocol_state.blockchain_state curr)
168-
in
169-
{ t with sok_digest = Sok_message.Digest.default }
170-
in
171-
let genesis_epoch_ledger =
172-
match t.genesis_epoch_data with
173-
| None ->
174-
genesis_ledger
175-
| Some data ->
176-
data.staking.ledger
177-
in
178-
let open Pickles_types in
179-
let blockchain_dummy =
180-
Pickles.Proof.dummy Nat.N2.n Nat.N2.n Nat.N2.n ~domain_log2:16
181-
in
182-
let txn_dummy =
183-
Pickles.Proof.dummy Nat.N2.n Nat.N2.n Nat.N0.n ~domain_log2:14
184-
in
185-
B.step
186-
~handler:
187-
(Consensus.Data.Prover_state.precomputed_handler ~constraint_constants
188-
~genesis_epoch_ledger )
189-
{ transition =
190-
Snark_transition.genesis ~constraint_constants ~consensus_constants
191-
~genesis_ledger ~genesis_body_reference:t.genesis_body_reference
192-
; prev_state
193-
; prev_state_proof = blockchain_dummy
194-
; txn_snark = dummy_txn_stmt
195-
; txn_snark_proof = txn_dummy
196-
}
197-
t.protocol_state_with_hashes.data
198-
199153
let digests (module T : Transaction_snark.S)
200154
(module B : Blockchain_snark.Blockchain_snark_state.S) =
201155
let open Lazy.Let_syntax in

src/lib/mina_block/validated_block.ml

+4
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,7 @@ let state_body_hash (t, _) =
6666
let header t = t |> forget |> With_hash.data |> Block.header
6767

6868
let body t = t |> forget |> With_hash.data |> Block.body
69+
70+
let is_genesis t =
71+
header t |> Header.protocol_state |> Mina_state.Protocol_state.consensus_state
72+
|> Consensus.Data.Consensus_state.is_genesis_state

src/lib/mina_block/validated_block.mli

+2
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ val state_body_hash : t -> State_body_hash.t
3131
val header : t -> Header.t
3232

3333
val body : t -> Staged_ledger_diff.Body.t
34+
35+
val is_genesis : t -> bool

src/lib/sync_handler/sync_handler.ml

+2-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ module Make (Inputs : Inputs_intf) :
139139
in
140140
let scan_state = Staged_ledger.scan_state staged_ledger in
141141
let merkle_root =
142-
Staged_ledger.hash staged_ledger |> Staged_ledger_hash.ledger_hash
142+
Breadcrumb.staged_ledger_hash breadcrumb
143+
|> Staged_ledger_hash.ledger_hash
143144
in
144145
let%map scan_state_protocol_states = protocol_states scan_state in
145146
let pending_coinbase =

src/lib/transition_frontier/frontier_base/breadcrumb.ml

+18-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module T = struct
1313
; staged_ledger : Staged_ledger.t
1414
; just_emitted_a_proof : bool
1515
; transition_receipt_time : Time.t option
16+
; staged_ledger_hash : Staged_ledger_hash.t
1617
}
1718
[@@deriving fields]
1819

@@ -31,17 +32,30 @@ module T = struct
3132

3233
let create ~validated_transition ~staged_ledger ~just_emitted_a_proof
3334
~transition_receipt_time =
35+
(* TODO This looks terrible, consider removing this in the hardfork by either
36+
removing staged_ledger_hash from the header or computing it consistently
37+
for the genesis block *)
38+
let staged_ledger_hash =
39+
if Mina_block.Validated.is_genesis validated_transition then
40+
Staged_ledger.hash staged_ledger
41+
else
42+
Mina_block.Validated.header validated_transition
43+
|> Mina_block.Header.protocol_state |> Protocol_state.blockchain_state
44+
|> Blockchain_state.staged_ledger_hash
45+
in
3446
{ validated_transition
3547
; staged_ledger
3648
; just_emitted_a_proof
3749
; transition_receipt_time
50+
; staged_ledger_hash
3851
}
3952

4053
let to_yojson
4154
{ validated_transition
4255
; staged_ledger = _
4356
; just_emitted_a_proof
4457
; transition_receipt_time
58+
; staged_ledger_hash = _
4559
} =
4660
`Assoc
4761
[ ( "validated_transition"
@@ -61,7 +75,8 @@ T.
6175
, staged_ledger
6276
, just_emitted_a_proof
6377
, transition_receipt_time
64-
, to_yojson )]
78+
, to_yojson
79+
, staged_ledger_hash )]
6580

6681
include Allocation_functor.Make.Basic (T)
6782

@@ -398,7 +413,7 @@ module For_tests = struct
398413
let body =
399414
Mina_block.Body.create @@ Staged_ledger_diff.forget staged_ledger_diff
400415
in
401-
let%bind ( `Hash_after_applying next_staged_ledger_hash
416+
let%bind ( `Hash_after_applying staged_ledger_hash
402417
, `Ledger_proof ledger_proof_opt
403418
, `Staged_ledger _
404419
, `Pending_coinbase_update _ ) =
@@ -436,7 +451,7 @@ module For_tests = struct
436451
let next_blockchain_state =
437452
Blockchain_state.create_value
438453
~timestamp:(Block_time.now @@ Block_time.Controller.basic ~logger)
439-
~staged_ledger_hash:next_staged_ledger_hash ~genesis_ledger_hash
454+
~staged_ledger_hash ~genesis_ledger_hash
440455
~body_reference:
441456
(Body.compute_reference
442457
~tag:Mina_net2.Bitswap_tag.(to_enum Body)

src/lib/transition_frontier/frontier_base/breadcrumb.mli

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ val display : t -> display
8282

8383
val name : t -> string
8484

85+
val staged_ledger_hash : t -> Staged_ledger_hash.t
86+
8587
module For_tests : sig
8688
val gen :
8789
?logger:Logger.t

src/lib/transition_frontier/frontier_base/root_data.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ module Historical = struct
5151
Staged_ledger.pending_coinbase_collection staged_ledger
5252
in
5353
let staged_ledger_target_ledger_hash =
54-
Staged_ledger.hash staged_ledger |> Staged_ledger_hash.ledger_hash
54+
Breadcrumb.staged_ledger_hash breadcrumb |> Staged_ledger_hash.ledger_hash
5555
in
5656
let common = Common.create ~scan_state ~pending_coinbase in
5757
{ transition; common; staged_ledger_target_ledger_hash }

src/lib/transition_frontier/full_frontier/full_frontier.ml

+4-2
Original file line numberDiff line numberDiff line change
@@ -1010,12 +1010,14 @@ module For_tests = struct
10101010
~src:(Lazy.force Genesis_ledger.t)
10111011
~dest:(Mina_ledger.Ledger.create ~depth:ledger_depth ()) )
10121012
in
1013+
let staged_ledger =
1014+
Staged_ledger.create_exn ~constraint_constants ~ledger:root_ledger
1015+
in
10131016
let root_data =
10141017
let open Root_data in
10151018
{ transition =
10161019
Mina_block.Validated.lift @@ Mina_block.genesis ~precomputed_values
1017-
; staged_ledger =
1018-
Staged_ledger.create_exn ~constraint_constants ~ledger:root_ledger
1020+
; staged_ledger
10191021
; protocol_states = []
10201022
}
10211023
in

src/lib/transition_frontier/persistent_frontier/persistent_frontier.ml

+1-6
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,9 @@ let construct_staged_ledger_at_root ~(precomputed_values : Precomputed_values.t)
6363
~expected_merkle_root:(Staged_ledger_hash.ledger_hash staged_ledger_hash)
6464
~get_state
6565
in
66-
let is_genesis =
67-
Mina_block.Validated.header root_transition
68-
|> Header.protocol_state |> Protocol_state.consensus_state
69-
|> Consensus.Data.Consensus_state.is_genesis_state
70-
in
7166
let constructed_staged_ledger_hash = Staged_ledger.hash staged_ledger in
7267
if
73-
is_genesis
68+
Mina_block.Validated.is_genesis root_transition
7469
|| Staged_ledger_hash.equal staged_ledger_hash
7570
constructed_staged_ledger_hash
7671
then Deferred.return (Ok staged_ledger)

0 commit comments

Comments
 (0)