show-validators: display current/delinquent stake, and flag delinquent nodes (#6525)
This commit is contained in:
		| @@ -8,7 +8,7 @@ use crate::{ | ||||
| use clap::{value_t_or_exit, App, Arg, ArgMatches, SubCommand}; | ||||
| use console::{style, Emoji}; | ||||
| use serde_json::Value; | ||||
| use solana_client::rpc_client::RpcClient; | ||||
| use solana_client::{rpc_client::RpcClient, rpc_request::RpcVoteAccountInfo}; | ||||
| use solana_sdk::{ | ||||
|     clock, | ||||
|     hash::Hash, | ||||
| @@ -22,6 +22,7 @@ use std::{ | ||||
|  | ||||
| static CHECK_MARK: Emoji = Emoji("✅ ", ""); | ||||
| static CROSS_MARK: Emoji = Emoji("❌ ", ""); | ||||
| static WARNING: Emoji = Emoji("⚠️", "!"); | ||||
|  | ||||
| pub trait ClusterQuerySubCommands { | ||||
|     fn cluster_query_subcommands(self) -> Self; | ||||
| @@ -303,17 +304,48 @@ pub fn process_ping( | ||||
|  | ||||
| pub fn process_show_validators(rpc_client: &RpcClient, use_lamports_unit: bool) -> ProcessResult { | ||||
|     let vote_accounts = rpc_client.get_vote_accounts()?; | ||||
|     let total_activate_stake = vote_accounts | ||||
|     let total_active_stake = vote_accounts | ||||
|         .current | ||||
|         .iter() | ||||
|         .chain(vote_accounts.delinquent.iter()) | ||||
|         .fold(0, |acc, vote_account| acc + vote_account.activated_stake) | ||||
|         as f64; | ||||
|  | ||||
|     let total_deliquent_stake = vote_accounts | ||||
|         .delinquent | ||||
|         .iter() | ||||
|         .fold(0, |acc, vote_account| acc + vote_account.activated_stake) | ||||
|         as f64; | ||||
|     let total_current_stake = total_active_stake - total_deliquent_stake; | ||||
|  | ||||
|     println_name_value( | ||||
|         "Active Stake:", | ||||
|         &build_balance_message(total_active_stake as u64, use_lamports_unit), | ||||
|     ); | ||||
|     if total_deliquent_stake > 0. { | ||||
|         println_name_value( | ||||
|             "Current Stake:", | ||||
|             &format!( | ||||
|                 "{} ({:0.2}%)", | ||||
|                 &build_balance_message(total_current_stake as u64, use_lamports_unit), | ||||
|                 100. * total_current_stake / total_active_stake | ||||
|             ), | ||||
|         ); | ||||
|         println_name_value( | ||||
|             "Delinquent Stake:", | ||||
|             &format!( | ||||
|                 "{} ({:0.2}%)", | ||||
|                 &build_balance_message(total_deliquent_stake as u64, use_lamports_unit), | ||||
|                 100. * total_deliquent_stake / total_active_stake | ||||
|             ), | ||||
|         ); | ||||
|     } | ||||
|     println!(); | ||||
|  | ||||
|     println!( | ||||
|         "{}", | ||||
|         style(format!( | ||||
|             "{:<44}  {:<44}  {:<11}  {:>10}  {:>11}  {}", | ||||
|             "  {:<44}  {:<44}  {:<11}  {:>10}  {:>11}  {}", | ||||
|             "Identity Pubkey", | ||||
|             "Vote Account Pubkey", | ||||
|             "Commission", | ||||
| @@ -324,11 +356,12 @@ pub fn process_show_validators(rpc_client: &RpcClient, use_lamports_unit: bool) | ||||
|         .bold() | ||||
|     ); | ||||
|  | ||||
|     for vote_account in vote_accounts | ||||
|         .current | ||||
|         .iter() | ||||
|         .chain(vote_accounts.delinquent.iter()) | ||||
|     { | ||||
|     fn print_vote_account( | ||||
|         vote_account: &RpcVoteAccountInfo, | ||||
|         total_active_stake: f64, | ||||
|         use_lamports_unit: bool, | ||||
|         delinquent: bool, | ||||
|     ) { | ||||
|         fn non_zero_or_dash(v: u64) -> String { | ||||
|             if v == 0 { | ||||
|                 "-".into() | ||||
| @@ -336,9 +369,13 @@ pub fn process_show_validators(rpc_client: &RpcClient, use_lamports_unit: bool) | ||||
|                 format!("{}", v) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         println!( | ||||
|             "{:<44}  {:<44}  {:>3} ({:>4.1}%)  {:>10}  {:>11}  {:>11}", | ||||
|             "{} {:<44}  {:<44}  {:>3} ({:>4.1}%)  {:>10}  {:>11}  {:>11}", | ||||
|             if delinquent { | ||||
|                 WARNING.to_string() | ||||
|             } else { | ||||
|                 " ".to_string() | ||||
|             }, | ||||
|             vote_account.node_pubkey, | ||||
|             vote_account.vote_pubkey, | ||||
|             vote_account.commission, | ||||
| @@ -349,7 +386,7 @@ pub fn process_show_validators(rpc_client: &RpcClient, use_lamports_unit: bool) | ||||
|                 format!( | ||||
|                     "{} ({:.2}%)", | ||||
|                     build_balance_message(vote_account.activated_stake, use_lamports_unit), | ||||
|                     100. * vote_account.activated_stake as f64 / total_activate_stake | ||||
|                     100. * vote_account.activated_stake as f64 / total_active_stake | ||||
|                 ) | ||||
|             } else { | ||||
|                 "-".into() | ||||
| @@ -357,6 +394,13 @@ pub fn process_show_validators(rpc_client: &RpcClient, use_lamports_unit: bool) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     for vote_account in vote_accounts.current.iter() { | ||||
|         print_vote_account(vote_account, total_active_stake, use_lamports_unit, false); | ||||
|     } | ||||
|     for vote_account in vote_accounts.delinquent.iter() { | ||||
|         print_vote_account(vote_account, total_active_stake, use_lamports_unit, true); | ||||
|     } | ||||
|  | ||||
|     Ok("".to_string()) | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user