Add get-epoch-info command (#6161)

automerge
This commit is contained in:
Michael Vines
2019-09-27 22:00:30 -07:00
committed by Grimes
parent 5637f88aff
commit d50aef8404
5 changed files with 100 additions and 32 deletions

View File

@ -1,3 +1,6 @@
#[macro_use]
extern crate serde_derive;
pub mod client_error;
mod generic_rpc_client_request;
pub mod mock_rpc_client_request;

View File

@ -2,23 +2,26 @@ use crate::client_error::ClientError;
use crate::generic_rpc_client_request::GenericRpcClientRequest;
use crate::mock_rpc_client_request::MockRpcClientRequest;
use crate::rpc_client_request::RpcClientRequest;
use crate::rpc_request::RpcRequest;
use crate::rpc_request::{RpcEpochInfo, RpcRequest};
use bincode::serialize;
use log::*;
use serde_json::{json, Value};
use solana_sdk::account::Account;
use solana_sdk::clock::{DEFAULT_TICKS_PER_SECOND, DEFAULT_TICKS_PER_SLOT};
use solana_sdk::fee_calculator::FeeCalculator;
use solana_sdk::hash::Hash;
use solana_sdk::inflation::Inflation;
use solana_sdk::pubkey::Pubkey;
use solana_sdk::signature::{KeypairUtil, Signature};
use solana_sdk::transaction::{self, Transaction, TransactionError};
use std::error;
use std::io;
use std::net::SocketAddr;
use std::thread::sleep;
use std::time::{Duration, Instant};
use solana_sdk::{
account::Account,
clock::{Slot, DEFAULT_TICKS_PER_SECOND, DEFAULT_TICKS_PER_SLOT},
fee_calculator::FeeCalculator,
hash::Hash,
inflation::Inflation,
pubkey::Pubkey,
signature::{KeypairUtil, Signature},
transaction::{self, Transaction, TransactionError},
};
use std::{
error, io,
net::SocketAddr,
thread::sleep,
time::{Duration, Instant},
};
pub struct RpcClient {
client: Box<dyn GenericRpcClientRequest + Send + Sync>,
@ -76,7 +79,7 @@ impl RpcClient {
Ok(result)
}
pub fn get_slot(&self) -> io::Result<u64> {
pub fn get_slot(&self) -> io::Result<Slot> {
let response = self
.client
.send(&RpcRequest::GetSlot, None, 0)
@ -95,6 +98,25 @@ impl RpcClient {
})
}
pub fn get_epoch_info(&self) -> io::Result<RpcEpochInfo> {
let response = self
.client
.send(&RpcRequest::GetEpochInfo, None, 0)
.map_err(|err| {
io::Error::new(
io::ErrorKind::Other,
format!("GetEpochInfo request failure: {:?}", err),
)
})?;
serde_json::from_value(response).map_err(|err| {
io::Error::new(
io::ErrorKind::Other,
format!("GetEpochInfo parse failure: {}", err),
)
})
}
pub fn get_inflation(&self) -> io::Result<Inflation> {
let response = self
.client

View File

@ -1,6 +1,22 @@
use serde_json::{json, Value};
use std::{error, fmt};
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct RpcEpochInfo {
/// The current epoch
pub epoch: u64,
/// The current slot, relative to the start of the current epoch
pub slot_index: u64,
/// The number of slots in this epoch
pub slots_in_epoch: u64,
/// The absolute current slot
pub absolute_slot: u64,
}
#[derive(Debug, PartialEq)]
pub enum RpcRequest {
ConfirmTransaction,
@ -9,6 +25,7 @@ pub enum RpcRequest {
GetAccountInfo,
GetBalance,
GetClusterNodes,
GetEpochInfo,
GetGenesisBlockhash,
GetInflation,
GetNumBlocksSinceSignatureConfirmation,
@ -41,6 +58,7 @@ impl RpcRequest {
RpcRequest::GetAccountInfo => "getAccountInfo",
RpcRequest::GetBalance => "getBalance",
RpcRequest::GetClusterNodes => "getClusterNodes",
RpcRequest::GetEpochInfo => "getEpochInfo",
RpcRequest::GetGenesisBlockhash => "getGenesisBlockhash",
RpcRequest::GetInflation => "getInflation",
RpcRequest::GetNumBlocksSinceSignatureConfirmation => {
@ -114,6 +132,10 @@ mod tests {
let request = test_request.build_request_json(1, Some(addr));
assert_eq!(request["method"], "getBalance");
let test_request = RpcRequest::GetEpochInfo;
let request = test_request.build_request_json(1, None);
assert_eq!(request["method"], "getEpochInfo");
let test_request = RpcRequest::GetInflation;
let request = test_request.build_request_json(1, None);
assert_eq!(request["method"], "getInflation");