From 98f79d726f062d02cc395391a5582cf19c50655c Mon Sep 17 00:00:00 2001 From: "Sam H. Smith" Date: Mon, 1 Jul 2024 00:42:22 +0200 Subject: [PATCH] fix: flatten asset definitions and assets in data model Signed-off-by: Sam H. Smith --- cli/src/lib.rs | 1 + configs/swarm/executor.wasm | Bin 501625 -> 486735 bytes core/benches/blocks/common.rs | 1 + core/src/block.rs | 13 +- core/src/queue.rs | 4 +- core/src/smartcontracts/isi/account.rs | 20 +- core/src/smartcontracts/isi/asset.rs | 112 +++--- core/src/smartcontracts/isi/domain.rs | 86 +++-- core/src/smartcontracts/isi/mod.rs | 2 +- core/src/smartcontracts/isi/query.rs | 52 ++- core/src/smartcontracts/isi/world.rs | 25 ++ core/src/smartcontracts/wasm.rs | 2 +- core/src/state.rs | 396 +++++++++++++++++---- core/src/sumeragi/main_loop.rs | 2 +- data_model/src/account.rs | 36 +- data_model/src/asset.rs | 22 +- data_model/src/domain.rs | 83 +---- data_model/src/events/data/filters.rs | 3 - docs/source/references/schema.json | 38 +- tools/parity_scale_cli/samples/trigger.bin | Bin 131 -> 131 bytes 20 files changed, 516 insertions(+), 382 deletions(-) diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 59cb2d91821..8c61027bcba 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -260,6 +260,7 @@ impl Iroha { let world = World::with( [genesis_domain(config.genesis.public_key.clone())], [genesis_account(config.genesis.public_key.clone())], + [], config .sumeragi .trusted_peers diff --git a/configs/swarm/executor.wasm b/configs/swarm/executor.wasm index 26823f64271cd011d36efd95f765c919b391a849..e23238a47bb0f62aa36ff6521b5e27f9200976bd 100644 GIT binary patch delta 109426 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 R89nOG;04NR7|+MkmF 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≶6)KG%{08O0u_HL@OK0LcqvNaY4P?mgHO% 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 bhJCmtbD*6uG1JdJ*pfMZbz}cb*MIzf+IM6K diff --git a/core/benches/blocks/common.rs b/core/benches/blocks/common.rs index e964bae048b..96c408281a5 100644 --- a/core/benches/blocks/common.rs +++ b/core/benches/blocks/common.rs @@ -188,6 +188,7 @@ pub fn build_state(rt: &tokio::runtime::Handle, account_id: &AccountId) -> State World::with( [domain], [Account::new(account_id.clone()).build(account_id)], + [], UniqueVec::new(), ), kura, diff --git a/core/src/block.rs b/core/src/block.rs index 05169d30d8b..e2499543615 100644 --- a/core/src/block.rs +++ b/core/src/block.rs @@ -997,7 +997,7 @@ mod tests { let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = DomainId::from_str("wonderland").expect("Valid"); let domain = Domain::new(domain_id).build(&alice_id); - let world = World::with([domain], [account], UniqueVec::new()); + let world = World::with([domain], [account], [], UniqueVec::new()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); @@ -1053,7 +1053,7 @@ mod tests { let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = DomainId::from_str("wonderland").expect("Valid"); let domain = Domain::new(domain_id).build(&alice_id); - let world = World::with([domain], [account], UniqueVec::new()); + let world = World::with([domain], [account], [], UniqueVec::new()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); @@ -1127,7 +1127,7 @@ mod tests { let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = DomainId::from_str("wonderland").expect("Valid"); let domain = Domain::new(domain_id).build(&alice_id); - let world = World::with([domain], [account], UniqueVec::new()); + let world = World::with([domain], [account], [], UniqueVec::new()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); @@ -1205,7 +1205,12 @@ mod tests { Domain::new(GENESIS_DOMAIN_ID.clone()).build(&genesis_correct_account_id); let genesis_wrong_account = Account::new(genesis_wrong_account_id.clone()).build(&genesis_wrong_account_id); - let world = World::with([genesis_domain], [genesis_wrong_account], UniqueVec::new()); + let world = World::with( + [genesis_domain], + [genesis_wrong_account], + [], + UniqueVec::new(), + ); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); diff --git a/core/src/queue.rs b/core/src/queue.rs index 1d8d1985ab1..17218d9de33 100644 --- a/core/src/queue.rs +++ b/core/src/queue.rs @@ -439,7 +439,7 @@ pub mod tests { let (account_id, _account_keypair) = gen_account_in("wonderland"); let domain = Domain::new(domain_id).build(&account_id); let account = Account::new(account_id.clone()).build(&account_id); - World::with([domain], [account], PeersIds::new()) + World::with([domain], [account], [], PeersIds::new()) } fn config_factory() -> Config { @@ -840,7 +840,7 @@ pub mod tests { let domain = Domain::new(domain_id).build(&alice_id); let alice_account = Account::new(alice_id.clone()).build(&alice_id); let bob_account = Account::new(bob_id.clone()).build(&bob_id); - World::with([domain], [alice_account, bob_account], PeersIds::new()) + World::with([domain], [alice_account, bob_account], [], PeersIds::new()) }; let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); diff --git a/core/src/smartcontracts/isi/account.rs b/core/src/smartcontracts/isi/account.rs index 4278dd67229..2ba18eea0e0 100644 --- a/core/src/smartcontracts/isi/account.rs +++ b/core/src/smartcontracts/isi/account.rs @@ -97,12 +97,9 @@ pub mod isi { let asset = state_transaction .world - .account_mut(&asset_id.account) - .and_then(|account| { - account - .remove_asset(&asset_id.definition) - .ok_or_else(|| FindError::Asset(asset_id)) - })?; + .assets + .remove(asset_id.clone()) + .ok_or_else(|| FindError::Asset(asset_id))?; match asset.value { AssetValue::Numeric(increment) => { @@ -586,7 +583,16 @@ pub mod query { state_ro .world() .accounts_iter() - .filter(move |account| account.assets.contains_key(&asset_definition_id)) + .filter(move |account| { + state_ro + .world() + .assets() + .get(&AssetId::new( + asset_definition_id.clone(), + account.id().clone(), + )) + .is_some() + }) .cloned(), )) } diff --git a/core/src/smartcontracts/isi/asset.rs b/core/src/smartcontracts/isi/asset.rs index d3221810474..df8d3c0f321 100644 --- a/core/src/smartcontracts/isi/asset.rs +++ b/core/src/smartcontracts/isi/asset.rs @@ -141,19 +141,18 @@ pub mod isi { let asset = state_transaction .world - .account_mut(&asset_id.account) - .and_then(|account| { - account - .remove_asset(&asset_id.definition) - .ok_or_else(|| FindError::Asset(asset_id.clone())) - })?; + .assets + .get_mut(&asset_id) + .ok_or_else(|| FindError::Asset(asset_id.clone()))?; let destination_store = { + let value = asset.value.clone(); + let destination_id = AssetId::new(asset_id.definition.clone(), self.destination.clone()); let destination_store_asset = state_transaction .world - .asset_or_insert(destination_id.clone(), asset.value)?; + .asset_or_insert(destination_id.clone(), value)?; destination_store_asset.clone() }; @@ -230,10 +229,10 @@ pub mod isi { )?; assert_numeric_spec(&self.object, &asset_definition)?; - let account = state_transaction.world.account_mut(&asset_id.account)?; - let asset = account + let asset = state_transaction + .world .assets - .get_mut(&asset_id.definition) + .get_mut(&asset_id) .ok_or_else(|| FindError::Asset(asset_id.clone()))?; let AssetValue::Numeric(quantity) = &mut asset.value else { return Err(Error::Conversion("Expected numeric asset type".to_owned())); @@ -243,7 +242,11 @@ pub mod isi { .ok_or(MathError::NotEnoughQuantity)?; if asset.value.is_zero_value() { - assert!(account.remove_asset(&asset_id.definition).is_some()); + assert!(state_transaction + .world + .assets + .remove(asset_id.clone()) + .is_some()); } #[allow(clippy::float_arithmetic)] @@ -286,10 +289,10 @@ pub mod isi { assert_numeric_spec(&self.object, &asset_definition)?; { - let account = state_transaction.world.account_mut(&source_id.account)?; - let asset = account + let asset = state_transaction + .world .assets - .get_mut(&source_id.definition) + .get_mut(&source_id) .ok_or_else(|| FindError::Asset(source_id.clone()))?; let AssetValue::Numeric(quantity) = &mut asset.value else { return Err(Error::Conversion("Expected numeric asset type".to_owned())); @@ -298,7 +301,11 @@ pub mod isi { .checked_sub(self.object) .ok_or(MathError::NotEnoughQuantity)?; if asset.value.is_zero_value() { - assert!(account.remove_asset(&source_id.definition).is_some()); + assert!(state_transaction + .world + .assets + .remove(source_id.clone()) + .is_some()); } } @@ -430,13 +437,7 @@ pub mod query { &self, state_ro: &'state impl StateReadOnly, ) -> Result + 'state>, Error> { - Ok(Box::new( - state_ro - .world() - .accounts_iter() - .flat_map(|account| account.assets.values()) - .cloned(), - )) + Ok(Box::new(state_ro.world().assets_iter().cloned())) } } @@ -446,13 +447,7 @@ pub mod query { &self, state_ro: &'state impl StateReadOnly, ) -> Result + 'state>, Error> { - Ok(Box::new( - state_ro - .world() - .domains_iter() - .flat_map(|domain| domain.asset_definitions.values()) - .cloned(), - )) + Ok(Box::new(state_ro.world().asset_definitions_iter().cloned())) } } @@ -493,15 +488,8 @@ pub mod query { Ok(Box::new( state_ro .world() - .accounts_iter() - .flat_map(move |account| { - let name = name.clone(); - - account - .assets - .values() - .filter(move |asset| asset.id().definition.name == name) - }) + .assets_iter() + .filter(move |asset| asset.id().definition.name == name) .cloned(), )) } @@ -513,9 +501,16 @@ pub mod query { &self, state_ro: &'state impl StateReadOnly, ) -> Result + 'state>, Error> { - let id = &self.account; + let id = self.account.clone(); iroha_logger::trace!(%id); - Ok(Box::new(state_ro.world().account_assets(id)?.cloned())) + let _ = state_ro.world().map_account(&id, |_| ())?; + Ok(Box::new( + state_ro + .world() + .assets_iter() + .filter(move |asset| asset.id().account == id) + .cloned(), + )) } } @@ -530,15 +525,8 @@ pub mod query { Ok(Box::new( state_ro .world() - .accounts_iter() - .flat_map(move |account| { - let id = id.clone(); - - account - .assets - .values() - .filter(move |asset| asset.id().definition == id) - }) + .assets_iter() + .filter(move |asset| asset.id().definition == id) .cloned(), )) } @@ -550,13 +538,13 @@ pub mod query { &self, state_ro: &'state impl StateReadOnly, ) -> Result + 'state>, Error> { - let id = &self.domain; + let id = self.domain.clone(); iroha_logger::trace!(%id); Ok(Box::new( state_ro .world() - .accounts_in_domain_iter(id) - .flat_map(|account| account.assets.values()) + .assets_iter() + .filter(move |asset| asset.id().account.domain() == &id) .cloned(), )) } @@ -570,24 +558,16 @@ pub mod query { ) -> Result + 'state>, Error> { let domain_id = self.domain.clone(); let asset_definition_id = self.asset_definition.clone(); - let domain = state_ro.world().domain(&domain_id)?; - let _definition = domain - .asset_definitions - .get(&asset_definition_id) - .ok_or_else(|| FindError::AssetDefinition(asset_definition_id.clone()))?; + let _ = state_ro.world().domain(&domain_id)?; + let _ = state_ro.world().asset_definition(&asset_definition_id)?; iroha_logger::trace!(%domain_id, %asset_definition_id); Ok(Box::new( state_ro .world() - .accounts_in_domain_iter(&domain_id) - .flat_map(move |account| { - let domain_id = domain_id.clone(); - let asset_definition_id = asset_definition_id.clone(); - - account.assets.values().filter(move |asset| { - asset.id().account.domain == domain_id - && asset.id().definition == asset_definition_id - }) + .assets_iter() + .filter(move |asset| { + asset.id().definition == asset_definition_id + && asset.id().account.domain() == &domain_id }) .cloned(), )) diff --git a/core/src/smartcontracts/isi/domain.rs b/core/src/smartcontracts/isi/domain.rs index 590059d3aed..cb01fa8d5f7 100644 --- a/core/src/smartcontracts/isi/domain.rs +++ b/core/src/smartcontracts/isi/domain.rs @@ -1,11 +1,7 @@ //! This module contains [`Domain`] structure and related implementations and trait implementations. use eyre::Result; -use iroha_data_model::{ - asset::{AssetDefinitionsMap, AssetTotalQuantityMap}, - prelude::*, - query::error::FindError, -}; +use iroha_data_model::{prelude::*, query::error::FindError}; use iroha_telemetry::metrics; use super::super::isi::prelude::*; @@ -18,8 +14,6 @@ impl Registrable for iroha_data_model::domain::NewDomain { fn build(self, authority: &AccountId) -> Self::Target { Self::Target { id: self.id, - asset_definitions: AssetDefinitionsMap::default(), - asset_total_quantities: AssetTotalQuantityMap::default(), metadata: self.metadata, logo: self.logo, owned_by: authority.clone(), @@ -109,6 +103,15 @@ pub mod isi { state_transaction.world.remove_account_roles(&account_id); + let remove_assets: Vec = state_transaction + .world + .assets_in_account_iter(&account_id) + .map(|ad| ad.id().clone()) + .collect(); + for asset_id in remove_assets { + state_transaction.world.assets.remove(asset_id); + } + if state_transaction .world .accounts @@ -136,20 +139,30 @@ pub mod isi { let asset_definition = self.object.build(authority); let asset_definition_id = asset_definition.id().clone(); - let domain = state_transaction + if state_transaction .world - .domain_mut(&asset_definition_id.domain)?; - if domain.asset_definitions.contains_key(&asset_definition_id) { + .asset_definition(&asset_definition_id) + .is_ok() + { return Err(RepetitionError { instruction: InstructionType::Register, id: IdBox::AssetDefinitionId(asset_definition_id), } .into()); } + let _ = state_transaction + .world + .domain(&asset_definition_id.domain)?; - domain.add_asset_total_quantity(asset_definition_id, Numeric::ZERO); + state_transaction + .world + .asset_total_quantities + .insert(asset_definition_id.clone(), Numeric::ZERO); - domain.add_asset_definition(asset_definition.clone()); + state_transaction + .world + .asset_definitions + .insert(asset_definition_id.clone(), asset_definition.clone()); state_transaction .world @@ -171,50 +184,49 @@ pub mod isi { let asset_definition_id = self.object; let mut assets_to_remove = Vec::new(); - for (_, account) in state_transaction.world.accounts.iter() { - assets_to_remove.extend( - account - .assets - .values() - .filter_map(|asset| { - if asset.id().definition == asset_definition_id { - return Some(asset.id()); - } - - None - }) - .cloned(), - ) - } + assets_to_remove.extend( + state_transaction + .world + .assets + .iter() + .filter(|(asset_id, _)| asset_id.definition == asset_definition_id) + .map(|(asset_id, _)| asset_id) + .cloned(), + ); let mut events = Vec::with_capacity(assets_to_remove.len() + 1); for asset_id in assets_to_remove { if state_transaction .world - .account_mut(&asset_id.account)? - .remove_asset(&asset_id.definition) + .assets + .remove(asset_id.clone()) .is_none() { error!(%asset_id, "asset not found. This is a bug"); } - events.push(AccountEvent::Asset(AssetEvent::Deleted(asset_id)).into()); + events.push(AssetEvent::Deleted(asset_id).into()); } - let domain = state_transaction + if state_transaction .world - .domain_mut(&asset_definition_id.domain)?; - if domain - .remove_asset_definition(&asset_definition_id) + .asset_definitions + .remove(asset_definition_id.clone()) .is_none() { return Err(FindError::AssetDefinition(asset_definition_id).into()); } + let _ = state_transaction + .world + .domain(&asset_definition_id.domain)?; - domain.remove_asset_total_quantity(&asset_definition_id); + state_transaction + .world + .asset_total_quantities + .remove(asset_definition_id.clone()); - events.push(DataEvent::from(DomainEvent::AssetDefinition( - AssetDefinitionEvent::Deleted(asset_definition_id), + events.push(DataEvent::from(AssetDefinitionEvent::Deleted( + asset_definition_id, ))); state_transaction.world.emit_events(events); diff --git a/core/src/smartcontracts/isi/mod.rs b/core/src/smartcontracts/isi/mod.rs index 7466ebdbe4d..a57ec6bd3c9 100644 --- a/core/src/smartcontracts/isi/mod.rs +++ b/core/src/smartcontracts/isi/mod.rs @@ -244,7 +244,7 @@ mod tests { }; fn state_with_test_domains(kura: &Arc) -> Result { - let world = World::with([], [], PeersIds::new()); + let world = World::with([], [], [], PeersIds::new()); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura.clone(), query_handle); let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland")?; diff --git a/core/src/smartcontracts/isi/query.rs b/core/src/smartcontracts/isi/query.rs index 395e9618e74..557db5644f7 100644 --- a/core/src/smartcontracts/isi/query.rs +++ b/core/src/smartcontracts/isi/query.rs @@ -312,25 +312,19 @@ mod tests { fn world_with_test_domains() -> World { let domain_id = DomainId::from_str("wonderland").expect("Valid"); - let mut domain = Domain::new(domain_id).build(&ALICE_ID); + let domain = Domain::new(domain_id).build(&ALICE_ID); let account = Account::new(ALICE_ID.clone()).build(&ALICE_ID); let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland").expect("Valid"); - assert!(domain - .add_asset_definition(AssetDefinition::numeric(asset_definition_id).build(&ALICE_ID)) - .is_none()); - World::with([domain], [account], PeersIds::new()) + let asset_definition = AssetDefinition::numeric(asset_definition_id).build(&ALICE_ID); + World::with([domain], [account], [asset_definition], PeersIds::new()) } fn world_with_test_asset_with_metadata() -> World { let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland").expect("Valid"); - let mut domain = - Domain::new(DomainId::from_str("wonderland").expect("Valid")).build(&ALICE_ID); - let mut account = Account::new(ALICE_ID.clone()).build(&ALICE_ID); - assert!(domain - .add_asset_definition( - AssetDefinition::numeric(asset_definition_id.clone()).build(&ALICE_ID) - ) - .is_none()); + let domain = Domain::new(DomainId::from_str("wonderland").expect("Valid")).build(&ALICE_ID); + let account = Account::new(ALICE_ID.clone()).build(&ALICE_ID); + let asset_definition = + AssetDefinition::numeric(asset_definition_id.clone()).build(&ALICE_ID); let mut store = Metadata::default(); store.insert( @@ -340,23 +334,31 @@ mod tests { let asset_id = AssetId::new(asset_definition_id, account.id().clone()); let asset = Asset::new(asset_id, AssetValue::Store(store)); - assert!(account.add_asset(asset).is_none()); - World::with([domain], [account], PeersIds::new()) + World::with_assets( + [domain], + [account], + [asset_definition], + [asset], + PeersIds::new(), + ) } fn world_with_test_account_with_metadata() -> Result { let mut metadata = Metadata::default(); metadata.insert(Name::from_str("Bytes")?, vec![1_u32, 2_u32, 3_u32]); - let mut domain = Domain::new(DomainId::from_str("wonderland")?).build(&ALICE_ID); + let domain = Domain::new(DomainId::from_str("wonderland")?).build(&ALICE_ID); let account = Account::new(ALICE_ID.clone()) .with_metadata(metadata) .build(&ALICE_ID); let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland").expect("Valid"); - assert!(domain - .add_asset_definition(AssetDefinition::numeric(asset_definition_id).build(&ALICE_ID)) - .is_none()); - Ok(World::with([domain], [account], PeersIds::new())) + let asset_definition = AssetDefinition::numeric(asset_definition_id).build(&ALICE_ID); + Ok(World::with( + [domain], + [account], + [asset_definition], + PeersIds::new(), + )) } fn state_with_test_blocks_and_transactions( @@ -594,19 +596,15 @@ mod tests { let state = { let mut metadata = Metadata::default(); metadata.insert(Name::from_str("Bytes")?, vec![1_u32, 2_u32, 3_u32]); - let mut domain = Domain::new(DomainId::from_str("wonderland")?) + let domain = Domain::new(DomainId::from_str("wonderland")?) .with_metadata(metadata) .build(&ALICE_ID); let account = Account::new(ALICE_ID.clone()).build(&ALICE_ID); let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland")?; - assert!(domain - .add_asset_definition( - AssetDefinition::numeric(asset_definition_id).build(&ALICE_ID) - ) - .is_none()); + let asset_definition = AssetDefinition::numeric(asset_definition_id).build(&ALICE_ID); let query_handle = LiveQueryStore::test().start(); State::new( - World::with([domain], [account], PeersIds::new()), + World::with([domain], [account], [asset_definition], PeersIds::new()), kura, query_handle, ) diff --git a/core/src/smartcontracts/isi/world.rs b/core/src/smartcontracts/isi/world.rs index ff65fdee954..bb348f84475 100644 --- a/core/src/smartcontracts/isi/world.rs +++ b/core/src/smartcontracts/isi/world.rs @@ -147,9 +147,34 @@ pub mod isi { state_transaction.world.remove_account_roles(&account); + let remove_assets: Vec = state_transaction + .world + .assets_in_account_iter(&account) + .map(|ad| ad.id().clone()) + .collect(); + for asset_id in remove_assets { + state_transaction.world.assets.remove(asset_id); + } + state_transaction.world.accounts.remove(account); } + let remove_asset_definitions: Vec = state_transaction + .world + .asset_definitions_in_domain_iter(&domain_id) + .map(|ad| ad.id().clone()) + .collect(); + for asset_definition_id in remove_asset_definitions { + state_transaction + .world + .asset_definitions + .remove(asset_definition_id.clone()); + state_transaction + .world + .asset_total_quantities + .remove(asset_definition_id); + } + if state_transaction .world .domains diff --git a/core/src/smartcontracts/wasm.rs b/core/src/smartcontracts/wasm.rs index c113f9a8562..215d6d9a40b 100644 --- a/core/src/smartcontracts/wasm.rs +++ b/core/src/smartcontracts/wasm.rs @@ -1721,7 +1721,7 @@ mod tests { let account = Account::new(authority.clone()).build(authority); let domain = Domain::new(domain_id).build(authority); - World::with([domain], [account], PeersIds::new()) + World::with([domain], [account], [], PeersIds::new()) } fn memory_and_alloc(isi_hex: &str) -> String { diff --git a/core/src/state.rs b/core/src/state.rs index 7335d11de48..17aa9bd762f 100644 --- a/core/src/state.rs +++ b/core/src/state.rs @@ -25,7 +25,7 @@ use iroha_data_model::{ use iroha_logger::prelude::*; use iroha_primitives::{must_use::MustUse, numeric::Numeric, small::SmallVec}; use parking_lot::Mutex; -use range_bounds::{AccountByDomainBounds, AsAccountIdDomainCompare, RoleIdByAccountBounds}; +use range_bounds::*; use serde::{ de::{DeserializeSeed, MapAccess, Visitor}, Deserializer, Serialize, @@ -71,6 +71,12 @@ pub struct World { pub(crate) domains: Storage, /// Registered accounts. pub(crate) accounts: Storage, + /// Registered asset definitions. + pub(crate) asset_definitions: Storage, + /// Registered asset definition total amounts. + pub(crate) asset_total_quantities: Storage, + /// Registered assets. + pub(crate) assets: Storage, /// Roles. [`Role`] pairs. pub(crate) roles: Storage, /// Permission tokens of an account. @@ -95,6 +101,12 @@ pub struct WorldBlock<'world> { pub(crate) domains: StorageBlock<'world, DomainId, Domain>, /// Registered accounts. pub(crate) accounts: StorageBlock<'world, AccountId, Account>, + /// Registered asset definitions. + pub(crate) asset_definitions: StorageBlock<'world, AssetDefinitionId, AssetDefinition>, + /// Registered asset definition total amounts. + pub(crate) asset_total_quantities: StorageBlock<'world, AssetDefinitionId, Numeric>, + /// Registered assets. + pub(crate) assets: StorageBlock<'world, AssetId, Asset>, /// Roles. [`Role`] pairs. pub(crate) roles: StorageBlock<'world, RoleId, Role>, /// Permission tokens of an account. @@ -121,6 +133,14 @@ pub struct WorldTransaction<'block, 'world> { pub(crate) domains: StorageTransaction<'block, 'world, DomainId, Domain>, /// Registered accounts. pub(crate) accounts: StorageTransaction<'block, 'world, AccountId, Account>, + /// Registered asset definitions. + pub(crate) asset_definitions: + StorageTransaction<'block, 'world, AssetDefinitionId, AssetDefinition>, + /// Registered asset definition total amounts. + pub(crate) asset_total_quantities: + StorageTransaction<'block, 'world, AssetDefinitionId, Numeric>, + /// Registered assets. + pub(crate) assets: StorageTransaction<'block, 'world, AssetId, Asset>, /// Roles. [`Role`] pairs. pub(crate) roles: StorageTransaction<'block, 'world, RoleId, Role>, /// Permission tokens of an account. @@ -155,6 +175,12 @@ pub struct WorldView<'world> { pub(crate) domains: StorageView<'world, DomainId, Domain>, /// Registered accounts. pub(crate) accounts: StorageView<'world, AccountId, Account>, + /// Registered asset definitions. + pub(crate) asset_definitions: StorageView<'world, AssetDefinitionId, AssetDefinition>, + /// Registered asset definition total amounts. + pub(crate) asset_total_quantities: StorageView<'world, AssetDefinitionId, Numeric>, + /// Registered assets. + pub(crate) assets: StorageView<'world, AssetId, Asset>, /// Roles. [`Role`] pairs. pub(crate) roles: StorageView<'world, RoleId, Role>, /// Permission tokens of an account. @@ -262,10 +288,33 @@ impl World { } /// Creates a [`World`] with these [`Domain`]s and trusted [`PeerId`]s. - pub fn with(domains: D, accounts: A, trusted_peers_ids: PeersIds) -> Self + pub fn with( + domains: D, + accounts: A, + asset_definitions: Ad, + trusted_peers_ids: PeersIds, + ) -> Self where D: IntoIterator, A: IntoIterator, + Ad: IntoIterator, + { + Self::with_assets(domains, accounts, asset_definitions, [], trusted_peers_ids) + } + + /// Creates a [`World`] with these [`Domain`]s and trusted [`PeerId`]s. + pub fn with_assets( + domains: D, + accounts: A, + asset_definitions: Ad, + assets: As, + trusted_peers_ids: PeersIds, + ) -> Self + where + D: IntoIterator, + A: IntoIterator, + Ad: IntoIterator, + As: IntoIterator, { let domains = domains .into_iter() @@ -275,10 +324,17 @@ impl World { .into_iter() .map(|account| (account.id().clone(), account)) .collect(); + let asset_definitions = asset_definitions + .into_iter() + .map(|ad| (ad.id().clone(), ad)) + .collect(); + let assets = assets.into_iter().map(|ad| (ad.id().clone(), ad)).collect(); Self { trusted_peers_ids: Cell::new(trusted_peers_ids), domains, accounts, + asset_definitions, + assets, ..Self::new() } } @@ -290,6 +346,9 @@ impl World { trusted_peers_ids: self.trusted_peers_ids.block(), domains: self.domains.block(), accounts: self.accounts.block(), + asset_definitions: self.asset_definitions.block(), + asset_total_quantities: self.asset_total_quantities.block(), + assets: self.assets.block(), roles: self.roles.block(), account_permissions: self.account_permissions.block(), account_roles: self.account_roles.block(), @@ -307,6 +366,9 @@ impl World { trusted_peers_ids: self.trusted_peers_ids.block_and_revert(), domains: self.domains.block_and_revert(), accounts: self.accounts.block_and_revert(), + asset_definitions: self.asset_definitions.block_and_revert(), + asset_total_quantities: self.asset_total_quantities.block_and_revert(), + assets: self.assets.block_and_revert(), roles: self.roles.block_and_revert(), account_permissions: self.account_permissions.block_and_revert(), account_roles: self.account_roles.block_and_revert(), @@ -324,6 +386,9 @@ impl World { trusted_peers_ids: self.trusted_peers_ids.view(), domains: self.domains.view(), accounts: self.accounts.view(), + asset_definitions: self.asset_definitions.view(), + asset_total_quantities: self.asset_total_quantities.view(), + assets: self.assets.view(), roles: self.roles.view(), account_permissions: self.account_permissions.view(), account_roles: self.account_roles.view(), @@ -341,6 +406,9 @@ pub trait WorldReadOnly { fn trusted_peers_ids(&self) -> &PeersIds; fn domains(&self) -> &impl StorageReadOnly; fn accounts(&self) -> &impl StorageReadOnly; + fn asset_definitions(&self) -> &impl StorageReadOnly; + fn asset_total_quantities(&self) -> &impl StorageReadOnly; + fn assets(&self) -> &impl StorageReadOnly; fn roles(&self) -> &impl StorageReadOnly; fn account_permissions(&self) -> &impl StorageReadOnly; fn account_roles(&self) -> &impl StorageReadOnly; @@ -396,12 +464,52 @@ pub trait WorldReadOnly { .map(|(_, account)| account) } - /// Returns reference for domains map + /// Returns reference for accounts map #[inline] fn accounts_iter(&self) -> impl Iterator { self.accounts().iter().map(|(_, account)| account) } + /// Iterate asset definitions in domain + #[allow(clippy::type_complexity)] + fn asset_definitions_in_domain_iter<'slf>( + &'slf self, + id: &DomainId, + ) -> core::iter::Map< + RangeIter<'slf, AssetDefinitionId, AssetDefinition>, + fn((&'slf AssetDefinitionId, &'slf AssetDefinition)) -> &'slf AssetDefinition, + > { + self.asset_definitions() + .range::(AssetDefinitionByDomainBounds::new(id)) + .map(|(_, ad)| ad) + } + + /// Returns reference for asset definitions map + #[inline] + fn asset_definitions_iter(&self) -> impl Iterator { + self.asset_definitions().iter().map(|(_, ad)| ad) + } + + /// Iterate assets in account + #[allow(clippy::type_complexity)] + fn assets_in_account_iter<'slf>( + &'slf self, + id: &AccountId, + ) -> core::iter::Map< + RangeIter<'slf, AssetId, Asset>, + fn((&'slf AssetId, &'slf Asset)) -> &'slf Asset, + > { + self.assets() + .range::(AssetByAccountBounds::new(id)) + .map(|(_, a)| a) + } + + /// Returns reference for asset definitions map + #[inline] + fn assets_iter(&self) -> impl Iterator { + self.assets().iter().map(|(_, a)| a) + } + // Account-related methods /// Get `Account` and return reference to it. @@ -430,18 +538,6 @@ pub trait WorldReadOnly { Ok(f(account)) } - /// Get `Account`'s `Asset`s - /// - /// # Errors - /// Fails if there is no domain or account - fn account_assets( - &self, - id: &AccountId, - ) -> Result, QueryExecutionFail> - { - self.map_account(id, |account| account.assets.values()) - } - /// Get [`Account`]'s [`RoleId`]s // NOTE: have to use concreate type because don't want to capture lifetme of `id` #[allow(clippy::type_complexity)] @@ -516,16 +612,11 @@ pub trait WorldReadOnly { /// - The [`Account`] with which the [`Asset`] is associated doesn't exist. /// - The [`Domain`] with which the [`Account`] is associated doesn't exist. fn asset(&self, id: &AssetId) -> Result { - self.map_account( - &id.account, - |account| -> Result { - account - .assets - .get(&id.definition) - .ok_or_else(|| QueryExecutionFail::from(FindError::Asset(id.clone()))) - .cloned() - }, - )? + let _ = self.map_account(&id.account, |_| ())?; + self.assets() + .get(id) + .ok_or_else(|| QueryExecutionFail::from(FindError::Asset(id.clone()))) + .cloned() } // AssetDefinition-related methods @@ -535,8 +626,7 @@ pub trait WorldReadOnly { /// # Errors /// - Asset definition entry not found fn asset_definition(&self, asset_id: &AssetDefinitionId) -> Result { - self.domain(&asset_id.domain)? - .asset_definitions + self.asset_definitions() .get(asset_id) .ok_or_else(|| FindError::AssetDefinition(asset_id.clone())) .cloned() @@ -547,8 +637,7 @@ pub trait WorldReadOnly { /// # Errors /// - Asset definition not found fn asset_total_amount(&self, definition_id: &AssetDefinitionId) -> Result { - self.domain(&definition_id.domain)? - .asset_total_quantities + self.asset_total_quantities() .get(definition_id) .ok_or_else(|| FindError::AssetDefinition(definition_id.clone())) .copied() @@ -581,6 +670,15 @@ macro_rules! impl_world_ro { fn accounts(&self) -> &impl StorageReadOnly { &self.accounts } + fn asset_definitions(&self) -> &impl StorageReadOnly { + &self.asset_definitions + } + fn asset_total_quantities(&self) -> &impl StorageReadOnly { + &self.asset_total_quantities + } + fn assets(&self) -> &impl StorageReadOnly { + &self.assets + } fn roles(&self) -> &impl StorageReadOnly { &self.roles } @@ -615,6 +713,9 @@ impl<'world> WorldBlock<'world> { trusted_peers_ids: self.trusted_peers_ids.transaction(), domains: self.domains.transaction(), accounts: self.accounts.transaction(), + asset_definitions: self.asset_definitions.transaction(), + asset_total_quantities: self.asset_total_quantities.transaction(), + assets: self.assets.transaction(), roles: self.roles.transaction(), account_permissions: self.account_permissions.transaction(), account_roles: self.account_roles.transaction(), @@ -637,6 +738,9 @@ impl<'world> WorldBlock<'world> { self.account_roles.commit(); self.account_permissions.commit(); self.roles.commit(); + self.assets.commit(); + self.asset_total_quantities.commit(); + self.asset_definitions.commit(); self.accounts.commit(); self.domains.commit(); self.trusted_peers_ids.commit(); @@ -653,6 +757,9 @@ impl WorldTransaction<'_, '_> { self.account_roles.apply(); self.account_permissions.apply(); self.roles.apply(); + self.assets.apply(); + self.asset_total_quantities.apply(); + self.asset_definitions.apply(); self.accounts.apply(); self.domains.apply(); self.trusted_peers_ids.apply(); @@ -729,12 +836,10 @@ impl WorldTransaction<'_, '_> { /// # Errors /// If domain, account or asset not found pub fn asset_mut(&mut self, id: &AssetId) -> Result<&mut Asset, FindError> { - self.account_mut(&id.account).and_then(move |account| { - account - .assets - .get_mut(&id.definition) - .ok_or_else(|| FindError::Asset(id.clone())) - }) + let _ = self.account(&id.account)?; + self.assets + .get_mut(id) + .ok_or_else(|| FindError::Asset(id.clone())) } /// Get asset or inserts new with `default_asset_value`. @@ -749,36 +854,24 @@ impl WorldTransaction<'_, '_> { ) -> Result<&mut Asset, Error> { // Check that asset definition exists { - let asset_definition_id = &asset_id.definition; - let asset_definition_domain_id = &asset_id.definition.domain; - let asset_definition_domain = self - .domains - .get(asset_definition_domain_id) - .ok_or(FindError::Domain(asset_definition_domain_id.clone()))?; - asset_definition_domain - .asset_definitions - .get(asset_definition_id) - .ok_or(FindError::AssetDefinition(asset_definition_id.clone()))?; + let _ = self.domain(&asset_id.definition.domain)?; + let _ = self.asset_definition(&asset_id.definition)?; } - let account_id = &asset_id.account; - let account = self - .accounts - .get_mut(account_id) - .ok_or(FindError::Account(account_id.clone()))?; - - Ok(account + let _ = self.account(&asset_id.account)?; + if self.assets.get(&asset_id).is_none() { + let asset = Asset::new(asset_id.clone(), default_asset_value.into()); + Self::emit_events_impl( + &mut self.triggers, + &mut self.events_buffer, + Some(AssetEvent::Created(asset.clone())), + ); + self.assets.insert(asset_id.clone(), asset); + } + Ok(self .assets - .entry(asset_id.definition.clone()) - .or_insert_with(|| { - let asset = Asset::new(asset_id, default_asset_value.into()); - Self::emit_events_impl( - &mut self.triggers, - &mut self.events_buffer, - Some(AccountEvent::Asset(AssetEvent::Created(asset.clone()))), - ); - asset - })) + .get_mut(&asset_id) + .expect("Just inserted, cannot fail.")) } /// Get mutable reference to [`AssetDefinition`] @@ -789,12 +882,9 @@ impl WorldTransaction<'_, '_> { &mut self, id: &AssetDefinitionId, ) -> Result<&mut AssetDefinition, FindError> { - self.domain_mut(&id.domain).and_then(|domain| { - domain - .asset_definitions - .get_mut(id) - .ok_or_else(|| FindError::AssetDefinition(id.clone())) - }) + self.asset_definitions + .get_mut(id) + .ok_or_else(|| FindError::AssetDefinition(id.clone())) } /// Increase [`Asset`] total amount by given value @@ -807,9 +897,8 @@ impl WorldTransaction<'_, '_> { definition_id: &AssetDefinitionId, increment: Numeric, ) -> Result<(), Error> { - let domain = self.domain_mut(&definition_id.domain)?; let asset_total_amount: &mut Numeric = - domain.asset_total_quantities.get_mut(definition_id).expect( + self.asset_total_quantities.get_mut(definition_id).expect( "INTERNAL BUG: Asset total amount not found. \ Insert initial total amount on `Register`", ); @@ -840,9 +929,8 @@ impl WorldTransaction<'_, '_> { definition_id: &AssetDefinitionId, decrement: Numeric, ) -> Result<(), Error> { - let domain = self.domain_mut(&definition_id.domain)?; let asset_total_amount: &mut Numeric = - domain.asset_total_quantities.get_mut(definition_id).expect( + self.asset_total_quantities.get_mut(definition_id).expect( "INTERNAL BUG: Asset total amount not found. \ Insert initial total amount on `Register`", ); @@ -1531,6 +1619,116 @@ mod range_bounds { key: AccountIdDomainCompare<'_>, trait: AsAccountIdDomainCompare } + + /// `DomainId` wrapper for fetching asset definitions beloning to a domain from the global store + #[derive(PartialEq, Eq, Ord, PartialOrd, Copy, Clone)] + pub struct AssetDefinitionIdDomainCompare<'a> { + domain_id: &'a DomainId, + name: MinMaxExt<&'a Name>, + } + + /// Bounds for range quired over asset definitions by domain + pub struct AssetDefinitionByDomainBounds<'a> { + start: AssetDefinitionIdDomainCompare<'a>, + end: AssetDefinitionIdDomainCompare<'a>, + } + + impl<'a> AssetDefinitionByDomainBounds<'a> { + /// Create range bounds for range quires over asset definitions by domain + pub fn new(domain_id: &'a DomainId) -> Self { + Self { + start: AssetDefinitionIdDomainCompare { + domain_id, + name: MinMaxExt::Min, + }, + end: AssetDefinitionIdDomainCompare { + domain_id, + name: MinMaxExt::Max, + }, + } + } + } + + impl<'a> RangeBounds + for AssetDefinitionByDomainBounds<'a> + { + fn start_bound(&self) -> Bound<&(dyn AsAssetDefinitionIdDomainCompare + 'a)> { + Bound::Excluded(&self.start) + } + + fn end_bound(&self) -> Bound<&(dyn AsAssetDefinitionIdDomainCompare + 'a)> { + Bound::Excluded(&self.end) + } + } + + impl AsAssetDefinitionIdDomainCompare for AssetDefinitionId { + fn as_key(&self) -> AssetDefinitionIdDomainCompare<'_> { + AssetDefinitionIdDomainCompare { + domain_id: &self.domain, + name: (&self.name).into(), + } + } + } + + impl_as_dyn_key! { + target: AssetDefinitionId, + key: AssetDefinitionIdDomainCompare<'_>, + trait: AsAssetDefinitionIdDomainCompare + } + + /// `AccountId` wrapper for fetching assets beloning to an account from the global store + #[derive(PartialEq, Eq, Ord, PartialOrd, Copy, Clone)] + pub struct AssetIdAccountCompare<'a> { + account_id: &'a AccountId, + definition: MinMaxExt<&'a AssetDefinitionId>, + } + + /// Bounds for range quired over assets by account + pub struct AssetByAccountBounds<'a> { + start: AssetIdAccountCompare<'a>, + end: AssetIdAccountCompare<'a>, + } + + impl<'a> AssetByAccountBounds<'a> { + /// Create range bounds for range quires over assets by account + pub fn new(account_id: &'a AccountId) -> Self { + Self { + start: AssetIdAccountCompare { + account_id, + definition: MinMaxExt::Min, + }, + end: AssetIdAccountCompare { + account_id, + definition: MinMaxExt::Max, + }, + } + } + } + + impl<'a> RangeBounds for AssetByAccountBounds<'a> { + fn start_bound(&self) -> Bound<&(dyn AsAssetIdAccountCompare + 'a)> { + Bound::Excluded(&self.start) + } + + fn end_bound(&self) -> Bound<&(dyn AsAssetIdAccountCompare + 'a)> { + Bound::Excluded(&self.end) + } + } + + impl AsAssetIdAccountCompare for AssetId { + fn as_key(&self) -> AssetIdAccountCompare<'_> { + AssetIdAccountCompare { + account_id: &self.account, + definition: (&self.definition).into(), + } + } + } + + impl_as_dyn_key! { + target: AssetId, + key: AssetIdAccountCompare<'_>, + trait: AsAssetIdAccountCompare + } } pub(crate) mod deserialize { @@ -1628,6 +1826,9 @@ pub(crate) mod deserialize { let mut trusted_peers_ids = None; let mut domains = None; let mut accounts = None; + let mut asset_definitions = None; + let mut asset_total_quantities = None; + let mut assets = None; let mut roles = None; let mut account_permissions = None; let mut account_roles = None; @@ -1649,6 +1850,15 @@ pub(crate) mod deserialize { "accounts" => { accounts = Some(map.next_value()?); } + "asset_definitions" => { + asset_definitions = Some(map.next_value()?); + } + "asset_total_quantities" => { + asset_total_quantities = Some(map.next_value()?); + } + "assets" => { + assets = Some(map.next_value()?); + } "roles" => { roles = Some(map.next_value()?); } @@ -1684,6 +1894,12 @@ pub(crate) mod deserialize { .ok_or_else(|| serde::de::Error::missing_field("domains"))?, accounts: accounts .ok_or_else(|| serde::de::Error::missing_field("accounts"))?, + asset_definitions: asset_definitions + .ok_or_else(|| serde::de::Error::missing_field("asset_definitions"))?, + asset_total_quantities: asset_total_quantities.ok_or_else(|| { + serde::de::Error::missing_field("asset_total_quantities") + })?, + assets: assets.ok_or_else(|| serde::de::Error::missing_field("assets"))?, roles: roles.ok_or_else(|| serde::de::Error::missing_field("roles"))?, account_permissions: account_permissions.ok_or_else(|| { serde::de::Error::missing_field("account_permissions") @@ -1929,4 +2145,40 @@ mod tests { assert_eq!(&account.domain, &domain_id); } } + + #[test] + fn asset_account_range() { + let domain_id: DomainId = "wonderland".parse().unwrap(); + + let account_id = gen_account_in("wonderland").0; + + let accounts = [ + account_id.clone(), + account_id.clone(), + gen_account_in("a").0, + gen_account_in("b").0, + gen_account_in("z").0, + gen_account_in("z").0, + ]; + let asset_definitions = [ + AssetDefinitionId::new(domain_id.clone(), "a".parse().unwrap()), + AssetDefinitionId::new(domain_id.clone(), "f".parse().unwrap()), + AssetDefinitionId::new(domain_id.clone(), "b".parse().unwrap()), + AssetDefinitionId::new(domain_id.clone(), "c".parse().unwrap()), + AssetDefinitionId::new(domain_id.clone(), "d".parse().unwrap()), + AssetDefinitionId::new(domain_id.clone(), "e".parse().unwrap()), + ]; + + let assets = accounts + .into_iter() + .zip(asset_definitions) + .map(|(account, asset_definiton)| AssetId::new(asset_definiton, account)) + .map(|asset| (asset, ())); + + let map = Storage::from_iter(assets); + + let view = map.view(); + let range = view.range(AssetByAccountBounds::new(&account_id)); + assert_eq!(range.count(), 2); + } } diff --git a/core/src/sumeragi/main_loop.rs b/core/src/sumeragi/main_loop.rs index f8c2d8dd17b..af21b124381 100644 --- a/core/src/sumeragi/main_loop.rs +++ b/core/src/sumeragi/main_loop.rs @@ -1365,7 +1365,7 @@ mod tests { let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = "wonderland".parse().expect("Valid"); let domain = Domain::new(domain_id).build(&alice_id); - let world = World::with([domain], [account], topology.iter().cloned().collect()); + let world = World::with([domain], [account], [], topology.iter().cloned().collect()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, Arc::clone(&kura), query_handle); diff --git a/data_model/src/account.rs b/data_model/src/account.rs index c8daf5c8cb3..0717190102d 100644 --- a/data_model/src/account.rs +++ b/data_model/src/account.rs @@ -12,10 +12,7 @@ use serde_with::{DeserializeFromStr, SerializeDisplay}; pub use self::model::*; use crate::{ - asset::{Asset, AssetDefinitionId, AssetsMap}, - domain::prelude::*, - metadata::Metadata, - HasMetadata, ParseError, PublicKey, Registered, + domain::prelude::*, metadata::Metadata, HasMetadata, ParseError, PublicKey, Registered, }; #[model] @@ -75,8 +72,6 @@ mod model { pub struct Account { /// Identification of the [`Account`]. pub id: AccountId, - /// Assets in this [`Account`]. - pub assets: AssetsMap, /// Metadata of this account as a key-value store. pub metadata: Metadata, } @@ -118,34 +113,6 @@ impl Account { pub fn signatory(&self) -> &PublicKey { &self.id.signatory } - - /// Return a reference to the [`Asset`] corresponding to the asset id. - #[inline] - pub fn asset(&self, asset_id: &AssetDefinitionId) -> Option<&Asset> { - self.assets.get(asset_id) - } - - /// Get an iterator over [`Asset`]s of the `Account` - #[inline] - pub fn assets(&self) -> impl ExactSizeIterator { - self.assets.values() - } -} - -#[cfg(feature = "transparent_api")] -impl Account { - /// Add [`Asset`] into the [`Account`] returning previous asset stored under the same id - #[inline] - pub fn add_asset(&mut self, asset: Asset) -> Option { - assert_eq!(self.id, asset.id.account); - self.assets.insert(asset.id.definition.clone(), asset) - } - - /// Remove asset from the [`Account`] and return it - #[inline] - pub fn remove_asset(&mut self, asset_id: &AssetDefinitionId) -> Option { - self.assets.remove(asset_id) - } } impl NewAccount { @@ -171,7 +138,6 @@ impl NewAccount { pub fn into_account(self) -> Account { Account { id: self.id, - assets: AssetsMap::default(), metadata: self.metadata, } } diff --git a/data_model/src/asset.rs b/data_model/src/asset.rs index 7e4e1c43f9b..dfdaf640875 100644 --- a/data_model/src/asset.rs +++ b/data_model/src/asset.rs @@ -20,13 +20,6 @@ use crate::{ ParseError, Registered, }; -/// API to work with collections of [`Id`] : [`Asset`] mappings. -pub type AssetsMap = btree_map::BTreeMap; - -/// [`AssetDefinitionsMap`] provides an API to work with collection of key([`AssetDefinitionId`])-value([`AssetDefinition`]) -/// pairs. -pub type AssetDefinitionsMap = btree_map::BTreeMap; - /// [`AssetTotalQuantityMap`] provides an API to work with collection of key([`AssetDefinitionId`])-value([`AssetValue`]) /// pairs. pub type AssetTotalQuantityMap = btree_map::BTreeMap; @@ -83,7 +76,6 @@ mod model { PartialOrd, Ord, Hash, - Constructor, Getters, Decode, Encode, @@ -94,10 +86,10 @@ mod model { #[getset(get = "pub")] #[ffi_type] pub struct AssetId { - /// Entity Identification. - pub definition: AssetDefinitionId, /// Account Identification. pub account: AccountId, + /// Entity Identification. + pub definition: AssetDefinitionId, } /// Asset definition defines the type of that asset. @@ -302,6 +294,16 @@ impl AssetDefinition { } } +impl AssetId { + /// Create a new AssetId + pub fn new(definition: AssetDefinitionId, account: AccountId) -> Self { + Self { + account, + definition, + } + } +} + impl Asset { /// Constructor pub fn new(id: AssetId, value: impl Into) -> ::With { diff --git a/data_model/src/domain.rs b/data_model/src/domain.rs index fba99212f45..8789ea47a34 100644 --- a/data_model/src/domain.rs +++ b/data_model/src/domain.rs @@ -5,20 +5,13 @@ use alloc::{format, string::String, vec::Vec}; use derive_more::{Constructor, Display, FromStr}; use iroha_data_model_derive::{model, IdEqOrdHash}; -use iroha_primitives::numeric::Numeric; use iroha_schema::IntoSchema; use parity_scale_codec::{Decode, Encode}; use serde::{Deserialize, Serialize}; use serde_with::{DeserializeFromStr, SerializeDisplay}; pub use self::model::*; -use crate::{ - asset::{AssetDefinition, AssetDefinitionsMap, AssetTotalQuantityMap}, - ipfs::IpfsPath, - metadata::Metadata, - prelude::*, - HasMetadata, Name, Registered, -}; +use crate::{ipfs::IpfsPath, metadata::Metadata, prelude::*, HasMetadata, Name, Registered}; #[model] mod model { @@ -73,10 +66,6 @@ mod model { pub struct Domain { /// Identification of this [`Domain`]. pub id: DomainId, - /// [`Asset`](AssetDefinition)s defined of the `Domain`. - pub asset_definitions: AssetDefinitionsMap, - /// Total amount of [`Asset`]. - pub asset_total_quantities: AssetTotalQuantityMap, /// IPFS link to the [`Domain`] logo. #[getset(get = "pub")] pub logo: Option, @@ -155,76 +144,6 @@ impl Domain { } } -impl Domain { - /// Return a reference to the asset definition corresponding to the asset definition id - #[inline] - pub fn asset_definition( - &self, - asset_definition_id: &AssetDefinitionId, - ) -> Option<&AssetDefinition> { - self.asset_definitions.get(asset_definition_id) - } - - /// Return a reference to the asset definition corresponding to the asset definition id - #[inline] - pub fn asset_total_quantity( - &self, - asset_definition_id: &AssetDefinitionId, - ) -> Option<&Numeric> { - self.asset_total_quantities.get(asset_definition_id) - } - - /// Get an iterator over asset definitions of the `Domain` - #[inline] - pub fn asset_definitions(&self) -> impl ExactSizeIterator { - self.asset_definitions.values() - } -} - -#[cfg(feature = "transparent_api")] -impl Domain { - /// Add asset definition into the [`Domain`] returning previous - /// asset definition stored under the same id - #[inline] - pub fn add_asset_definition( - &mut self, - asset_definition: AssetDefinition, - ) -> Option { - self.asset_definitions - .insert(asset_definition.id().clone(), asset_definition) - } - - /// Remove asset definition from the [`Domain`] and return it - #[inline] - pub fn remove_asset_definition( - &mut self, - asset_definition_id: &AssetDefinitionId, - ) -> Option { - self.asset_definitions.remove(asset_definition_id) - } - - /// Add asset total amount into the [`Domain`] returning previous - /// asset amount stored under the same id - #[inline] - pub fn add_asset_total_quantity( - &mut self, - asset_definition_id: AssetDefinitionId, - initial_amount: Numeric, - ) -> Option { - self.asset_total_quantities - .insert(asset_definition_id, initial_amount) - } - - /// Remove asset total amount from the [`Domain`] and return it - #[inline] - pub fn remove_asset_total_quantity( - &mut self, - asset_definition_id: &AssetDefinitionId, - ) -> Option { - self.asset_total_quantities.remove(asset_definition_id) - } -} - /// The prelude re-exports most commonly used traits, structs and macros from this crate. pub mod prelude { pub use super::{Domain, DomainId}; diff --git a/data_model/src/events/data/filters.rs b/data_model/src/events/data/filters.rs index 0bda7058181..20dbf6e0d3d 100644 --- a/data_model/src/events/data/filters.rs +++ b/data_model/src/events/data/filters.rs @@ -724,7 +724,6 @@ mod tests { use iroha_crypto::KeyPair; use super::*; - use crate::asset::{AssetDefinitionsMap, AssetTotalQuantityMap}; #[test] #[cfg(feature = "transparent_api")] @@ -736,8 +735,6 @@ mod tests { let domain = Domain { id: domain_id.clone(), - asset_definitions: AssetDefinitionsMap::default(), - asset_total_quantities: AssetTotalQuantityMap::default(), logo: None, metadata: Metadata::default(), owned_by: domain_owner_id, diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index ec3064d9867..65ed5f1a562 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -5,10 +5,6 @@ "name": "id", "type": "AccountId" }, - { - "name": "assets", - "type": "SortedMap" - }, { "name": "metadata", "type": "Metadata" @@ -470,13 +466,13 @@ }, "AssetId": { "Struct": [ - { - "name": "definition", - "type": "AssetDefinitionId" - }, { "name": "account", "type": "AccountId" + }, + { + "name": "definition", + "type": "AssetDefinitionId" } ] }, @@ -1166,14 +1162,6 @@ "name": "id", "type": "DomainId" }, - { - "name": "asset_definitions", - "type": "SortedMap" - }, - { - "name": "asset_total_quantities", - "type": "SortedMap" - }, { "name": "logo", "type": "Option" @@ -3854,24 +3842,6 @@ } ] }, - "SortedMap": { - "Map": { - "key": "AssetDefinitionId", - "value": "Asset" - } - }, - "SortedMap": { - "Map": { - "key": "AssetDefinitionId", - "value": "AssetDefinition" - } - }, - "SortedMap": { - "Map": { - "key": "AssetDefinitionId", - "value": "Numeric" - } - }, "SortedMap": { "Map": { "key": "CustomParameterId", diff --git a/tools/parity_scale_cli/samples/trigger.bin b/tools/parity_scale_cli/samples/trigger.bin index d46095a94fdceb5b1a2fcb144965c9d41520524e..3016bb36d2d0a4883a9d8e75ff9f0713a1aa6a99 100644 GIT binary patch delta 39 tcmZo>Y-XGwJyBapP@_CQFD11oCowNYpeVmMm0_ZSE(aqM0|x^T008Pq39|qI delta 27 hcmZo>Y-XGw%_>loUz|EoKzAa)9tR^60|x^T003Wh1u*~s