Skip to content

Commit

Permalink
Create new endpoint to check last view of the node
Browse files Browse the repository at this point in the history
  • Loading branch information
IAvecilla committed Feb 20, 2024
1 parent 53b805d commit c72b9ca
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 1 deletion.
3 changes: 2 additions & 1 deletion node/libs/roles/src/validator/messages/consensus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use super::{BlockHeader, Msg, Payload, Signed};
use crate::{validator, validator::Signature};
use anyhow::bail;
use bit_vec::BitVec;
use serde::Serialize;
use std::collections::{BTreeMap, BTreeSet};
use zksync_consensus_utils::enum_util::{BadVariantError, Variant};

Expand Down Expand Up @@ -417,7 +418,7 @@ impl ValidatorSet {
}

/// A struct that represents a view number.
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
pub struct ViewNumber(pub u64);

impl ViewNumber {
Expand Down
50 changes: 50 additions & 0 deletions node/tools/src/rpc/methods/last_view.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//! Peers method for RPC server.
use crate::{config::encode_json, decode_json, AppConfig};

use super::RPCMethod;
use jsonrpsee::types::{error::ErrorCode, Params};
use std::{fs, sync::Arc};
use zksync_consensus_storage::{BlockStore, ReplicaState};
use zksync_protobuf::serde::Serde;

/// Config method for RPC server.
pub(crate) struct LastView;

impl LastView {
/// Provide the node's config information
pub(crate) fn info(node_storage: Arc<BlockStore>) -> Result<serde_json::Value, ErrorCode> {
let block = node_storage;
let sub = &mut block.subscribe();
let state = sub.borrow().clone();
let replica_state = ReplicaState::from(state.last).view;
let replica_state =
serde_json::to_value(replica_state).map_err(|_e| ErrorCode::InternalError);
replica_state
}
}

impl RPCMethod for LastView {
/// Config response for /config endpoint.
fn callback(_params: Params) -> Result<serde_json::Value, ErrorCode> {
// This may change in the future since we are assuming that the executor binary is being run inside the config directory.
let node_config =
fs::read_to_string("config.json").map_err(|_e| ErrorCode::InternalError)?;
let node_config = decode_json::<Serde<AppConfig>>(&node_config)
.map_err(|_e| ErrorCode::InternalError)?
.0;
let config = encode_json(&Serde(node_config));
Ok(serde_json::json!({
"config": config
}))
}

/// Config method name.
fn method() -> &'static str {
"last_view"
}

/// Method path for GET requests.
fn path() -> &'static str {
"/last_view"
}
}
1 change: 1 addition & 0 deletions node/tools/src/rpc/methods/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ pub trait RPCMethod {

pub(crate) mod config;
pub mod health_check;
pub mod last_view;
pub(crate) mod peers;
9 changes: 9 additions & 0 deletions node/tools/src/rpc/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ impl RPCServer {
.layer(ProxyGetRequestLayer::new(
ConfigInfo::path(),
ConfigInfo::method(),
)?)
.layer(ProxyGetRequestLayer::new(
LastView::path(),
LastView::method(),
)?);

let server = Server::builder()
Expand All @@ -61,6 +65,11 @@ impl RPCServer {
ConfigInfo::info(config.clone())
})?;

let node_storage = self.node_storage.clone();
module.register_method(LastView::method(), move |_params, _| {
LastView::info(node_storage.clone())
})?;

let handle = server.start(module);
scope::run!(ctx, |ctx, s| async {
s.spawn_bg(async {
Expand Down

0 comments on commit c72b9ca

Please sign in to comment.