Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/state_migration/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ mod nv24;
mod nv25;
mod nv26fix;
mod nv27;
mod nv28;
Comment thread
LesnyRumcajs marked this conversation as resolved.
mod type_migrations;

type RunMigration<DB> = fn(&ChainConfig, &Arc<DB>, &Cid, ChainEpoch) -> anyhow::Result<Cid>;
Expand Down
88 changes: 88 additions & 0 deletions src/state_migration/nv28/migration.rs
Original file line number Diff line number Diff line change
@@ -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<BS: Blockstore> StateMigration<BS> {
pub fn add_nv28_migrations(
&mut self,
store: &Arc<BS>,
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::<SystemStateOld>(&system_actor.state)?;

let current_manifest_data = system_actor_state.builtin_actors;

let current_manifest =
BuiltinActorManifest::load_v1_actor_list(store, &current_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))
Comment thread
LesnyRumcajs marked this conversation as resolved.
}

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<DB>(
chain_config: &ChainConfig,
blockstore: &Arc<DB>,
state: &Cid,
epoch: ChainEpoch,
) -> anyhow::Result<Cid>
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::<DB>::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)
}
20 changes: 20 additions & 0 deletions src/state_migration/nv28/mod.rs
Original file line number Diff line number Diff line change
@@ -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!();
Loading