Browse Source

data directory: configured at genesis

Mokhtar Naamani 4 years ago
parent
commit
1a2f87b5fc

+ 25 - 1
node/src/chain_spec/content_config.rs

@@ -3,7 +3,7 @@ use node_runtime::{
     primitives::{BlockNumber, Credential},
     versioned_store::{Class, ClassId, Entity, EntityId, InputValidationLengthConstraint},
     versioned_store_permissions::ClassPermissions,
-    ContentId, Runtime, VersionedStoreConfig, VersionedStorePermissionsConfig,
+    ContentId, DataDirectoryConfig, Runtime, VersionedStoreConfig, VersionedStorePermissionsConfig,
 };
 
 use codec::Decode;
@@ -236,3 +236,27 @@ pub fn versioned_store_permissions_config_from_json(
             .collect(),
     }
 }
+
+pub fn empty_data_directory_config() -> DataDirectoryConfig {
+    DataDirectoryConfig {
+        data_object_by_content_id: vec![],
+        known_content_ids: vec![],
+    }
+}
+
+pub fn data_directory_config_from_json(data_file: &Path) -> DataDirectoryConfig {
+    let content = parse_content_data(data_file).decode();
+
+    DataDirectoryConfig {
+        data_object_by_content_id: content
+            .data_objects
+            .iter()
+            .map(|object| (object.content_id, object.data_object.clone()))
+            .collect(),
+        known_content_ids: content
+            .data_objects
+            .into_iter()
+            .map(|object| object.content_id)
+            .collect(),
+    }
+}

+ 5 - 1
node/src/chain_spec/mod.rs

@@ -30,7 +30,7 @@ use sp_runtime::Perbill;
 
 use node_runtime::{
     membership, AuthorityDiscoveryConfig, BabeConfig, Balance, BalancesConfig,
-    ContentWorkingGroupConfig, CouncilConfig, CouncilElectionConfig,
+    ContentWorkingGroupConfig, CouncilConfig, CouncilElectionConfig, DataDirectoryConfig,
     DataObjectStorageRegistryConfig, DataObjectTypeRegistryConfig, ElectionParameters, ForumConfig,
     GrandpaConfig, ImOnlineConfig, MembersConfig, Moment, ProposalsCodexConfig, SessionConfig,
     SessionKeys, Signature, StakerStatus, StakingConfig, StorageWorkingGroupConfig, SudoConfig,
@@ -137,6 +137,7 @@ impl Alternative {
                         forum_config::empty(get_account_id_from_seed::<sr25519::Public>("Alice")),
                         content_config::empty_versioned_store_config(),
                         content_config::empty_versioned_store_permissions_config(),
+                        content_config::empty_data_directory_config(),
                     )
                 },
                 Vec::new(),
@@ -175,6 +176,7 @@ impl Alternative {
                         forum_config::empty(get_account_id_from_seed::<sr25519::Public>("Alice")),
                         content_config::empty_versioned_store_config(),
                         content_config::empty_versioned_store_permissions_config(),
+                        content_config::empty_data_directory_config(),
                     )
                 },
                 Vec::new(),
@@ -216,6 +218,7 @@ pub fn testnet_genesis(
     forum_config: ForumConfig,
     versioned_store_config: VersionedStoreConfig,
     versioned_store_permissions_config: VersionedStorePermissionsConfig,
+    data_directory_config: DataDirectoryConfig,
 ) -> GenesisConfig {
     const CENTS: Balance = 1;
     const DOLLARS: Balance = 100 * CENTS;
@@ -291,6 +294,7 @@ pub fn testnet_genesis(
             members,
         }),
         forum: Some(forum_config),
+        data_directory: Some(data_directory_config),
         data_object_type_registry: Some(DataObjectTypeRegistryConfig {
             first_data_object_type_id: 1,
         }),

+ 2 - 2
runtime-modules/storage/src/data_directory.rs

@@ -150,10 +150,10 @@ pub type DataObjectsMap<T> = BTreeMap<<T as Trait>::ContentId, DataObject<T>>;
 decl_storage! {
     trait Store for Module<T: Trait> as DataDirectory {
         /// List of ids known to the system.
-        pub KnownContentIds get(fn known_content_ids): Vec<T::ContentId> = Vec::new();
+        pub KnownContentIds get(fn known_content_ids) config(): Vec<T::ContentId> = Vec::new();
 
         /// Maps data objects by their content id.
-        pub DataObjectByContentId get(fn data_object_by_content_id):
+        pub DataObjectByContentId get(fn data_object_by_content_id) config():
             map hasher(blake2_128_concat) T::ContentId => Option<DataObject<T>>;
     }
 }

+ 1 - 1
runtime/src/lib.rs

@@ -608,7 +608,7 @@ construct_runtime!(
         ContentWorkingGroup: content_wg::{Module, Call, Storage, Event<T>, Config<T>},
         // --- Storage
         DataObjectTypeRegistry: data_object_type_registry::{Module, Call, Storage, Event<T>, Config<T>},
-        DataDirectory: data_directory::{Module, Call, Storage, Event<T>},
+        DataDirectory: data_directory::{Module, Call, Storage, Event<T>, Config<T>},
         DataObjectStorageRegistry: data_object_storage_registry::{Module, Call, Storage, Event<T>, Config<T>},
         Discovery: service_discovery::{Module, Call, Storage, Event<T>},
         // --- Proposals

+ 7 - 0
utils/chain-spec-builder/src/main.rs

@@ -192,6 +192,12 @@ fn genesis_constructor(
         content_config::empty_versioned_store_permissions_config()
     };
 
+    let data_directory_config = if let Some(path) = initial_content_path {
+        content_config::data_directory_config_from_json(path.as_path())
+    } else {
+        content_config::empty_data_directory_config()
+    };
+
     chain_spec::testnet_genesis(
         authorities,
         sudo_account.clone(),
@@ -201,6 +207,7 @@ fn genesis_constructor(
         forum_cfg,
         versioned_store_cfg,
         versioned_store_permissions_cfg,
+        data_directory_config,
     )
 }