From 310a7c636f2d1c8ace53fe88f0a7313e095a17ad Mon Sep 17 00:00:00 2001 From: Green Baneling Date: Wed, 26 Jun 2024 11:58:39 +0200 Subject: [PATCH] Extract `HistoricalView` trait from the `AtomicView` (#1989) It is preparation for https://github.com/FuelLabs/fuel-core/issues/451. Most of the services don't need historical functionality; only the executor uses the view of the storage at a specific height. The change extracts this functionality into its own `HistoricalView` trait. During the implementation of the state rewind, I realized that the historical view has some limitations(like we are not able to iterate). So because of that, the historical view uses another type that only implements the `KeyValueInspect` trait. ## Checklist - [x] Breaking changes are clearly marked as such in the PR description and changelog ### Before requesting review - [x] I have reviewed the code myself --- CHANGELOG.md | 7 +- .../state_transition_bytecode.wasm | Bin 2012224 -> 2012033 bytes crates/fuel-core/src/coins_query.rs | 13 +- crates/fuel-core/src/database.rs | 102 +++-------- .../src/database/database_description.rs | 33 +++- crates/fuel-core/src/executor.rs | 26 ++- .../fuel-core/src/graphql_api/api_service.rs | 8 +- crates/fuel-core/src/graphql_api/database.rs | 27 +-- .../src/graphql_api/database/arc_wrapper.rs | 40 ++--- .../src/graphql_api/view_extension.rs | 13 +- crates/fuel-core/src/schema/dap.rs | 31 ++-- .../src/service/adapters/producer.rs | 5 + .../fuel-core/src/service/adapters/relayer.rs | 4 +- .../consensus_module/src/block_verifier.rs | 4 +- crates/services/executor/src/executor.rs | 8 + crates/services/importer/src/importer.rs | 5 +- crates/services/importer/src/ports.rs | 2 +- crates/services/p2p/src/service.rs | 44 ++--- .../services/producer/src/block_producer.rs | 29 ++-- crates/services/producer/src/mocks.rs | 18 +- crates/services/producer/src/ports.rs | 3 + crates/services/txpool/src/mock_db.rs | 21 +-- crates/services/txpool/src/service.rs | 8 +- crates/services/txpool/src/txpool.rs | 9 +- .../upgradable-executor/src/executor.rs | 160 ++++++++++-------- crates/storage/src/lib.rs | 7 + crates/storage/src/structured_storage.rs | 5 + crates/storage/src/transactional.rs | 25 ++- 28 files changed, 327 insertions(+), 330 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcb4089c3e3..3bb97d51da1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] ### Added -- [1972](https://github.com/FuelLabs/fuel-core/pull/1972): Implement `AlgorithmUpdater` for `GasPriceService` +- [#1972](https://github.com/FuelLabs/fuel-core/pull/1972): Implement `AlgorithmUpdater` for `GasPriceService` - [#1948](https://github.com/FuelLabs/fuel-core/pull/1948): Add new `AlgorithmV1` and `AlgorithmUpdaterV1` for the gas price. Include tools for analysis +### Changed + +#### Breaking +- [#1989](https://github.com/FuelLabs/fuel-core/pull/1989): Extract `HistoricalView` trait from the `AtomicView`. + ## [Version 0.30.0] ### Added diff --git a/bin/fuel-core/chainspec/local-testnet/state_transition_bytecode.wasm b/bin/fuel-core/chainspec/local-testnet/state_transition_bytecode.wasm index 8e610b6f1bab07e99505b94a2d015942598ad2ae..9b14f5112ce9f193c78e7fd3a155f88ef4510f3f 100755 GIT binary patch delta 184967 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 delta 185223 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�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 diff --git a/crates/fuel-core/src/coins_query.rs b/crates/fuel-core/src/coins_query.rs index 8120d723ff9..c0adc94101a 100644 --- a/crates/fuel-core/src/coins_query.rs +++ b/crates/fuel-core/src/coins_query.rs @@ -343,7 +343,7 @@ mod tests { asset, base_asset_id, None, - &db.view(), + &db.test_view(), )) .map(|coins| { coins @@ -503,7 +503,7 @@ mod tests { db: &ServiceDatabase, ) -> Result, CoinsQueryError> { let coins = random_improve( - &db.view(), + &db.test_view(), &SpendQuery::new(owner, &query_per_asset, None, base_asset_id)?, ); @@ -701,7 +701,8 @@ mod tests { Some(excluded_ids), base_asset_id, )?; - let coins = random_improve(&db.service_database().view(), &spend_query); + let coins = + random_improve(&db.service_database().test_view(), &spend_query); // Transform result for convenience coins.map(|coins| { @@ -859,7 +860,7 @@ mod tests { } let coins = random_improve( - &db.service_database().view(), + &db.service_database().test_view(), &SpendQuery::new( owner, &[AssetSpendTarget { @@ -1008,7 +1009,7 @@ mod tests { pub fn owned_coins(&self, owner: &Address) -> Vec { use crate::query::CoinQueryData; let query = self.service_database(); - let query = query.view(); + let query = query.test_view(); query .owned_coins_ids(owner, None, IterDirection::Forward) .map(|res| res.map(|id| query.coin(id).unwrap())) @@ -1019,7 +1020,7 @@ mod tests { pub fn owned_messages(&self, owner: &Address) -> Vec { use crate::query::MessageQueryData; let query = self.service_database(); - let query = query.view(); + let query = query.test_view(); query .owned_message_ids(owner, None, IterDirection::Forward) .map(|res| res.map(|id| query.message(&id).unwrap())) diff --git a/crates/fuel-core/src/database.rs b/crates/fuel-core/src/database.rs index e46ce1a12de..a3777c8914b 100644 --- a/crates/fuel-core/src/database.rs +++ b/crates/fuel-core/src/database.rs @@ -49,13 +49,7 @@ use fuel_core_storage::{ StorageInspect, StorageMutate, }; -use fuel_core_types::{ - blockchain::{ - block::CompressedBlock, - primitives::DaBlockHeight, - }, - fuel_types::BlockHeight, -}; +use fuel_core_types::blockchain::block::CompressedBlock; use itertools::Itertools; use std::{ fmt::Debug, @@ -66,8 +60,10 @@ pub use fuel_core_database::Error; pub type Result = core::result::Result; // TODO: Extract `Database` and all belongs into `fuel-core-database`. +use crate::database::database_description::DatabaseHeight; #[cfg(feature = "rocksdb")] use crate::state::rocks_db::RocksDb; +use fuel_core_storage::transactional::HistoricalView; #[cfg(feature = "rocksdb")] use std::path::Path; @@ -294,60 +290,32 @@ where } } -impl AtomicView for Database { - type View = Self; - - type Height = BlockHeight; - - fn latest_height(&self) -> Option { - *self.stage.height.lock() - } - - fn view_at(&self, _: &BlockHeight) -> StorageResult { - // TODO: Unimplemented until of the https://github.com/FuelLabs/fuel-core/issues/451 - Ok(self.latest_view()) - } +impl AtomicView for Database +where + Description: DatabaseDescription, +{ + type LatestView = Self; - fn latest_view(&self) -> Self::View { + fn latest_view(&self) -> StorageResult { // TODO: https://github.com/FuelLabs/fuel-core/issues/1581 - self.clone() + Ok(self.clone()) } } -impl AtomicView for Database { - type View = Self; - - type Height = BlockHeight; +impl HistoricalView for Database +where + Description: DatabaseDescription, +{ + type Height = Description::Height; + type ViewAtHeight = Self; fn latest_height(&self) -> Option { *self.stage.height.lock() } - fn view_at(&self, _: &BlockHeight) -> StorageResult { + fn view_at(&self, _: &Self::Height) -> StorageResult { // TODO: Unimplemented until of the https://github.com/FuelLabs/fuel-core/issues/451 - Ok(self.latest_view()) - } - - fn latest_view(&self) -> Self::View { - // TODO: https://github.com/FuelLabs/fuel-core/issues/1581 - self.clone() - } -} - -impl AtomicView for Database { - type View = Self; - type Height = DaBlockHeight; - - fn latest_height(&self) -> Option { - *self.stage.height.lock() - } - - fn view_at(&self, _: &Self::Height) -> StorageResult { - Ok(self.latest_view()) - } - - fn latest_view(&self) -> Self::View { - self.clone() + Ok(self.clone()) } } @@ -409,33 +377,6 @@ impl Modifiable for GenesisDatabase { } } -trait DatabaseHeight: Sized { - fn as_u64(&self) -> u64; - - fn advance_height(&self) -> Option; -} - -impl DatabaseHeight for BlockHeight { - fn as_u64(&self) -> u64 { - let height: u32 = (*self).into(); - height as u64 - } - - fn advance_height(&self) -> Option { - self.succ() - } -} - -impl DatabaseHeight for DaBlockHeight { - fn as_u64(&self) -> u64 { - self.0 - } - - fn advance_height(&self) -> Option { - self.0.checked_add(1).map(Into::into) - } -} - fn commit_changes_with_height_update( database: &mut Database, changes: Changes, @@ -620,7 +561,7 @@ mod tests { .unwrap(); // Then - assert_eq!(AtomicView::latest_height(&database), None); + assert_eq!(HistoricalView::latest_height(&database), None); } #[test] @@ -780,7 +721,7 @@ mod tests { .unwrap(); // Then - assert_eq!(AtomicView::latest_height(&database), None); + assert_eq!(HistoricalView::latest_height(&database), None); } #[test] @@ -903,6 +844,7 @@ mod tests { }; use fuel_core_relayer::storage::EventsHistory; use fuel_core_storage::transactional::WriteTransaction; + use fuel_core_types::blockchain::primitives::DaBlockHeight; #[test] fn column_keys_not_exceed_count_test() { @@ -945,7 +887,7 @@ mod tests { .unwrap(); // Then - assert_eq!(AtomicView::latest_height(&database), None); + assert_eq!(HistoricalView::latest_height(&database), None); } #[test] diff --git a/crates/fuel-core/src/database/database_description.rs b/crates/fuel-core/src/database/database_description.rs index f62c6a11695..8e5f8ab3e7a 100644 --- a/crates/fuel-core/src/database/database_description.rs +++ b/crates/fuel-core/src/database/database_description.rs @@ -1,16 +1,47 @@ use core::fmt::Debug; use fuel_core_storage::kv_store::StorageColumn; +use fuel_core_types::{ + blockchain::primitives::DaBlockHeight, + fuel_types::BlockHeight, +}; pub mod off_chain; pub mod on_chain; pub mod relayer; +pub trait DatabaseHeight: PartialEq + Default + Copy + Send + Sync { + fn as_u64(&self) -> u64; + + fn advance_height(&self) -> Option; +} + +impl DatabaseHeight for BlockHeight { + fn as_u64(&self) -> u64 { + let height: u32 = (*self).into(); + height as u64 + } + + fn advance_height(&self) -> Option { + self.succ() + } +} + +impl DatabaseHeight for DaBlockHeight { + fn as_u64(&self) -> u64 { + self.0 + } + + fn advance_height(&self) -> Option { + self.0.checked_add(1).map(Into::into) + } +} + /// The description of the database that makes it unique. pub trait DatabaseDescription: 'static + Clone + Debug + Send + Sync { /// The type of the column used by the database. type Column: StorageColumn + strum::EnumCount + enum_iterator::Sequence; /// The type of the height of the database used to track commits. - type Height: Default + Copy; + type Height: DatabaseHeight; /// Returns the expected version of the database. fn version() -> u32; diff --git a/crates/fuel-core/src/executor.rs b/crates/fuel-core/src/executor.rs index 1d2d4bbd560..7a1bf096799 100644 --- a/crates/fuel-core/src/executor.rs +++ b/crates/fuel-core/src/executor.rs @@ -162,19 +162,10 @@ mod tests { } impl AtomicView for DisabledRelayer { - type View = Self; - type Height = DaBlockHeight; + type LatestView = Self; - fn latest_height(&self) -> Option { - Some(0u64.into()) - } - - fn view_at(&self, _: &Self::Height) -> StorageResult { - Ok(self.latest_view()) - } - - fn latest_view(&self) -> Self::View { - self.clone() + fn latest_view(&self) -> StorageResult { + Ok(self.clone()) } } @@ -508,6 +499,7 @@ mod tests { } = producer .storage_view_provider .latest_view() + .unwrap() .contract_balances(recipient, None, IterDirection::Forward) .next() .unwrap() @@ -598,6 +590,7 @@ mod tests { } = producer .storage_view_provider .latest_view() + .unwrap() .contract_balances(recipient, None, IterDirection::Forward) .next() .unwrap() @@ -707,6 +700,7 @@ mod tests { } = validator .storage_view_provider .latest_view() + .unwrap() .contract_balances(recipient, None, IterDirection::Forward) .next() .unwrap() @@ -2303,7 +2297,7 @@ mod tests { }; let mut exec = make_executor(&messages); - let view = exec.storage_view_provider.latest_view(); + let view = exec.storage_view_provider.latest_view().unwrap(); assert!(view.message_exists(message_coin.nonce()).unwrap()); assert!(view.message_exists(message_data.nonce()).unwrap()); @@ -2314,7 +2308,7 @@ mod tests { assert_eq!(skipped_transactions.len(), 0); // Successful execution consumes `message_coin` and `message_data`. - let view = exec.storage_view_provider.latest_view(); + let view = exec.storage_view_provider.latest_view().unwrap(); assert!(!view.message_exists(message_coin.nonce()).unwrap()); assert!(!view.message_exists(message_data.nonce()).unwrap()); assert_eq!( @@ -2350,7 +2344,7 @@ mod tests { }; let mut exec = make_executor(&messages); - let view = exec.storage_view_provider.latest_view(); + let view = exec.storage_view_provider.latest_view().unwrap(); assert!(view.message_exists(message_coin.nonce()).unwrap()); assert!(view.message_exists(message_data.nonce()).unwrap()); @@ -2361,7 +2355,7 @@ mod tests { assert_eq!(skipped_transactions.len(), 0); // We should spend only `message_coin`. The `message_data` should be unspent. - let view = exec.storage_view_provider.latest_view(); + let view = exec.storage_view_provider.latest_view().unwrap(); assert!(!view.message_exists(message_coin.nonce()).unwrap()); assert!(view.message_exists(message_data.nonce()).unwrap()); assert_eq!(*view.coin(&UtxoId::new(tx_id, 0)).unwrap().amount(), amount); diff --git a/crates/fuel-core/src/graphql_api/api_service.rs b/crates/fuel-core/src/graphql_api/api_service.rs index 179a62f6ed0..88eaf3da23a 100644 --- a/crates/fuel-core/src/graphql_api/api_service.rs +++ b/crates/fuel-core/src/graphql_api/api_service.rs @@ -190,10 +190,10 @@ pub fn new_service( request_timeout: Duration, ) -> anyhow::Result where - OnChain: AtomicView + 'static, - OffChain: AtomicView + 'static, - OnChain::View: OnChainDatabase, - OffChain::View: OffChainDatabase, + OnChain: AtomicView + 'static, + OffChain: AtomicView + 'static, + OnChain::LatestView: OnChainDatabase, + OffChain::LatestView: OffChainDatabase, { let network_addr = config.addr; let combined_read_database = diff --git a/crates/fuel-core/src/graphql_api/database.rs b/crates/fuel-core/src/graphql_api/database.rs index 5ac6e9b5589..3ff3e9f70bf 100644 --- a/crates/fuel-core/src/graphql_api/database.rs +++ b/crates/fuel-core/src/graphql_api/database.rs @@ -82,9 +82,9 @@ pub struct ReadDatabase { /// The height of the genesis block. genesis_height: BlockHeight, /// The on-chain database view provider. - on_chain: Box>, + on_chain: Box>, /// The off-chain database view provider. - off_chain: Box>, + off_chain: Box>, } impl ReadDatabase { @@ -95,10 +95,10 @@ impl ReadDatabase { off_chain: OffChain, ) -> Self where - OnChain: AtomicView + 'static, - OffChain: AtomicView + 'static, - OnChain::View: OnChainDatabase, - OffChain::View: OffChainDatabase, + OnChain: AtomicView + 'static, + OffChain: AtomicView + 'static, + OnChain::LatestView: OnChainDatabase, + OffChain::LatestView: OffChainDatabase, { Self { genesis_height, @@ -108,15 +108,20 @@ impl ReadDatabase { } /// Creates a consistent view of the database. - pub fn view(&self) -> ReadView { + pub fn view(&self) -> StorageResult { // TODO: Use the same height for both views to guarantee consistency. // It is not possible to implement until `view_at` is implemented for the `AtomicView`. // https://github.com/FuelLabs/fuel-core/issues/1582 - ReadView { + Ok(ReadView { genesis_height: self.genesis_height, - on_chain: self.on_chain.latest_view(), - off_chain: self.off_chain.latest_view(), - } + on_chain: self.on_chain.latest_view()?, + off_chain: self.off_chain.latest_view()?, + }) + } + + #[cfg(feature = "test-helpers")] + pub fn test_view(&self) -> ReadView { + self.view().expect("The latest view always should exist") } } diff --git a/crates/fuel-core/src/graphql_api/database/arc_wrapper.rs b/crates/fuel-core/src/graphql_api/database/arc_wrapper.rs index 5355bde48d8..0fc88ec8c70 100644 --- a/crates/fuel-core/src/graphql_api/database/arc_wrapper.rs +++ b/crates/fuel-core/src/graphql_api/database/arc_wrapper.rs @@ -30,46 +30,26 @@ impl ArcWrapper { } } -impl AtomicView for ArcWrapper +impl AtomicView for ArcWrapper where - Provider: AtomicView, + Provider: AtomicView, View: OnChainDatabase + 'static, { - type View = OnChainView; - type Height = Height; + type LatestView = OnChainView; - fn latest_height(&self) -> Option { - self.inner.latest_height() - } - - fn view_at(&self, height: &Height) -> StorageResult { - let view = self.inner.view_at(height)?; - Ok(Arc::new(view)) - } - - fn latest_view(&self) -> Self::View { - Arc::new(self.inner.latest_view()) + fn latest_view(&self) -> StorageResult { + Ok(Arc::new(self.inner.latest_view()?)) } } -impl AtomicView for ArcWrapper +impl AtomicView for ArcWrapper where - Provider: AtomicView, + Provider: AtomicView, View: OffChainDatabase + 'static, { - type View = OffChainView; - type Height = Height; - - fn latest_height(&self) -> Option { - self.inner.latest_height() - } - - fn view_at(&self, height: &Height) -> StorageResult { - let view = self.inner.view_at(height)?; - Ok(Arc::new(view)) - } + type LatestView = OffChainView; - fn latest_view(&self) -> Self::View { - Arc::new(self.inner.latest_view()) + fn latest_view(&self) -> StorageResult { + Ok(Arc::new(self.inner.latest_view()?)) } } diff --git a/crates/fuel-core/src/graphql_api/view_extension.rs b/crates/fuel-core/src/graphql_api/view_extension.rs index ca482fe9878..48c666ed189 100644 --- a/crates/fuel-core/src/graphql_api/view_extension.rs +++ b/crates/fuel-core/src/graphql_api/view_extension.rs @@ -6,7 +6,9 @@ use async_graphql::{ ExtensionFactory, NextPrepareRequest, }, + Pos, Request, + ServerError, ServerResult, }; use std::sync::Arc; @@ -37,7 +39,16 @@ impl Extension for ViewExtension { next: NextPrepareRequest<'_>, ) -> ServerResult { let database: &ReadDatabase = ctx.data_unchecked(); - let view = database.view(); + let view = database.view().map_err(|e| { + let (line, column) = (line!(), column!()); + ServerError::new( + e.to_string(), + Some(Pos { + line: line as usize, + column: column as usize, + }), + ) + })?; let request = request.data(view); next.run(ctx, request).await } diff --git a/crates/fuel-core/src/schema/dap.rs b/crates/fuel-core/src/schema/dap.rs index 3a247fa8706..6c61603df16 100644 --- a/crates/fuel-core/src/schema/dap.rs +++ b/crates/fuel-core/src/schema/dap.rs @@ -19,6 +19,7 @@ use async_graphql::{ use fuel_core_storage::{ not_found, transactional::{ + AtomicView, IntoTransaction, StorageTransaction, }, @@ -109,7 +110,7 @@ impl ConcreteStorage { &mut self, txs: &[Script], params: Arc, - storage: Database, + storage: &Database, ) -> anyhow::Result { let id = Uuid::new_v4(); let id = ID::from(id); @@ -156,7 +157,7 @@ impl ConcreteStorage { &mut self, id: &ID, params: Arc, - storage: Database, + storage: &Database, ) -> anyhow::Result<()> { let vm_database = Self::vm_database(storage)?; let tx = self @@ -202,13 +203,14 @@ impl ConcreteStorage { .ok_or_else(|| anyhow::anyhow!("The VM instance was not found")) } - fn vm_database(storage: Database) -> anyhow::Result { - let block = storage + fn vm_database(storage: &Database) -> anyhow::Result { + let view = storage.latest_view()?; + let block = view .get_current_block()? .ok_or(not_found!("Block for VMDatabase"))?; let vm_database = VmStorage::new( - storage.into_transaction(), + view.into_transaction(), block.header().consensus(), block.header().application(), // TODO: Use a real coinbase address @@ -313,11 +315,11 @@ impl DapMutation { .data_unchecked::() .latest_consensus_params(); - let id = ctx.data_unchecked::().lock().await.init( - &[], - params, - db.clone(), - )?; + let id = + ctx.data_unchecked::() + .lock() + .await + .init(&[], params, db)?; debug!("Session {:?} initialized", id); @@ -346,11 +348,10 @@ impl DapMutation { .data_unchecked::() .latest_consensus_params(); - ctx.data_unchecked::().lock().await.reset( - &id, - params, - db.clone(), - )?; + ctx.data_unchecked::() + .lock() + .await + .reset(&id, params, db)?; debug!("Session {:?} was reset", id); diff --git a/crates/fuel-core/src/service/adapters/producer.rs b/crates/fuel-core/src/service/adapters/producer.rs index 3aab12b5776..36470d8f951 100644 --- a/crates/fuel-core/src/service/adapters/producer.rs +++ b/crates/fuel-core/src/service/adapters/producer.rs @@ -190,6 +190,11 @@ fn get_gas_cost_for_height( } impl fuel_core_producer::ports::BlockProducerDatabase for Database { + fn latest_height(&self) -> Option { + use fuel_core_storage::transactional::HistoricalView; + HistoricalView::latest_height(self) + } + fn get_block(&self, height: &BlockHeight) -> StorageResult> { self.storage::() .get(height)? diff --git a/crates/fuel-core/src/service/adapters/relayer.rs b/crates/fuel-core/src/service/adapters/relayer.rs index c776146ec0f..ba08cc9d392 100644 --- a/crates/fuel-core/src/service/adapters/relayer.rs +++ b/crates/fuel-core/src/service/adapters/relayer.rs @@ -4,7 +4,7 @@ use crate::database::{ }; use fuel_core_relayer::ports::Transactional; use fuel_core_storage::transactional::{ - AtomicView, + HistoricalView, IntoTransaction, StorageTransaction, }; @@ -18,6 +18,6 @@ impl Transactional for Database { } fn latest_da_height(&self) -> Option { - AtomicView::latest_height(self) + HistoricalView::latest_height(self) } } diff --git a/crates/services/consensus_module/src/block_verifier.rs b/crates/services/consensus_module/src/block_verifier.rs index e7c931383e6..bd47ec5d3b2 100644 --- a/crates/services/consensus_module/src/block_verifier.rs +++ b/crates/services/consensus_module/src/block_verifier.rs @@ -44,7 +44,7 @@ impl Verifier { impl Verifier where V: AtomicView, - V::View: PoAVerifierDatabase, + V::LatestView: PoAVerifierDatabase, { /// Verifies **all** fields of the block based on used consensus to produce a block. /// @@ -65,7 +65,7 @@ where ) } Consensus::PoA(_) => { - let view = self.view_provider.latest_view(); + let view = self.view_provider.latest_view()?; fuel_core_poa::verifier::verify_block_fields(&view, block) } _ => Err(anyhow::anyhow!("Unsupported consensus: {:?}", consensus)), diff --git a/crates/services/executor/src/executor.rs b/crates/services/executor/src/executor.rs index 647e95e9469..fd5fe13de3a 100644 --- a/crates/services/executor/src/executor.rs +++ b/crates/services/executor/src/executor.rs @@ -229,6 +229,14 @@ where R: RelayerPort, D: KeyValueInspect, { + pub fn new(relayer: R, database: D, options: ExecutionOptions) -> Self { + Self { + relayer, + database, + options, + } + } + #[tracing::instrument(skip_all)] pub fn produce_without_commit( self, diff --git a/crates/services/importer/src/importer.rs b/crates/services/importer/src/importer.rs index 7bc451f16f0..850b5b90f30 100644 --- a/crates/services/importer/src/importer.rs +++ b/crates/services/importer/src/importer.rs @@ -3,6 +3,7 @@ use crate::{ BlockVerifier, DatabaseTransaction, ImporterDatabase, + Transactional, Validator, }, Config, @@ -177,7 +178,7 @@ impl Importer { impl Importer where - D: ImporterDatabase, + D: ImporterDatabase + Transactional, { /// The method commits the result of the block execution attaching the consensus data. /// It expects that the `UncommittedResult` contains the result of the block @@ -434,7 +435,7 @@ where impl Importer where - IDatabase: ImporterDatabase + 'static, + IDatabase: ImporterDatabase + Transactional + 'static, E: Validator + 'static, V: BlockVerifier + 'static, { diff --git a/crates/services/importer/src/ports.rs b/crates/services/importer/src/ports.rs index cd5cbe02c42..ee1952b335c 100644 --- a/crates/services/importer/src/ports.rs +++ b/crates/services/importer/src/ports.rs @@ -62,7 +62,7 @@ pub trait Transactional { } /// The alias port used by the block importer. -pub trait ImporterDatabase: Transactional + Send + Sync { +pub trait ImporterDatabase: Send + Sync { /// Returns the latest block height. fn latest_block_height(&self) -> StorageResult>; diff --git a/crates/services/p2p/src/service.rs b/crates/services/p2p/src/service.rs index f6a29e41579..34727f1c209 100644 --- a/crates/services/p2p/src/service.rs +++ b/crates/services/p2p/src/service.rs @@ -411,7 +411,7 @@ fn convert_peer_id(peer_id: &PeerId) -> anyhow::Result { impl RunnableService for UninitializedTask where V: AtomicView + 'static, - V::View: P2pDb, + V::LatestView: P2pDb, { const NAME: &'static str = "P2P"; @@ -437,7 +437,7 @@ where config, } = self; - let view = view_provider.latest_view(); + let view = view_provider.latest_view()?; let genesis = view.get_genesis()?; let config = config.init(genesis)?; let Config { @@ -492,7 +492,7 @@ impl RunnableTask for Task where P: TaskP2PService + 'static, V: AtomicView + 'static, - V::View: P2pDb, + V::LatestView: P2pDb, B: Broadcast + 'static, { async fn run(&mut self, watcher: &mut StateWatcher) -> anyhow::Result { @@ -578,7 +578,7 @@ where Some(FuelP2PEvent::InboundRequestMessage { request_message, request_id }) => { match request_message { RequestMessage::Transactions(range) => { - let view = self.view_provider.latest_view(); + let view = self.view_provider.latest_view()?; match view.get_transactions(range.clone()) { Ok(response) => { let _ = self.p2p_service.send_response_msg(request_id, ResponseMessage::Transactions(response)); @@ -599,7 +599,7 @@ where let response = None; let _ = self.p2p_service.send_response_msg(request_id, ResponseMessage::SealedHeaders(response)); } else { - let view = self.view_provider.latest_view(); + let view = self.view_provider.latest_view()?; match view.get_sealed_headers(range.clone()) { Ok(headers) => { let response = Some(headers); @@ -801,7 +801,7 @@ pub fn new_service( ) -> Service where V: AtomicView + 'static, - V::View: P2pDb, + V::LatestView: P2pDb, B: BlockHeightImporter, { let task = @@ -867,20 +867,10 @@ pub mod tests { struct FakeDb; impl AtomicView for FakeDb { - type View = Self; + type LatestView = Self; - type Height = BlockHeight; - - fn latest_height(&self) -> Option { - Some(BlockHeight::default()) - } - - fn view_at(&self, _: &BlockHeight) -> StorageResult { - unimplemented!() - } - - fn latest_view(&self) -> Self::View { - self.clone() + fn latest_view(&self) -> StorageResult { + Ok(self.clone()) } } @@ -992,20 +982,10 @@ pub mod tests { struct FakeDB; impl AtomicView for FakeDB { - type View = Self; - - type Height = BlockHeight; - - fn latest_height(&self) -> Option { - Some(BlockHeight::default()) - } - - fn view_at(&self, _: &BlockHeight) -> StorageResult { - unimplemented!() - } + type LatestView = Self; - fn latest_view(&self) -> Self::View { - self.clone() + fn latest_view(&self) -> StorageResult { + Ok(self.clone()) } } diff --git a/crates/services/producer/src/block_producer.rs b/crates/services/producer/src/block_producer.rs index d3f34c4add2..476b8685fc9 100644 --- a/crates/services/producer/src/block_producer.rs +++ b/crates/services/producer/src/block_producer.rs @@ -91,8 +91,8 @@ pub struct Producer Producer where - ViewProvider: AtomicView + 'static, - ViewProvider::View: BlockProducerDatabase, + ViewProvider: AtomicView + 'static, + ViewProvider::LatestView: BlockProducerDatabase, GasPriceProvider: GasPriceProviderConstraint, ConsensusProvider: ConsensusParametersProvider, { @@ -165,8 +165,8 @@ where impl Producer where - ViewProvider: AtomicView + 'static, - ViewProvider::View: BlockProducerDatabase, + ViewProvider: AtomicView + 'static, + ViewProvider::LatestView: BlockProducerDatabase, TxPool: ports::TxPool + 'static, Executor: ports::BlockProducer + 'static, GasPriceProvider: GasPriceProviderConstraint, @@ -188,8 +188,8 @@ where impl Producer where - ViewProvider: AtomicView + 'static, - ViewProvider::View: BlockProducerDatabase, + ViewProvider: AtomicView + 'static, + ViewProvider::LatestView: BlockProducerDatabase, Executor: ports::BlockProducer> + 'static, GasPriceProvider: GasPriceProviderConstraint, ConsensusProvider: ConsensusParametersProvider, @@ -209,8 +209,8 @@ where impl Producer where - ViewProvider: AtomicView + 'static, - ViewProvider::View: BlockProducerDatabase, + ViewProvider: AtomicView + 'static, + ViewProvider::LatestView: BlockProducerDatabase, Executor: ports::DryRunner + 'static, GasPriceProvider: GasPriceProviderConstraint, ConsensusProvider: ConsensusParametersProvider, @@ -226,9 +226,9 @@ where utxo_validation: Option, gas_price: Option, ) -> anyhow::Result> { + let view = self.view_provider.latest_view()?; let height = height.unwrap_or_else(|| { - self.view_provider - .latest_height() + view.latest_height() .unwrap_or_default() .succ() .expect("It is impossible to overflow the current block height") @@ -283,8 +283,8 @@ pub const NO_NEW_DA_HEIGHT_FOUND: &str = "No new da_height found"; impl Producer where - ViewProvider: AtomicView + 'static, - ViewProvider::View: BlockProducerDatabase, + ViewProvider: AtomicView + 'static, + ViewProvider::LatestView: BlockProducerDatabase, ConsensusProvider: ConsensusParametersProvider, { /// Create the header for a new block at the provided height @@ -356,7 +356,7 @@ where height: BlockHeight, block_time: Tai64, ) -> anyhow::Result { - let view = self.view_provider.latest_view(); + let view = self.view_provider.latest_view()?; let previous_block_info = self.previous_block_info(height, &view)?; let consensus_parameters_version = view.latest_consensus_parameters_version()?; let state_transition_bytecode_version = @@ -381,10 +381,11 @@ where fn previous_block_info( &self, height: BlockHeight, - view: &ViewProvider::View, + view: &ViewProvider::LatestView, ) -> anyhow::Result { let latest_height = self .view_provider + .latest_view()? .latest_height() .ok_or(Error::NoGenesisBlock)?; // block 0 is reserved for genesis diff --git a/crates/services/producer/src/mocks.rs b/crates/services/producer/src/mocks.rs index 3c4a86f9855..95fe741c34c 100644 --- a/crates/services/producer/src/mocks.rs +++ b/crates/services/producer/src/mocks.rs @@ -213,26 +213,20 @@ pub struct MockDb { } impl AtomicView for MockDb { - type View = Self; + type LatestView = Self; - type Height = BlockHeight; + fn latest_view(&self) -> StorageResult { + Ok(self.clone()) + } +} +impl BlockProducerDatabase for MockDb { fn latest_height(&self) -> Option { let blocks = self.blocks.lock().unwrap(); blocks.keys().max().cloned() } - fn view_at(&self, _: &BlockHeight) -> StorageResult { - Ok(self.latest_view()) - } - - fn latest_view(&self) -> Self::View { - self.clone() - } -} - -impl BlockProducerDatabase for MockDb { fn get_block(&self, height: &BlockHeight) -> StorageResult> { let blocks = self.blocks.lock().unwrap(); blocks diff --git a/crates/services/producer/src/ports.rs b/crates/services/producer/src/ports.rs index 66c4f77d235..a50b2ebe33c 100644 --- a/crates/services/producer/src/ports.rs +++ b/crates/services/producer/src/ports.rs @@ -29,6 +29,9 @@ use fuel_core_types::{ use std::borrow::Cow; pub trait BlockProducerDatabase: Send + Sync { + /// Returns the latest block height. + fn latest_height(&self) -> Option; + /// Gets the committed block at the `height`. fn get_block(&self, height: &BlockHeight) -> StorageResult>; diff --git a/crates/services/txpool/src/mock_db.rs b/crates/services/txpool/src/mock_db.rs index a7b8406b485..d6a4ff8d9c1 100644 --- a/crates/services/txpool/src/mock_db.rs +++ b/crates/services/txpool/src/mock_db.rs @@ -16,10 +16,7 @@ use fuel_core_types::{ ContractId, UtxoId, }, - fuel_types::{ - BlockHeight, - Nonce, - }, + fuel_types::Nonce, }; use std::{ collections::{ @@ -89,19 +86,9 @@ impl TxPoolDb for MockDb { pub struct MockDBProvider(pub MockDb); impl AtomicView for MockDBProvider { - type View = MockDb; - - type Height = BlockHeight; - - fn latest_height(&self) -> Option { - Some(BlockHeight::default()) - } - - fn view_at(&self, _: &BlockHeight) -> StorageResult { - Ok(self.latest_view()) - } + type LatestView = MockDb; - fn latest_view(&self) -> Self::View { - self.0.clone() + fn latest_view(&self) -> StorageResult { + Ok(self.0.clone()) } } diff --git a/crates/services/txpool/src/service.rs b/crates/services/txpool/src/service.rs index 565cad0525c..afa90ca6ba3 100644 --- a/crates/services/txpool/src/service.rs +++ b/crates/services/txpool/src/service.rs @@ -161,7 +161,7 @@ impl RunnableS for Task where P2P: PeerToPeer, - ViewProvider: AtomicView, + ViewProvider: AtomicView, View: TxPoolDb, GasPriceProvider: GasPriceProviderConstraint + Send + Sync, ConsensusProvider: ConsensusParametersProvider + Send + Sync, @@ -193,7 +193,7 @@ impl RunnableT for Task where P2P: PeerToPeer, - ViewProvider: AtomicView, + ViewProvider: AtomicView, View: TxPoolDb, GasPriceProvider: GasPriceProviderConstraint + Send + Sync, ConsensusProvider: ConsensusParametersProvider + Send + Sync, @@ -387,7 +387,7 @@ impl SharedState where P2P: PeerToPeer, - ViewProvider: AtomicView, + ViewProvider: AtomicView, View: TxPoolDb, GasPriceProvider: GasPriceProviderConstraint + Send + Sync, ConsensusProvider: ConsensusParametersProvider, @@ -503,7 +503,7 @@ where Importer: BlockImporter, P2P: PeerToPeer + 'static, ViewProvider: AtomicView, - ViewProvider::View: TxPoolDb, + ViewProvider::LatestView: TxPoolDb, GasPriceProvider: GasPriceProviderConstraint + Send + Sync, ConsensusProvider: ConsensusParametersProvider + Send + Sync, MP: MemoryPool + Send + Sync, diff --git a/crates/services/txpool/src/txpool.rs b/crates/services/txpool/src/txpool.rs index 736a6b17bcb..eab09da10ac 100644 --- a/crates/services/txpool/src/txpool.rs +++ b/crates/services/txpool/src/txpool.rs @@ -334,7 +334,7 @@ impl TxPool { impl TxPool where - ViewProvider: AtomicView, + ViewProvider: AtomicView, View: TxPoolDb, { #[cfg(test)] @@ -342,7 +342,7 @@ where &mut self, tx: Checked, ) -> Result { - let view = self.database.latest_view(); + let view = self.database.latest_view().unwrap(); self.insert_inner(tx, &view) } @@ -432,7 +432,10 @@ where // Check if that data is okay (witness match input/output, and if recovered signatures ara valid). // should be done before transaction comes to txpool, or before it enters RwLocked region. let mut res = Vec::new(); - let view = self.database.latest_view(); + let view = match self.database.latest_view() { + Ok(view) => view, + Err(e) => return vec![Err(Error::Other(e.to_string()))], + }; for tx in txs.into_iter() { res.push(self.insert_inner(tx, &view)); diff --git a/crates/services/upgradable-executor/src/executor.rs b/crates/services/upgradable-executor/src/executor.rs index a6065f18516..12acb9489c5 100644 --- a/crates/services/upgradable-executor/src/executor.rs +++ b/crates/services/upgradable-executor/src/executor.rs @@ -16,14 +16,17 @@ use fuel_core_storage::{ transactional::{ AtomicView, Changes, + HistoricalView, Modifiable, }, }; use fuel_core_types::{ blockchain::{ block::Block, - header::StateTransitionBytecodeVersion, - primitives::DaBlockHeight, + header::{ + StateTransitionBytecodeVersion, + LATEST_STATE_TRANSITION_VERSION, + }, }, fuel_tx::Transaction, fuel_types::BlockHeight, @@ -34,6 +37,7 @@ use fuel_core_types::{ ExecutionResult, Result as ExecutorResult, TransactionExecutionStatus, + ValidationResult, }, Uncommitted, }, @@ -54,10 +58,6 @@ use fuel_core_storage::{ use fuel_core_types::blockchain::block::PartialFuelBlock; #[cfg(any(test, feature = "test-helpers"))] use fuel_core_types::services::executor::UncommittedResult; -use fuel_core_types::{ - blockchain::header::LATEST_STATE_TRANSITION_VERSION, - services::executor::ValidationResult, -}; #[cfg(feature = "wasm-executor")] enum ExecutionStrategy { @@ -206,12 +206,13 @@ impl Executor { } } -impl Executor +impl Executor where - R: AtomicView, - R::View: RelayerPort + Send + Sync + 'static, - D: AtomicView + Modifiable, - D::View: KeyValueInspect + Send + Sync + 'static, + S: HistoricalView + Modifiable, + S::LatestView: KeyValueInspect + Send + Sync + 'static, + S::ViewAtHeight: KeyValueInspect + Send + Sync + 'static, + R: AtomicView, + R::LatestView: RelayerPort + Send + Sync + 'static, { #[cfg(any(test, feature = "test-helpers"))] /// Executes the block and commits the result of the execution into the inner `Database`. @@ -240,10 +241,11 @@ where #[cfg(any(test, feature = "test-helpers"))] impl Executor where - S: AtomicView, - S::View: KeyValueInspect + Send + Sync + 'static, - R: AtomicView, - R::View: RelayerPort + Send + Sync + 'static, + S: HistoricalView, + S::LatestView: KeyValueInspect + Send + Sync + 'static, + S::ViewAtHeight: KeyValueInspect + Send + Sync + 'static, + R: AtomicView, + R::LatestView: RelayerPort + Send + Sync + 'static, { /// Executes the block and returns the result of the execution with storage changes. pub fn produce_without_commit( @@ -287,10 +289,11 @@ where impl Executor where - S: AtomicView, - S::View: KeyValueInspect + Send + Sync + 'static, - R: AtomicView, - R::View: RelayerPort + Send + Sync + 'static, + S: HistoricalView, + S::LatestView: KeyValueInspect + Send + Sync + 'static, + S::ViewAtHeight: KeyValueInspect + Send + Sync + 'static, + R: AtomicView, + R::LatestView: RelayerPort + Send + Sync + 'static, { /// Produces the block and returns the result of the execution without committing the changes. pub fn produce_without_commit_with_source( @@ -479,13 +482,24 @@ where gas_price, }; - let storage = self.storage_view_provider.latest_view(); - let relayer = self.relayer_view_provider.latest_view(); + let previous_block_height = block.header_to_produce.height().pred(); + + let instance_without_input = + crate::instance::Instance::new(&self.engine).add_source(source)?; + + let instance_without_input = if let Some(previous_block_height) = + previous_block_height + { + let storage = self.storage_view_provider.view_at(&previous_block_height)?; + instance_without_input.add_storage(storage)? + } else { + let storage = self.storage_view_provider.latest_view()?; + instance_without_input.add_storage(storage)? + }; + + let relayer = self.relayer_view_provider.latest_view()?; + let instance_without_input = instance_without_input.add_relayer(relayer)?; - let instance_without_input = crate::instance::Instance::new(&self.engine) - .add_source(source)? - .add_storage(storage)? - .add_relayer(relayer)?; let instance = if dry_run { instance_without_input.add_dry_run_input_data(block, options)? } else { @@ -509,12 +523,20 @@ where self.trace_block_version_warning( block.header().state_transition_bytecode_version, ); - let storage = self.storage_view_provider.latest_view(); - let relayer = self.relayer_view_provider.latest_view(); + let previous_block_height = block.header().height().pred(); + + let instance = crate::instance::Instance::new(&self.engine).no_source()?; + + let instance = if let Some(previous_block_height) = previous_block_height { + let storage = self.storage_view_provider.view_at(&previous_block_height)?; + instance.add_storage(storage)? + } else { + let storage = self.storage_view_provider.latest_view()?; + instance.add_storage(storage)? + }; - let instance = crate::instance::Instance::new(&self.engine) - .no_source()? - .add_storage(storage)? + let relayer = self.relayer_view_provider.latest_view()?; + let instance = instance .add_relayer(relayer)? .add_validation_input_data(block, options)?; @@ -536,8 +558,18 @@ where where TxSource: TransactionsSource + Send + Sync + 'static, { - let instance = self.new_native_executor_instance(options); - instance.produce_without_commit(block, dry_run) + let previous_block_height = block.header_to_produce.height().pred(); + let relayer = self.relayer_view_provider.latest_view()?; + + if let Some(previous_block_height) = previous_block_height { + let database = self.storage_view_provider.view_at(&previous_block_height)?; + ExecutionInstance::new(relayer, database, options) + .produce_without_commit(block, dry_run) + } else { + let database = self.storage_view_provider.latest_view()?; + ExecutionInstance::new(relayer, database, options) + .produce_without_commit(block, dry_run) + } } fn native_validate_inner( @@ -545,21 +577,17 @@ where block: &Block, options: ExecutionOptions, ) -> ExecutorResult> { - let instance = self.new_native_executor_instance(options); - instance.validate_without_commit(block) - } + let previous_block_height = block.header().height().pred(); + let relayer = self.relayer_view_provider.latest_view()?; - fn new_native_executor_instance( - &self, - options: ExecutionOptions, - ) -> ExecutionInstance<::View, ::View> { - let relayer = self.relayer_view_provider.latest_view(); - let storage = self.storage_view_provider.latest_view(); - - ExecutionInstance { - relayer, - database: storage, - options, + if let Some(previous_block_height) = previous_block_height { + let database = self.storage_view_provider.view_at(&previous_block_height)?; + ExecutionInstance::new(relayer, database, options) + .validate_without_commit(block) + } else { + let database = self.storage_view_provider.latest_view()?; + ExecutionInstance::new(relayer, database, options) + .validate_without_commit(block) } } @@ -578,7 +606,7 @@ where } drop(guard); - let view = StructuredStorage::new(self.storage_view_provider.latest_view()); + let view = StructuredStorage::new(self.storage_view_provider.latest_view()?); let bytecode_root = *view .storage::() .get(&version)? @@ -637,7 +665,10 @@ mod test { PartialBlockHeader, StateTransitionBytecodeVersion, }, - primitives::Empty, + primitives::{ + DaBlockHeight, + Empty, + }, }, fuel_tx::{ AssetId, @@ -656,19 +687,23 @@ mod test { struct Storage(InMemoryStorage); impl AtomicView for Storage { - type View = InMemoryStorage; + type LatestView = InMemoryStorage; + + fn latest_view(&self) -> StorageResult { + Ok(self.0.clone()) + } + } + + impl HistoricalView for Storage { type Height = BlockHeight; + type ViewAtHeight = Self::LatestView; fn latest_height(&self) -> Option { None } - fn view_at(&self, _: &Self::Height) -> StorageResult { - unimplemented!() - } - - fn latest_view(&self) -> Self::View { - self.0.clone() + fn view_at(&self, _: &Self::Height) -> StorageResult { + self.latest_view() } } @@ -700,19 +735,10 @@ mod test { } impl AtomicView for DisabledRelayer { - type View = Self; - type Height = DaBlockHeight; - - fn latest_height(&self) -> Option { - None - } - - fn view_at(&self, _: &Self::Height) -> StorageResult { - unimplemented!() - } + type LatestView = Self; - fn latest_view(&self) -> Self::View { - *self + fn latest_view(&self) -> StorageResult { + Ok(*self) } } diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 5bd81711ce9..6f3e6b9faca 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -68,6 +68,13 @@ pub enum Error { Other(anyhow::Error), } +#[cfg(feature = "test-helpers")] +impl PartialEq for Error { + fn eq(&self, other: &Self) -> bool { + self.to_string().eq(&other.to_string()) + } +} + impl From for anyhow::Error { fn from(error: Error) -> Self { anyhow::Error::msg(error) diff --git a/crates/storage/src/structured_storage.rs b/crates/storage/src/structured_storage.rs index 11fb9fa986a..8f0c83290d7 100644 --- a/crates/storage/src/structured_storage.rs +++ b/crates/storage/src/structured_storage.rs @@ -84,6 +84,11 @@ impl StructuredStorage { pub fn new(storage: S) -> Self { Self { inner: storage } } + + /// Returns the inner storage. + pub fn into_inner(self) -> S { + self.inner + } } impl AsRef for StructuredStorage { diff --git a/crates/storage/src/transactional.rs b/crates/storage/src/transactional.rs index f997488295e..7fc569f28e5 100644 --- a/crates/storage/src/transactional.rs +++ b/crates/storage/src/transactional.rs @@ -33,23 +33,30 @@ use crate::{ kv_store::KVItem, }; -/// Provides a view of the storage at the given height. -/// It guarantees to be atomic, meaning the view is immutable to outside modifications. +/// Provides an atomic view of the storage at the latest height at +/// the moment of view instantiation. All modifications to the storage +/// after this point will not affect the view. pub trait AtomicView: Send + Sync { - /// The type of the storage view. - type View; + /// The type of the latest storage view. + type LatestView; + /// Returns current the view of the storage. + fn latest_view(&self) -> StorageResult; +} + +/// Provides an atomic view of the storage at the given height. +/// The view is guaranteed to be unmodifiable for the given height. +pub trait HistoricalView: AtomicView { /// The type used by the storage to track the commitments at a specific height. type Height; + /// The type of the storage view at `Self::Height`. + type ViewAtHeight; - /// Returns the latest block height. + /// Returns the latest height. fn latest_height(&self) -> Option; /// Returns the view of the storage at the given `height`. - fn view_at(&self, height: &Self::Height) -> StorageResult; - - /// Returns the view of the storage for the latest block height. - fn latest_view(&self) -> Self::View; + fn view_at(&self, height: &Self::Height) -> StorageResult; } /// Storage transaction on top of the storage.