diff --git a/src/state_migration/mod.rs b/src/state_migration/mod.rs index a94345e81d3d..bc7dbf58c792 100644 --- a/src/state_migration/mod.rs +++ b/src/state_migration/mod.rs @@ -28,6 +28,7 @@ mod nv24; mod nv25; mod nv26fix; mod nv27; +mod nv28; mod type_migrations; type RunMigration = fn(&ChainConfig, &Arc, &Cid, ChainEpoch) -> anyhow::Result; diff --git a/src/state_migration/nv28/migration.rs b/src/state_migration/nv28/migration.rs new file mode 100644 index 000000000000..8f3c9e468d4b --- /dev/null +++ b/src/state_migration/nv28/migration.rs @@ -0,0 +1,88 @@ +// Copyright 2019-2026 ChainSafe Systems +// SPDX-License-Identifier: Apache-2.0, MIT +// +//! This module contains the migration logic for the `NV28` upgrade. + +use std::sync::Arc; + +use crate::networks::{ChainConfig, Height}; +use crate::shim::{ + address::Address, + clock::ChainEpoch, + machine::BuiltinActorManifest, + state_tree::{StateTree, StateTreeVersion}, +}; +use crate::utils::db::CborStoreExt as _; +use anyhow::Context as _; +use cid::Cid; + +use fvm_ipld_blockstore::Blockstore; + +use super::{SystemStateOld, system, verifier::Verifier}; +use crate::state_migration::common::{StateMigration, migrators::nil_migrator}; + +impl StateMigration { + pub fn add_nv28_migrations( + &mut self, + store: &Arc, + state: &Cid, + new_manifest: &BuiltinActorManifest, + ) -> anyhow::Result<()> { + let state_tree = StateTree::new_from_root(store.clone(), state)?; + let system_actor = state_tree.get_required_actor(&Address::SYSTEM_ACTOR)?; + let system_actor_state = store.get_cbor_required::(&system_actor.state)?; + + let current_manifest_data = system_actor_state.builtin_actors; + + let current_manifest = + BuiltinActorManifest::load_v1_actor_list(store, ¤t_manifest_data)?; + + for (name, code) in current_manifest.builtin_actors() { + let new_code = new_manifest.get(name)?; + self.add_migrator(code, nil_migrator(new_code)) + } + + self.add_migrator( + current_manifest.get_system(), + system::system_migrator(new_manifest), + ); + + Ok(()) + } +} + +/// Runs the migration for `NV28`. Returns the new state root. +pub fn run_migration( + chain_config: &ChainConfig, + blockstore: &Arc, + state: &Cid, + epoch: ChainEpoch, +) -> anyhow::Result +where + DB: Blockstore + Send + Sync, +{ + let new_manifest_cid = chain_config + .height_infos + .get(&Height::Xxx) + .context("no height info for network version NV28")? + .bundle + .as_ref() + .context("no bundle for network version NV28")?; + + blockstore.get(new_manifest_cid)?.context(format!( + "manifest for network version NV28 not found in blockstore: {new_manifest_cid}" + ))?; + + // Add migration specification verification + let verifier = Arc::new(Verifier::default()); + + let new_manifest = BuiltinActorManifest::load_manifest(blockstore, new_manifest_cid)?; + let mut migration = StateMigration::::new(Some(verifier)); + migration.add_nv28_migrations(blockstore, state, &new_manifest)?; + + let actors_in = StateTree::new_from_root(blockstore.clone(), state)?; + let actors_out = StateTree::new(blockstore.clone(), StateTreeVersion::V5)?; + let new_state = migration.migrate_state_tree(blockstore, epoch, actors_in, actors_out)?; + + Ok(new_state) +} diff --git a/src/state_migration/nv28/mod.rs b/src/state_migration/nv28/mod.rs new file mode 100644 index 000000000000..a4abf9a8f99c --- /dev/null +++ b/src/state_migration/nv28/mod.rs @@ -0,0 +1,20 @@ +// Copyright 2019-2026 ChainSafe Systems +// SPDX-License-Identifier: Apache-2.0, MIT + +//! This module contains the migration logic for the `NV28` upgrade. +mod migration; + +/// Run migration for `NV28`. This should be the only exported method in this +/// module. +#[allow(unused)] +pub use migration::run_migration; + +use crate::{define_system_states, impl_system, impl_verifier}; + +define_system_states!( + fil_actor_system_state::v17::State, + fil_actor_system_state::v18::State +); + +impl_system!(); +impl_verifier!();