Skip to content

Commit 8e7365c

Browse files
committed
Signer: Add db_directory & rename Signer struct to Runtime
Signed-off-by: DJO <[email protected]>
1 parent c714964 commit 8e7365c

File tree

7 files changed

+59
-32
lines changed

7 files changed

+59
-32
lines changed

mithril-signer/config/dev.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
"network": "testnet",
33
"aggregator_endpoint": "http://localhost:8080/aggregator",
44
"party_id": 0,
5-
"run_interval": 20000
5+
"run_interval": 20000,
6+
"db_directory": "/db"
67
}

mithril-signer/config/testnet.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
"network": "testnet",
33
"aggregator_endpoint": "http://aggregator.api.mithril.network/aggregator",
44
"party_id": 0,
5-
"run_interval": 20000
5+
"run_interval": 20000,
6+
"db_directory": "/db"
67
}

mithril-signer/src/certificate_handler.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ mod tests {
138138
use super::*;
139139
use httpmock::prelude::*;
140140
use serde_json::json;
141+
use std::path::Path;
141142

142143
use mithril_common::fake_data;
143144

@@ -150,6 +151,7 @@ mod tests {
150151
aggregator_endpoint: server.url(""),
151152
party_id: 0,
152153
run_interval: 100,
154+
db_directory: Path::new("./").to_path_buf(),
153155
};
154156
(server, config)
155157
}

mithril-signer/src/entities.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use cli_table::Table;
22
use serde::{Deserialize, Serialize};
3+
use std::path::{Display, Path, PathBuf};
34

45
/// Client configuration
56
#[derive(Table, Debug, Clone, Serialize, Deserialize)]
@@ -19,4 +20,15 @@ pub struct Config {
1920
/// Run Interval
2021
#[table(title = "Interval between two signatures attempts")]
2122
pub run_interval: u64,
23+
24+
/// Directory to snapshot
25+
#[table(
26+
title = "Path to the Cardano Node db directory",
27+
display_fn = "display_path"
28+
)]
29+
pub db_directory: PathBuf,
30+
}
31+
32+
fn display_path(path: &Path) -> Display<'_> {
33+
path.display()
2234
}

mithril-signer/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
mod certificate_handler;
22
mod entities;
3-
mod signer;
3+
mod runtime;
44
mod single_signer;
55

66
pub use certificate_handler::CertificateHandlerHTTPClient;
77
pub use entities::Config;
8-
pub use signer::Signer;
8+
pub use runtime::Runtime;
99
pub use single_signer::MithrilSingleSigner;

mithril-signer/src/main.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::sync::Arc;
66
use std::time::Duration;
77
use tokio::time::sleep;
88

9-
use mithril_signer::{CertificateHandlerHTTPClient, Config, MithrilSingleSigner, Signer};
9+
use mithril_signer::{CertificateHandlerHTTPClient, Config, MithrilSingleSigner, Runtime};
1010

1111
/// CLI args
1212
#[derive(Parser)]
@@ -66,12 +66,9 @@ async fn main() -> Result<(), String> {
6666
let single_signer = MithrilSingleSigner::new(config.party_id, protocol_initializer_encoded);
6767
let certificate_handler = CertificateHandlerHTTPClient::new(config.aggregator_endpoint.clone());
6868

69-
let mut signer = Signer::new(Box::new(certificate_handler), Box::new(single_signer));
70-
loop {
71-
if let Err(e) = signer.run().await {
72-
error!("{:?}", e)
73-
}
74-
info!("Sleeping for {}", config.run_interval);
75-
sleep(Duration::from_millis(config.run_interval)).await;
76-
}
69+
// Should the runtime loop returns an error ? If yes should we abort the loop at the first error or is their some tolerance ?
70+
let mut runtime = Runtime::new(Box::new(certificate_handler), Box::new(single_signer));
71+
runtime.infinite_loop(config.run_interval).await;
72+
73+
Ok(())
7774
}

mithril-signer/src/signer.rs renamed to mithril-signer/src/runtime.rs

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
use slog_scope::{error, info};
12
use std::collections::HashMap;
3+
use std::time::Duration;
24
use thiserror::Error;
5+
use tokio::time::sleep;
36

47
use mithril_common::crypto_helper::key_encode_hex;
58
use mithril_common::entities::{self, Beacon, SignerWithStake};
@@ -8,14 +11,14 @@ use mithril_common::fake_data;
811
use super::certificate_handler::CertificateHandler;
912
use super::single_signer::SingleSigner;
1013

