Skip to content

Commit 3d22457

Browse files
committed
load membership from storage before catchup
1 parent c1e0659 commit 3d22457

File tree

28 files changed

+515
-185
lines changed

28 files changed

+515
-185
lines changed

crates/builder/src/non_permissioned.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ pub fn build_instance_state<V: Versions>(
7272
genesis.epoch_height.unwrap_or_default(),
7373
))),
7474
genesis.epoch_height.unwrap_or_default(),
75-
&Arc::new(sequencer::persistence::no_storage::NoStorage),
75+
Arc::new(sequencer::persistence::no_storage::NoStorage),
7676
);
7777

7878
NodeState::new(

crates/hotshot/example-types/src/membership/strict_membership.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ impl<
8080
{
8181
type Error = anyhow::Error;
8282
type StakeTableHash = NoStakeTableHash;
83+
type StakeTableMetadata = ();
8384
type Storage = TestStorage<TYPES>;
8485

8586
fn new<I: NodeImplementation<TYPES>>(
@@ -368,4 +369,14 @@ impl<
368369
self.inner
369370
.add_da_committee(first_epoch, committee.into_iter().map(Into::into).collect());
370371
}
372+
373+
fn insert_epoch_state(
374+
&mut self,
375+
epoch: TYPES::Epoch,
376+
_stake_table: HSStakeTable<TYPES>,
377+
_epoch_root: Option<TYPES::BlockHeader>,
378+
_metadata: Self::StakeTableMetadata,
379+
) {
380+
self.epochs.insert(epoch);
381+
}
371382
}

crates/hotshot/example-types/src/storage_types.rs

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use std::{
1212
},
1313
};
1414

