Skip to content

Commit 4b0ef20

Browse files
committed
[wip] add era checker to signer
1 parent 3fd4d50 commit 4b0ef20

File tree

14 files changed

+325
-136
lines changed

14 files changed

+325
-136
lines changed

mithril-aggregator/src/command_args.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use mithril_common::{
1515
CardanoImmutableDigester, ImmutableFileSystemObserver,
1616
},
1717
entities::{Epoch, HexEncodedGenesisSecretKey},
18-
era::{adapters::BootstrapAdapter as BootstrapEraReaderAdapter, EraChecker, EraReader},
18+
era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader},
1919
store::{adapter::SQLiteAdapter, StakeStore},
2020
BeaconProvider, BeaconProviderImpl,
2121
};
@@ -399,7 +399,7 @@ impl ServeCommand {
399399
));
400400

401401
// TODO: use EraReader when it is implemented to retrieve current era
402-
let era_reader = Arc::new(EraReader::new(Box::new(BootstrapEraReaderAdapter)));
402+
let era_reader = Arc::new(EraReader::new(Box::new(EraReaderBootstrapAdapter)));
403403
let era_epoch_token = era_reader
404404
.read_era_epoch_token(beacon_provider.get_current_beacon().await?.epoch)
405405
.await?;

mithril-aggregator/src/dependency.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ pub mod tests {
272272
chain_observer::FakeObserver,
273273
crypto_helper::{key_encode_hex, ProtocolGenesisSigner},
274274
digesters::{DumbImmutableDigester, DumbImmutableFileObserver},
275-
era::{adapters::BootstrapAdapter as BootstrapEraReaderAdapter, EraChecker, EraReader},
275+
era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader},
276276
store::{adapter::MemoryAdapter, StakeStore},
277277
test_utils::fake_data,
278278
BeaconProvider, BeaconProviderImpl, CardanoNetwork,
@@ -350,7 +350,7 @@ pub mod tests {
350350
chain_observer.clone(),
351351
verification_key_store.clone(),
352352
));
353-
let era_reader = Arc::new(EraReader::new(Box::new(BootstrapEraReaderAdapter)));
353+
let era_reader = Arc::new(EraReader::new(Box::new(EraReaderBootstrapAdapter)));
354354
let era_epoch_token = era_reader
355355
.read_era_epoch_token(beacon_provider.get_current_beacon().await.unwrap().epoch)
356356
.await

mithril-aggregator/tests/test_extensions/dependency.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use mithril_common::crypto_helper::{key_encode_hex, ProtocolGenesisSigner};
1010
use mithril_common::digesters::{DumbImmutableDigester, DumbImmutableFileObserver};
1111
use mithril_common::entities::ProtocolParameters;
1212
use mithril_common::era::EraReader;
13-
use mithril_common::era::{adapters::BootstrapAdapter as BootstrapEraReaderAdapter, EraChecker};
13+
use mithril_common::era::{adapters::EraReaderBootstrapAdapter, EraChecker};
1414
use mithril_common::store::adapter::MemoryAdapter;
1515
use mithril_common::store::StakeStore;
1616
use mithril_common::{BeaconProvider, BeaconProviderImpl, CardanoNetwork};
@@ -92,7 +92,7 @@ pub async fn initialize_dependencies(
9292
chain_observer.clone(),
9393
verification_key_store.clone(),
9494
));
95-
let era_reader = Arc::new(EraReader::new(Box::new(BootstrapEraReaderAdapter)));
95+
let era_reader = Arc::new(EraReader::new(Box::new(EraReaderBootstrapAdapter)));
9696
let era_epoch_token = era_reader
9797
.read_era_epoch_token(beacon_provider.get_current_beacon().await.unwrap().epoch)
9898
.await

mithril-common/src/era/adapters/bootstrap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub struct BootstrapAdapter;
1111

