From 1c82f84595fcde1c8af8d7555e70cc57f1a978b3 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Tue, 28 Jan 2020 21:52:52 -0700 Subject: [PATCH] Add leader-schedule subcommand --- cli/src/cli.rs | 6 ++++++ cli/src/cluster_query.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 91785ba523..cadafd5922 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -193,6 +193,7 @@ pub enum CliCommand { GetTransactionCount { commitment_config: CommitmentConfig, }, + LeaderSchedule, Ping { lamports: u64, interval: Duration, @@ -456,6 +457,10 @@ pub fn parse_command(matches: &ArgMatches<'_>) -> Result parse_get_slot(matches), ("transaction-count", Some(matches)) => parse_get_transaction_count(matches), + ("leader-schedule", Some(_matches)) => Ok(CliCommandInfo { + command: CliCommand::LeaderSchedule, + require_keypair: false, + }), ("ping", Some(matches)) => parse_cluster_ping(matches), ("block-production", Some(matches)) => parse_show_block_production(matches), ("gossip", Some(_matches)) => Ok(CliCommandInfo { @@ -1261,6 +1266,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { CliCommand::GetTransactionCount { commitment_config } => { process_get_transaction_count(&rpc_client, commitment_config) } + CliCommand::LeaderSchedule => process_leader_schedule(&rpc_client), CliCommand::Ping { lamports, interval, diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 278b1e2c75..c00407caa3 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -67,6 +67,7 @@ impl ClusterQuerySubCommands for App<'_, '_> { .help("Slot number of the block to query") ) ) + .subcommand(SubCommand::with_name("leader-schedule").about("Display leader schedule")) .subcommand( SubCommand::with_name("epoch-info") .about("Get information about the current epoch") @@ -406,6 +407,41 @@ pub fn process_fees(rpc_client: &RpcClient) -> ProcessResult { )) } +pub fn process_leader_schedule(rpc_client: &RpcClient) -> ProcessResult { + let epoch_info = rpc_client.get_epoch_info()?; + let first_slot_in_epoch = epoch_info.absolute_slot - epoch_info.slot_index; + + let leader_schedule = rpc_client.get_leader_schedule(Some(first_slot_in_epoch))?; + if leader_schedule.is_none() { + return Err(format!( + "Unable to fetch leader schedule for slot {}", + first_slot_in_epoch + ) + .into()); + } + let leader_schedule = leader_schedule.unwrap(); + + let mut leader_per_slot_index = Vec::new(); + for (pubkey, leader_slots) in leader_schedule.iter() { + for slot_index in leader_slots.iter() { + if *slot_index >= leader_per_slot_index.len() { + leader_per_slot_index.resize(*slot_index + 1, "?"); + } + leader_per_slot_index[*slot_index] = pubkey; + } + } + + for (slot_index, leader) in leader_per_slot_index.iter().enumerate() { + println!( + " {:<15} {:<44}", + first_slot_in_epoch + slot_index as u64, + leader + ); + } + + Ok("".to_string()) +} + pub fn process_get_block_time(rpc_client: &RpcClient, slot: Slot) -> ProcessResult { let timestamp = rpc_client.get_block_time(slot)?; Ok(timestamp.to_string())