Skip to content

Commit 84fae19

Browse files
committed
Wired up Signer & SingleSigner in main #144, #145
1 parent 862e2c5 commit 84fae19

File tree

8 files changed

+85
-34
lines changed

8 files changed

+85
-34
lines changed

mithril-signer/Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-signer/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ reqwest = { version = "0.11", features = ["json", "stream"] }
2323
tar = "0.4.38"
2424
flate2 = "1.0.23"
2525
thiserror = "1.0.31"
26+
async-trait = "0.1.52"
27+
tokio = { version = "1.17.0", features = ["full"] }
2628

2729
hex = "0.4.3"
2830
rand_core = "0.6.3"

mithril-signer/config/dev.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
22
"network": "testnet",
3-
"aggregator_endpoint": "http://localhost:8080/aggregator"
3+
"aggregator_endpoint": "http://localhost:8080/aggregator",
4+
"party_id": 0,
5+
"run_interval": 20000
46
}

mithril-signer/config/testnet.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
22
"network": "testnet",
3-
"aggregator_endpoint": "http://aggregator.api.mithril.network/aggregator"
3+
"aggregator_endpoint": "http://aggregator.api.mithril.network/aggregator",
4+
"party_id": 0,
5+
"run_interval": 20000
46
}
Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
1+
use async_trait::async_trait;
12
use mithril_aggregator::entities::CertificatePending;
23
#[cfg(test)]
34
use mockall::automock;
45

56
#[cfg_attr(test, automock)]
7+
#[async_trait]
68
pub trait CertificateHandler {
7-
fn retrieve_pending_certificate(&self) -> Result<Option<CertificatePending>, String>;
9+
async fn retrieve_pending_certificate(&self) -> Result<Option<CertificatePending>, String>;
810

9-
fn register_signatures(&self, signature: &str) -> Result<(), String>;
11+
async fn register_signatures(&self, signature: &str) -> Result<(), String>;
12+
}
13+
14+
pub struct CertificateHandlerNoOp {}
15+
16+
#[async_trait]
17+
impl CertificateHandler for CertificateHandlerNoOp {
18+
async fn retrieve_pending_certificate(&self) -> Result<Option<CertificatePending>, String> {
19+
unimplemented!()
20+
}
21+
22+
async fn register_signatures(&self, _signature: &str) -> Result<(), String> {
23+
unimplemented!()
24+
}
1025
}

mithril-signer/src/entities.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,12 @@ pub struct Config {
1111
/// Aggregator endpoint
1212
#[table(title = "Aggregator Endpoint")]
1313
pub aggregator_endpoint: String,
14+
15+
/// Party Id
16+
#[table(title = "Party Id")]
17+
pub party_id: u64,
18+
19+
/// Run Interval
20+
#[table(title = "Interval between two signatures attempts")]
21+
pub run_interval: u64,
1422
}

mithril-signer/src/main.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1+
use crate::certificate_handler::CertificateHandlerNoOp;
12
use crate::entities::Config;
3+
use crate::signer::Signer;
4+
use crate::single_signer::{key_decode_hex, MithrilSingleSigner};
25
use clap::Parser;
6+
use mithril_aggregator::fake_data;
37
use slog::{o, Drain, Level, Logger};
4-
use slog_scope::debug;
8+
use slog_scope::{debug, error, info};
59
use std::env;
610
use std::sync::Arc;
11+
use std::time::Duration;
12+
use tokio::time::sleep;
713

814
mod certificate_handler;
915
mod entities;
@@ -46,7 +52,8 @@ fn build_logger(min_level: Level) -> Logger {
4652
Logger::root(Arc::new(drain), o!())
4753
}
4854