1212
#[async_trait]
1313
impl EraReaderAdapter for BootstrapAdapter {
14-
async fn read(&self) -> Result<Vec<EraMarker>, Box<dyn std::error::Error>> {
14+
async fn read(&self) -> Result<Vec<EraMarker>, Box<dyn std::error::Error + Sync + Send>> {
1515
Ok(vec![EraMarker::new(
1616
&SupportedEra::Thales.to_string(),
1717
Some(Epoch(1)),

mithril-common/src/era/adapters/dummy.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ impl DummyAdapter {
2020

2121
#[async_trait]
2222
impl EraReaderAdapter for DummyAdapter {
23-
async fn read(&self) -> Result<Vec<EraMarker>, Box<dyn Error>> {
23+
async fn read(&self) -> Result<Vec<EraMarker>, Box<dyn Error + Sync + Send>> {
2424
Ok(self.markers.clone())
2525
}
2626
}

mithril-common/src/era/adapters/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
mod bootstrap;
33
mod dummy;
44

5-
pub use bootstrap::BootstrapAdapter;
6-
pub use dummy::DummyAdapter;
5+
pub use bootstrap::BootstrapAdapter as EraReaderBootstrapAdapter;
6+
pub use dummy::DummyAdapter as EraReaderDummyAdapter;

mithril-common/src/era/era_checker.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ impl EraChecker {
2727
self.current_era_stamp.read().unwrap().era
2828
}
2929

30-
/// Retrieve the current Epoch
30+
/// Retrieve the Epoch the checker was the last updated.
3131
pub fn current_epoch(&self) -> Epoch {
3232
self.current_era_stamp.read().unwrap().epoch
3333
}

mithril-common/src/era/era_reader.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl EraMarker {
3030
#[async_trait]
3131
pub trait EraReaderAdapter: Sync + Send {
3232
/// Read era markers from the underlying adapter.
33-
async fn read(&self) -> Result<Vec<EraMarker>, Box<dyn StdError>>;
33+
async fn read(&self) -> Result<Vec<EraMarker>, Box<dyn StdError + Sync + Send>>;
3434
}
3535

3636
/// This is a response from the [EraReader]. It contains [EraMarker]s read from
@@ -102,7 +102,7 @@ pub enum EraReaderError {
102102
message: String,
103103

104104
/// nested underlying adapter error
105-
error: Box<dyn StdError>,
105+
error: Box<dyn StdError + Sync + Send>,
106106
},
107107

108108
/// Data returned from the adapter are inconsistent or incomplete preventing
@@ -163,7 +163,7 @@ impl EraReader {
163163

164164
#[cfg(test)]
165165
mod tests {
166-
use super::super::adapters::DummyAdapter;
166+
use super::super::adapters::EraReaderDummyAdapter as DummyAdapter;
167167
use super::*;
168168

169169
fn get_basic_marker_sample() -> Vec<EraMarker> {

mithril-signer/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
104104
debug!("Started"; "run_mode" => &args.run_mode, "config" => format!("{config:?}"));
105105

106106
let mut state_machine = StateMachine::new(
107-
SignerState::Unregistered(None),
107+
SignerState::Unregistered { epoch: None },
108108
Box::new(SignerRunner::new(config.clone(), services)),
109109
Duration::from_millis(config.run_interval),
110110
);

mithril-signer/src/runtime/runner.rs

Lines changed: 76 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ pub trait Runner {
8686
&self,
8787
maybe_signature: Option<SingleSignatures>,
8888
) -> Result<(), Box<dyn StdError + Sync + Send>>;
89+
90+
/// Read the current era and update the EraChecker.
91+
async fn update_era_checker(&self, epoch: Epoch)
92+
-> Result<(), Box<dyn StdError + Sync + Send>>;
8993
}
9094

9195
/// This type represents the errors thrown from the Runner.
@@ -429,6 +433,25 @@ impl Runner for SignerRunner {
429433
Ok(())
430434
}
431435
}
436+
437+
async fn update_era_checker(
438+
&self,
439+
epoch: Epoch,
440+
) -> Result<(), Box<dyn StdError + Sync + Send>> {
441+
let era_token = self
442+
.services
443+
.era_reader
444+
.read_era_epoch_token(epoch)
445+
.await
446+
.map_err(|e| Box::new(e))?;
447+
448+
self.services.era_checker.change_era(
449+
era_token.get_current_supported_era()?,
450+
era_token.get_current_epoch(),
451+
);
452+
453+
Ok(())
454+
}
432455
}
433456

434457
#[cfg(test)]
@@ -438,7 +461,7 @@ mod tests {
438461
crypto_helper::ProtocolInitializer,
439462
digesters::{DumbImmutableDigester, DumbImmutableFileObserver},
440463
entities::{Epoch, StakeDistribution},
441-
era::{EraChecker, SupportedEra},
464+
era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader},
442465
store::{
443466
adapter::{DumbStoreAdapter, MemoryAdapter},
444467
StakeStore, StakeStorer,
@@ -467,34 +490,45 @@ mod tests {
467490
}
468491
}
469492

470-
fn init_services() -> SignerServices {
493+
async fn init_services() -> SignerServices {
471494
let adapter: MemoryAdapter<Epoch, ProtocolInitializer> = MemoryAdapter::new(None).unwrap();
472495
let chain_observer = Arc::new(FakeObserver::default());
473-
let era_checker = Arc::new(EraChecker::new(SupportedEra::dummy()));
496+
let beacon_provider = Arc::new(BeaconProviderImpl::new(
497+
chain_observer.clone(),
498+
Arc::new(DumbImmutableFileObserver::default()),
499+
CardanoNetwork::TestNet(42),
500+
));
501+
let era_reader = Arc::new(EraReader::new(Box::new(EraReaderBootstrapAdapter)));
502+
let era_epoch_token = era_reader
503+
.read_era_epoch_token(beacon_provider.get_current_beacon().await.unwrap().epoch)
504+
.await
505+
.unwrap();
506+
let era_checker = Arc::new(EraChecker::new(
507+
era_epoch_token.get_current_supported_era().unwrap(),
508+
era_epoch_token.get_current_epoch(),
509+
));
510+
474511
SignerServices {
475512
stake_store: Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)),
476513
certificate_handler: Arc::new(DumbCertificateHandler::default()),
477-
chain_observer: chain_observer.clone(),
514+
chain_observer,
478515
digester: Arc::new(DumbImmutableDigester::new(DIGESTER_RESULT, true)),
479516
single_signer: Arc::new(MithrilSingleSigner::new("1".to_string())),
480-
beacon_provider: Arc::new(BeaconProviderImpl::new(
481-
chain_observer,
482-
Arc::new(DumbImmutableFileObserver::default()),
483-
CardanoNetwork::TestNet(42),
484-
)),
517+
beacon_provider,
485518
protocol_initializer_store: Arc::new(ProtocolInitializerStore::new(
486519
Box::new(adapter),
487520
None,
488521
)),
489522
era_checker,
523+
era_reader,
490524
}
491525
}
492526

493-
fn init_runner(
527+
async fn init_runner(
494528
maybe_services: Option<SignerServices>,
495529
maybe_config: Option<Config>,
496530
) -> SignerRunner {
497-
let services = init_services();
531+
let services = init_services().await;
498532
let config = Config {
499533
aggregator_endpoint: "http://0.0.0.0:3000".to_string(),
500534
cardano_cli_path: PathBuf::new(),
@@ -520,15 +554,15 @@ mod tests {
520554

521555
#[tokio::test]
522556
async fn test_get_current_beacon() {
523-
let mut services = init_services();
557+
let mut services = init_services().await;
524558
let expected = fake_data::beacon();
525559
let mut beacon_provider = MockFakeBeaconProvider::new();
526560
beacon_provider
527561
.expect_get_current_beacon()
528562
.once()
529563
.returning(|| Ok(fake_data::beacon()));
530564
services.beacon_provider = Arc::new(beacon_provider);
531-
let runner = init_runner(Some(services), None);
565+
let runner = init_runner(Some(services), None).await;
532566

533567
assert_eq!(
534568
expected,
@@ -541,15 +575,15 @@ mod tests {
541575

542576
#[tokio::test]
543577
async fn test_update_stake_distribution() {
544-
let services = init_services();
578+
let services = init_services().await;
545579
let stake_store = services.stake_store.clone();
546580
let current_epoch = services
547581
.chain_observer
548582
.get_current_epoch()
549583
.await
550584
.expect("chain observer should not fail")
551585
.expect("the observer should return an epoch");
552-
let runner = init_runner(Some(services), None);
586+
let runner = init_runner(Some(services), None).await;
553587
assert!(stake_store
554588
.get_stakes(current_epoch)
555589
.await
@@ -572,7 +606,7 @@ mod tests {
572606

573607
#[tokio::test]
574608
async fn test_register_signer_to_aggregator() {
575-
let mut services = init_services();
609+
let mut services = init_services().await;
576610
let certificate_handler = Arc::new(DumbCertificateHandler::default());
577611
services.certificate_handler = certificate_handler.clone();
578612
let protocol_initializer_store = services.protocol_initializer_store.clone();
@@ -595,7 +629,7 @@ mod tests {
595629
.save_stakes(epoch, stakes)
596630
.await
597631
.unwrap();
598-
let runner = init_runner(Some(services), None);
632+
let runner = init_runner(Some(services), None).await;
599633
let epoch = chain_observer
600634
.current_beacon
601635
.read()
@@ -630,9 +664,9 @@ mod tests {
630664

631665
#[tokio::test]
632666
async fn test_can_i_sign() {
633-
let services = init_services();
667+
let services = init_services().await;
634668
let protocol_initializer_store = services.protocol_initializer_store.clone();
635-
let runner = init_runner(Some(services), None);
669+
let runner = init_runner(Some(services), None).await;
636670
let mut pending_certificate = fake_data::certificate_pending();
637671
let epoch = pending_certificate.beacon.epoch;
638672
let mut signer = &mut pending_certificate.signers[0];
@@ -657,9 +691,9 @@ mod tests {
657691

658692
#[tokio::test]
659693
async fn test_associate_signers_with_stake() {
660-
let services = init_services();
694+
let services = init_services().await;
661695
let stake_store = services.stake_store.clone();
662-
let runner = init_runner(Some(services), None);
696+
let runner = init_runner(Some(services), None).await;
663697
let epoch = Epoch(12);
664698
let expected = fake_data::signers_with_stakes(5);
665699
let signers = expected
@@ -687,7 +721,7 @@ mod tests {
687721

688722
#[tokio::test]
689723
async fn test_compute_message() {
690-
let mut services = init_services();
724+
let mut services = init_services().await;
691725
let current_beacon = services
692726
.beacon_provider
693727
.get_current_beacon()
@@ -722,7 +756,7 @@ mod tests {
722756
.expect("an avk should have been computed");
723757
expected.set_message_part(ProtocolMessagePartKey::NextAggregateVerificationKey, avk);
724758

725-
let runner = init_runner(Some(services), None);
759+
let runner = init_runner(Some(services), None).await;
726760
let message = runner
727761
.compute_message(&current_beacon, &next_signers)
728762
.await
@@ -733,7 +767,7 @@ mod tests {
733767

734768
#[tokio::test]
735769
async fn test_compute_single_signature() {
736-
let mut services = init_services();
770+
let mut services = init_services().await;
737771
let current_beacon = services
738772
.beacon_provider
739773
.get_current_beacon()
@@ -773,7 +807,7 @@ mod tests {
773807
.compute_single_signatures(&message, &signers, &protocol_initializer)
774808
.expect("compute_single_signatures should not fail");
775809

776-
let runner = init_runner(Some(services), None);
810+
let runner = init_runner(Some(services), None).await;
777811
let single_signature = runner
778812
.compute_single_signature(current_beacon.epoch, &message, &signers)
779813
.await
@@ -783,18 +817,33 @@ mod tests {
783817

784818
#[tokio::test]
785819
async fn test_send_single_signature() {
786-
let mut services = init_services();
820+
let mut services = init_services().await;
787821
let mut certificate_handler = MockCertificateHandler::new();
788822
certificate_handler
789823
.expect_register_signatures()
790824
.once()
791825
.returning(|_| Ok(()));
792826
services.certificate_handler = Arc::new(certificate_handler);
793-
let runner = init_runner(Some(services), None);
827+
let runner = init_runner(Some(services), None).await;
794828

795829
runner
796830
.send_single_signature(Some(fake_data::single_signatures(vec![2, 5, 12])))
797831
.await
798832
.expect("send_single_signature should not fail");
799833
}
834+
835+
#[tokio::test]
836+
async fn test_update_era_checker() {
837+
let services = init_services().await;
838+
let beacon_provider = services.beacon_provider.clone();
839+
let era_checker = services.era_checker.clone();
840+
let mut beacon = beacon_provider.get_current_beacon().await.unwrap();
841+
842+
assert_eq!(beacon.epoch, era_checker.current_epoch());
843+
let runner = init_runner(Some(services), None).await;
844+
beacon.epoch += 1;
845+
runner.update_era_checker(beacon.epoch).await.unwrap();
846+
847+
assert_eq!(beacon.epoch, era_checker.current_epoch());
848+
}
800849
}

0 commit comments

Comments
 (0)