Skip to content

Commit af2ba9e

Browse files
committed
add immutable signer builder
1 parent aec981c commit af2ba9e

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use std::sync::Arc;
2+
3+
use async_trait::async_trait;
4+
use mithril_common::{
5+
digesters::ImmutableDigester,
6+
entities::{Beacon, ProtocolMessage, ProtocolMessagePartKey},
7+
signable_builder::SignableBuilder,
8+
StdResult,
9+
};
10+
11+
pub struct ImmutableSignableBuilder {
12+
immutable_digester: Arc<dyn ImmutableDigester>,
13+
}
14+
15+
impl ImmutableSignableBuilder {
16+
/// Constructor
17+
pub fn new(immutable_digester: Arc<dyn ImmutableDigester>) -> Self {
18+
Self { immutable_digester }
19+
}
20+
}
21+
22+
#[async_trait]
23+
impl SignableBuilder<Beacon, ProtocolMessage> for ImmutableSignableBuilder {
24+
async fn compute_signable(&self, beacon: Beacon) -> StdResult<ProtocolMessage> {
25+
let digest = self.immutable_digester.compute_digest(&beacon).await?;
26+
let mut protocol_message = ProtocolMessage::new();
27+
protocol_message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, digest);
28+
29+
Ok(protocol_message)
30+
}
31+
}
32+
33+
#[cfg(test)]
34+
mod tests {
35+
use super::*;
36+
37+
use async_trait::async_trait;
38+
use mithril_common::digesters::{ImmutableDigester, ImmutableDigesterError};
39+
use mithril_common::entities::Beacon;
40+
41+
#[derive(Default)]
42+
pub struct ImmutableDigesterImpl;
43+
44+
#[async_trait]
45+
impl ImmutableDigester for ImmutableDigesterImpl {
46+
async fn compute_digest(&self, beacon: &Beacon) -> Result<String, ImmutableDigesterError> {
47+
Ok(format!("immutable {}", beacon.immutable_file_number))
48+
}
49+
}
50+
#[tokio::test]
51+
async fn compute_signable() {
52+
let digester = ImmutableDigesterImpl::default();
53+
let signable_builder = ImmutableSignableBuilder::new(Arc::new(digester));
54+
let protocol_message = signable_builder
55+
.compute_signable(Beacon::default())
56+
.await
57+
.unwrap();
58+
59+
assert_eq!(
60+
&"immutable 0".to_string(),
61+
protocol_message
62+
.get_message_part(&ProtocolMessagePartKey::SnapshotDigest)
63+
.unwrap()
64+
);
65+
}
66+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
//! The module used for building signables
22
3+
mod immutable_signable_builder;
34
mod mithril_stake_distribution;
45
mod signable_builder_service;
56

7+
pub use immutable_signable_builder::*;
68
pub use mithril_stake_distribution::*;
79
pub use signable_builder_service::*;

mithril-common/src/entities/beacon.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::entities::{Epoch, ImmutableFileNumber};
2+
use crate::signable_builder::Beacon as Beaconable;
23
use serde::{Deserialize, Serialize};
34
use sha2::{Digest, Sha256};
45
use std::cmp::Ordering;
@@ -18,6 +19,8 @@ pub struct Beacon {
1819
pub immutable_file_number: ImmutableFileNumber,
1920
}
2021

22+
impl Beaconable for Beacon {}
23+
2124
/// A BeaconComparison is the result of the comparison between a beacon and an oldest beacon.
2225
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
2326
pub enum BeaconComparison {

0 commit comments

Comments
 (0)