diff --git a/cli/src/stake.rs b/cli/src/stake.rs index 7c5308228d..5fb756eba4 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -12,7 +12,7 @@ use crate::{ }; use clap::{App, Arg, ArgGroup, ArgMatches, SubCommand}; use solana_clap_utils::{input_parsers::*, input_validators::*, offline::*, ArgConstant}; -use solana_client::rpc_client::RpcClient; +use solana_client::{rpc_client::RpcClient, rpc_request::DELINQUENT_VALIDATOR_SLOT_DISTANCE}; use solana_remote_wallet::remote_wallet::RemoteWalletManager; use solana_sdk::{ account_utils::StateMut, @@ -1461,13 +1461,15 @@ pub fn process_delegate_stake( "Unable to delegate. Vote account has no root slot".to_string(), )), Some(root_slot) => { - let slot = rpc_client.get_slot()?; - if root_slot + solana_sdk::clock::DEFAULT_SLOTS_PER_TURN < slot { - Err(CliError::BadParameter( - format!( - "Unable to delegate. Vote account root slot ({}) is too old, the current slot is {}", root_slot, slot - ) - )) + let min_root_slot = rpc_client + .get_slot()? + .saturating_sub(DELINQUENT_VALIDATOR_SLOT_DISTANCE); + if root_slot < min_root_slot { + Err(CliError::DynamicProgramError(format!( + "Unable to delegate. Vote account appears delinquent \ + because its current root slot, {}, is less than {}", + root_slot, min_root_slot + ))) } else { Ok(()) } diff --git a/client/src/rpc_request.rs b/client/src/rpc_request.rs index d637aaf954..bd93bdd0ee 100644 --- a/client/src/rpc_request.rs +++ b/client/src/rpc_request.rs @@ -103,6 +103,9 @@ pub const NUM_LARGEST_ACCOUNTS: usize = 20; pub const MAX_GET_SIGNATURE_STATUSES_QUERY_ITEMS: usize = 256; pub const MAX_GET_CONFIRMED_SIGNATURES_FOR_ADDRESS_SLOT_RANGE: u64 = 10_000; +// Validators that are this number of slots behind are considered delinquent +pub const DELINQUENT_VALIDATOR_SLOT_DISTANCE: u64 = 128; + impl RpcRequest { pub(crate) fn build_request_json(self, id: u64, params: Value) -> Value { let jsonrpc = "2.0"; diff --git a/core/src/rpc.rs b/core/src/rpc.rs index 9a327fe5f4..a037d413a4 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -16,7 +16,7 @@ use jsonrpc_derive::rpc; use solana_client::{ rpc_config::*, rpc_request::{ - MAX_GET_CONFIRMED_SIGNATURES_FOR_ADDRESS_SLOT_RANGE, + DELINQUENT_VALIDATOR_SLOT_DISTANCE, MAX_GET_CONFIRMED_SIGNATURES_FOR_ADDRESS_SLOT_RANGE, MAX_GET_SIGNATURE_STATUSES_QUERY_ITEMS, NUM_LARGEST_ACCOUNTS, }, rpc_response::*, @@ -420,8 +420,9 @@ impl JsonRpcRequestProcessor { } }) .partition(|vote_account_info| { - if bank.slot() >= MAX_LOCKOUT_HISTORY as u64 { - vote_account_info.last_vote > bank.slot() - MAX_LOCKOUT_HISTORY as u64 + if bank.slot() >= DELINQUENT_VALIDATOR_SLOT_DISTANCE as u64 { + vote_account_info.last_vote + > bank.slot() - DELINQUENT_VALIDATOR_SLOT_DISTANCE as u64 } else { vote_account_info.last_vote > 0 } @@ -1588,7 +1589,7 @@ pub mod tests { }; const TEST_MINT_LAMPORTS: u64 = 1_000_000; - const TEST_SLOTS_PER_EPOCH: u64 = 50; + const TEST_SLOTS_PER_EPOCH: u64 = DELINQUENT_VALIDATOR_SLOT_DISTANCE + 1; struct RpcHandler { io: MetaIoHandler, diff --git a/sdk/src/clock.rs b/sdk/src/clock.rs index 4e9ef8c1ee..0aa4e8068f 100644 --- a/sdk/src/clock.rs +++ b/sdk/src/clock.rs @@ -22,9 +22,6 @@ pub const TICKS_PER_DAY: u64 = DEFAULT_TICKS_PER_SECOND * SECONDS_PER_DAY; // 1 Epoch ~= 2 days pub const DEFAULT_SLOTS_PER_EPOCH: u64 = 2 * TICKS_PER_DAY / DEFAULT_TICKS_PER_SLOT; -// 4 times longer than the max_lockout to allow enough time for PoRep (128 slots) -pub const DEFAULT_SLOTS_PER_TURN: u64 = 32 * 4; - // leader schedule is governed by this pub const NUM_CONSECUTIVE_LEADER_SLOTS: u64 = 4;