Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix validator parse error #149

Merged
merged 1 commit into from
Dec 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions rpc-server/src/modules/network/methods.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
use crate::config::ServerContext;
use crate::errors::RPCError;
use crate::modules::blocks::utils::fetch_block_from_cache_or_get;
use crate::modules::network::{friendly_memory_size_format, StatusResponse};
use crate::modules::network::{
friendly_memory_size_format, parse_validator_request, StatusResponse,
};
#[cfg(feature = "shadow_data_consistency")]
use crate::utils::shadow_compare_results;
use jsonrpc_v2::{Data, Params};
use near_primitives::types::EpochReference;
use serde_json::Value;
use sysinfo::{System, SystemExt};

pub async fn status(
data: Data<ServerContext>,
Params(_params): Params<Value>,
Params(_params): Params<serde_json::Value>,
) -> Result<StatusResponse, RPCError> {
let sys = System::new_all();
let total_memory = sys.total_memory();
Expand Down Expand Up @@ -54,7 +55,7 @@ pub async fn status(
}

pub async fn network_info(
Params(_params): Params<Value>,
Params(_params): Params<serde_json::Value>,
) -> Result<near_jsonrpc_primitives::types::network_info::RpcNetworkInfoResponse, RPCError> {
Err(RPCError::unimplemented_error(
"Method is not implemented on this type of node. Please send a request to NEAR JSON RPC instead.",
Expand All @@ -63,24 +64,27 @@ pub async fn network_info(

pub async fn validators(
data: Data<ServerContext>,
Params(params): Params<near_jsonrpc_primitives::types::validator::RpcValidatorRequest>,
Params(params): Params<serde_json::Value>,
) -> Result<near_jsonrpc_primitives::types::validator::RpcValidatorResponse, RPCError> {
tracing::debug!("`validators` called with parameters: {:?}", params);
let request = parse_validator_request(params)
.await
.map_err(|err| RPCError::parse_error(&err.to_string()))?;
tracing::debug!("`validators` called with parameters: {:?}", request);
crate::metrics::VALIDATORS_REQUESTS_TOTAL.inc();
let validator_info = validators_call(&data, &params).await;
let validator_info = validators_call(&data, &request).await;

#[cfg(feature = "shadow_data_consistency")]
{
let near_rpc_client = &data.near_rpc_client.clone();
let meta_data = format!("{:?}", params);
let meta_data = format!("{:?}", request);
let (read_rpc_response_json, is_response_ok) = match &validator_info {
Ok(validators) => (serde_json::to_value(&validators), true),
Err(err) => (serde_json::to_value(err), false),
};
let comparison_result = shadow_compare_results(
read_rpc_response_json,
near_rpc_client.clone(),
params,
request,
is_response_ok,
)
.await;
Expand Down Expand Up @@ -111,7 +115,7 @@ pub async fn validators_ordered(

pub async fn genesis_config(
data: Data<ServerContext>,
Params(_params): Params<Value>,
Params(_params): Params<serde_json::Value>,
) -> Result<near_chain_configs::GenesisConfig, RPCError> {
Ok(data.genesis_config.clone())
}
Expand Down
21 changes: 21 additions & 0 deletions rpc-server/src/modules/network/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
pub mod methods;

async fn parse_validator_request(
value: serde_json::Value,
) -> anyhow::Result<near_jsonrpc_primitives::types::validator::RpcValidatorRequest> {
let request = if let serde_json::Value::Object(_) = value {
serde_json::from_value::<near_jsonrpc_primitives::types::validator::RpcValidatorRequest>(
value,
)?
} else {
let epoch_reference = match value[0].clone() {
serde_json::Value::Null => near_primitives::types::EpochReference::Latest,
_ => {
let (block_id,) =
serde_json::from_value::<(near_primitives::types::BlockId,)>(value)?;
near_primitives::types::EpochReference::BlockId(block_id)
}
};
near_jsonrpc_primitives::types::validator::RpcValidatorRequest { epoch_reference }
};
Ok(request)
}

#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub struct StatusResponse {
total_memory: String,
Expand Down
Loading