Skip to content

Commit

Permalink
compiles again
Browse files Browse the repository at this point in the history
Fix compile errors

  * fix some calls to is_valid_cert
  * add `da_stake` method
  * cargo fmt happened
  • Loading branch information
tbro committed Nov 15, 2024
1 parent 41488c8 commit c67fb3a
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 97 deletions.
10 changes: 10 additions & 0 deletions crates/hotshot/src/traits/election/randomized_committee.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,16 @@ impl<TYPES: NodeType> Membership<TYPES> for RandomizedCommittee<TYPES> {
self.indexed_stake_table.get(pub_key).cloned()
}

/// Get the stake table entry for a public key
fn da_stake(
&self,
pub_key: &<TYPES as NodeType>::SignatureKey,
_epoch: <TYPES as NodeType>::Epoch,
) -> Option<<TYPES::SignatureKey as SignatureKey>::StakeTableEntry> {
// Only return the stake if it is above zero
self.indexed_da_stake_table.get(pub_key).cloned()
}

/// Check if a node has stake in the committee
fn has_stake(
&self,
Expand Down
10 changes: 10 additions & 0 deletions crates/hotshot/src/traits/election/static_committee.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,16 @@ impl<TYPES: NodeType> Membership<TYPES> for StaticCommittee<TYPES> {
self.indexed_stake_table.get(pub_key).cloned()
}

/// Get the DA stake table entry for a public key
fn da_stake(
&self,
pub_key: &<TYPES as NodeType>::SignatureKey,
_epoch: <TYPES as NodeType>::Epoch,
) -> Option<<TYPES::SignatureKey as SignatureKey>::StakeTableEntry> {
// Only return the stake if it is above zero
self.indexed_da_stake_table.get(pub_key).cloned()
}

/// Check if a node has stake in the committee
fn has_stake(
&self,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,16 @@ impl<TYPES: NodeType> Membership<TYPES> for StaticCommitteeLeaderForTwoViews<TYP
self.indexed_stake_table.get(pub_key).cloned()
}

/// Get DA the stake table entry for a public key
fn da_stake(
&self,
pub_key: &<TYPES as NodeType>::SignatureKey,
_epoch: <TYPES as NodeType>::Epoch,
) -> Option<<TYPES::SignatureKey as SignatureKey>::StakeTableEntry> {
// Only return the stake if it is above zero
self.indexed_da_stake_table.get(pub_key).cloned()
}

/// Check if a node has stake in the committee
fn has_stake(
&self,
Expand Down
2 changes: 1 addition & 1 deletion crates/task-impls/src/consensus/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ pub async fn send_high_qc<TYPES: NodeType, V: Versions, I: NodeImplementation<TY
);
let high_qc = task_state.consensus.read().await.high_qc().clone();
let leader = task_state
.quorum_membership
.membership
.leader(new_view_number, TYPES::Epoch::new(0))?;
broadcast_event(Arc::new(HotShotEvent::HighQcSend(high_qc, leader)), sender).await;
Ok(())
Expand Down
9 changes: 7 additions & 2 deletions crates/task-impls/src/quorum_proposal/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use std::{
marker::PhantomData,
num::NonZeroU64,
sync::Arc,
time::{Duration, Instant},
};
Expand All @@ -29,6 +30,7 @@ use hotshot_types::{
simple_certificate::{QuorumCertificate, UpgradeCertificate},
traits::{
block_contents::BlockHeader,
election::Membership,
node_implementation::{ConsensusTime, NodeType},
signature_key::SignatureKey,
},
Expand Down Expand Up @@ -122,8 +124,11 @@ impl<TYPES: NodeType, V: Versions> ProposalDependencyHandle<TYPES, V> {
if let HotShotEvent::HighQcRecv(qc, _sender) = event.as_ref() {
if qc
.is_valid_cert(
self.quorum_membership.as_ref(),
TYPES::Epoch::new(0),
self.quorum_membership.stake_table(TYPES::Epoch::new(0)),
NonZeroU64::new(QuorumCertificate::<TYPES>::threshold(
self.quorum_membership.as_ref(),
))
.unwrap(),
&self.upgrade_lock,
)
.await
Expand Down
191 changes: 97 additions & 94 deletions crates/task-impls/src/quorum_proposal/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
// You should have received a copy of the MIT License
// along with the HotShot repository. If not, see <https://mit-license.org/>.

use std::{collections::BTreeMap, sync::Arc, time::Instant};
use std::{collections::BTreeMap, num::NonZeroU64, sync::Arc, time::Instant};

use async_broadcast::{Receiver, Sender};
use async_lock::RwLock;
Expand Down Expand Up @@ -176,97 +176,97 @@ impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions>

/// Creates the requisite dependencies for the Quorum Proposal task. It also handles any event forwarding.
fn create_and_complete_dependencies(
&self,
view_number: TYPES::View,
event_receiver: &Receiver<Arc<HotShotEvent<TYPES>>>,
event: Arc<HotShotEvent<TYPES>>,
) -> AndDependency<Vec<Vec<Arc<HotShotEvent<TYPES>>>>> {
let mut proposal_dependency = self.create_event_dependency(
ProposalDependency::Proposal,
view_number,
event_receiver.clone(),
);

let mut qc_dependency = self.create_event_dependency(
ProposalDependency::Qc,
view_number,
event_receiver.clone(),
);

let mut view_sync_dependency = self.create_event_dependency(
ProposalDependency::ViewSyncCert,
view_number,
event_receiver.clone(),
);

let mut timeout_dependency = self.create_event_dependency(
ProposalDependency::TimeoutCert,
view_number,
event_receiver.clone(),
);

let mut payload_commitment_dependency = self.create_event_dependency(
ProposalDependency::PayloadAndMetadata,
view_number,
event_receiver.clone(),
);

let mut vid_share_dependency = self.create_event_dependency(
ProposalDependency::VidShare,
view_number,
event_receiver.clone(),
);

match event.as_ref() {
HotShotEvent::SendPayloadCommitmentAndMetadata(..) => {
payload_commitment_dependency.mark_as_completed(Arc::clone(&event));
}
HotShotEvent::QuorumProposalPreliminarilyValidated(..) => {
proposal_dependency.mark_as_completed(event);
}
HotShotEvent::QcFormed(quorum_certificate) => match quorum_certificate {
Either::Right(_) => {
timeout_dependency.mark_as_completed(event);
&self,
view_number: TYPES::View,
event_receiver: &Receiver<Arc<HotShotEvent<TYPES>>>,
event: Arc<HotShotEvent<TYPES>>,
) -> AndDependency<Vec<Vec<Arc<HotShotEvent<TYPES>>>>> {
let mut proposal_dependency = self.create_event_dependency(
ProposalDependency::Proposal,
view_number,
event_receiver.clone(),
);

let mut qc_dependency = self.create_event_dependency(
ProposalDependency::Qc,
view_number,
event_receiver.clone(),
);

let mut view_sync_dependency = self.create_event_dependency(
ProposalDependency::ViewSyncCert,
view_number,
event_receiver.clone(),
);

let mut timeout_dependency = self.create_event_dependency(
ProposalDependency::TimeoutCert,
view_number,
event_receiver.clone(),
);

let mut payload_commitment_dependency = self.create_event_dependency(
ProposalDependency::PayloadAndMetadata,
view_number,
event_receiver.clone(),
);

let mut vid_share_dependency = self.create_event_dependency(
ProposalDependency::VidShare,
view_number,
event_receiver.clone(),
);

match event.as_ref() {
HotShotEvent::SendPayloadCommitmentAndMetadata(..) => {
payload_commitment_dependency.mark_as_completed(Arc::clone(&event));
}
Either::Left(_) => {
qc_dependency.mark_as_completed(event);
HotShotEvent::QuorumProposalPreliminarilyValidated(..) => {
proposal_dependency.mark_as_completed(event);
}
},
HotShotEvent::ViewSyncFinalizeCertificate2Recv(_) => {
view_sync_dependency.mark_as_completed(event);
}
HotShotEvent::VidDisperseSend(_, _) => {
vid_share_dependency.mark_as_completed(event);
HotShotEvent::QcFormed(quorum_certificate) => match quorum_certificate {
Either::Right(_) => {
timeout_dependency.mark_as_completed(event);
}
Either::Left(_) => {
qc_dependency.mark_as_completed(event);
}
},
HotShotEvent::ViewSyncFinalizeCertificate2Recv(_) => {
view_sync_dependency.mark_as_completed(event);
}
HotShotEvent::VidDisperseSend(_, _) => {
vid_share_dependency.mark_as_completed(event);
}
_ => {}
};

// We have three cases to consider:
let mut secondary_deps = vec![
// 1. A timeout cert was received
AndDependency::from_deps(vec![timeout_dependency]),
// 2. A view sync cert was received.
AndDependency::from_deps(vec![view_sync_dependency]),
];
// 3. A `QcFormed`` event (and `QuorumProposalRecv` event)
if *view_number > 1 {
secondary_deps.push(AndDependency::from_deps(vec![
qc_dependency,
proposal_dependency,
]));
} else {
secondary_deps.push(AndDependency::from_deps(vec![qc_dependency]));
}
_ => {}
};

// We have three cases to consider:
let mut secondary_deps = vec![
// 1. A timeout cert was received
AndDependency::from_deps(vec![timeout_dependency]),
// 2. A view sync cert was received.
AndDependency::from_deps(vec![view_sync_dependency]),
];
// 3. A `QcFormed`` event (and `QuorumProposalRecv` event)
if *view_number > 1 {
secondary_deps.push(AndDependency::from_deps(vec![
qc_dependency,
proposal_dependency,
]));
} else {
secondary_deps.push(AndDependency::from_deps(vec![qc_dependency]));
}

let primary_deps = vec![payload_commitment_dependency, vid_share_dependency];
let primary_deps = vec![payload_commitment_dependency, vid_share_dependency];

AndDependency::from_deps(vec![OrDependency::from_deps(vec![
AndDependency::from_deps(vec![
OrDependency::from_deps(vec![AndDependency::from_deps(primary_deps)]),
OrDependency::from_deps(secondary_deps),
]),
])])
}
AndDependency::from_deps(vec![OrDependency::from_deps(vec![
AndDependency::from_deps(vec![
OrDependency::from_deps(vec![AndDependency::from_deps(primary_deps)]),
OrDependency::from_deps(secondary_deps),
]),
])])
}

/// Create and store an [`AndDependency`] combining [`EventDependency`]s associated with the
/// given view number if it doesn't exist. Also takes in the received `event` to seed a
Expand Down Expand Up @@ -514,8 +514,11 @@ impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions>
let epoch_number = self.consensus.read().await.cur_epoch();
ensure!(
qc.is_valid_cert(
self.quorum_membership.as_ref(),
epoch_number,
self.membership.stake_table(epoch_number),
NonZeroU64::new(QuorumCertificate::<TYPES>::threshold(
self.membership.as_ref()
))
.unwrap(),
&self.upgrade_lock
)
.await,
Expand All @@ -530,12 +533,12 @@ impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions>

/// Cancel all tasks the consensus tasks has spawned before the given view
pub fn cancel_tasks(&mut self, view: TYPES::View) {
let keep = self.proposal_dependencies.split_off(&view);
while let Some((_, task)) = self.proposal_dependencies.pop_first() {
task.abort();
let keep = self.proposal_dependencies.split_off(&view);
while let Some((_, task)) = self.proposal_dependencies.pop_first() {
task.abort();
}
self.proposal_dependencies = keep;
}
self.proposal_dependencies = keep;
}
}

#[async_trait]
Expand Down

0 comments on commit c67fb3a

Please sign in to comment.