49-
fn main() {
55+
#[tokio::main]
56+
async fn main() {
5057
// Load args
5158
let args = Args::parse();
5259
let _guard = slog_scope::set_global_logger(build_logger(args.log_level()));
@@ -62,5 +69,19 @@ fn main() {
6269
.unwrap();
6370
debug!("Started"; "run_mode" => &run_mode, "config" => format!("{:?}", config));
6471

65-
println!("Hello, world!");
72+
loop {
73+
let fake_signer = fake_data::signer_keys(config.party_id).unwrap();
74+
let single_signer = MithrilSingleSigner::new(
75+
fake_signer.party_id,
76+
key_decode_hex(&fake_signer.secret_key).unwrap(),
77+
);
78+
let certificate_handler = CertificateHandlerNoOp {};
79+
80+
let mut signer = Signer::new(Box::new(certificate_handler), Box::new(single_signer));
81+
if let Err(e) = signer.run().await {
82+
error!("{:?}", e)
83+
}
84+
info!("Sleeping for {}", config.run_interval);
85+
sleep(Duration::from_millis(config.run_interval)).await;
86+
}
6687
}

mithril-signer/src/signer.rs

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use mithril_aggregator::fake_data;
66
use crate::certificate_handler::CertificateHandler;
77
use crate::single_signer::SingleSigner;
88

9-
struct Signer {
9+
pub struct Signer {
1010
certificate_handler: Box<dyn CertificateHandler>,
1111
single_signer: Box<dyn SingleSigner>,
1212
current_beacon: Option<Beacon>,
@@ -21,9 +21,7 @@ pub enum SignerError {
2121
}
2222

2323
impl Signer {
24-
fn new(
25-
_party_id: &str,
26-
_signing_key: &str,
24+
pub fn new(
2725
certificate_handler: Box<dyn CertificateHandler>,
2826
single_signer: Box<dyn SingleSigner>,
2927
) -> Self {
@@ -34,10 +32,11 @@ impl Signer {
3432
}
3533
}
3634

37-
fn run(&mut self) -> Result<(), SignerError> {
35+
pub async fn run(&mut self) -> Result<(), SignerError> {
3836
if let Some(pending_certificate) = self
3937
.certificate_handler
4038
.retrieve_pending_certificate()
39+
.await
4140
.map_err(SignerError::RetrievePendingCertificateFailed)?
4241
{
4342
let must_register_signature = match &self.current_beacon {
@@ -49,7 +48,7 @@ impl Signer {
4948
};
5049

5150
if must_register_signature {
52-
let message = "message".as_bytes().to_vec();
51+
let message = fake_data::digest();
5352
let stake_distribution = fake_data::signers_with_stakes(5);
5453
let signatures = self
5554
.single_signer
@@ -60,7 +59,7 @@ impl Signer {
6059
)
6160
.map_err(|e| SignerError::SingleSignaturesComputeFailed(e.to_string()))?;
6261
if !signatures.is_empty() {
63-
let _ = self.certificate_handler.register_signatures("");
62+
let _ = self.certificate_handler.register_signatures("").await;
6463
}
6564
}
6665
}
@@ -76,8 +75,8 @@ mod tests {
7675
use crate::single_signer::{MockSingleSigner, SingleSignerError};
7776
use mithril_aggregator::fake_data;
7877

79-
#[test]
80-
fn signer_doesnt_sign_when_there_is_no_pending_certificate() {
78+
#[tokio::test]
79+
async fn signer_doesnt_sign_when_there_is_no_pending_certificate() {
8180
let party_id = "";
8281
let signing_key = "";
8382
let mut mock_certificate_handler = MockCertificateHandler::new();
@@ -96,11 +95,11 @@ mod tests {
9695
Box::new(mock_certificate_handler),
9796
Box::new(mock_single_signer),
9897
);
99-
assert!(signer.run().is_ok());
98+
assert!(signer.run().await.is_ok());
10099
}
101100

102-
#[test]
103-
fn signer_fails_when_pending_certificate_fails() {
101+
#[tokio::test]
102+
async fn signer_fails_when_pending_certificate_fails() {
104103
let party_id = "";
105104
let signing_key = "";
106105
let mut mock_certificate_handler = MockCertificateHandler::new();
@@ -117,12 +116,12 @@ mod tests {
117116
);
118117
assert_eq!(
119118
SignerError::RetrievePendingCertificateFailed("An Error".to_string()),
120-
signer.run().unwrap_err()
119+
signer.run().await.unwrap_err()
121120
);
122121
}
123122

124-
#[test]
125-
fn signer_sign_when_triggered_by_pending_certificate() {
123+
#[tokio::test]
124+
async fn signer_sign_when_triggered_by_pending_certificate() {
126125
let party_id = "";
127126
let signing_key = "";
128127
let mut mock_certificate_handler = MockCertificateHandler::new();
@@ -150,12 +149,12 @@ mod tests {
150149
Box::new(mock_certificate_handler),
151150
Box::new(mock_single_signer),
152151
);
153-
assert!(signer.run().is_ok());
154-
assert!(signer.run().is_ok());
152+
assert!(signer.run().await.is_ok());
153+
assert!(signer.run().await.is_ok());
155154
}
156155

157-
#[test]
158-
fn signer_sign_only_once_if_pending_certificate_has_not_changed() {
156+
#[tokio::test]
157+
async fn signer_sign_only_once_if_pending_certificate_has_not_changed() {
159158
let party_id = "";
160159
let signing_key = "";
161160
let mut mock_certificate_handler = MockCertificateHandler::new();
@@ -179,12 +178,12 @@ mod tests {
179178
Box::new(mock_certificate_handler),
180179
Box::new(mock_single_signer),
181180
);
182-
assert!(signer.run().is_ok());
183-
assert!(signer.run().is_ok());
181+
assert!(signer.run().await.is_ok());
182+
assert!(signer.run().await.is_ok());
184183
}
185184

186-
#[test]
187-
fn signer_does_not_send_signatures_if_none_are_computed() {
185+
#[tokio::test]
186+
async fn signer_does_not_send_signatures_if_none_are_computed() {
188187
let party_id = "";
189188
let signing_key = "";
190189
let mut mock_certificate_handler = MockCertificateHandler::new();
@@ -207,11 +206,11 @@ mod tests {
207206
Box::new(mock_certificate_handler),
208207
Box::new(mock_single_signer),
209208
);
210-
assert!(signer.run().is_ok());
209+
assert!(signer.run().await.is_ok());
211210
}
212211

213-
#[test]
214-
fn signer_fails_if_signature_computation_fails() {
212+
#[tokio::test]
213+
async fn signer_fails_if_signature_computation_fails() {
215214
let party_id = "";
216215
let signing_key = "";
217216
let mut mock_certificate_handler = MockCertificateHandler::new();
@@ -235,7 +234,7 @@ mod tests {
235234
SignerError::SingleSignaturesComputeFailed(
236235
SingleSignerError::UnregisteredVerificationKey().to_string()
237236
),
238-
signer.run().unwrap_err()
237+
signer.run().await.unwrap_err()
239238
);
240239
}
241240
}

0 commit comments

Comments
 (0)