From db2a662c27ed2c139fa70626fd01e01c45b6ce20 Mon Sep 17 00:00:00 2001 From: Jannik Straube Date: Thu, 6 Feb 2025 18:13:56 +0100 Subject: [PATCH 1/3] improve resiliency of validator --- Cargo.lock | 1 + validator/Cargo.toml | 1 + validator/src/main.rs | 119 +++++++++++++++++++++++++++--------------- 3 files changed, 78 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e1f721c..fd36126 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5872,6 +5872,7 @@ version = "0.1.4" dependencies = [ "actix-web", "alloy", + "anyhow", "clap 4.5.27", "env_logger 0.11.6", "log", diff --git a/validator/Cargo.toml b/validator/Cargo.toml index b7f697d..8750064 100644 --- a/validator/Cargo.toml +++ b/validator/Cargo.toml @@ -6,6 +6,7 @@ edition.workspace = true [dependencies] actix-web = "4.9.0" alloy = { version = "0.9.2", features = ["full"] } +anyhow = "1.0.95" clap = { version = "4.5.26", features = ["derive"] } env_logger = "0.11.6" log = "0.4.25" diff --git a/validator/src/main.rs b/validator/src/main.rs index 04dd774..3aefd4a 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -1,6 +1,7 @@ use actix_web::{web, App, HttpResponse, HttpServer, Responder}; use alloy::primitives::{hex, Address}; use alloy::signers::Signer; +use anyhow::{Context, Result}; use clap::Parser; use log::LevelFilter; use log::{error, info}; @@ -64,57 +65,74 @@ fn main() { .with_compute_pool() .build() .unwrap(); - loop { - async fn _generate_signature( - wallet: &Wallet, - message: &str, - ) -> Result> { + async fn _generate_signature(wallet: &Wallet, message: &str) -> Result { let signature = wallet .signer .sign_message(message.as_bytes()) - .await? + .await + .context("Failed to sign message")? .as_bytes(); Ok(format!("0x{}", hex::encode(signature))) } - let nodes: Result, Box> = - runtime.block_on(async { - let discovery_route = "/api/validator"; - let address = validator_wallet - .wallet - .default_signer() - .address() - .to_string(); - let signature = _generate_signature(&validator_wallet, discovery_route) - .await - .unwrap(); - - let mut headers = reqwest::header::HeaderMap::new(); - headers.insert("x-address", address.parse().unwrap()); - headers.insert("x-signature", signature.parse().unwrap()); - - info!("Fetching nodes from: {}{}", discovery_url, discovery_route); - let response = reqwest::Client::new() - .get(format!("{}{}", discovery_url, discovery_route)) - .headers(headers) - .send() - .await?; - - let response_text = response.text().await?; - let parsed_response: ApiResponse> = - serde_json::from_str(&response_text)?; - - if !parsed_response.success { - error!("Failed to fetch nodes: {:?}", parsed_response); - return Ok(vec![]); - } + let nodes = match runtime.block_on(async { + let discovery_route = "/api/validator"; + let address = validator_wallet + .wallet + .default_signer() + .address() + .to_string(); + + let signature = _generate_signature(&validator_wallet, discovery_route) + .await + .context("Failed to generate signature")?; + + let mut headers = reqwest::header::HeaderMap::new(); + headers.insert( + "x-address", + reqwest::header::HeaderValue::from_str(&address) + .context("Failed to create address header")?, + ); + headers.insert( + "x-signature", + reqwest::header::HeaderValue::from_str(&signature) + .context("Failed to create signature header")?, + ); + + info!("Fetching nodes from: {}{}", discovery_url, discovery_route); + let response = reqwest::Client::new() + .get(format!("{}{}", discovery_url, discovery_route)) + .headers(headers) + .send() + .await + .context("Failed to fetch nodes")?; + + let response_text = response + .text() + .await + .context("Failed to get response text")?; + + let parsed_response: ApiResponse> = + serde_json::from_str(&response_text).context("Failed to parse response")?; + + if !parsed_response.success { + error!("Failed to fetch nodes: {:?}", parsed_response); + return Ok::, anyhow::Error>(vec![]); + } + + Ok(parsed_response.data) + }) { + Ok(n) => n, + Err(e) => { + error!("Error in node fetching loop: {:#}", e); + std::thread::sleep(std::time::Duration::from_secs(10)); + continue; + } + }; - Ok(parsed_response.data) - }); let non_validated_nodes: Vec = nodes .iter() - .flatten() .filter(|node| !node.is_validated) .cloned() .collect(); @@ -122,13 +140,28 @@ fn main() { info!("Non validated nodes: {:?}", non_validated_nodes); for node in non_validated_nodes { - let node_address = node.id.trim_start_matches("0x").parse::
().unwrap(); + let node_address = match node.id.trim_start_matches("0x").parse::
() { + Ok(addr) => addr, + Err(e) => { + error!("Failed to parse node address {}: {}", node.id, e); + continue; + } + }; - let provider_address = node + let provider_address = match node .provider_address .trim_start_matches("0x") .parse::
() - .unwrap(); + { + Ok(addr) => addr, + Err(e) => { + error!( + "Failed to parse provider address {}: {}", + node.provider_address, e + ); + continue; + } + }; if let Err(e) = runtime.block_on( contracts From f79ee1fd24e6c13f02ac4eb51bfb5e23c96d88f5 Mon Sep 17 00:00:00 2001 From: Jannik Straube Date: Thu, 6 Feb 2025 18:17:53 +0100 Subject: [PATCH 2/3] bump version --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fd36126..e06c835 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2211,7 +2211,7 @@ dependencies = [ [[package]] name = "discovery" -version = "0.1.4" +version = "0.1.5" dependencies = [ "actix-web", "alloy", @@ -3596,7 +3596,7 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miner" -version = "0.1.4" +version = "0.1.5" dependencies = [ "actix-web", "alloy", @@ -4020,7 +4020,7 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orchestrator" -version = "0.1.4" +version = "0.1.5" dependencies = [ "actix-web", "alloy", @@ -5868,7 +5868,7 @@ dependencies = [ [[package]] name = "validator" -version = "0.1.4" +version = "0.1.5" dependencies = [ "actix-web", "alloy", diff --git a/Cargo.toml b/Cargo.toml index 120ba93..d84cb45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["discovery", "miner", "validator", "shared", "orchestrator", "dev-uti resolver = "2" [workspace.package] -version = "0.1.4" +version = "0.1.5" edition = "2021" [workspace.features] From 58d136ba43eeea5a17041f49693fc99be35bbf88 Mon Sep 17 00:00:00 2001 From: Jannik Straube Date: Thu, 6 Feb 2025 18:19:20 +0100 Subject: [PATCH 3/3] fmt --- validator/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator/src/main.rs b/validator/src/main.rs index 3aefd4a..80f78fa 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -95,7 +95,7 @@ fn main() { .context("Failed to create address header")?, ); headers.insert( - "x-signature", + "x-signature", reqwest::header::HeaderValue::from_str(&signature) .context("Failed to create signature header")?, );