11-
pub struct Signer {
14+
pub struct Runtime {
1215
certificate_handler: Box<dyn CertificateHandler>,
1316
single_signer: Box<dyn SingleSigner>,
1417
current_beacon: Option<Beacon>,
1518
}
1619

1720
#[derive(Error, Debug, PartialEq)]
18-
pub enum SignerError {
21+
pub enum RuntimeError {
1922
#[error("single signatures computation failed: `{0}`")]
2023
SingleSignaturesComputeFailed(String),
2124
#[error("could not retrieve pending certificate: `{0}`")]
@@ -28,7 +31,7 @@ pub enum SignerError {
2831
Codec(String),
2932
}
3033

31-
impl Signer {
34+
impl Runtime {
3235
pub fn new(
3336
certificate_handler: Box<dyn CertificateHandler>,
3437
single_signer: Box<dyn SingleSigner>,
@@ -40,12 +43,23 @@ impl Signer {
4043
}
4144
}
4245

43-
pub async fn run(&mut self) -> Result<(), SignerError> {
46+
pub async fn infinite_loop(&mut self, loop_interval: u64) {
47+
loop {
48+
if let Err(e) = self.run().await {
49+
error!("{:?}", e)
50+
}
51+
52+
info!("Sleeping for {}", loop_interval);
53+
sleep(Duration::from_millis(loop_interval)).await;
54+
}
55+
}
56+
57+
pub async fn run(&mut self) -> Result<(), RuntimeError> {
4458
if let Some(pending_certificate) = self
4559
.certificate_handler
4660
.retrieve_pending_certificate()
4761
.await
48-
.map_err(|e| SignerError::RetrievePendingCertificateFailed(e.to_string()))?
62+
.map_err(|e| RuntimeError::RetrievePendingCertificateFailed(e.to_string()))?
4963
{
5064
let message = fake_data::digest(&pending_certificate.beacon);
5165
let must_register_signature = match &self.current_beacon {
@@ -58,16 +72,16 @@ impl Signer {
5872
if let Some(protocol_initializer) = self.single_signer.get_protocol_initializer() {
5973
let verification_key = protocol_initializer.verification_key();
6074
let verification_key =
61-
key_encode_hex(verification_key).map_err(SignerError::Codec)?;
75+
key_encode_hex(verification_key).map_err(RuntimeError::Codec)?;
6276
let signer =
6377
entities::Signer::new(self.single_signer.get_party_id(), verification_key);
6478
self.certificate_handler
6579
.register_signer(&signer)
6680
.await
67-
.map_err(|e| SignerError::RegisterSignerFailed(e.to_string()))?;
81+
.map_err(|e| RuntimeError::RegisterSignerFailed(e.to_string()))?;
6882
self.single_signer
6983
.update_is_registered(true)
70-
.map_err(|e| SignerError::RegisterSignerFailed(e.to_string()))?;
84+
.map_err(|e| RuntimeError::RegisterSignerFailed(e.to_string()))?;
7185
}
7286
}
7387

@@ -99,7 +113,7 @@ impl Signer {
99113
stake_distribution_extended,
100114
&pending_certificate.protocol_parameters,
101115
)
102-
.map_err(|e| SignerError::SingleSignaturesComputeFailed(e.to_string()))?;
116+
.map_err(|e| RuntimeError::SingleSignaturesComputeFailed(e.to_string()))?;
103117
if !signatures.is_empty() {
104118
let _ = self
105119
.certificate_handler
@@ -148,7 +162,7 @@ mod tests {
148162
.expect_get_is_registered()
149163
.return_once(|| false);
150164

151-
let mut signer = Signer::new(
165+
let mut signer = Runtime::new(
152166
Box::new(mock_certificate_handler),
153167
Box::new(mock_single_signer),
154168
);
@@ -170,12 +184,12 @@ mod tests {
170184
.expect_get_protocol_initializer()
171185
.return_once(move || None);
172186

173-
let mut signer = Signer::new(
187+
let mut signer = Runtime::new(
174188
Box::new(mock_certificate_handler),
175189
Box::new(mock_single_signer),
176190
);
177191
assert_eq!(
178-
SignerError::RetrievePendingCertificateFailed(
192+
RuntimeError::RetrievePendingCertificateFailed(
179193
CertificateHandlerError::RemoteServerTechnical("An Error".to_string()).to_string()
180194
),
181195
signer.run().await.unwrap_err()
@@ -220,7 +234,7 @@ mod tests {
220234
.expect_update_is_registered()
221235
.return_once(move |_| Ok(()));
222236

223-
let mut signer = Signer::new(
237+
let mut signer = Runtime::new(
224238
Box::new(mock_certificate_handler),
225239
Box::new(mock_single_signer),
226240
);
@@ -269,7 +283,7 @@ mod tests {
269283
.expect_get_protocol_initializer()
270284
.return_once(move || Some(protocol_initializer.clone()));
271285

272-
let mut signer = Signer::new(
286+
let mut signer = Runtime::new(
273287
Box::new(mock_certificate_handler),
274288
Box::new(mock_single_signer),
275289
);
@@ -310,7 +324,7 @@ mod tests {
310324
.expect_update_is_registered()
311325
.return_once(move |_| Ok(()));
312326

313-
let mut signer = Signer::new(
327+
let mut signer = Runtime::new(
314328
Box::new(mock_certificate_handler),
315329
Box::new(mock_single_signer),
316330
);
@@ -335,12 +349,12 @@ mod tests {
335349
.expect_get_protocol_initializer()
336350
.return_once(move || None);
337351

338-
let mut signer = Signer::new(
352+
let mut signer = Runtime::new(
339353
Box::new(mock_certificate_handler),
340354
Box::new(mock_single_signer),
341355
);
342356
assert_eq!(
343-
SignerError::SingleSignaturesComputeFailed(
357+
RuntimeError::SingleSignaturesComputeFailed(
344358
SingleSignerError::UnregisteredVerificationKey().to_string()
345359
),
346360
signer.run().await.unwrap_err()
@@ -378,12 +392,12 @@ mod tests {
378392
.expect_get_is_registered()
379393
.return_once(|| false);
380394

381-
let mut signer = Signer::new(
395+
let mut signer = Runtime::new(
382396
Box::new(mock_certificate_handler),
383397
Box::new(mock_single_signer),
384398
);
385399
assert_eq!(
386-
SignerError::RegisterSignerFailed(
400+
RuntimeError::RegisterSignerFailed(
387401
CertificateHandlerError::RemoteServerLogical("an error occurred".to_string(),)
388402
.to_string()
389403
),

0 commit comments

Comments
 (0)