From 4098fc236085ccdb9e6aa2ae66f85dcfd93994f6 Mon Sep 17 00:00:00 2001
From: librelois <c@elo.tf>
Date: Sun, 17 Apr 2022 23:13:38 +0200
Subject: [PATCH] feat(genesis_conf): make session_keys optional and infer
 authority role

---
 node/src/chain_spec/gen_genesis_data.rs | 23 +++++++++++++++++------
 resources/gdev.json                     |  7 ++-----
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs
index f9c03b1ee..c2303724f 100644
--- a/node/src/chain_spec/gen_genesis_data.rs
+++ b/node/src/chain_spec/gen_genesis_data.rs
@@ -76,9 +76,7 @@ struct Idty {
 
 #[derive(Clone, Deserialize, Serialize)]
 struct SmithData {
-    #[serde(default)]
-    authority: bool,
-    session_keys: String,
+    session_keys: Option<String>,
     #[serde(default)]
     certs: Vec<String>,
 }
@@ -252,11 +250,24 @@ where
         }
 
         // Initial authorities
-        initial_authorities.insert(*idty_index, (identity.pubkey.clone(), smith_data.authority));
+        initial_authorities.insert(
+            *idty_index,
+            (identity.pubkey.clone(), smith_data.session_keys.is_some()),
+        );
 
         // Session keys
-        let session_keys_bytes = hex::decode(&smith_data.session_keys[2..])
-            .map_err(|_| format!("invalid session keys for idty {}", &idty_name))?;
+        let session_keys_bytes = if let Some(ref session_keys) = smith_data.session_keys {
+            hex::decode(&session_keys[2..])
+                .map_err(|_| format!("invalid session keys for idty {}", &idty_name))?
+        } else {
+            // Create fake session keys (must be unique and deterministic)
+            let mut fake_session_keys_bytes = Vec::with_capacity(128);
+            for _ in 0..4 {
+                fake_session_keys_bytes.extend_from_slice(identity.pubkey.as_ref())
+            }
+            fake_session_keys_bytes
+            //vec![initial_authorities.len() as u8; std::mem::size_of::<SK>()]
+        };
         session_keys_map.insert(
             identity.pubkey.clone(),
             SK::decode(&mut &session_keys_bytes[..])
diff --git a/resources/gdev.json b/resources/gdev.json
index 65e51d52a..c6a09c034 100644
--- a/resources/gdev.json
+++ b/resources/gdev.json
@@ -50,17 +50,14 @@
   },
   "smiths": {
     "Elois1": {
-      "authority": true,
       "certs": ["Elois2", "Elois3"],
       "session_keys": "0x90ea1e9059fd30860fc14370b62a3675a720763913e0aa41fa01b268c33afd3b64c9301d94f7a043ac6714c8a6301541e56e833c1b13170c19f9785fa469407864c9301d94f7a043ac6714c8a6301541e56e833c1b13170c19f9785fa469407864c9301d94f7a043ac6714c8a6301541e56e833c1b13170c19f9785fa4694078"
     },
     "Elois2": {
-      "certs": ["Elois1", "Elois3"],
-      "session_keys": "0x1a1c5027d35e315efde9b9296a0ff80920a9d448a7d0480080d9773e4035ec85a270415a3a2f5392df3185bc9f3d2d7a3cb158f55ebdf6ccc42da8ab26d96f7ca270415a3a2f5392df3185bc9f3d2d7a3cb158f55ebdf6ccc42da8ab26d96f7ca270415a3a2f5392df3185bc9f3d2d7a3cb158f55ebdf6ccc42da8ab26d96f7c"
+      "certs": ["Elois1", "Elois3"]
     },
     "Elois3": {
-      "certs": ["Elois1", "Elois2"],
-      "session_keys": "0xcde37cd0d59573465dacd587f0759c93a82e9f0a40ee8f547772446abe846b86f0badfddff9238d6f18ab5ef8fa5fdd3d5edd29a9f6b097416ffc87e2f774022f0badfddff9238d6f18ab5ef8fa5fdd3d5edd29a9f6b097416ffc87e2f774022f0badfddff9238d6f18ab5ef8fa5fdd3d5edd29a9f6b097416ffc87e2f774022"
+      "certs": ["Elois1", "Elois2"]
     }
   },
   "sudo_key": "5H95G8bwuf4yyNNNa83hDhj7wpYaSRhZiGezZ9TDbyqNdAhY"
-- 
GitLab