From 9dcd0b395ae16b3a5320e84469107c6af7056140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anler=20Hern=C3=A1ndez=20Peral?= Date: Thu, 4 Apr 2019 15:47:35 +0200 Subject: [PATCH] fix(signature_mngr): hack to fix initialization cycle in sig mngr Upon startup the signature manager needs to fetch/generate a signing key and use it, then, when it comes to the step of using it, it does so by sending a message to itself (via public set_key function), problem is that this future is blocked with `.wait` meaning the actor is not able to process any incoming message until the future resolves, but it can't resolve because it waiting for the actor to accept the SetKey message. --- node/src/signature_mngr.rs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/node/src/signature_mngr.rs b/node/src/signature_mngr.rs index 887946cd8..df353a49b 100644 --- a/node/src/signature_mngr.rs +++ b/node/src/signature_mngr.rs @@ -55,6 +55,14 @@ struct SignatureManager { keypair: Option<(SK, PK)>, } +impl SignatureManager { + fn set_key(&mut self, key: SK) { + let public_key = PK::from_secret_key(&SignContext::signing_only(), &key); + self.keypair = Some((key, public_key)); + log::info!("Signature Manager received a key and is ready to sign"); + } +} + struct SetKey(SK); struct Sign(Vec); @@ -75,7 +83,7 @@ impl Actor for SignatureManager { storage_mngr::get::<_, ExtendedSecretKey>(&EXTENDED_SK_KEY) .and_then(move |extended_sk_from_storage| { extended_sk_from_storage.map_or_else( - || -> Box> { + || -> Box> { log::warn!("No extended secret key in storage"); // Create a new Secret Key @@ -84,9 +92,8 @@ impl Actor for SignatureManager { match MasterKeyGen::new(seed).generate() { Ok(extended_sk) => { - let fut = set_key(extended_sk.secret_key) - .join(persist_extended_sk(extended_sk)) - .map(|_| ()); + let fut = + persist_extended_sk(extended_sk.clone()).map(|_| extended_sk); Box::new(fut) } @@ -99,7 +106,7 @@ impl Actor for SignatureManager { }, |extended_secret_key| { let extended_sk: ExtendedSK = extended_secret_key.into(); - let fut = set_key(extended_sk.secret_key); + let fut = futures::future::ok(extended_sk); Box::new(fut) }, @@ -107,6 +114,9 @@ impl Actor for SignatureManager { }) .map_err(|e| log::error!("Couldn't initialize Signature Manager: {}", e)) .into_actor(self) + .map(|ext_key, act, _| { + act.set_key(ext_key.secret_key); + }) .wait(ctx); } } @@ -127,10 +137,7 @@ impl Handler for SignatureManager { type Result = ::Result; fn handle(&mut self, SetKey(secret_key): SetKey, _ctx: &mut Self::Context) -> Self::Result { - let public_key = PK::from_secret_key(&SignContext::signing_only(), &secret_key); - self.keypair = Some((secret_key, public_key)); - - log::info!("Signature Manager received a key and is ready to sign"); + self.set_key(secret_key); Ok(()) }