diff --git a/crates/rooch/src/commands/indexer/commands/rebuild.rs b/crates/rooch/src/commands/indexer/commands/rebuild.rs index 60fcd0964..f75424fbe 100644 --- a/crates/rooch/src/commands/indexer/commands/rebuild.rs +++ b/crates/rooch/src/commands/indexer/commands/rebuild.rs @@ -24,9 +24,6 @@ use rooch_types::rooch_network::RoochChainID; use crate::commands::indexer::commands::init_indexer; use crate::commands::statedb::commands::import::parse_csv_fields; -use crate::commands::statedb::commands::{ - GLOBAL_STATE_TYPE_OBJECT, GLOBAL_STATE_TYPE_PREFIX, GLOBAL_STATE_TYPE_ROOT, -}; /// Rebuild indexer #[derive(Debug, Parser)] @@ -89,7 +86,7 @@ fn produce_updates( batch_size: usize, ) -> Result<()> { let mut csv_reader = BufReader::new(File::open(input).unwrap()); - let mut last_state_type = None; + // let mut last_state_type = None; // set genesis tx_order and state_index_generator for indexer rebuild let tx_order: u64 = 0; @@ -107,25 +104,24 @@ fn produce_updates( for line in csv_reader.by_ref().lines().take(batch_size) { let line = line?; - if line.starts_with(GLOBAL_STATE_TYPE_PREFIX) { - let (state_type, _) = parse_csv_fields(&line)?; - last_state_type = Some(state_type); - continue; - } - let (_c1, state_str) = parse_csv_fields(&line)?; - let state = ObjectState::from_str(&state_str)?; - - let state_type = last_state_type - .clone() - .expect("Last state type should have value"); - - if state_type.eq(GLOBAL_STATE_TYPE_OBJECT) || state_type.eq(GLOBAL_STATE_TYPE_ROOT) { - let indexer_state = - IndexerObjectState::new(state.metadata, tx_order, state_index_generator); - state_index_generator += 1; - updates.object_states.push(indexer_state); - }; + let state_result = ObjectState::from_str(&state_str); + match state_result { + Ok(state) => { + let indexer_state = + IndexerObjectState::new(state.metadata, tx_order, state_index_generator); + state_index_generator += 1; + updates.object_states.push(indexer_state); + } + Err(e) => { + println!( + "Parse object state error, state maybe not an object, line: {} , err: {:?}", + line, + e.to_string() + ); + continue; + } + } } if updates.object_states.is_empty() { break; diff --git a/crates/rooch/src/commands/statedb/commands/export.rs b/crates/rooch/src/commands/statedb/commands/export.rs index a05fe8a91..670cc7396 100644 --- a/crates/rooch/src/commands/statedb/commands/export.rs +++ b/crates/rooch/src/commands/statedb/commands/export.rs @@ -31,11 +31,12 @@ use crate::commands::statedb::commands::{ #[serde(rename_all = "lowercase")] pub enum ExportMode { #[default] - Genesis = 0, // dump InscriptionStore, BitcoinUTXOStore, RoochToBitcoinAddressMapping for genesis start-up - Full = 1, - Snapshot = 2, - Indexer = 3, // dump InscriptionStore, BitcoinUTXOStore for rebuild indexer - Object = 4, + Genesis, // dump InscriptionStore, BitcoinUTXOStore, RoochToBitcoinAddressMapping for genesis start-up + Full, + Snapshot, + FullIndexer, // dump Full Objects, include InscriptionStore, BitcoinUTXOStore for rebuild indexer + Indexer, // dump InscriptionStore, BitcoinUTXOStore for rebuild indexer + Object, } impl Display for ExportMode { @@ -44,6 +45,7 @@ impl Display for ExportMode { ExportMode::Genesis => write!(f, "genesis"), ExportMode::Full => write!(f, "full"), ExportMode::Snapshot => write!(f, "snapshot"), + ExportMode::FullIndexer => write!(f, "fullindexer"), ExportMode::Indexer => write!(f, "indexer"), ExportMode::Object => write!(f, "object"), } @@ -58,6 +60,7 @@ impl FromStr for ExportMode { "genesis" => Ok(ExportMode::Genesis), "full" => Ok(ExportMode::Full), "snapshot" => Ok(ExportMode::Snapshot), + "fullindexer" => Ok(ExportMode::FullIndexer), "indexer" => Ok(ExportMode::Indexer), "object" => Ok(ExportMode::Object), _ => Err("export-mode no match"), @@ -65,12 +68,6 @@ impl FromStr for ExportMode { } } -impl ExportMode { - pub fn to_num(self) -> u8 { - self as u8 - } -} - #[derive(Debug, Serialize, Deserialize, Clone, Ord, Eq, PartialOrd, PartialEq)] pub struct ExportID { pub object_id: ObjectID, @@ -162,6 +159,7 @@ impl FromStr for ExportObjectName { } } +#[allow(dead_code)] #[derive(Debug, Parser)] pub struct ExportCommand { /// export state root, default latest state root @@ -218,6 +216,9 @@ impl ExportCommand { ExportMode::Snapshot => { todo!() } + ExportMode::FullIndexer => { + Self::export_full_indexer(&moveos_store, root_state_root, &mut writer)?; + } ExportMode::Indexer => { Self::export_indexer(&moveos_store, root_state_root, &mut writer)?; } @@ -263,49 +264,53 @@ impl ExportCommand { ) } + fn export_full_indexer( + moveos_store: &MoveOSStore, + root_state_root: H256, + writer: &mut Writer, + ) -> Result<()> { + // export root object, utxo, inscription store object, exclude dynamic filed objects + let object_ids = vec![ + ObjectID::root(), + BitcoinUTXOStore::object_id(), + InscriptionStore::object_id(), + ]; + + Self::internal_export_indexer(moveos_store, root_state_root, writer, object_ids)?; + writer.flush()?; + Ok(()) + } + fn export_indexer( moveos_store: &MoveOSStore, root_state_root: H256, writer: &mut Writer, ) -> Result<()> { - // export root's ExportID - export_root_export_id(root_state_root, writer)?; // export utxo, inscription store object - let field_keys = vec![ - BitcoinUTXOStore::object_id().field_key(), - InscriptionStore::object_id().field_key(), - ]; - export_fields(moveos_store, root_state_root, writer, field_keys)?; - // export utxo store fields - let utxo_store_state_root = get_state_root( - moveos_store, - root_state_root, - BitcoinUTXOStore::object_id().field_key(), - ); - Self::export_top_level_fields( - moveos_store, - utxo_store_state_root, - BitcoinUTXOStore::object_id(), - Some(ExportObjectName::UtxoStore.to_string()), - writer, - )?; - // export inscription store fields - let inscription_store_state_root = get_state_root( - moveos_store, - root_state_root, - InscriptionStore::object_id().field_key(), - ); - Self::export_top_level_fields( - moveos_store, - inscription_store_state_root, - BitcoinUTXOStore::object_id(), - Some(ExportObjectName::InscriptionStore.to_string()), - writer, - )?; + let object_ids = vec![BitcoinUTXOStore::object_id(), InscriptionStore::object_id()]; + + Self::internal_export_indexer(moveos_store, root_state_root, writer, object_ids)?; writer.flush()?; Ok(()) } + fn internal_export_indexer( + moveos_store: &MoveOSStore, + root_state_root: H256, + writer: &mut Writer, + object_ids: Vec, + ) -> Result<()> { + for obj_id in object_ids.into_iter() { + let state_root = if obj_id == ObjectID::root() { + root_state_root + } else { + get_state_root(moveos_store, root_state_root, obj_id.field_key()) + }; + Self::export_top_level_fields(moveos_store, state_root, obj_id, None, writer)?; + } + Ok(()) + } + // export top level fields of an object, no recursive export child field fn export_top_level_fields( moveos_store: &MoveOSStore, @@ -477,6 +482,7 @@ impl ExportCommand { } } +#[allow(dead_code)] // export root's export id for further checking in import job. fn export_root_export_id( root_state_root: H256, @@ -487,6 +493,7 @@ fn export_root_export_id( Ok(()) } +#[allow(dead_code)] fn export_fields( moveos_store: &MoveOSStore, state_root: H256,