@@ -19,39 +19,42 @@ pub fn upgrade_to_v23<T: BeaconChainTypes>(
19
19
_log : Logger ,
20
20
) -> Result < Vec < KeyValueStoreOp > , Error > {
21
21
// Set the head-tracker to empty
22
-
23
22
let Some ( persisted_beacon_chain_v22) =
24
23
db. get_item :: < PersistedBeaconChainV22 > ( & BEACON_CHAIN_DB_KEY ) ?
25
24
else {
26
- // If there is no persisted beacon chain, ignore the upgrade
27
- return Ok ( vec ! [ ] ) ;
25
+ return Err ( Error :: MigrationError (
26
+ "No persisted beacon chain found in DB. Datadir could be incorrect or DB could be corrupt" . to_string ( )
27
+ ) ) ;
28
28
} ;
29
29
30
30
let persisted_beacon_chain = PersistedBeaconChain {
31
31
genesis_block_root : persisted_beacon_chain_v22. genesis_block_root ,
32
32
} ;
33
33
34
- db . put_item :: < PersistedBeaconChain > ( & BEACON_CHAIN_DB_KEY , & persisted_beacon_chain ) ? ;
34
+ let ops = vec ! [ persisted_beacon_chain . as_kv_store_op ( BEACON_CHAIN_DB_KEY ) ] ;
35
35
36
- todo ! ( ) ;
36
+ Ok ( ops )
37
37
}
38
38
39
39
pub fn downgrade_from_v23 < T : BeaconChainTypes > (
40
40
db : Arc < HotColdDB < T :: EthSpec , T :: HotStore , T :: ColdStore > > ,
41
41
log : Logger ,
42
42
) -> Result < Vec < KeyValueStoreOp > , Error > {
43
- // recreate head-tracker from the fork-choice
44
-
45
- let Some ( persisted_fork_choice) = db. get_item :: < PersistedForkChoice > ( & FORK_CHOICE_DB_KEY ) ?
43
+ let Some ( persisted_beacon_chain) = db. get_item :: < PersistedBeaconChain > ( & BEACON_CHAIN_DB_KEY ) ?
46
44
else {
47
- // Is it possible for the fork-choice to not exist on a downgrade?
48
- return Ok ( vec ! [ ] ) ;
45
+ // The `PersistedBeaconChain` must exist if fork choice exists.
46
+ return Err ( Error :: MigrationError (
47
+ "No persisted beacon chain found in DB. Datadir could be incorrect or DB could be corrupt" . to_string ( ) ,
48
+ ) ) ;
49
49
} ;
50
50
51
- let Some ( persisted_beacon_chain) = db. get_item :: < PersistedBeaconChain > ( & BEACON_CHAIN_DB_KEY ) ?
51
+ // Recreate head-tracker from fork choice.
52
+ let Some ( persisted_fork_choice) = db. get_item :: < PersistedForkChoice > ( & FORK_CHOICE_DB_KEY ) ?
52
53
else {
53
- // TODO: Is it possible for persisted beacon chain to be missing if the fork choice exists?
54
- return Ok ( vec ! [ ] ) ;
54
+ // Fork choice should exist if the database exists.
55
+ return Err ( Error :: MigrationError (
56
+ "No fork choice found in DB" . to_string ( ) ,
57
+ ) ) ;
55
58
} ;
56
59
57
60
let fc_store =
@@ -62,7 +65,8 @@ pub fn downgrade_from_v23<T: BeaconChainTypes>(
62
65
) )
63
66
} ) ?;
64
67
65
- // TODO: what value to choose here?
68
+ // Doesn't matter what policy we use for invalid payloads, as our head calculation just
69
+ // considers descent from finalization.
66
70
let reset_payload_statuses = ResetPayloadStatuses :: OnlyWithInvalidPayload ;
67
71
let fork_choice = ForkChoice :: from_persisted (
68
72
persisted_fork_choice. fork_choice ,
@@ -91,9 +95,9 @@ pub fn downgrade_from_v23<T: BeaconChainTypes>(
91
95
} ,
92
96
} ;
93
97
94
- db . put_item :: < PersistedBeaconChainV22 > ( & BEACON_CHAIN_DB_KEY , & persisted_beacon_chain_v22 ) ? ;
98
+ let ops = vec ! [ persisted_beacon_chain_v22 . as_kv_store_op ( BEACON_CHAIN_DB_KEY ) ] ;
95
99
96
- todo ! ( ) ;
100
+ Ok ( ops )
97
101
}
98
102
99
103
/// Helper struct that is used to encode/decode the state of the `HeadTracker` as SSZ bytes.
0 commit comments