Skip to content

Commit

Permalink
revert membership trait result changes
Browse files Browse the repository at this point in the history
  • Loading branch information
imabdulbasit committed Mar 3, 2025
2 parents bc1d0d7 + 54dd9fa commit 31a0980
Show file tree
Hide file tree
Showing 31 changed files with 454 additions and 976 deletions.
1 change: 0 additions & 1 deletion hotshot-examples/infra/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,6 @@ pub trait RunDa<
TYPES::View::genesis(),
genesis_epoch_from_version::<V, TYPES>(),
)
.unwrap_or_default()
.len();
let consensus_lock = context.hotshot.consensus();
let consensus_reader = consensus_lock.read().await;
Expand Down
6 changes: 2 additions & 4 deletions hotshot-task-impls/src/consensus/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,7 @@ pub(crate) async fn handle_quorum_vote_recv<
.membership
.read()
.await
.has_stake(&vote.signing_key(), Some(vote_epoch + 1))
.unwrap_or_default();
.has_stake(&vote.signing_key(), Some(vote_epoch + 1));
if has_stake {
handle_vote(
&mut task_state.next_epoch_vote_collectors,
Expand Down Expand Up @@ -371,8 +370,7 @@ pub(crate) async fn handle_timeout<TYPES: NodeType, I: NodeImplementation<TYPES>
.membership
.read()
.await
.has_stake(&task_state.public_key, epoch)
.unwrap_or_default(),
.has_stake(&task_state.public_key, epoch),
debug!(
"We were not chosen for the consensus committee for view {:?}",
view_number
Expand Down
30 changes: 5 additions & 25 deletions hotshot-task-impls/src/da.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,24 +169,15 @@ impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions> DaTaskState<TYP

let membership_reader = self.membership.read().await;
ensure!(
membership_reader
.has_da_stake(&self.public_key, epoch_number)
.unwrap_or_default(),
membership_reader.has_da_stake(&self.public_key, epoch_number),
debug!(
"We were not chosen for consensus committee for view {:?} in epoch {:?}",
view_number, epoch_number
)
);
let num_nodes = membership_reader.total_nodes(epoch_number).map_err(|_| {
error!(format!(
"total_nodes not found for epoch = {epoch_number:?}"
))
})?;
let next_epoch = epoch_number.map(|e| e + 1);
let num_nodes = membership_reader.total_nodes(epoch_number);
let next_epoch_num_nodes =
membership_reader.total_nodes(next_epoch).map_err(|_| {
error!(format!("total_nodes not found for epoch = {next_epoch:?}",))
})?;
membership_reader.total_nodes(epoch_number.map(|e| e + 1));
drop(membership_reader);

let version = self.upgrade_lock.version_infallible(view_number).await;
Expand Down Expand Up @@ -282,20 +273,9 @@ impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions> DaTaskState<TYP
let next_epoch = proposal_epoch.map(|epoch| epoch + 1);

let membership_reader = membership.read().await;
let target_epoch = if membership_reader
.has_stake(&public_key, proposal_epoch)
.map_err(|_| {
error!(format!(
"failed to get stake for epoch = {proposal_epoch:?}"
))
})? {
let target_epoch = if membership_reader.has_stake(&public_key, proposal_epoch) {
proposal_epoch
} else if membership_reader
.has_stake(&public_key, next_epoch)
.map_err(|_| {
error!(format!("failed to get stake for epoch = {next_epoch:?}"))
})?
{
} else if membership_reader.has_stake(&public_key, next_epoch) {
next_epoch
} else {
bail!("Not calculating VID, the node doesn't belong to the current epoch or the next epoch.");
Expand Down
93 changes: 21 additions & 72 deletions hotshot-task-impls/src/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ use hotshot_types::{
option_epoch_from_block_number, Terminator, View, ViewInner,
},
vote::{Certificate, HasViewNumber},
StakeTableEntries,
};
use hotshot_utils::anytrace::*;
use std::{
Expand Down Expand Up @@ -133,30 +134,13 @@ pub(crate) async fn fetch_proposal<TYPES: NodeType, V: Versions>(
let justify_qc_epoch = justify_qc.data.epoch();

let membership_reader = membership.read().await;
let membership_stake_table = membership_reader
.stake_table(justify_qc_epoch)
.map_err(|_| {
error!(format!(
"failed to get stake table for epoch = {justify_qc_epoch:?}"
))
})?;
let membership_success_threshold = membership_reader
.success_threshold(justify_qc_epoch)
.map_err(|_| {
error!(format!(
"failed to get success threshold for epoch = {justify_qc_epoch:?}"
))
})?;
let membership_stake_table = membership_reader.stake_table(justify_qc_epoch);
let membership_success_threshold = membership_reader.success_threshold(justify_qc_epoch);
drop(membership_reader);

let membership_stake_table = membership_stake_table
.into_iter()
.map(|config| config.stake_table_entry)
.collect::<Vec<_>>();

justify_qc
.is_valid_cert(
membership_stake_table,
StakeTableEntries::<TYPES>::from(membership_stake_table).0,
membership_success_threshold,
upgrade_lock,
)
Expand Down Expand Up @@ -782,22 +766,14 @@ pub(crate) async fn validate_proposal_view_and_certs<
let timeout_cert_epoch = timeout_cert.data().epoch();

let membership_reader = validation_info.membership.read().await;
let membership_stake_table = membership_reader
.stake_table(timeout_cert_epoch)
.map_err(|_| error!("failed to get stake table"))?;
let membership_success_threshold = membership_reader
.success_threshold(timeout_cert_epoch)
.map_err(|_| error!("failed to get success_threshold"))?;
let membership_stake_table = membership_reader.stake_table(timeout_cert_epoch);
let membership_success_threshold =
membership_reader.success_threshold(timeout_cert_epoch);
drop(membership_reader);

let membership_stake_table = membership_stake_table
.into_iter()
.map(|config| config.stake_table_entry)
.collect::<Vec<_>>();

timeout_cert
.is_valid_cert(
membership_stake_table,
StakeTableEntries::<TYPES>::from(membership_stake_table).0,
membership_success_threshold,
&validation_info.upgrade_lock,
)
Expand All @@ -820,21 +796,15 @@ pub(crate) async fn validate_proposal_view_and_certs<
let view_sync_cert_epoch = view_sync_cert.data().epoch();

let membership_reader = validation_info.membership.read().await;
let membership_stake_table = membership_reader
.stake_table(view_sync_cert_epoch)
.map_err(|_| error!("failed to get stake_table"))?;
let membership_success_threshold = membership_reader
.success_threshold(view_sync_cert_epoch)
.map_err(|_| error!("failed to get success_threshold"))?;
let membership_stake_table = membership_reader.stake_table(view_sync_cert_epoch);
let membership_success_threshold =
membership_reader.success_threshold(view_sync_cert_epoch);
drop(membership_reader);
let membership_stake_table = membership_stake_table
.into_iter()
.map(|config| config.stake_table_entry)
.collect::<Vec<_>>();

// View sync certs must also be valid.
view_sync_cert
.is_valid_cert(
membership_stake_table,
StakeTableEntries::<TYPES>::from(membership_stake_table).0,
membership_success_threshold,
&validation_info.upgrade_lock,
)
Expand Down Expand Up @@ -955,28 +925,14 @@ pub async fn validate_qc_and_next_epoch_qc<TYPES: NodeType, V: Versions>(
upgrade_lock: &UpgradeLock<TYPES, V>,
) -> Result<()> {
let membership_reader = membership.read().await;
let qc_epoch = qc.data.epoch;
let membership_stake_table = membership_reader.stake_table(qc_epoch).map_err(|_| {
error!(format!(
"failed to get stake table for epoch = {qc_epoch:?}"
))
})?;
let membership_success_threshold =
membership_reader.success_threshold(qc_epoch).map_err(|_| {
error!(format!(
"failed to get success_threshold for epoch = {qc_epoch:?}"
))
})?;
let membership_stake_table = membership_reader.stake_table(qc.data.epoch);
let membership_success_threshold = membership_reader.success_threshold(qc.data.epoch);
drop(membership_reader);

let membership_stake_table = membership_stake_table
.into_iter()
.map(|config| config.stake_table_entry)
.collect::<Vec<_>>();
{
let consensus_reader = consensus.read().await;
qc.is_valid_cert(
membership_stake_table,
StakeTableEntries::<TYPES>::from(membership_stake_table).0,
membership_success_threshold,
upgrade_lock,
)
Expand All @@ -995,23 +951,16 @@ pub async fn validate_qc_and_next_epoch_qc<TYPES: NodeType, V: Versions>(
}

let membership_reader = membership.read().await;
let membership_next_stake_table = membership_reader
.stake_table(qc.data.epoch.map(|x| x + 1))
.map_err(|_| error!("failed to get stake table"))?;
let membership_next_success_threshold = membership_reader
.success_threshold(qc.data.epoch.map(|x| x + 1))
.map_err(|_| error!("failed to get success threshold stake table"))?;
let membership_next_stake_table =
membership_reader.stake_table(qc.data.epoch.map(|x| x + 1));
let membership_next_success_threshold =
membership_reader.success_threshold(qc.data.epoch.map(|x| x + 1));
drop(membership_reader);

let membership_next_stake_table = membership_next_stake_table
.into_iter()
.map(|config| config.stake_table_entry)
.collect::<Vec<_>>();

// Validate the next epoch qc as well
next_epoch_qc
.is_valid_cert(
membership_next_stake_table,
StakeTableEntries::<TYPES>::from(membership_next_stake_table).0,
membership_next_success_threshold,
upgrade_lock,
)
Expand Down
3 changes: 1 addition & 2 deletions hotshot-task-impls/src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1149,8 +1149,7 @@ impl<
.membership
.read()
.await
.da_committee_members(view_number, self.epoch)
.unwrap_or_default();
.da_committee_members(view_number, self.epoch);
let network = Arc::clone(&self.network);
let storage = Arc::clone(&self.storage);
let consensus = OuterConsensus::new(Arc::clone(&self.consensus.inner_consensus));
Expand Down
13 changes: 4 additions & 9 deletions hotshot-task-impls/src/quorum_proposal/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use hotshot_types::{
signature_key::SignatureKey,
},
utils::{is_last_block_in_epoch, option_epoch_from_block_number},
vote::{Certificate, HasViewNumber},
vote::{Certificate, HasViewNumber}, StakeTableEntries,
};
use hotshot_utils::anytrace::*;
use tracing::instrument;
Expand Down Expand Up @@ -127,19 +127,14 @@ impl<TYPES: NodeType, V: Versions> ProposalDependencyHandle<TYPES, V> {
while let Ok(event) = rx.recv_direct().await {
if let HotShotEvent::HighQcRecv(qc, _sender) = event.as_ref() {
let membership_reader = self.membership.read().await;
let membership_stake_table = membership_reader.stake_table(qc.data.epoch).ok()?;
let membership_stake_table = membership_reader.stake_table(qc.data.epoch);
let membership_success_threshold =
membership_reader.success_threshold(qc.data.epoch).ok()?;
membership_reader.success_threshold(qc.data.epoch);
drop(membership_reader);

let membership_stake_table = membership_stake_table
.iter()
.map(|config| config.stake_table_entry.clone())
.collect::<Vec<_>>();

if qc
.is_valid_cert(
membership_stake_table,
StakeTableEntries::<TYPES>::from(membership_stake_table).0,
membership_success_threshold,
&self.upgrade_lock,
)
Expand Down
40 changes: 9 additions & 31 deletions hotshot-task-impls/src/quorum_proposal/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use hotshot_task::{
dependency_task::DependencyTask,
task::TaskState,
};
use hotshot_types::StakeTableEntries;
use hotshot_types::{
consensus::OuterConsensus,
message::UpgradeLock,
Expand Down Expand Up @@ -472,26 +473,14 @@ impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions>
let epoch_number = certificate.data.epoch;

let membership_reader = self.membership.read().await;
let membership_stake_table = membership_reader
.stake_table(epoch_number)
.unwrap_or_default();
let membership_success_threshold = membership_reader
.success_threshold(epoch_number)
.map_err(|_| {
error!(format!(
"success_threshold not found for epoch = {epoch_number:?}"
))
})?;
let membership_stake_table = membership_reader.stake_table(epoch_number);
let membership_success_threshold =
membership_reader.success_threshold(epoch_number);
drop(membership_reader);

let membership_stake_table = membership_stake_table
.into_iter()
.map(|config| config.stake_table_entry.clone())
.collect::<Vec<_>>();

certificate
.is_valid_cert(
membership_stake_table,
StakeTableEntries::<TYPES>::from(membership_stake_table).0,
membership_success_threshold,
&self.upgrade_lock,
)
Expand Down Expand Up @@ -569,24 +558,13 @@ impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions>
let cert_epoch_number = qc.data.epoch;

let membership_reader = self.membership.read().await;
let membership_stake_table = membership_reader
.stake_table(cert_epoch_number)
.unwrap_or_default();
let membership_success_threshold = membership_reader
.success_threshold(cert_epoch_number)
.map_err(|_| {
error!(format!(
" success_threshold not found for epoch = {cert_epoch_number:?}"
))
})?;
let membership_stake_table = membership_reader.stake_table(cert_epoch_number);
let membership_success_threshold =
membership_reader.success_threshold(cert_epoch_number);
drop(membership_reader);

let membership_stake_table = membership_stake_table
.into_iter()
.map(|config| config.stake_table_entry.clone())
.collect::<Vec<_>>();
qc.is_valid_cert(
membership_stake_table,
StakeTableEntries::<TYPES>::from(membership_stake_table).0,
membership_success_threshold,
&self.upgrade_lock,
)
Expand Down
14 changes: 4 additions & 10 deletions hotshot-task-impls/src/quorum_vote/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,8 @@ async fn verify_drb_result<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Ver
let membership_reader = task_state.membership.read().await;

if let Some(epoch_val) = epoch {
let has_stake_current_epoch = membership_reader
.has_stake(&task_state.public_key, Some(epoch_val))
.unwrap_or_default();
let has_stake_current_epoch =
membership_reader.has_stake(&task_state.public_key, Some(epoch_val));

drop(membership_reader);

Expand Down Expand Up @@ -190,7 +189,6 @@ async fn start_drb_task<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versio
.read()
.await
.has_stake(&task_state.public_key, Some(current_epoch_number))
.unwrap_or_default()
{
let new_epoch_number = current_epoch_number + 1;

Expand Down Expand Up @@ -638,16 +636,12 @@ pub(crate) async fn submit_vote<TYPES: NodeType, I: NodeImplementation<TYPES>, V
);

let membership_reader = membership.read().await;
let committee_member_in_current_epoch = membership_reader
.has_stake(&public_key, epoch_number)
.unwrap_or_default();
let committee_member_in_current_epoch = membership_reader.has_stake(&public_key, epoch_number);
// If the proposed leaf is for the last block in the epoch and the node is part of the quorum committee
// in the next epoch, the node should vote to achieve the double quorum.
let committee_member_in_next_epoch = leaf.with_epoch
&& is_last_block_in_epoch(leaf.height(), epoch_height)
&& membership_reader
.has_stake(&public_key, epoch_number.map(|x| x + 1))
.unwrap_or_default();
&& membership_reader.has_stake(&public_key, epoch_number.map(|x| x + 1));
drop(membership_reader);

ensure!(
Expand Down
Loading

0 comments on commit 31a0980

Please sign in to comment.