Skip to content

Commit 2d55a0b

Browse files
committed
Remove associate_signers_with_stake from runner and improve epoch_service implementation
1 parent 1c31204 commit 2d55a0b

File tree

5 files changed

+83
-163
lines changed

5 files changed

+83
-163
lines changed

mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use mithril_common::entities::CardanoDbBeacon;
22
use mithril_common::{
3-
entities::{CertificatePending, SignedEntityType, Signer},
3+
entities::{CertificatePending, SignedEntityType},
44
messages::{CertificatePendingMessage, SignerMessagePart},
55
};
66

mithril-aggregator/src/message_adapters/to_epoch_settings_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use mithril_common::entities::{EpochSettings, Signer};
1+
use mithril_common::entities::EpochSettings;
22
use mithril_common::messages::{EpochSettingsMessage, SignerMessagePart, ToMessageAdapter};
33

44
/// Adapter to spawn [EpochSettingsMessage] from [EpochSettings] instances.

mithril-signer/src/runtime/runner.rs

Lines changed: 2 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use anyhow::Context;
22
use async_trait::async_trait;
3-
use slog_scope::{debug, info, trace, warn};
3+
use slog_scope::{debug, info, warn};
44
use thiserror::Error;
55

66
#[cfg(test)]
@@ -55,14 +55,6 @@ pub trait Runner: Send + Sync {
5555
/// Register epoch information
5656
async fn inform_epoch_settings(&self, epoch_settings: EpochSettings) -> StdResult<()>;
5757

58-
/// From a list of signers, associate them with the stake read on the
59-
/// Cardano node.
60-
async fn associate_signers_with_stake(
61-
&self,
62-
epoch: Epoch,
63-
signers: &[Signer],
64-
) -> StdResult<Vec<SignerWithStake>>;
65-
6658
/// Create the message to be signed with the single signature.
6759
async fn compute_message(
6860
&self,
@@ -164,8 +156,6 @@ impl Runner for SignerRunner {
164156
.cloned()
165157
}
166158

167-
// TODO do we need to be async ?
168-
// TODO do we return a vec or a &vec ?
169159
async fn get_next_signers(&self) -> StdResult<Vec<Signer>> {
170160
debug!("RUNNER: get_next_signers");
171161

@@ -359,45 +349,6 @@ impl Runner for SignerRunner {
359349
.await
360350
}
361351

362-
// TODO do it in EpochService and store SignerWithStack
363-
// Inject stake_store in EpochService (epoch + current protocol parameters)
364-
async fn associate_signers_with_stake(
365-
&self,
366-
epoch: Epoch,
367-
signers: &[Signer],
368-
) -> StdResult<Vec<SignerWithStake>> {
369-
debug!("RUNNER: associate_signers_with_stake");
370-
371-
let stakes = self
372-
.services
373-
.stake_store
374-
.get_stakes(epoch)
375-
.await?
376-
.ok_or_else(|| RunnerError::NoValueError(format!("stakes at epoch {epoch}")))?;
377-
let mut signers_with_stake = vec![];
378-
379-
for signer in signers {
380-
let stake = stakes
381-
.get(&*signer.party_id)
382-
.ok_or_else(|| RunnerError::NoStakeForSigner(signer.party_id.to_string()))?;
383-
384-
signers_with_stake.push(SignerWithStake::new(
385-
signer.party_id.to_owned(),
386-
signer.verification_key.to_owned(),
387-
signer.verification_key_signature.to_owned(),
388-
signer.operational_certificate.to_owned(),
389-
signer.kes_period.to_owned(),
390-
*stake,
391-
));
392-
trace!(
393-
" > associating signer_id {} with stake {}",
394-
signer.party_id,
395-
*stake
396-
);
397-
}
398-
Ok(signers_with_stake)
399-
}
400-
401352
async fn compute_message(
402353
&self,
403354
signed_entity_type: &SignedEntityType,
@@ -551,7 +502,7 @@ mod tests {
551502
MKMap, MKMapNode, MKTreeNode, MKTreeStoreInMemory, MKTreeStorer, ProtocolInitializer,
552503
},
553504
digesters::{DumbImmutableDigester, DumbImmutableFileObserver},
554-
entities::{BlockNumber, BlockRange, CardanoDbBeacon, Epoch, StakeDistribution},
505+
entities::{BlockNumber, BlockRange, CardanoDbBeacon, Epoch},
555506
era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader},
556507
signable_builder::{
557508
BlockRangeRootRetriever, CardanoImmutableFilesFullSignableBuilder,
@@ -857,36 +808,6 @@ mod tests {
857808
);
858809
}
859810

860-
#[tokio::test]
861-
async fn test_associate_signers_with_stake() {
862-
let services = init_services().await;
863-
let stake_store = services.stake_store.clone();
864-
let runner = init_runner(Some(services), None).await;
865-
let epoch = Epoch(12);
866-
let expected = fake_data::signers_with_stakes(5);
867-
let signers = expected
868-
.clone()
869-
.into_iter()
870-
.map(|s| s.into())
871-
.collect::<Vec<_>>();
872-
let stake_distribution = expected
873-
.clone()
874-
.iter()
875-
.map(|s| s.into())
876-
.collect::<StakeDistribution>();
877-
878-
stake_store
879-
.save_stakes(epoch, stake_distribution)
880-
.await
881-
.expect("save_stakes should not fail");
882-
883-
let result = runner
884-
.associate_signers_with_stake(epoch, &signers)
885-
.await
886-
.expect("associate_signers_with_stake should not fail");
887-
assert_eq!(expected, result);
888-
}
889-
890811
#[tokio::test]
891812
async fn test_compute_message() {
892813
let mut services = init_services().await;

mithril-signer/src/runtime/state_machine.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,6 @@ impl StateMachine {
295295
})
296296
}
297297

298-
// TODO do we remove epoch_settings information when unregistered ???
299298
async fn transition_from_signed_to_unregistered(
300299
&self,
301300
epoch: Epoch,
@@ -518,7 +517,6 @@ mod tests {
518517
epoch: Epoch(3),
519518
protocol_parameters: fake_data::protocol_parameters(),
520519
next_protocol_parameters: fake_data::protocol_parameters(),
521-
// TODO : put some data ?
522520
current_signers: vec![],
523521
next_signers: vec![],
524522
};
@@ -555,7 +553,6 @@ mod tests {
555553
.once()
556554
.returning(|| Ok(Some(fake_data::epoch_settings())));
557555

558-
// TODO do we check the epoch_setting is the one returning by get_epoch_settings
559556
runner
560557
.expect_inform_epoch_settings()
561558
.with(predicate::eq(fake_data::epoch_settings()))

mithril-signer/src/services/epoch_service.rs

Lines changed: 79 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ impl MithrilEpochService {
8080
}
8181
}
8282

83-
// TODO do it in EpochService and store SignerWithStack
84-
// Inject stake_store in EpochService (epoch + current protocol parameters)
8583
async fn associate_signers_with_stake(
8684
&self,
8785
epoch: Epoch,
@@ -162,24 +160,20 @@ impl EpochService for MithrilEpochService {
162160

163161
async fn current_signers_with_stake(&self) -> StdResult<Vec<SignerWithStake>> {
164162
let current_epoch = self.epoch_of_current_data()?;
165-
let (retrieval_epoch, _next_retrieval_epoch) = (
163+
self.associate_signers_with_stake(
166164
current_epoch.offset_to_signer_retrieval_epoch()?,
167-
current_epoch.offset_to_next_signer_retrieval_epoch(),
168-
);
169-
let current_signers = self.current_signers()?;
170-
self.associate_signers_with_stake(retrieval_epoch, current_signers)
171-
.await
165+
self.current_signers()?,
166+
)
167+
.await
172168
}
173169

174170
async fn next_signers_with_stake(&self) -> StdResult<Vec<SignerWithStake>> {
175171
let current_epoch = self.epoch_of_current_data()?;
176-
let (_retrieval_epoch, _next_retrieval_epoch) = (
177-
current_epoch.offset_to_signer_retrieval_epoch()?,
172+
self.associate_signers_with_stake(
178173
current_epoch.offset_to_next_signer_retrieval_epoch(),
179-
);
180-
let next_signers = self.next_signers()?;
181-
self.associate_signers_with_stake(_next_retrieval_epoch, next_signers)
182-
.await
174+
self.next_signers()?,
175+
)
176+
.await
183177
}
184178
}
185179

@@ -191,12 +185,15 @@ mod tests {
191185

192186
use mithril_common::{
193187
entities::{Epoch, EpochSettings, StakeDistribution},
194-
test_utils::fake_data,
188+
test_utils::fake_data::{self},
189+
};
190+
use mithril_persistence::store::{
191+
adapter::{DumbStoreAdapter, MemoryAdapter},
192+
StakeStore, StakeStorer,
195193
};
196-
use mithril_persistence::store::{adapter::DumbStoreAdapter, StakeStore, StakeStorer};
197194

198195
#[tokio::test]
199-
async fn test_signers_are_not_available_before_register_epoch_settings_was_call() {
196+
async fn test_retrieve_data_return_error_before_register_epoch_settings_was_call() {
200197
let epoch = Epoch(12);
201198
// Signers and stake distribution
202199
let signers = fake_data::signers(10);
@@ -215,12 +212,16 @@ mod tests {
215212

216213
// Build service and register epoch settings
217214
let service = MithrilEpochService::new(stake_store);
215+
assert!(service.epoch_of_current_data().is_err());
216+
assert!(service.next_protocol_parameters().is_err());
218217
assert!(service.current_signers().is_err());
219218
assert!(service.next_signers().is_err());
219+
assert!(service.current_signers_with_stake().await.is_err());
220+
assert!(service.next_signers_with_stake().await.is_err());
220221
}
221222

222223
#[tokio::test]
223-
async fn test_signers_are_available_after_register_epoch_settings_call() {
224+
async fn test_data_are_available_after_register_epoch_settings_call() {
224225
let epoch = Epoch(12);
225226
// Signers and stake distribution
226227
let signers = fake_data::signers(10);
@@ -245,15 +246,19 @@ mod tests {
245246
.unwrap();
246247

247248
// Check current_signers
248-
let current_signers = service.current_signers().unwrap();
249-
let expected_current_signers = epoch_settings.current_signers.clone();
250-
assert_eq!(expected_current_signers, *current_signers);
251-
249+
{
250+
let current_signers = service.current_signers().unwrap();
251+
let expected_current_signers = epoch_settings.current_signers.clone();
252+
assert_eq!(expected_current_signers, *current_signers);
253+
}
252254
// Check next_signers
253-
let next_signers = service.next_signers().unwrap();
254-
let expected_next_signers = epoch_settings.next_signers.clone();
255-
assert_eq!(expected_next_signers, *next_signers);
255+
{
256+
let next_signers = service.next_signers().unwrap();
257+
let expected_next_signers = epoch_settings.next_signers.clone();
258+
assert_eq!(expected_next_signers, *next_signers);
259+
}
256260

261+
// Check other data
257262
assert_eq!(
258263
epoch_settings.epoch,
259264
service.epoch_of_current_data().unwrap()
@@ -264,78 +269,75 @@ mod tests {
264269
);
265270
}
266271

267-
// TODO try to simplify this test
268272
#[tokio::test]
269273
async fn test_signers_with_stake_are_available_after_register_epoch_settings_call() {
274+
fn build_stake_distribution(signers: &Vec<Signer>, first_stake: u64) -> StakeDistribution {
275+
signers
276+
.iter()
277+
.enumerate()
278+
.map(|(i, signer)| (signer.party_id.clone(), first_stake + i as u64))
279+
.collect()
280+
}
281+
270282
let epoch = Epoch(12);
283+
271284
// Signers and stake distribution
272285
let signers = fake_data::signers(10);
273-
274-
// Init stake_store
275-
let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None));
286+
let stake_distribution: StakeDistribution = build_stake_distribution(&signers, 100);
287+
let next_stake_distribution: StakeDistribution = build_stake_distribution(&signers, 500);
288+
289+
let stake_store = Arc::new(StakeStore::new(
290+
Box::new(
291+
MemoryAdapter::<Epoch, StakeDistribution>::new(Some(vec![
292+
(
293+
epoch.offset_to_signer_retrieval_epoch().unwrap(),
294+
stake_distribution.clone(),
295+
),
296+
(
297+
epoch.offset_to_next_signer_retrieval_epoch(),
298+
next_stake_distribution.clone(),
299+
),
300+
]))
301+
.unwrap(),
302+
),
303+
None,
304+
));
276305

277306
// Epoch settings
278-
let epoch_settings = fake_data::epoch_settings();
279307
let epoch_settings = EpochSettings {
280308
epoch,
281309
current_signers: signers[2..5].to_vec(),
282310
next_signers: signers[3..7].to_vec(),
283-
..epoch_settings.clone()
311+
..fake_data::epoch_settings().clone()
284312
};
313+
285314
// Build service and register epoch settings
286-
let mut service = MithrilEpochService::new(stake_store.clone());
315+
let mut service = MithrilEpochService::new(stake_store);
287316
service
288317
.inform_epoch_settings(epoch_settings.clone())
289318
.await
290319
.unwrap();
291320

292-
// Check current_signers
293-
let stake_distribution: StakeDistribution = signers
294-
.iter()
295-
.enumerate()
296-
.map(|(i, signer)| (signer.party_id.clone(), (i + 1) as u64 * 100))
297-
.collect();
298-
stake_store
299-
.save_stakes(
300-
epoch.offset_to_signer_retrieval_epoch().unwrap(),
301-
stake_distribution.clone(),
302-
)
303-
.await
304-
.expect("save_stakes should not fail");
305-
let current_signers = service.current_signers_with_stake().await.unwrap();
306-
let expected_current_signers = epoch_settings.current_signers.clone();
307-
assert_eq!(expected_current_signers.len(), current_signers.len());
308-
for signer in current_signers {
309-
assert_eq!(
310-
stake_distribution.get(&signer.party_id).unwrap(),
311-
&signer.stake
312-
);
321+
// Check current signers with stake
322+
{
323+
let current_signers = service.current_signers_with_stake().await.unwrap();
324+
325+
assert_eq!(epoch_settings.current_signers.len(), current_signers.len());
326+
for signer in current_signers {
327+
let expected_stake = stake_distribution.get(&signer.party_id).unwrap();
328+
assert_eq!(expected_stake, &signer.stake);
329+
}
313330
}
314331

315-
// Check next_signers
316-
let next_stake_distribution: StakeDistribution = signers
317-
.iter()
318-
.enumerate()
319-
.map(|(i, signer)| (signer.party_id.clone(), (i + 1) as u64 * 1000))
320-
.collect();
321-
stake_store
322-
.save_stakes(
323-
epoch.offset_to_next_signer_retrieval_epoch(),
324-
next_stake_distribution.clone(),
325-
)
326-
.await
327-
.expect("save_stakes should not fail");
328-
let next_signers = service.next_signers_with_stake().await.unwrap();
329-
let expected_next_signers = epoch_settings.next_signers.clone();
330-
assert_eq!(expected_next_signers.len(), next_signers.len());
331-
for signer in next_signers {
332-
assert_eq!(
333-
next_stake_distribution.get(&signer.party_id).unwrap(),
334-
&signer.stake
335-
);
332+
// Check next signers with stake
333+
{
334+
let next_signers = service.next_signers_with_stake().await.unwrap();
335+
336+
assert_eq!(epoch_settings.next_signers.len(), next_signers.len());
337+
for signer in next_signers {
338+
let expected_stake = next_stake_distribution.get(&signer.party_id).unwrap();
339+
assert_eq!(expected_stake, &signer.stake);
340+
}
336341
}
337342
}
338-
339-
// TODO check update of signer after register_epoch_settings call
340-
// TODO should we provide a "reset" function ?
341343
}

0 commit comments

Comments
 (0)