feature subcommand: display active stake by feature id when feature activation is not available
This commit is contained in:
committed by
mergify[bot]
parent
ccb48f5ce9
commit
322dbd894f
@ -120,10 +120,8 @@ pub fn process_feature_subcommand(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Feature activation is only allowed when 95% of the active stake is on the current feature set
|
fn active_stake_by_feature_set(rpc_client: &RpcClient) -> Result<HashMap<u32, u64>, ClientError> {
|
||||||
fn feature_activation_allowed(rpc_client: &RpcClient) -> Result<bool, ClientError> {
|
// Validator identity -> feature set
|
||||||
let my_feature_set = solana_version::Version::default().feature_set;
|
|
||||||
|
|
||||||
let feature_set_map = rpc_client
|
let feature_set_map = rpc_client
|
||||||
.get_cluster_nodes()?
|
.get_cluster_nodes()?
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@ -139,19 +137,58 @@ fn feature_activation_allowed(rpc_client: &RpcClient) -> Result<bool, ClientErro
|
|||||||
.map(|vote_account| vote_account.activated_stake)
|
.map(|vote_account| vote_account.activated_stake)
|
||||||
.sum();
|
.sum();
|
||||||
|
|
||||||
let total_compatible_stake: u64 = vote_accounts
|
// Sum all active stake by feature set
|
||||||
.current
|
let mut active_stake_by_feature_set = HashMap::new();
|
||||||
.iter()
|
for vote_account in vote_accounts.current {
|
||||||
.map(|vote_account| {
|
if let Some(Some(feature_set)) = feature_set_map.get(&vote_account.node_pubkey) {
|
||||||
if Some(&Some(my_feature_set)) == feature_set_map.get(&vote_account.node_pubkey) {
|
*active_stake_by_feature_set.entry(*feature_set).or_default() +=
|
||||||
vote_account.activated_stake
|
vote_account.activated_stake;
|
||||||
} else {
|
} else {
|
||||||
0
|
*active_stake_by_feature_set
|
||||||
|
.entry(0 /* "unknown" */)
|
||||||
|
.or_default() += vote_account.activated_stake;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
|
||||||
.sum();
|
|
||||||
|
|
||||||
Ok(total_compatible_stake * 100 / total_active_stake >= 95)
|
// Convert active stake to a percentage so the caller doesn't need `total_active_stake`
|
||||||
|
for (_, val) in active_stake_by_feature_set.iter_mut() {
|
||||||
|
*val = *val * 100 / total_active_stake;
|
||||||
|
}
|
||||||
|
Ok(active_stake_by_feature_set)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Feature activation is only allowed when 95% of the active stake is on the current feature set
|
||||||
|
fn feature_activation_allowed(rpc_client: &RpcClient) -> Result<bool, ClientError> {
|
||||||
|
let my_feature_set = solana_version::Version::default().feature_set;
|
||||||
|
|
||||||
|
let active_stake_by_feature_set = active_stake_by_feature_set(rpc_client)?;
|
||||||
|
|
||||||
|
let feature_activation_allowed = active_stake_by_feature_set
|
||||||
|
.get(&my_feature_set)
|
||||||
|
.map(|percentage| *percentage >= 95)
|
||||||
|
.unwrap_or(false);
|
||||||
|
|
||||||
|
if !feature_activation_allowed {
|
||||||
|
println!("\n{}", style("Stake By Feature Id:").bold());
|
||||||
|
for (feature_set, percentage) in active_stake_by_feature_set.iter() {
|
||||||
|
if *feature_set == 0 {
|
||||||
|
println!("unknown - {}%", percentage);
|
||||||
|
} else {
|
||||||
|
println!(
|
||||||
|
"{} - {}% {}",
|
||||||
|
feature_set,
|
||||||
|
percentage,
|
||||||
|
if *feature_set == my_feature_set {
|
||||||
|
" <-- current"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(feature_activation_allowed)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_status(rpc_client: &RpcClient, feature_ids: &[Pubkey]) -> ProcessResult {
|
fn process_status(rpc_client: &RpcClient, feature_ids: &[Pubkey]) -> ProcessResult {
|
||||||
|
Reference in New Issue
Block a user