Skip to content

Commit 59a3614

Browse files
cjjdespresglyh
authored andcommitted
Implement dump from genesis epoch ledgers
1 parent 24fd19d commit 59a3614

File tree

3 files changed

+63
-8
lines changed

3 files changed

+63
-8
lines changed

src/lib/genesis_ledger/genesis_ledger.ml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,16 @@ module Utils = struct
8181
assert (Root_ledger.depth root = depth) ;
8282
Root_ledger.create_checkpoint ~config root () |> Or_error.return
8383

84+
let create_root_from_backing_root_with_directory genesis_mask root ~directory
85+
~depth () =
86+
assert (
87+
Ledger_hash.equal
88+
(Ledger.merkle_root genesis_mask)
89+
(Root_ledger.merkle_root root) ) ;
90+
assert (Root_ledger.depth root = depth) ;
91+
Root_ledger.create_checkpoint_with_directory root ~directory_name:directory
92+
|> Or_error.return
93+
8494
let keypair_of_account_record_exn (private_key, account) =
8595
let open Account in
8696
let sk_error_msg =
@@ -181,6 +191,29 @@ module Make (Inputs : Intf.Ledger_input_intf) : Intf.S = struct
181191
| `Root ledger ->
182192
create_root_from_backing_root mask ledger ~config ~depth ()
183193

194+
let create_root_with_directory ~directory ~depth () =
195+
let backing_ledger, mask = Lazy.force backing_ledger in
196+
match backing_ledger with
197+
| `Ephemeral ledger ->
198+
(* For ephemeral ledgers, create a fresh root with stable_db backing
199+
and transfer accounts to it *)
200+
let open Or_error.Let_syntax in
201+
let config =
202+
Root_ledger.Config.with_directory ~backing_type:Stable_db
203+
~directory_name:directory
204+
in
205+
let root = Root_ledger.create ~logger ~config ~depth () in
206+
(* We are transferring to an unmasked view of the root, so this is
207+
used solely for the transfer side effect *)
208+
let%map _dest =
209+
Ledger_transfer_mask.transfer_accounts ~src:ledger
210+
~dest:(Root_ledger.as_unmasked root)
211+
in
212+
root
213+
| `Root ledger ->
214+
create_root_from_backing_root_with_directory mask ledger ~directory
215+
~depth ()
216+
184217
include Utils
185218

186219
let find_account_record_exn ~f =
@@ -219,6 +252,8 @@ module Packed = struct
219252

220253
let create_root ((module L) : t) = L.create_root
221254

255+
let create_root_with_directory ((module L) : t) = L.create_root_with_directory
256+
222257
let depth ((module L) : t) = L.depth
223258

224259
let accounts ((module L) : t) = L.accounts
@@ -265,6 +300,11 @@ end) : Intf.S = struct
265300
let genesis_root, mask = Lazy.force backing_ledger in
266301
create_root_from_backing_root mask genesis_root ~config ~depth ()
267302

303+
let create_root_with_directory ~directory ~depth () =
304+
let genesis_root, mask = Lazy.force backing_ledger in
305+
create_root_from_backing_root_with_directory mask genesis_root ~directory
306+
~depth ()
307+
268308
let find_account_record_exn ~f =
269309
find_account_record_exn ~f (Lazy.force accounts)
270310

src/lib/genesis_ledger/intf.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ module type S = sig
7979
val create_root :
8080
config:Root_ledger.Config.t -> depth:int -> unit -> Root_ledger.t Or_error.t
8181

82+
(** Create a new root ledger that is equal in state to the genesis ledger,
83+
using a directory path instead of a config *)
84+
val create_root_with_directory :
85+
directory:string -> depth:int -> unit -> Root_ledger.t Or_error.t
86+
8287
val depth : int
8388

8489
val accounts : (Private_key.t option * Account.t) list Lazy.t

src/lib/mina_lib/mina_lib.ml

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2984,10 +2984,15 @@ module Hardfork_config = struct
29842984
let genesis_staking_ledger_data =
29852985
let directory_name = parent_directory ^/ "staking_ledger" in
29862986
match source_ledgers.staking_ledger with
2987-
| `Genesis _l ->
2988-
failwith
2989-
"Daemon has genesis staking ledger - hard fork dump currently \
2990-
unsupported"
2987+
| `Genesis l ->
2988+
let depth = Genesis_ledger.Packed.depth l in
2989+
let root =
2990+
Genesis_ledger.Packed.create_root_with_directory l
2991+
~directory:directory_name ~depth ()
2992+
|> Or_error.ok_exn
2993+
in
2994+
let diff = Ledger.Location.Map.empty in
2995+
(root, diff)
29912996
| `Root l ->
29922997
let root =
29932998
Root_ledger.create_checkpoint_with_directory l ~directory_name
@@ -2998,10 +3003,15 @@ module Hardfork_config = struct
29983003
let genesis_next_epoch_ledger_data =
29993004
let directory_name = parent_directory ^/ "next_epoch_ledger" in
30003005
match source_ledgers.next_epoch_ledger with
3001-
| `Genesis _l ->
3002-
failwith
3003-
"Daemon has genesis epoch ledger - hard fork dump currently \
3004-
unsupported"
3006+
| `Genesis l ->
3007+
let depth = Genesis_ledger.Packed.depth l in
3008+
let root =
3009+
Genesis_ledger.Packed.create_root_with_directory l
3010+
~directory:directory_name ~depth ()
3011+
|> Or_error.ok_exn
3012+
in
3013+
let diff = Ledger.Location.Map.empty in
3014+
(root, diff)
30053015
| `Root l ->
30063016
let root =
30073017
Root_ledger.create_checkpoint_with_directory l ~directory_name

0 commit comments

Comments
 (0)