15-
use anyhow::{anyhow, bail, Result};
15+
use anyhow::{anyhow, bail, ensure, Result};
1616
use async_lock::RwLock;
1717
use async_trait::async_trait;
1818
use hotshot_types::{
@@ -28,9 +28,10 @@ use hotshot_types::{
2828
LightClientStateUpdateCertificateV2, NextEpochQuorumCertificate2, QuorumCertificate2,
2929
UpgradeCertificate,
3030
},
31+
stake_table::HSStakeTable,
3132
traits::{
3233
node_implementation::{ConsensusTime, NodeType},
33-
storage::Storage,
34+
storage::{EpochStateStorage, Storage},
3435
},
3536
vote::HasViewNumber,
3637
};
@@ -174,6 +175,8 @@ impl<TYPES: NodeType> TestStorage<TYPES> {
174175

175176
#[async_trait]
176177
impl<TYPES: NodeType> Storage<TYPES> for TestStorage<TYPES> {
178+
type StakeTableMetadata = ();
179+
177180
async fn append_vid(&self, proposal: &Proposal<TYPES, ADVZDisperseShare<TYPES>>) -> Result<()> {
178181
if self.should_return_err.load(Ordering::Relaxed) {
179182
bail!("Failed to append VID proposal to storage");
@@ -426,41 +429,60 @@ impl<TYPES: NodeType> Storage<TYPES> for TestStorage<TYPES> {
426429

427430
Ok(())
428431
}
432+
}
429433

430-
async fn store_drb_result(&self, epoch: TYPES::Epoch, drb_result: DrbResult) -> Result<()> {
431-
let mut inner = self.inner.write().await;
432-
433-
inner.drb_results.insert(epoch, drb_result);
434-
435-
Ok(())
434+
#[async_trait]
435+
impl<TYPES: NodeType> EpochStateStorage<TYPES> for TestStorage<TYPES> {
436+
async fn load_epoch_root(&self, epoch: TYPES::Epoch) -> Result<Option<TYPES::BlockHeader>> {
437+
let inner = self.inner.read().await;
438+
Ok(inner.epoch_roots.get(&epoch).cloned())
436439
}
437440

438-
async fn store_epoch_root(
441+
async fn load_stake_table(
439442
&self,
440-
epoch: TYPES::Epoch,
441-
block_header: TYPES::BlockHeader,
442-
) -> Result<()> {
443-
let mut inner = self.inner.write().await;
444-
445-
inner.epoch_roots.insert(epoch, block_header);
443+
_epoch: TYPES::Epoch,
444+
) -> Result<Option<(HSStakeTable<TYPES>, Box<dyn std::any::Any + Send + Sync>)>> {
445+
Ok(None)
446+
}
446447

447-
Ok(())
448+
async fn load_drb_result(&self, epoch: TYPES::Epoch) -> Result<DrbResult> {
449+
match self.load_drb_input(*epoch).await {
450+
Ok(drb_input) => {
451+
ensure!(drb_input.iteration == drb_input.difficulty_level);
452+
Ok(drb_input.value)
453+
},
454+
Err(e) => Err(e),
455+
}
448456
}
449457

450458
async fn store_drb_input(&self, drb_input: DrbInput) -> Result<()> {
451459
let mut inner = self.inner.write().await;
452-
453460
inner.drb_inputs.insert(drb_input.epoch, drb_input);
454-
455461
Ok(())
456462
}
457463

458464
async fn load_drb_input(&self, epoch: u64) -> Result<DrbInput> {
459465
let inner = self.inner.read().await;
466+
inner
467+
.drb_inputs
468+
.get(&epoch)
469+
.cloned()
470+
.ok_or_else(|| anyhow!("DRB input not found for epoch {}", epoch))
471+
}
460472

461-
match inner.drb_inputs.get(&epoch) {
462-
Some(drb_input) => Ok(drb_input.clone()),
463-
None => Err(anyhow!("Missing DrbInput for epoch {}", epoch)),
464-
}
473+
async fn store_drb_result(&self, epoch: TYPES::Epoch, drb_result: DrbResult) -> Result<()> {
474+
let mut inner = self.inner.write().await;
475+
inner.drb_results.insert(epoch, drb_result);
476+
Ok(())
477+
}
478+
479+
async fn store_epoch_root(
480+
&self,
481+
epoch: TYPES::Epoch,
482+
block_header: TYPES::BlockHeader,
483+
) -> Result<()> {
484+
let mut inner = self.inner.write().await;
485+
inner.epoch_roots.insert(epoch, block_header);
486+
Ok(())
465487
}
466488
}

crates/hotshot/examples/infra/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ pub trait RunDa<
401401
state_sk,
402402
config.node_index,
403403
config.config,
404-
EpochMembershipCoordinator::new(membership, epoch_height, &storage.clone()),
404+
EpochMembershipCoordinator::new(membership, epoch_height, storage.clone()),
405405
network,
406406
initializer,
407407
ConsensusMetricsValue::default(),

crates/hotshot/hotshot/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ use hotshot_types::{
1919
simple_certificate::{CertificatePair, LightClientStateUpdateCertificateV2},
2020
traits::{
2121
block_contents::BlockHeader, election::Membership, network::BroadcastDelay,
22-
node_implementation::Versions, signature_key::StateSignatureKey, storage::Storage,
22+
node_implementation::Versions, signature_key::StateSignatureKey,
23+
storage::EpochStateStorage,
2324
},
2425
utils::{epoch_from_block_number, is_ge_epoch_root},
2526
};

crates/hotshot/task-impls/src/helpers.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use hotshot_types::{
4242
signature_key::{
4343
LCV2StateSignatureKey, LCV3StateSignatureKey, SignatureKey, StakeTableEntryType,
4444
},
45-
storage::Storage,
45+
storage::{EpochStateStorage, Storage},
4646
BlockPayload, ValidatedState,
4747
},
4848
utils::{

crates/hotshot/testing/src/helpers.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ where
142142
)));
143143

144144
let coordinator =
145-
EpochMembershipCoordinator::new(memberships, hotshot_config.epoch_height, &storage);
145+
EpochMembershipCoordinator::new(memberships, hotshot_config.epoch_height, storage.clone());
146146
let node_key_map = launcher.metadata.build_node_key_map();
147147

148148
let (c, s, r) = SystemContext::init(

crates/hotshot/testing/src/test_builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ pub async fn create_test_handle<
283283
let public_key = validator_config.public_key.clone();
284284
let state_private_key = validator_config.state_private_key.clone();
285285
let membership_coordinator =
286-
EpochMembershipCoordinator::new(memberships, config.epoch_height, &storage.clone());
286+
EpochMembershipCoordinator::new(memberships, config.epoch_height, storage.clone());
287287

288288
let behaviour = (metadata.behaviour)(node_id);
289289
match behaviour {

crates/hotshot/testing/src/test_runner.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ where
561561
EpochMembershipCoordinator::new(
562562
Arc::new(RwLock::new(memberships)),
563563
epoch_height,
564-
&storage.clone(),
564+
storage.clone(),
565565
),
566566
network,
567567
initializer,
@@ -602,7 +602,7 @@ where
602602
state_private_key,
603603
node_id,
604604
config,
605-
EpochMembershipCoordinator::new(memberships, epoch_height, &storage.clone()),
605+
EpochMembershipCoordinator::new(memberships, epoch_height, storage.clone()),
606606
network,
607607
initializer,
608608
ConsensusMetricsValue::default(),

crates/hotshot/testing/tests/tests_1/network_task.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ async fn test_network_task() {
7070
config.epoch_height,
7171
)));
7272
let coordinator =
73-
EpochMembershipCoordinator::new(membership, config.epoch_height, &storage.clone());
73+
EpochMembershipCoordinator::new(membership, config.epoch_height, storage.clone());
7474
let network_state: NetworkEventTaskState<TestTypes, TestVersions, MemoryNetwork<_>, _> =
7575
NetworkEventTaskState {
7676
id: node_id,
@@ -250,7 +250,7 @@ async fn test_network_storage_fail() {
250250
config.epoch_height,
251251
)));
252252
let coordinator =
253-
EpochMembershipCoordinator::new(membership, config.epoch_height, &storage.clone());
253+
EpochMembershipCoordinator::new(membership, config.epoch_height, storage.clone());
254254
let network_state: NetworkEventTaskState<TestTypes, TestVersions, MemoryNetwork<_>, _> =
255255
NetworkEventTaskState {
256256
id: node_id,

0 commit comments

Comments
 (0)