From 0730e05a6fde08282a91aca99982cf8dcabb53ed Mon Sep 17 00:00:00 2001 From: Giacomo Pasini <21265557+zeegomo@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:24:43 +0100 Subject: [PATCH] Add raw api module to nomos-cli (#511) * Add raw api module to nomos-cli Add a separate module which contains all raw api calls and make them reuse the same reqwest client for increased efficiency * Use json instead of wire format in mempool add api Uniform all http api to use json as the encoding --- nodes/nomos-node/src/bridges/mod.rs | 3 +-- nomos-cli/Cargo.toml | 2 ++ nomos-cli/src/api/consensus.rs | 13 +++++++++ nomos-cli/src/api/da.rs | 18 +++++++++++++ nomos-cli/src/api/mempool.rs | 15 +++++++++++ nomos-cli/src/api/mod.rs | 9 +++++++ nomos-cli/src/api/storage.rs | 21 +++++++++++++++ nomos-cli/src/da/disseminate.rs | 12 +++------ nomos-cli/src/da/retrieve.rs | 42 ++++------------------------- nomos-cli/src/lib.rs | 1 + 10 files changed, 88 insertions(+), 48 deletions(-) create mode 100644 nomos-cli/src/api/consensus.rs create mode 100644 nomos-cli/src/api/da.rs create mode 100644 nomos-cli/src/api/mempool.rs create mode 100644 nomos-cli/src/api/mod.rs create mode 100644 nomos-cli/src/api/storage.rs diff --git a/nodes/nomos-node/src/bridges/mod.rs b/nodes/nomos-node/src/bridges/mod.rs index e120e16c..b8bf4198 100644 --- a/nodes/nomos-node/src/bridges/mod.rs +++ b/nodes/nomos-node/src/bridges/mod.rs @@ -14,7 +14,6 @@ use tokio::sync::oneshot; use tracing::error; // internal use full_replication::{Blob, Certificate}; -use nomos_core::wire; use nomos_core::{ block::Block, da::{blob, certificate::Certificate as _}, @@ -400,7 +399,7 @@ pub(super) async fn handle_mempool_add_req( where K: DeserializeOwned, { - let item = wire::deserialize::(&wire_item)?; + let item: K = serde_json::from_slice(&wire_item)?; let (sender, receiver) = oneshot::channel(); let key = key(&item); mempool_channel diff --git a/nomos-cli/Cargo.toml b/nomos-cli/Cargo.toml index 18ffd504..a183d8ad 100644 --- a/nomos-cli/Cargo.toml +++ b/nomos-cli/Cargo.toml @@ -20,6 +20,7 @@ overwatch-rs = { git = "https://github.com/logos-co/Overwatch", rev = "2f70806" overwatch-derive = { git = "https://github.com/logos-co/Overwatch", rev = "ac28d01" } nomos-network = { path = "../nomos-services/network", features = ["libp2p"] } nomos-da = { path = "../nomos-services/data-availability", features = ["libp2p"] } +nomos-consensus = { path = "../nomos-services/consensus" } nomos-libp2p = { path = "../nomos-libp2p"} nomos-core = { path = "../nomos-core" } nomos-node = { path = "../nodes/nomos-node" } @@ -29,3 +30,4 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" thiserror = "1.0" hex = "0.4.3" +once_cell = "1" \ No newline at end of file diff --git a/nomos-cli/src/api/consensus.rs b/nomos-cli/src/api/consensus.rs new file mode 100644 index 00000000..d370be74 --- /dev/null +++ b/nomos-cli/src/api/consensus.rs @@ -0,0 +1,13 @@ +use super::CLIENT; +use nomos_consensus::CarnotInfo; +use reqwest::Url; + +pub async fn carnot_info(node: &Url) -> Result { + const NODE_CARNOT_INFO_PATH: &str = "carnot/info"; + CLIENT + .get(node.join(NODE_CARNOT_INFO_PATH).unwrap()) + .send() + .await? + .json::() + .await +} diff --git a/nomos-cli/src/api/da.rs b/nomos-cli/src/api/da.rs new file mode 100644 index 00000000..1c2ae440 --- /dev/null +++ b/nomos-cli/src/api/da.rs @@ -0,0 +1,18 @@ +use super::CLIENT; +use full_replication::Blob; +use nomos_core::da::blob; +use reqwest::Url; + +pub async fn get_blobs( + node: &Url, + ids: Vec<::Hash>, +) -> Result, reqwest::Error> { + const BLOBS_PATH: &str = "da/blobs"; + CLIENT + .post(node.join(BLOBS_PATH).unwrap()) + .body(serde_json::to_string(&ids).unwrap()) + .send() + .await? + .json() + .await +} diff --git a/nomos-cli/src/api/mempool.rs b/nomos-cli/src/api/mempool.rs new file mode 100644 index 00000000..9db2253c --- /dev/null +++ b/nomos-cli/src/api/mempool.rs @@ -0,0 +1,15 @@ +use super::CLIENT; +use reqwest::{Error, Response, Url}; +use serde::Serialize; + +pub async fn send_certificate(node: &Url, cert: &C) -> Result +where + C: Serialize, +{ + const NODE_CERT_PATH: &str = "mempool-da/add"; + CLIENT + .post(node.join(NODE_CERT_PATH).unwrap()) + .body(serde_json::to_string(cert).unwrap()) + .send() + .await +} diff --git a/nomos-cli/src/api/mod.rs b/nomos-cli/src/api/mod.rs new file mode 100644 index 00000000..1fa5c4ec --- /dev/null +++ b/nomos-cli/src/api/mod.rs @@ -0,0 +1,9 @@ +pub mod consensus; +pub mod da; +pub mod mempool; +pub mod storage; + +use once_cell::sync::Lazy; +use reqwest::Client; + +static CLIENT: Lazy = Lazy::new(Client::new); diff --git a/nomos-cli/src/api/storage.rs b/nomos-cli/src/api/storage.rs new file mode 100644 index 00000000..d7e8891a --- /dev/null +++ b/nomos-cli/src/api/storage.rs @@ -0,0 +1,21 @@ +use super::CLIENT; +use consensus_engine::BlockId; +use full_replication::Certificate; +use nomos_core::block::Block; +use nomos_node::Tx; +use reqwest::Url; + +pub async fn get_block_contents( + node: &Url, + block: &BlockId, +) -> Result>, reqwest::Error> { + const BLOCK_PATH: &str = "storage/block"; + let block = CLIENT + .post(node.join(BLOCK_PATH).unwrap()) + .body(serde_json::to_string(block).unwrap()) + .send() + .await? + .json() + .await?; + Ok(block) +} diff --git a/nomos-cli/src/da/disseminate.rs b/nomos-cli/src/da/disseminate.rs index aea9fce6..04dac98c 100644 --- a/nomos-cli/src/da/disseminate.rs +++ b/nomos-cli/src/da/disseminate.rs @@ -1,3 +1,4 @@ +use crate::api::mempool::send_certificate; use clap::{Args, ValueEnum}; use full_replication::{AbsoluteNumber, Attestation, Certificate, FullReplication, Voter}; use futures::StreamExt; @@ -15,7 +16,7 @@ use overwatch_rs::{ }, DynError, }; -use reqwest::{Client, Url}; +use reqwest::Url; use serde::Serialize; use std::{ error::Error, @@ -25,8 +26,6 @@ use std::{ }; use tokio::sync::{mpsc::UnboundedReceiver, Mutex}; -const NODE_CERT_PATH: &str = "mempool-da/add"; - pub async fn disseminate_and_wait( mut da: D, data: Box<[u8]>, @@ -69,12 +68,7 @@ where if let Some(node) = node_addr { status_updates.send(Status::SendingCert)?; - let client = Client::new(); - let res = client - .post(node.join(NODE_CERT_PATH).unwrap()) - .body(wire::serialize(&cert).unwrap()) - .send() - .await?; + let res = send_certificate(node, &cert).await?; tracing::info!("Response: {:?}", res); if !res.status().is_success() { diff --git a/nomos-cli/src/da/retrieve.rs b/nomos-cli/src/da/retrieve.rs index 89649f07..7aa25314 100644 --- a/nomos-cli/src/da/retrieve.rs +++ b/nomos-cli/src/da/retrieve.rs @@ -1,15 +1,10 @@ use consensus_engine::BlockId; -use full_replication::{Blob, Certificate}; -use nomos_core::{ - block::Block, - da::{blob, certificate::Certificate as _}, -}; -use nomos_node::Tx; +use full_replication::Blob; +use nomos_core::da::certificate::Certificate; use reqwest::Url; use thiserror::Error; -const BLOCK_PATH: &str = "storage/block"; -const BLOBS_PATH: &str = "da/blobs"; +use crate::api::{da::get_blobs, storage::get_block_contents}; #[derive(Error, Debug)] pub enum Error { @@ -20,37 +15,10 @@ pub enum Error { } /// Return the blobs whose certificate has been included in the provided block. -pub async fn get_block_blobs(node: Url, block: BlockId) -> Result, Error> { - let block = get_block_contents(&node, block) +pub async fn get_block_blobs(node: &Url, block: &BlockId) -> Result, Error> { + let block = get_block_contents(node, block) .await? .ok_or(Error::NotFound)?; Ok(get_blobs(node, block.blobs().map(|cert| cert.blob()).collect()).await?) } - -pub async fn get_block_contents( - node: &Url, - block: BlockId, -) -> Result>, reqwest::Error> { - let block = reqwest::Client::new() - .post(node.join(BLOCK_PATH).unwrap()) - .body(serde_json::to_string(&block).unwrap()) - .send() - .await? - .json() - .await?; - Ok(block) -} - -pub async fn get_blobs( - node: Url, - ids: Vec<::Hash>, -) -> Result, reqwest::Error> { - reqwest::Client::new() - .post(node.join(BLOBS_PATH).unwrap()) - .body(serde_json::to_string(&ids).unwrap()) - .send() - .await? - .json() - .await -} diff --git a/nomos-cli/src/lib.rs b/nomos-cli/src/lib.rs index 594a50d9..27e0099a 100644 --- a/nomos-cli/src/lib.rs +++ b/nomos-cli/src/lib.rs @@ -1,3 +1,4 @@ +pub mod api; pub mod cmds; pub mod da;