From c463b39ddeb1f760d573080d8745039fba48a914 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com> Date: Fri, 27 Sep 2024 16:18:32 +1000 Subject: [PATCH 01/46] feat: add `GetVkResponse` (#16) --- examples/cloud.rs | 10 +++++----- examples/local.rs | 6 +++--- src/config.rs | 2 +- src/prover/builder.rs | 7 +++++-- src/prover/proving_service.rs | 11 ++++++++--- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index acdddbf..378a620 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -1,11 +1,11 @@ use clap::Parser; -use std::sync::Arc; use scroll_proving_sdk::{ config::{CloudProverConfig, Config}, prover::{ proving_service::{ - GetVkRequest, ProveRequest, ProveResponse, QueryTaskRequest, QueryTaskResponse, + GetVkRequest, GetVkResponse, ProveRequest, ProveResponse, QueryTaskRequest, + QueryTaskResponse, }, ProverBuilder, ProvingService, }, @@ -21,7 +21,7 @@ struct Args { } struct CloudProver { - endpoint: String, + base_url: String, api_key: String, } @@ -29,7 +29,7 @@ impl ProvingService for CloudProver { fn is_local(&self) -> bool { false } - fn get_vk(&self, req: GetVkRequest) -> String { + fn get_vk(&self, req: GetVkRequest) -> GetVkResponse { todo!() } fn prove(&self, req: ProveRequest) -> ProveResponse { @@ -43,7 +43,7 @@ impl ProvingService for CloudProver { impl CloudProver { pub fn new(cfg: CloudProverConfig) -> Self { Self { - endpoint: cfg.endpoint, + base_url: cfg.base_url, api_key: cfg.api_key, } } diff --git a/examples/local.rs b/examples/local.rs index 22e612d..d49b28f 100644 --- a/examples/local.rs +++ b/examples/local.rs @@ -1,11 +1,11 @@ use clap::Parser; -use std::sync::Arc; use scroll_proving_sdk::{ config::{Config, LocalProverConfig}, prover::{ proving_service::{ - GetVkRequest, ProveRequest, ProveResponse, QueryTaskRequest, QueryTaskResponse, + GetVkRequest, GetVkResponse, ProveRequest, ProveResponse, QueryTaskRequest, + QueryTaskResponse, }, ProverBuilder, ProvingService, }, @@ -26,7 +26,7 @@ impl ProvingService for LocalProver { fn is_local(&self) -> bool { true } - fn get_vk(&self, req: GetVkRequest) -> String { + fn get_vk(&self, req: GetVkRequest) -> GetVkResponse { todo!() } fn prove(&self, req: ProveRequest) -> ProveResponse { diff --git a/src/config.rs b/src/config.rs index e25320e..29291d2 100644 --- a/src/config.rs +++ b/src/config.rs @@ -36,7 +36,7 @@ pub struct ProverConfig { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct CloudProverConfig { - pub endpoint: String, + pub base_url: String, pub api_key: String, } diff --git a/src/prover/builder.rs b/src/prover/builder.rs index f4036e1..a10f51d 100644 --- a/src/prover/builder.rs +++ b/src/prover/builder.rs @@ -47,11 +47,14 @@ impl ProverBuilder { circuit_type: self.cfg.prover.circuit_type, circuit_version: self.cfg.prover.circuit_version.clone(), }; - let vk = self + let get_vk_response = self .proving_service .as_ref() .unwrap() .get_vk(get_vk_request); + if let Some(error) = get_vk_response.error { + anyhow::bail!("failed to get vk: {}", error); + } let key_signers: Result, _> = (0..self.cfg.prover.n_workers) .map(|i| { @@ -66,7 +69,7 @@ impl ProverBuilder { CoordinatorClient::new( self.cfg.coordinator.clone(), self.cfg.prover.circuit_type, - vec![vk.clone()], + vec![get_vk_response.vk.clone()], self.cfg.prover.circuit_version.clone(), format!("{}{}", self.cfg.prover_name_prefix, i), key_signers[i].clone(), diff --git a/src/prover/proving_service.rs b/src/prover/proving_service.rs index eb04f8f..19f2e76 100644 --- a/src/prover/proving_service.rs +++ b/src/prover/proving_service.rs @@ -2,9 +2,9 @@ use super::CircuitType; pub trait ProvingService { fn is_local(&self) -> bool; - fn get_vk(&self, req: GetVkRequest) -> String; // TODO: Result - fn prove(&self, req: ProveRequest) -> ProveResponse; // TODO: Result - fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse; // TODO: Result + fn get_vk(&self, req: GetVkRequest) -> GetVkResponse; + fn prove(&self, req: ProveRequest) -> ProveResponse; + fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse; } pub struct GetVkRequest { @@ -12,6 +12,11 @@ pub struct GetVkRequest { pub circuit_version: String, } +pub struct GetVkResponse { + pub vk: String, + pub error: Option, +} + pub struct ProveRequest { pub circuit_type: CircuitType, pub circuit_version: String, From 9db727996b076d7d1053188e9dbb54b881ebf9e9 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Sun, 29 Sep 2024 14:16:56 +1000 Subject: [PATCH 02/46] implement sindri client --- examples/cloud.rs | 339 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 329 insertions(+), 10 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 378a620..b15959a 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -1,13 +1,20 @@ use clap::Parser; +use reqwest::{ + header::{CONTENT_ENCODING, CONTENT_TYPE}, + Url, +}; +use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; +use serde::Serialize; +use std::collections::HashMap; use scroll_proving_sdk::{ config::{CloudProverConfig, Config}, prover::{ proving_service::{ GetVkRequest, GetVkResponse, ProveRequest, ProveResponse, QueryTaskRequest, - QueryTaskResponse, + QueryTaskResponse, TaskStatus, }, - ProverBuilder, ProvingService, + CircuitType, ProverBuilder, ProvingService, }, utils::init_tracing, }; @@ -21,35 +28,345 @@ struct Args { } struct CloudProver { - base_url: String, + base_url: Url, api_key: String, + client: ClientWithMiddleware, + rt: tokio::runtime::Runtime, +} + +#[derive(serde::Deserialize)] +struct VerificationKey { + verification_key: String, +} + +#[derive(serde::Deserialize)] +struct SindriTaskStatusResponse { + pub proof_id: String, + pub project_name: String, + pub perfoman_verify: bool, + pub status: SindriTaskStatus, + pub compute_time_sec: Option, + pub queue_time_sec: Option, + pub verification_key: Option, + pub proof: Option, + pub public: Option, + pub warnings: Option>, + pub error: Option, +} + +#[derive(serde::Deserialize)] +enum SindriTaskStatus { + #[serde(rename = "Queued")] + Queued, + #[serde(rename = "In Progress")] + Proving, + #[serde(rename = "Ready")] + Success, + #[serde(rename = "Failed")] + Failed, +} + +impl From for TaskStatus { + fn from(status: SindriTaskStatus) -> Self { + match status { + SindriTaskStatus::Queued => TaskStatus::Queued, + SindriTaskStatus::Proving => TaskStatus::Proving, + SindriTaskStatus::Success => TaskStatus::Success, + SindriTaskStatus::Failed => TaskStatus::Failed, + } + } +} + +enum MethodClass { + Circuit(CircuitType), + Proof(String), } impl ProvingService for CloudProver { fn is_local(&self) -> bool { false } + fn get_vk(&self, req: GetVkRequest) -> GetVkResponse { - todo!() + if req.circuit_version != THIS_CIRCUIT_VERSION { + return GetVkResponse { + vk: String::new(), + error: Some("circuit version mismatch".to_string()), + }; + }; + + #[derive(serde::Deserialize)] + struct SindriGetDetailResponse { + circuit_id: String, + circuit_name: String, + verification_key: VerificationKey, + } + + match self + .rt + .block_on(self.get_with_token::( + MethodClass::Circuit(req.circuit_type), + "detail", + None, + )) { + Ok(resp) => GetVkResponse { + vk: resp.verification_key.verification_key, + error: None, + }, + Err(e) => GetVkResponse { + vk: String::new(), + error: Some(e.to_string()), + }, + } } + fn prove(&self, req: ProveRequest) -> ProveResponse { - todo!() + if req.circuit_version != THIS_CIRCUIT_VERSION { + return ProveResponse { + task_id: String::new(), + circuit_type: req.circuit_type, + circuit_version: req.circuit_version, + hard_fork_name: req.hard_fork_name, + status: TaskStatus::Failed, + created_at: 0, + started_at: None, + finished_at: None, + compute_time_sec: None, + input: Some(req.input.clone()), + proof: None, + vk: None, + error: Some("circuit version mismatch".to_string()), + }; + }; + + #[derive(serde::Deserialize, serde::Serialize)] + struct SindriProveRequest { + proof_input: String, + perform_verify: bool, + } + + let sindri_req = SindriProveRequest { + proof_input: req.input.clone(), + perform_verify: true, + }; + + match self.rt.block_on( + self.post_with_token::( + MethodClass::Circuit(req.circuit_type), + "prove", + &sindri_req, + ), + ) { + Ok(resp) => ProveResponse { + task_id: resp.proof_id, + circuit_type: req.circuit_type, + circuit_version: req.circuit_version, + hard_fork_name: req.hard_fork_name, + status: resp.status.into(), + created_at: 0, // TODO: + started_at: None, // TODO: + finished_at: None, // TODO: + compute_time_sec: resp.compute_time_sec, + input: Some(req.input.clone()), + proof: resp.proof, + vk: resp.verification_key.map(|vk| vk.verification_key), + error: resp.error, + }, + Err(e) => ProveResponse { + task_id: String::new(), + circuit_type: req.circuit_type, + circuit_version: req.circuit_version, + hard_fork_name: req.hard_fork_name, + status: TaskStatus::Failed, + created_at: 0, + started_at: None, + finished_at: None, + compute_time_sec: None, + input: Some(req.input.clone()), + proof: None, + vk: None, + error: Some("failed to request proof".to_string()), + }, + } } + fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse { - todo!() + let query_params: HashMap = HashMap::from([ + ("include_proof".to_string(), "true".to_string()), + ("include_public".to_string(), "true".to_string()), + ("include_verification_key".to_string(), "true".to_string()), + ]); + + match self + .rt + .block_on(self.get_with_token::( + MethodClass::Proof(req.task_id.clone()), + "detail", + Some(query_params), + )) { + Ok(resp) => QueryTaskResponse { + task_id: resp.proof_id, + circuit_type: CircuitType::Undefined, // TODO: + circuit_version: "".to_string(), + hard_fork_name: "".to_string(), + status: resp.status.into(), + created_at: 0, // TODO: + started_at: None, // TODO: + finished_at: None, // TODO: + compute_time_sec: resp.compute_time_sec, + input: None, + proof: resp.proof, + vk: resp.verification_key.map(|vk| vk.verification_key), + error: resp.error, + }, + Err(e) => QueryTaskResponse { + task_id: req.task_id, + circuit_type: CircuitType::Undefined, + circuit_version: "".to_string(), + hard_fork_name: "".to_string(), + status: TaskStatus::Queued, + created_at: 0, + started_at: None, + finished_at: None, + compute_time_sec: None, + input: None, + proof: None, + vk: None, + error: Some("failed to query proof".to_string()), + }, + } } } +const THIS_CIRCUIT_VERSION: &str = "v0.13.1"; + impl CloudProver { pub fn new(cfg: CloudProverConfig) -> Self { + let client = ClientBuilder::new(reqwest::Client::new()) + // .with(RetryTransientMiddleware::new_with_policy(retry_policy)) // TODO: retry policy + .build(); + + let base_url = Url::parse(&cfg.base_url).expect("cannot parse cloud prover base_url"); + + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + Self { - base_url: cfg.base_url, + base_url, api_key: cfg.api_key, + client, + rt, + } + } + + fn build_url( + &self, + method_class: MethodClass, + method: &str, + query_params: Option>, + ) -> anyhow::Result { + let method_base = match method_class { + MethodClass::Circuit(circuit_type) => { + let circuit = match circuit_type { + CircuitType::Chunk => "chunk_prover", + CircuitType::Batch => "batch_prover", + CircuitType::Bundle => "bundle_prover", + CircuitType::Undefined => unreachable!("circuit type is undefined"), + }; + format!("circuit/{}:{}", circuit, THIS_CIRCUIT_VERSION) + } + MethodClass::Proof(id) => format!("proof/{}", id), + }; + + let mut url = self.base_url.join(&method_base)?.join(method)?; + + if let Some(params) = query_params { + for (key, value) in params { + url.query_pairs_mut().append_pair(&key, &value); + } } + + Ok(url) + } + + async fn post_with_token( + &self, + method_class: MethodClass, + method: &str, + req: &Req, + ) -> anyhow::Result + where + Req: ?Sized + Serialize, + Resp: serde::de::DeserializeOwned, + { + let request_body = serde_json::to_string(req)?; + + self.request_with_token(method_class, method, None, Some(request_body)) + .await + } + + async fn get_with_token( + &self, + method_class: MethodClass, + method: &str, + query_params: Option>, + ) -> anyhow::Result + where + Resp: serde::de::DeserializeOwned, + { + self.request_with_token(method_class, method, query_params, None) + .await + } + + async fn request_with_token( + &self, + method_class: MethodClass, + method: &str, + query_params: Option>, + request_body: Option, + ) -> anyhow::Result + where + Resp: serde::de::DeserializeOwned, + { + let url = self.build_url(method_class, method, query_params)?; + + log::info!("[sindri client]: {:?}", url.as_str()); + + let resp_builder = match request_body { + Some(request_body) => self.client.post(url).body(request_body), + None => self.client.get(url), + }; + + let resp_builder = resp_builder + // .timeout(self.send_timeout) // TODO: timeout + .header(CONTENT_TYPE, "application/json") + .header(CONTENT_ENCODING, "gzip") + .bearer_auth(self.api_key.clone()); + + let response = resp_builder.send().await?; + + if response.status() != http::status::StatusCode::OK { + // log::error!( + // "[sindir client], {method}, status not ok: {}", + // response.status() + // ); + anyhow::bail!( + "[sindir client], {method}, status not ok: {}", + response.status() + ) + } + + let response_body = response.text().await?; + + // log::info!("[sindir client], {method}, response: {response_body}"); + serde_json::from_str(&response_body).map_err(|e| anyhow::anyhow!(e)) } } -fn main() -> anyhow::Result<()> { +#[tokio::main] +async fn main() -> anyhow::Result<()> { init_tracing(); let args = Args::parse(); @@ -59,5 +376,7 @@ fn main() -> anyhow::Result<()> { .with_proving_service(Box::new(cloud_prover)) .build()?; - Arc::new(prover).run() -} + prover.run().await; + + Ok(()) +} \ No newline at end of file From 55404a993ee74a9369c75843d6ae5a19e039d941 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Sun, 29 Sep 2024 04:21:48 +0000 Subject: [PATCH 03/46] compile --- .gitignore | 4 +++- examples/cloud.rs | 12 +++++------- examples/local.rs | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 38be5e3..f1519c3 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,6 @@ target/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ \ No newline at end of file +#.idea/ + +config.json diff --git a/examples/cloud.rs b/examples/cloud.rs index b15959a..75b4d20 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -6,6 +6,7 @@ use reqwest::{ use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use serde::Serialize; use std::collections::HashMap; +use std::sync::Arc; use scroll_proving_sdk::{ config::{CloudProverConfig, Config}, @@ -275,7 +276,7 @@ impl CloudProver { CircuitType::Bundle => "bundle_prover", CircuitType::Undefined => unreachable!("circuit type is undefined"), }; - format!("circuit/{}:{}", circuit, THIS_CIRCUIT_VERSION) + format!("circuit/scroll-tech/{}:{}", circuit, THIS_CIRCUIT_VERSION) } MethodClass::Proof(id) => format!("proof/{}", id), }; @@ -365,8 +366,7 @@ impl CloudProver { } } -#[tokio::main] -async fn main() -> anyhow::Result<()> { +fn main() -> anyhow::Result<()> { init_tracing(); let args = Args::parse(); @@ -376,7 +376,5 @@ async fn main() -> anyhow::Result<()> { .with_proving_service(Box::new(cloud_prover)) .build()?; - prover.run().await; - - Ok(()) -} \ No newline at end of file + Arc::new(prover).run() +} diff --git a/examples/local.rs b/examples/local.rs index d49b28f..4e407b9 100644 --- a/examples/local.rs +++ b/examples/local.rs @@ -1,4 +1,5 @@ use clap::Parser; +use std::sync::Arc; use scroll_proving_sdk::{ config::{Config, LocalProverConfig}, From e3fe8bce3a0f2dd8256b7b6114efd5be8472f4ec Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Sun, 29 Sep 2024 04:42:59 +0000 Subject: [PATCH 04/46] fix url join --- examples/cloud.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 75b4d20..585c0e5 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -276,9 +276,9 @@ impl CloudProver { CircuitType::Bundle => "bundle_prover", CircuitType::Undefined => unreachable!("circuit type is undefined"), }; - format!("circuit/scroll-tech/{}:{}", circuit, THIS_CIRCUIT_VERSION) + format!("circuit/scroll-tech/{}:{}/", circuit, THIS_CIRCUIT_VERSION) } - MethodClass::Proof(id) => format!("proof/{}", id), + MethodClass::Proof(id) => format!("proof/{}/", id), }; let mut url = self.base_url.join(&method_base)?.join(method)?; From 1e7a4755f04bbd5e192ae066c9eb6d5283d07401 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Sun, 29 Sep 2024 04:59:09 +0000 Subject: [PATCH 05/46] improve --- examples/cloud.rs | 4 +++- src/prover/builder.rs | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 585c0e5..5ddf9e3 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -376,5 +376,7 @@ fn main() -> anyhow::Result<()> { .with_proving_service(Box::new(cloud_prover)) .build()?; - Arc::new(prover).run() + Arc::new(prover).run()?; + + loop {} } diff --git a/src/prover/builder.rs b/src/prover/builder.rs index a10f51d..a61d951 100644 --- a/src/prover/builder.rs +++ b/src/prover/builder.rs @@ -62,7 +62,8 @@ impl ProverBuilder { KeySigner::new(&key_path) }) .collect(); - let key_signers = key_signers?; + let key_signers = + key_signers.map_err(|e| anyhow::anyhow!("cannot create key_signer, err: {e}"))?; let coordinator_clients: Result, _> = (0..self.cfg.prover.n_workers) .map(|i| { From a73fa37aa9483239c262bc20cdcacbda25e4c1ed Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Sun, 29 Sep 2024 05:03:09 +0000 Subject: [PATCH 06/46] hardcode version --- .gitignore | 1 + src/utils.rs | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f1519c3..9c0348c 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ target/ #.idea/ config.json +keys/ diff --git a/src/utils.rs b/src/utils.rs index cb25771..7f3da9a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -3,7 +3,9 @@ use tracing_subscriber::filter::{EnvFilter, LevelFilter}; const SDK_VERSION: &str = "v0.0.1"; pub fn get_version(circuit_version: &str) -> String { - format!("{}-{}", SDK_VERSION, circuit_version) + // format!("{}-{}", SDK_VERSION, circuit_version) + // format!("{}-{}", "v4.4.43", circuit_version) + "v4.4.59-bce3383-6f7b46a-e5ddf67".to_string() } pub fn init_tracing() { From 04318dc9ed673939d000481a3a181ef9669a762c Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Sun, 29 Sep 2024 07:33:12 +0000 Subject: [PATCH 07/46] fix vk codec --- examples/cloud.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 5ddf9e3..066c9f7 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -83,6 +83,19 @@ enum MethodClass { Proof(String), } +fn reformat_vk(vk_old: String) -> String { + log::debug!("vk_old: {:?}", vk_old); + + // decode base64 without padding + let vk = base64::decode_config(vk_old, base64::URL_SAFE_NO_PAD).unwrap(); // TODO: error handling + // encode with padding + let vk_new = base64::encode_config(vk, base64::STANDARD); + + log::debug!("vk_new: {:?}", vk_new); + + vk_new +} + impl ProvingService for CloudProver { fn is_local(&self) -> bool { false @@ -111,7 +124,7 @@ impl ProvingService for CloudProver { None, )) { Ok(resp) => GetVkResponse { - vk: resp.verification_key.verification_key, + vk: reformat_vk(resp.verification_key.verification_key), error: None, }, Err(e) => GetVkResponse { From 3eb6af74ef3cb7a2080096bddb98b5b7dc116b5a Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Sun, 29 Sep 2024 09:51:16 +0000 Subject: [PATCH 08/46] handle reformat_vk error --- examples/cloud.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 066c9f7..a543379 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -83,17 +83,17 @@ enum MethodClass { Proof(String), } -fn reformat_vk(vk_old: String) -> String { +fn reformat_vk(vk_old: String) -> anyhow::Result { log::debug!("vk_old: {:?}", vk_old); // decode base64 without padding - let vk = base64::decode_config(vk_old, base64::URL_SAFE_NO_PAD).unwrap(); // TODO: error handling + let vk = base64::decode_config(vk_old, base64::URL_SAFE_NO_PAD)?; // encode with padding let vk_new = base64::encode_config(vk, base64::STANDARD); log::debug!("vk_new: {:?}", vk_new); - vk_new + Ok(vk_new) } impl ProvingService for CloudProver { @@ -123,9 +123,12 @@ impl ProvingService for CloudProver { "detail", None, )) { - Ok(resp) => GetVkResponse { - vk: reformat_vk(resp.verification_key.verification_key), - error: None, + Ok(resp) => match reformat_vk(resp.verification_key.verification_key) { + Ok(vk) => GetVkResponse { vk, error: None }, + Err(e) => GetVkResponse { + vk: String::new(), + error: Some(e.to_string()), + }, }, Err(e) => GetVkResponse { vk: String::new(), From 41ffe501e91d5250eb29facbc29f58cf138247e6 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 00:35:07 +0000 Subject: [PATCH 09/46] hardcode versio --- src/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.rs b/src/utils.rs index 7f3da9a..4a71a8b 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -5,7 +5,7 @@ const SDK_VERSION: &str = "v0.0.1"; pub fn get_version(circuit_version: &str) -> String { // format!("{}-{}", SDK_VERSION, circuit_version) // format!("{}-{}", "v4.4.43", circuit_version) - "v4.4.59-bce3383-6f7b46a-e5ddf67".to_string() + "v4.4.56-bce3383-6f7b46a-e5ddf67".to_string() } pub fn init_tracing() { From 516bd4869f6b999ceca8c666edca24680043dc34 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 07:45:12 +0000 Subject: [PATCH 10/46] fix prover_height --- src/coordinator_handler/types.rs | 2 +- src/prover/mod.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coordinator_handler/types.rs b/src/coordinator_handler/types.rs index b143c4c..d7b09c9 100644 --- a/src/coordinator_handler/types.rs +++ b/src/coordinator_handler/types.rs @@ -60,7 +60,7 @@ pub type ChallengeResponseData = LoginResponseData; #[derive(Default, Serialize, Deserialize)] pub struct GetTaskRequest { pub task_types: Vec, - pub prover_height: Option, + pub prover_height: Option, } #[derive(Serialize, Deserialize, Clone)] diff --git a/src/prover/mod.rs b/src/prover/mod.rs index 6e214c7..283843f 100644 --- a/src/prover/mod.rs +++ b/src/prover/mod.rs @@ -225,11 +225,11 @@ impl Prover { } fn build_get_task_request(&self) -> GetTaskRequest { - let prover_height = self.l2geth_client.as_ref().and_then(|l2geth_client| { + let prover_height: Option = self.l2geth_client.as_ref().and_then(|l2geth_client| { l2geth_client .block_number_sync() .ok() - .and_then(|block_number| block_number.as_number()) + .and_then(|block_number| block_number.as_number().map(|num| num.as_u64())) }); GetTaskRequest { From a21cd3da1f3357ab5520ba02ad46998d17c72570 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 08:01:17 +0000 Subject: [PATCH 11/46] improve error --- examples/cloud.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index a543379..282757d 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -202,7 +202,7 @@ impl ProvingService for CloudProver { input: Some(req.input.clone()), proof: None, vk: None, - error: Some("failed to request proof".to_string()), + error: Some(anyhow::anyhow!("failed to request proof: {e}").to_string()), }, } } @@ -249,7 +249,7 @@ impl ProvingService for CloudProver { input: None, proof: None, vk: None, - error: Some("failed to query proof".to_string()), + error: Some(anyhow::anyhow!("failed to query proof: {e}").to_string()), }, } } From cc388d3b7c379515fa359b60d8e50e8c7d668fdd Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 08:08:03 +0000 Subject: [PATCH 12/46] fix status --- examples/cloud.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 282757d..79caa4c 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -364,20 +364,21 @@ impl CloudProver { let response = resp_builder.send().await?; - if response.status() != http::status::StatusCode::OK { - // log::error!( - // "[sindir client], {method}, status not ok: {}", - // response.status() - // ); + let status = response.status(); + if !(status >= http::status::StatusCode::OK && status <= http::status::StatusCode::ACCEPTED){ + log::error!( + "[sindir client], {method}, status not ok: {}", + status + ); anyhow::bail!( "[sindir client], {method}, status not ok: {}", - response.status() + status ) } let response_body = response.text().await?; - // log::info!("[sindir client], {method}, response: {response_body}"); + log::info!("[sindir client], {method}, response: {response_body}"); serde_json::from_str(&response_body).map_err(|e| anyhow::anyhow!(e)) } } From d873eb34e098989264479c772e6eb8ca85418c8e Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 08:10:55 +0000 Subject: [PATCH 13/46] fix SindriTaskStatusResponse --- examples/cloud.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 79caa4c..d7adfee 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -44,7 +44,7 @@ struct VerificationKey { struct SindriTaskStatusResponse { pub proof_id: String, pub project_name: String, - pub perfoman_verify: bool, + pub perform_verify: bool, pub status: SindriTaskStatus, pub compute_time_sec: Option, pub queue_time_sec: Option, From 442669b349c087352d1689a78037036a318e8816 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 08:43:53 +0000 Subject: [PATCH 14/46] improve logging --- examples/cloud.rs | 16 ++++++---------- src/coordinator_handler/api.rs | 14 ++++++++------ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index d7adfee..0228211 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -365,20 +365,16 @@ impl CloudProver { let response = resp_builder.send().await?; let status = response.status(); - if !(status >= http::status::StatusCode::OK && status <= http::status::StatusCode::ACCEPTED){ - log::error!( - "[sindir client], {method}, status not ok: {}", - status - ); - anyhow::bail!( - "[sindir client], {method}, status not ok: {}", - status - ) + if !(status >= http::status::StatusCode::OK && status <= http::status::StatusCode::ACCEPTED) + { + // log::error!("[sindir client], {method}, status not ok: {}", status); + anyhow::bail!("[sindir client], {method}, status not ok: {}", status) } let response_body = response.text().await?; - log::info!("[sindir client], {method}, response: {response_body}"); + log::info!("[sindir client], {method}, received response"); + log::debug!("[sindir client], {method}, response: {response_body}"); serde_json::from_str(&response_body).map_err(|e| anyhow::anyhow!(e)) } } diff --git a/src/coordinator_handler/api.rs b/src/coordinator_handler/api.rs index a93b6a3..ac39cf9 100644 --- a/src/coordinator_handler/api.rs +++ b/src/coordinator_handler/api.rs @@ -50,7 +50,8 @@ impl Api { let url = self.build_url(method)?; let request_body = serde_json::to_string(req)?; - log::info!("[coordinator client], {method}, request: {request_body}"); + log::info!("[coordinator client], {method}, sent request"); + log::debug!("[coordinator client], {method}, request: {request_body}"); let response = self .client .post(url) @@ -62,10 +63,10 @@ impl Api { .await?; if response.status() != http::status::StatusCode::OK { - log::error!( - "[coordinator client], {method}, status not ok: {}", - response.status() - ); + // log::error!( + // "[coordinator client], {method}, status not ok: {}", + // response.status() + // ); anyhow::bail!( "[coordinator client], {method}, status not ok: {}", response.status() @@ -74,7 +75,8 @@ impl Api { let response_body = response.text().await?; - log::info!("[coordinator client], {method}, response: {response_body}"); + log::info!("[coordinator client], {method}, received response"); + log::debug!("[coordinator client], {method}, response: {response_body}"); serde_json::from_str(&response_body).map_err(|e| anyhow::anyhow!(e)) } From d08020f26fe53d368702e3fd1a88f396f159fbaa Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 09:00:05 +0000 Subject: [PATCH 15/46] skip compute_time_sec --- examples/cloud.rs | 20 +++++++++++--------- src/prover/proving_service.rs | 4 ++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 0228211..109cb16 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -46,8 +46,8 @@ struct SindriTaskStatusResponse { pub project_name: String, pub perform_verify: bool, pub status: SindriTaskStatus, - pub compute_time_sec: Option, - pub queue_time_sec: Option, + // pub compute_time_sec: Option, + // pub queue_time_sec: Option, pub verification_key: Option, pub proof: Option, pub public: Option, @@ -148,7 +148,7 @@ impl ProvingService for CloudProver { created_at: 0, started_at: None, finished_at: None, - compute_time_sec: None, + // compute_time_sec: None, input: Some(req.input.clone()), proof: None, vk: None, @@ -183,7 +183,7 @@ impl ProvingService for CloudProver { created_at: 0, // TODO: started_at: None, // TODO: finished_at: None, // TODO: - compute_time_sec: resp.compute_time_sec, + // compute_time_sec: resp.compute_time_sec, input: Some(req.input.clone()), proof: resp.proof, vk: resp.verification_key.map(|vk| vk.verification_key), @@ -198,7 +198,7 @@ impl ProvingService for CloudProver { created_at: 0, started_at: None, finished_at: None, - compute_time_sec: None, + // compute_time_sec: None, input: Some(req.input.clone()), proof: None, vk: None, @@ -230,13 +230,15 @@ impl ProvingService for CloudProver { created_at: 0, // TODO: started_at: None, // TODO: finished_at: None, // TODO: - compute_time_sec: resp.compute_time_sec, + // compute_time_sec: resp.compute_time_sec, input: None, proof: resp.proof, vk: resp.verification_key.map(|vk| vk.verification_key), error: resp.error, }, - Err(e) => QueryTaskResponse { + Err(e) => { + log::error!("failed to query proof: {:?}", e); + QueryTaskResponse { task_id: req.task_id, circuit_type: CircuitType::Undefined, circuit_version: "".to_string(), @@ -245,12 +247,12 @@ impl ProvingService for CloudProver { created_at: 0, started_at: None, finished_at: None, - compute_time_sec: None, + // compute_time_sec: None, input: None, proof: None, vk: None, error: Some(anyhow::anyhow!("failed to query proof: {e}").to_string()), - }, + }}, } } } diff --git a/src/prover/proving_service.rs b/src/prover/proving_service.rs index 19f2e76..109c6d1 100644 --- a/src/prover/proving_service.rs +++ b/src/prover/proving_service.rs @@ -33,7 +33,7 @@ pub struct ProveResponse { pub created_at: u64, pub started_at: Option, pub finished_at: Option, - pub compute_time_sec: Option, + // pub compute_time_sec: Option, pub input: Option, pub proof: Option, pub vk: Option, @@ -53,7 +53,7 @@ pub struct QueryTaskResponse { pub created_at: u64, pub started_at: Option, pub finished_at: Option, - pub compute_time_sec: Option, + // pub compute_time_sec: Option, pub input: Option, pub proof: Option, pub vk: Option, From 8ae991bba6e79973e3be83f8e472b2cb76d32851 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 09:58:38 +0000 Subject: [PATCH 16/46] deal with chunk_proof for now --- examples/cloud.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 109cb16..507ac02 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -1,4 +1,5 @@ use clap::Parser; +use prover_darwin_v2::ChunkProof; use reqwest::{ header::{CONTENT_ENCODING, CONTENT_TYPE}, Url, @@ -49,8 +50,8 @@ struct SindriTaskStatusResponse { // pub compute_time_sec: Option, // pub queue_time_sec: Option, pub verification_key: Option, - pub proof: Option, - pub public: Option, + pub proof: Option, // TODO: support other proof types + // pub public: Option, // TODO: fix me pub warnings: Option>, pub error: Option, } @@ -185,7 +186,7 @@ impl ProvingService for CloudProver { finished_at: None, // TODO: // compute_time_sec: resp.compute_time_sec, input: Some(req.input.clone()), - proof: resp.proof, + proof: serde_json::to_string(&resp.proof).ok(), vk: resp.verification_key.map(|vk| vk.verification_key), error: resp.error, }, @@ -232,7 +233,7 @@ impl ProvingService for CloudProver { finished_at: None, // TODO: // compute_time_sec: resp.compute_time_sec, input: None, - proof: resp.proof, + proof: serde_json::to_string(&resp.proof).ok(), vk: resp.verification_key.map(|vk| vk.verification_key), error: resp.error, }, From 3096a7caf5793d5a02824f51b98a8f5a6472faa8 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Mon, 30 Sep 2024 11:00:47 +0000 Subject: [PATCH 17/46] add tretry --- examples/cloud.rs | 41 +++++++++++++++++++++++++---------------- src/config.rs | 3 +++ 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 507ac02..1b73978 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -1,10 +1,12 @@ use clap::Parser; +use core::time::Duration; use prover_darwin_v2::ChunkProof; use reqwest::{ header::{CONTENT_ENCODING, CONTENT_TYPE}, Url, }; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; +use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware}; use serde::Serialize; use std::collections::HashMap; use std::sync::Arc; @@ -32,6 +34,7 @@ struct Args { struct CloudProver { base_url: Url, api_key: String, + send_timeout: Duration, client: ClientWithMiddleware, rt: tokio::runtime::Runtime, } @@ -240,20 +243,21 @@ impl ProvingService for CloudProver { Err(e) => { log::error!("failed to query proof: {:?}", e); QueryTaskResponse { - task_id: req.task_id, - circuit_type: CircuitType::Undefined, - circuit_version: "".to_string(), - hard_fork_name: "".to_string(), - status: TaskStatus::Queued, - created_at: 0, - started_at: None, - finished_at: None, - // compute_time_sec: None, - input: None, - proof: None, - vk: None, - error: Some(anyhow::anyhow!("failed to query proof: {e}").to_string()), - }}, + task_id: req.task_id, + circuit_type: CircuitType::Undefined, + circuit_version: "".to_string(), + hard_fork_name: "".to_string(), + status: TaskStatus::Queued, + created_at: 0, + started_at: None, + finished_at: None, + // compute_time_sec: None, + input: None, + proof: None, + vk: None, + error: Some(anyhow::anyhow!("failed to query proof: {e}").to_string()), + } + } } } } @@ -262,8 +266,12 @@ const THIS_CIRCUIT_VERSION: &str = "v0.13.1"; impl CloudProver { pub fn new(cfg: CloudProverConfig) -> Self { + let retry_wait_duration = Duration::from_secs(cfg.retry_wait_time_sec); + let retry_policy = ExponentialBackoff::builder() + .retry_bounds(retry_wait_duration / 2, retry_wait_duration) + .build_with_max_retries(cfg.retry_count); let client = ClientBuilder::new(reqwest::Client::new()) - // .with(RetryTransientMiddleware::new_with_policy(retry_policy)) // TODO: retry policy + .with(RetryTransientMiddleware::new_with_policy(retry_policy)) .build(); let base_url = Url::parse(&cfg.base_url).expect("cannot parse cloud prover base_url"); @@ -276,6 +284,7 @@ impl CloudProver { Self { base_url, api_key: cfg.api_key, + send_timeout: Duration::from_secs(cfg.connection_timeout_sec), client, rt, } @@ -360,7 +369,7 @@ impl CloudProver { }; let resp_builder = resp_builder - // .timeout(self.send_timeout) // TODO: timeout + .timeout(self.send_timeout) .header(CONTENT_TYPE, "application/json") .header(CONTENT_ENCODING, "gzip") .bearer_auth(self.api_key.clone()); diff --git a/src/config.rs b/src/config.rs index 29291d2..73e302c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -38,6 +38,9 @@ pub struct ProverConfig { pub struct CloudProverConfig { pub base_url: String, pub api_key: String, + pub retry_count: u32, + pub retry_wait_time_sec: u64, + pub connection_timeout_sec: u64, } #[derive(Debug, Serialize, Deserialize, Clone)] From 2907e411d9e39cd80530affd5b769a2df0e0705e Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Fri, 4 Oct 2024 13:56:43 +1000 Subject: [PATCH 18/46] Revert "Revert "refactor: use tokio async pattern (#15)" (#17)" This reverts commit 0b2105c6de0df6fc0b9d6a37e96779cf741992fc. --- Cargo.lock | 13 ++++ Cargo.toml | 2 +- examples/cloud.rs | 8 +-- examples/local.rs | 8 +-- src/coordinator_handler/coordinator_client.rs | 68 ++++++------------- src/prover/mod.rs | 50 ++++++++------ src/tracing_handler.rs | 26 ++----- 7 files changed, 77 insertions(+), 98 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e892792..b1a3049 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4684,11 +4684,24 @@ dependencies = [ "bytes", "libc", "mio", + "num_cpus", "pin-project-lite", "socket2", + "tokio-macros", "windows-sys 0.48.0", ] +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "tokio-native-tls" version = "0.3.1" diff --git a/Cargo.toml b/Cargo.toml index 517e9b7..10f2af4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ tiny-keccak = { version = "2.0.0", features = ["sha3", "keccak"] } rand = "0.8.5" eth-keystore = "0.5.0" rlp = "0.5.2" -tokio = "1.37.0" +tokio = { version = "1.37.0", features = ["macros", "rt-multi-thread"] } sled = "0.34.7" http = "1.1.0" clap = { version = "4.5", features = ["derive"] } diff --git a/examples/cloud.rs b/examples/cloud.rs index fe09d7e..0cc34ed 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -1,5 +1,4 @@ use clap::Parser; -use std::sync::Arc; use scroll_proving_sdk::{ config::{CloudProverConfig, Config}, @@ -50,7 +49,8 @@ impl CloudProver { } } -fn main() -> anyhow::Result<()> { +#[tokio::main] +async fn main() -> anyhow::Result<()> { init_tracing(); let args = Args::parse(); @@ -60,7 +60,7 @@ fn main() -> anyhow::Result<()> { .with_proving_service(Box::new(cloud_prover)) .build()?; - Arc::new(prover).run()?; + prover.run().await; - loop {} + Ok(()) } diff --git a/examples/local.rs b/examples/local.rs index 4ba5609..4f25b3b 100644 --- a/examples/local.rs +++ b/examples/local.rs @@ -1,5 +1,4 @@ use clap::Parser; -use std::sync::Arc; use scroll_proving_sdk::{ config::{Config, LocalProverConfig}, @@ -44,7 +43,8 @@ impl LocalProver { } } -fn main() -> anyhow::Result<()> { +#[tokio::main] +async fn main() -> anyhow::Result<()> { init_tracing(); let args = Args::parse(); @@ -54,7 +54,7 @@ fn main() -> anyhow::Result<()> { .with_proving_service(Box::new(local_prover)) .build()?; - Arc::new(prover).run()?; + prover.run().await; - loop {} + Ok(()) } diff --git a/src/coordinator_handler/coordinator_client.rs b/src/coordinator_handler/coordinator_client.rs index a687430..fa61635 100644 --- a/src/coordinator_handler/coordinator_client.rs +++ b/src/coordinator_handler/coordinator_client.rs @@ -3,8 +3,7 @@ use super::{ LoginRequest, Response, SubmitProofRequest, SubmitProofResponseData, }; use crate::{config::CoordinatorConfig, prover::CircuitType, utils::get_version}; -use std::sync::{Mutex, MutexGuard}; -use tokio::runtime::Runtime; +use tokio::sync::{Mutex, MutexGuard}; pub struct CoordinatorClient { circuit_type: CircuitType, @@ -14,7 +13,6 @@ pub struct CoordinatorClient { key_signer: KeySigner, api: Api, token: Mutex>, - rt: Runtime, } impl CoordinatorClient { @@ -26,9 +24,6 @@ impl CoordinatorClient { prover_name: String, key_signer: KeySigner, ) -> anyhow::Result { - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build()?; let api = Api::new(cfg)?; let client = Self { circuit_type, @@ -38,79 +33,58 @@ impl CoordinatorClient { key_signer, api, token: Mutex::new(None), - rt, }; Ok(client) } - pub fn get_task(&self, req: &GetTaskRequest) -> anyhow::Result> { - let token = self.get_token_sync(false)?; - let response = self.get_task_sync(req, &token)?; + pub async fn get_task( + &self, + req: &GetTaskRequest, + ) -> anyhow::Result> { + let token = self.get_token(false).await?; + let response = self.api.get_task(req, &token).await?; if response.errcode == ErrorCode::ErrJWTTokenExpired { - let token = self.get_token_sync(true)?; - self.get_task_sync(req, &token) + let token = self.get_token(true).await?; + self.api.get_task(req, &token).await } else { Ok(response) } } - pub fn submit_proof( + pub async fn submit_proof( &self, req: &SubmitProofRequest, ) -> anyhow::Result> { - let token = self.get_token_sync(false)?; - let response = self.submit_proof_sync(req, &token)?; + let token = self.get_token(false).await?; + let response = self.api.submit_proof(req, &token).await?; if response.errcode == ErrorCode::ErrJWTTokenExpired { - let token = self.get_token_sync(true)?; - self.submit_proof_sync(req, &token) + let token = self.get_token(true).await?; + self.api.submit_proof(req, &token).await } else { Ok(response) } } - fn get_task_sync( - &self, - req: &GetTaskRequest, - token: &String, - ) -> anyhow::Result> { - self.rt.block_on(self.api.get_task(req, token)) - } - - fn submit_proof_sync( - &self, - req: &SubmitProofRequest, - token: &String, - ) -> anyhow::Result> { - self.rt.block_on(self.api.submit_proof(req, token)) - } - - fn get_token_sync(&self, force_relogin: bool) -> anyhow::Result { - self.rt.block_on(self.get_token_async(force_relogin)) - } - /// Retrieves a token for authentication, optionally forcing a re-login. /// /// This function attempts to get the stored token if `force_relogin` is set to `false`. /// /// If the token is expired, `force_relogin` is set to `true`, or a login was never performed /// before, it will authenticate and fetch a new token. - async fn get_token_async(&self, force_relogin: bool) -> anyhow::Result { - let token_guard = self - .token - .lock() - .expect("Mutex locking only occurs within `get_token` fn, so there can be no double `lock` for one thread"); - - match token_guard.as_deref() { - Some(token) if !force_relogin => return Ok(token.to_string()), + async fn get_token(&self, force_relogin: bool) -> anyhow::Result { + let token_guard = self.token.lock().await; + + match *token_guard { + Some(ref token) if !force_relogin => return Ok(token.to_string()), _ => (), } - self.login_async(token_guard).await + self.login(token_guard).await } - async fn login_async<'t>( + async fn login<'t>( &self, mut token_guard: MutexGuard<'t, Option>, ) -> anyhow::Result { diff --git a/src/prover/mod.rs b/src/prover/mod.rs index 6e214c7..4e08906 100644 --- a/src/prover/mod.rs +++ b/src/prover/mod.rs @@ -1,6 +1,7 @@ pub mod builder; pub mod proving_service; pub mod types; +use tokio::task::JoinSet; pub use {builder::ProverBuilder, proving_service::ProvingService, types::*}; use crate::{ @@ -25,31 +26,33 @@ pub struct Prover { } impl Prover { - pub fn run(self: std::sync::Arc) -> anyhow::Result<()> { + pub async fn run(self) { assert!(self.n_workers == self.coordinator_clients.len()); if self.circuit_type == CircuitType::Chunk { assert!(self.l2geth_client.is_some()); } - for i in 0..self.n_workers { - let self_clone = std::sync::Arc::clone(&self); - thread::spawn(move || { - self_clone.working_loop(i); + let mut provers = JoinSet::new(); + let self_arc = std::sync::Arc::new(self); + for i in 0..self_arc.n_workers { + let self_clone = std::sync::Arc::clone(&self_arc); + provers.spawn(async move { + self_clone.working_loop(i).await; }); } - Ok(()) + while provers.join_next().await.is_some() {} } - fn working_loop(&self, i: usize) { + async fn working_loop(&self, i: usize) { loop { let coordinator_client = &self.coordinator_clients[i]; let prover_name = coordinator_client.prover_name.clone(); log::info!("{:?}: getting task from coordinator", prover_name); - let get_task_request = self.build_get_task_request(); - let coordinator_task = coordinator_client.get_task(&get_task_request); + let get_task_request = self.build_get_task_request().await; + let coordinator_task = coordinator_client.get_task(&get_task_request).await; if let Err(e) = coordinator_task { log::error!("{:?}: failed to get task: {:?}", prover_name, e); @@ -75,7 +78,7 @@ impl Prover { let coordinator_task_id = coordinator_task.task_id.clone(); let task_type = coordinator_task.task_type; - let proving_input = match self.build_proving_input(&coordinator_task) { + let proving_input = match self.build_proving_input(&coordinator_task).await { Ok(input) => input, Err(e) => { log::error!( @@ -148,7 +151,7 @@ impl Prover { failure_type: None, failure_msg: None, }; - match coordinator_client.submit_proof(&submit_proof_req) { + match coordinator_client.submit_proof(&submit_proof_req).await { Ok(_) => { log::info!( "{:?}: proof submitted. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}", @@ -193,7 +196,7 @@ impl Prover { failure_type: Some(ProofFailureType::Panic), // TODO: handle ProofFailureType::NoPanic failure_msg: Some(task_err), }; - match coordinator_client.submit_proof(&submit_proof_req) { + match coordinator_client.submit_proof(&submit_proof_req).await { Ok(_) => { log::info!( "{:?}: proof_err submitted. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}", @@ -224,13 +227,14 @@ impl Prover { } } - fn build_get_task_request(&self) -> GetTaskRequest { - let prover_height = self.l2geth_client.as_ref().and_then(|l2geth_client| { - l2geth_client - .block_number_sync() - .ok() - .and_then(|block_number| block_number.as_number()) - }); + async fn build_get_task_request(&self) -> GetTaskRequest { + let prover_height = match &self.l2geth_client { + None => None, + Some(l2geth_client) => match l2geth_client.block_number().await { + Ok(block_number) => block_number.as_number(), + Err(_) => None, + }, + }; GetTaskRequest { task_types: vec![self.circuit_type], @@ -238,7 +242,10 @@ impl Prover { } } - fn build_proving_input(&self, task: &GetTaskResponseData) -> anyhow::Result { + async fn build_proving_input( + &self, + task: &GetTaskResponseData, + ) -> anyhow::Result { anyhow::ensure!( task.task_type == self.circuit_type, "task type mismatch. self: {:?}, task: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}", @@ -258,7 +265,8 @@ impl Prover { .l2geth_client .as_ref() .unwrap() - .get_sorted_traces_by_hashes(&chunk_task_detail.block_hashes)?; + .get_sorted_traces_by_hashes(&chunk_task_detail.block_hashes) + .await?; let input = serde_json::to_string(&traces)?; Ok(ProveRequest { diff --git a/src/tracing_handler.rs b/src/tracing_handler.rs index d495e74..b1a980c 100644 --- a/src/tracing_handler.rs +++ b/src/tracing_handler.rs @@ -6,25 +6,20 @@ use prover_darwin_v2::BlockTrace; use serde::{de::DeserializeOwned, Serialize}; use std::cmp::Ordering; use std::fmt::Debug; -use tokio::runtime::Runtime; pub type CommonHash = H256; pub struct L2gethClient { provider: Provider, - rt: Runtime, } impl L2gethClient { pub fn new(cfg: L2GethConfig) -> anyhow::Result { let provider = Provider::::try_from(cfg.endpoint)?; - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build()?; - Ok(Self { provider, rt }) + Ok(Self { provider }) } - async fn get_block_trace_by_hash_async(&self, hash: &CommonHash) -> anyhow::Result + pub async fn get_block_trace_by_hash(&self, hash: &CommonHash) -> anyhow::Result where T: Serialize + DeserializeOwned + Debug + Send, { @@ -40,25 +35,14 @@ impl L2gethClient { Ok(trace) } - pub fn get_block_trace_by_hash_sync(&self, hash: &CommonHash) -> anyhow::Result - where - T: Serialize + DeserializeOwned + Debug + Send, - { - self.rt.block_on(self.get_block_trace_by_hash_async(hash)) - } - - async fn block_number_async(&self) -> anyhow::Result { + pub async fn block_number(&self) -> anyhow::Result { log::info!("l2geth_client calling block_number"); let trace = self.provider.request("eth_blockNumber", ()).await?; Ok(trace) } - pub fn block_number_sync(&self) -> anyhow::Result { - self.rt.block_on(self.block_number_async()) - } - - pub fn get_sorted_traces_by_hashes( + pub async fn get_sorted_traces_by_hashes( &self, block_hashes: &[CommonHash], ) -> anyhow::Result> { @@ -69,7 +53,7 @@ impl L2gethClient { let mut block_traces = Vec::new(); for hash in block_hashes.iter() { - let trace = self.get_block_trace_by_hash_sync(hash)?; + let trace = self.get_block_trace_by_hash(hash).await?; block_traces.push(trace); } From b65870e519923383462033e92511d25bc69a4eaf Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Fri, 4 Oct 2024 04:06:05 +0000 Subject: [PATCH 19/46] fix --- Cargo.lock | 12 ++++++++++++ Cargo.toml | 3 ++- examples/cloud.rs | 11 +++++++---- examples/local.rs | 11 +++++++---- src/prover/builder.rs | 5 +++-- src/prover/mod.rs | 11 +++++++---- src/prover/proving_service.rs | 8 +++++--- 7 files changed, 43 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b1a3049..318f536 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4007,6 +4007,7 @@ name = "scroll-proving-sdk" version = "0.1.0" dependencies = [ "anyhow", + "async-trait", "base64 0.13.1", "clap", "ctor 0.2.8", @@ -4316,6 +4317,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -4685,7 +4695,9 @@ dependencies = [ "libc", "mio", "num_cpus", + "parking_lot 0.12.3", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.48.0", diff --git a/Cargo.toml b/Cargo.toml index 10f2af4..b34c714 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,8 @@ tiny-keccak = { version = "2.0.0", features = ["sha3", "keccak"] } rand = "0.8.5" eth-keystore = "0.5.0" rlp = "0.5.2" -tokio = { version = "1.37.0", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.37.0", features = ["full"] } +async-trait = "0.1" sled = "0.34.7" http = "1.1.0" clap = { version = "4.5", features = ["derive"] } diff --git a/examples/cloud.rs b/examples/cloud.rs index 0cc34ed..5ded9e2 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -1,3 +1,4 @@ +use async_trait::async_trait; use clap::Parser; use scroll_proving_sdk::{ @@ -25,17 +26,18 @@ struct CloudProver { api_key: String, } +#[async_trait] impl ProvingService for CloudProver { fn is_local(&self) -> bool { false } - fn get_vk(&self, req: GetVkRequest) -> GetVkResponse { + async fn get_vk(&self, req: GetVkRequest) -> GetVkResponse { todo!() } - fn prove(&self, req: ProveRequest) -> ProveResponse { + async fn prove(&self, req: ProveRequest) -> ProveResponse { todo!() } - fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse { + async fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse { todo!() } } @@ -58,7 +60,8 @@ async fn main() -> anyhow::Result<()> { let cloud_prover = CloudProver::new(cfg.prover.cloud.clone().unwrap()); let prover = ProverBuilder::new(cfg) .with_proving_service(Box::new(cloud_prover)) - .build()?; + .build() + .await?; prover.run().await; diff --git a/examples/local.rs b/examples/local.rs index 4f25b3b..0757a0e 100644 --- a/examples/local.rs +++ b/examples/local.rs @@ -1,3 +1,4 @@ +use async_trait::async_trait; use clap::Parser; use scroll_proving_sdk::{ @@ -22,17 +23,18 @@ struct Args { struct LocalProver {} +#[async_trait] impl ProvingService for LocalProver { fn is_local(&self) -> bool { true } - fn get_vk(&self, req: GetVkRequest) -> GetVkResponse { + async fn get_vk(&self, req: GetVkRequest) -> GetVkResponse { todo!() } - fn prove(&self, req: ProveRequest) -> ProveResponse { + async fn prove(&self, req: ProveRequest) -> ProveResponse { todo!() } - fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse { + async fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse { todo!() } } @@ -52,7 +54,8 @@ async fn main() -> anyhow::Result<()> { let local_prover = LocalProver::new(cfg.prover.local.clone().unwrap()); let prover = ProverBuilder::new(cfg) .with_proving_service(Box::new(local_prover)) - .build()?; + .build() + .await?; prover.run().await; diff --git a/src/prover/builder.rs b/src/prover/builder.rs index a10f51d..9b1ff6b 100644 --- a/src/prover/builder.rs +++ b/src/prover/builder.rs @@ -31,7 +31,7 @@ impl ProverBuilder { self } - pub fn build(self) -> anyhow::Result { + pub async fn build(self) -> anyhow::Result { if self.proving_service.is_none() { anyhow::bail!("proving_service is not provided"); } @@ -51,7 +51,8 @@ impl ProverBuilder { .proving_service .as_ref() .unwrap() - .get_vk(get_vk_request); + .get_vk(get_vk_request) + .await; if let Some(error) = get_vk_response.error { anyhow::bail!("failed to get vk: {}", error); } diff --git a/src/prover/mod.rs b/src/prover/mod.rs index 4e08906..cd279c4 100644 --- a/src/prover/mod.rs +++ b/src/prover/mod.rs @@ -93,7 +93,7 @@ impl Prover { } }; - let proving_task = self.proving_service.prove(proving_input); + let proving_task = self.proving_service.prove(proving_input).await; if proving_task.error.is_some() { log::error!( "{:?}: failed to request proving_service to prove. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, err: {:?}", @@ -107,9 +107,12 @@ impl Prover { } else { let proving_service_task_id = proving_task.task_id; loop { - let task = self.proving_service.query_task(QueryTaskRequest { - task_id: proving_service_task_id.clone(), - }); + let task = self + .proving_service + .query_task(QueryTaskRequest { + task_id: proving_service_task_id.clone(), + }) + .await; match task.status { TaskStatus::Queued => { log::info!( diff --git a/src/prover/proving_service.rs b/src/prover/proving_service.rs index 19f2e76..f722187 100644 --- a/src/prover/proving_service.rs +++ b/src/prover/proving_service.rs @@ -1,10 +1,12 @@ use super::CircuitType; +use async_trait::async_trait; +#[async_trait] pub trait ProvingService { fn is_local(&self) -> bool; - fn get_vk(&self, req: GetVkRequest) -> GetVkResponse; - fn prove(&self, req: ProveRequest) -> ProveResponse; - fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse; + async fn get_vk(&self, req: GetVkRequest) -> GetVkResponse; + async fn prove(&self, req: ProveRequest) -> ProveResponse; + async fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse; } pub struct GetVkRequest { From c179c95c0c6715e60d2ebf57d2cbe58b06ad381b Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Fri, 4 Oct 2024 04:21:23 +0000 Subject: [PATCH 20/46] fix --- examples/cloud.rs | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index d38c21f..7e44d2c 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -10,7 +10,6 @@ use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware}; use serde::Serialize; use std::collections::HashMap; -use std::sync::Arc; use scroll_proving_sdk::{ config::{CloudProverConfig, Config}, @@ -37,7 +36,6 @@ struct CloudProver { api_key: String, send_timeout: Duration, client: ClientWithMiddleware, - rt: tokio::runtime::Runtime, } #[derive(serde::Deserialize)] @@ -123,12 +121,13 @@ impl ProvingService for CloudProver { } match self - .rt - .block_on(self.get_with_token::( + .get_with_token::( MethodClass::Circuit(req.circuit_type), "detail", None, - )) { + ) + .await + { Ok(resp) => match reformat_vk(resp.verification_key.verification_key) { Ok(vk) => GetVkResponse { vk, error: None }, Err(e) => GetVkResponse { @@ -173,13 +172,14 @@ impl ProvingService for CloudProver { perform_verify: true, }; - match self.rt.block_on( - self.post_with_token::( + match self + .post_with_token::( MethodClass::Circuit(req.circuit_type), "prove", &sindri_req, - ), - ) { + ) + .await + { Ok(resp) => ProveResponse { task_id: resp.proof_id, circuit_type: req.circuit_type, @@ -221,12 +221,13 @@ impl ProvingService for CloudProver { ]); match self - .rt - .block_on(self.get_with_token::( + .get_with_token::( MethodClass::Proof(req.task_id.clone()), "detail", Some(query_params), - )) { + ) + .await + { Ok(resp) => QueryTaskResponse { task_id: resp.proof_id, circuit_type: CircuitType::Undefined, // TODO: @@ -278,17 +279,11 @@ impl CloudProver { let base_url = Url::parse(&cfg.base_url).expect("cannot parse cloud prover base_url"); - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - Self { base_url, api_key: cfg.api_key, send_timeout: Duration::from_secs(cfg.connection_timeout_sec), client, - rt, } } From 5667bb426b187e2883f4305e635d42496331e55e Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Tue, 8 Oct 2024 05:53:51 +0000 Subject: [PATCH 21/46] fix task_type --- src/prover/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/prover/mod.rs b/src/prover/mod.rs index b770a3a..2cfb999 100644 --- a/src/prover/mod.rs +++ b/src/prover/mod.rs @@ -148,7 +148,8 @@ impl Prover { let submit_proof_req = SubmitProofRequest { uuid: coordinator_task_uuid.clone(), task_id: coordinator_task_id.clone(), - task_type: task.circuit_type, + // task_type: task.circuit_type, // TODO: task.circuit_type is incorrect atm + task_type, status: ProofStatus::Ok, proof: task.proof.unwrap(), failure_type: None, From e97a9b515f29ac40597c5e812c45a1c23df905dd Mon Sep 17 00:00:00 2001 From: 0xmountaintop <37070449+0xmountaintop@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:16:51 +1100 Subject: [PATCH 22/46] refactor (#22) --- examples/cloud.rs | 42 +++--- src/prover/mod.rs | 344 ++++++++++++++++++++++------------------------ 2 files changed, 185 insertions(+), 201 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 7e44d2c..071dff7 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -8,7 +8,7 @@ use reqwest::{ }; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware}; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use scroll_proving_sdk::{ @@ -38,12 +38,12 @@ struct CloudProver { client: ClientWithMiddleware, } -#[derive(serde::Deserialize)] +#[derive(Deserialize)] struct VerificationKey { verification_key: String, } -#[derive(serde::Deserialize)] +#[derive(Deserialize)] struct SindriTaskStatusResponse { pub proof_id: String, pub project_name: String, @@ -58,7 +58,7 @@ struct SindriTaskStatusResponse { pub error: Option, } -#[derive(serde::Deserialize)] +#[derive(Deserialize)] enum SindriTaskStatus { #[serde(rename = "Queued")] Queued, @@ -208,17 +208,20 @@ impl ProvingService for CloudProver { input: Some(req.input.clone()), proof: None, vk: None, - error: Some(anyhow::anyhow!("failed to request proof: {e}").to_string()), + error: Some(format!("Failed to request proof: {}", e)), }, } } async fn query_task(&self, req: QueryTaskRequest) -> QueryTaskResponse { - let query_params: HashMap = HashMap::from([ - ("include_proof".to_string(), "true".to_string()), - ("include_public".to_string(), "true".to_string()), - ("include_verification_key".to_string(), "true".to_string()), - ]); + let query_params: HashMap = [ + ("include_proof", "true"), + ("include_public", "true"), + ("include_verification_key", "true"), + ] + .iter() + .map(|&(k, v)| (k.to_string(), v.to_string())) + .collect(); match self .get_with_token::( @@ -244,7 +247,7 @@ impl ProvingService for CloudProver { error: resp.error, }, Err(e) => { - log::error!("failed to query proof: {:?}", e); + log::error!("Failed to query proof: {:?}", e); QueryTaskResponse { task_id: req.task_id, circuit_type: CircuitType::Undefined, @@ -258,7 +261,7 @@ impl ProvingService for CloudProver { input: None, proof: None, vk: None, - error: Some(anyhow::anyhow!("failed to query proof: {e}").to_string()), + error: Some(format!("Failed to query proof: {}", e)), } } } @@ -309,9 +312,7 @@ impl CloudProver { let mut url = self.base_url.join(&method_base)?.join(method)?; if let Some(params) = query_params { - for (key, value) in params { - url.query_pairs_mut().append_pair(&key, &value); - } + url.query_pairs_mut().extend_pairs(params); } Ok(url) @@ -361,7 +362,7 @@ impl CloudProver { log::info!("[sindri client]: {:?}", url.as_str()); let resp_builder = match request_body { - Some(request_body) => self.client.post(url).body(request_body), + Some(body) => self.client.post(url).body(body), None => self.client.get(url), }; @@ -369,7 +370,7 @@ impl CloudProver { .timeout(self.send_timeout) .header(CONTENT_TYPE, "application/json") .header(CONTENT_ENCODING, "gzip") - .bearer_auth(self.api_key.clone()); + .bearer_auth(&self.api_key); let response = resp_builder.send().await?; @@ -394,7 +395,12 @@ async fn main() -> anyhow::Result<()> { let args = Args::parse(); let cfg: Config = Config::from_file(args.config_file)?; - let cloud_prover = CloudProver::new(cfg.prover.cloud.clone().unwrap()); + let cloud_prover = CloudProver::new( + cfg.prover + .cloud + .clone() + .ok_or_else(|| anyhow::anyhow!("Missing cloud prover configuration"))?, + ); let prover = ProverBuilder::new(cfg) .with_proving_service(Box::new(cloud_prover)) .build() diff --git a/src/prover/mod.rs b/src/prover/mod.rs index 2cfb999..cdb24b0 100644 --- a/src/prover/mod.rs +++ b/src/prover/mod.rs @@ -1,9 +1,6 @@ pub mod builder; pub mod proving_service; pub mod types; -use tokio::task::JoinSet; -pub use {builder::ProverBuilder, proving_service::ProvingService, types::*}; - use crate::{ coordinator_handler::{ ChunkTaskDetail, CoordinatorClient, ErrorCode, GetTaskRequest, GetTaskResponseData, @@ -12,7 +9,10 @@ use crate::{ tracing_handler::L2gethClient, }; use proving_service::{ProveRequest, QueryTaskRequest, TaskStatus}; -use std::thread; +use tokio::task::JoinSet; +use tokio::time::{sleep, Duration}; +use tracing::{error, info, instrument}; +pub use {builder::ProverBuilder, proving_service::ProvingService, types::*}; const WORKER_SLEEP_SEC: u64 = 20; @@ -44,191 +44,175 @@ impl Prover { while provers.join_next().await.is_some() {} } + #[instrument(skip(self))] async fn working_loop(&self, i: usize) { loop { let coordinator_client = &self.coordinator_clients[i]; - let prover_name = coordinator_client.prover_name.clone(); - - log::info!("{:?}: getting task from coordinator", prover_name); + let prover_name = &coordinator_client.prover_name; - let get_task_request = self.build_get_task_request().await; - let coordinator_task = coordinator_client.get_task(&get_task_request).await; + info!(?prover_name, "Getting task from coordinator"); - if let Err(e) = coordinator_task { - log::error!("{:?}: failed to get task: {:?}", prover_name, e); - thread::sleep(std::time::Duration::from_secs(WORKER_SLEEP_SEC)); - continue; - } else if coordinator_task.as_ref().unwrap().errcode != ErrorCode::Success { - log::error!( - "{:?}: failed to get task, errcode: {:?}, errmsg: {:?}", - prover_name, - coordinator_task.as_ref().unwrap().errcode, - coordinator_task.as_ref().unwrap().errmsg - ); - thread::sleep(std::time::Duration::from_secs(WORKER_SLEEP_SEC)); - continue; - } else if coordinator_task.as_ref().unwrap().data.is_none() { - log::error!("{:?}: no task is available", prover_name); - thread::sleep(std::time::Duration::from_secs(WORKER_SLEEP_SEC)); - continue; + if let Err(e) = self.handle_task(coordinator_client).await { + error!(?prover_name, ?e, "Error handling task"); } - let coordinator_task = coordinator_task.unwrap().data.unwrap(); - let coordinator_task_uuid = coordinator_task.uuid.clone(); - let coordinator_task_id = coordinator_task.task_id.clone(); - let task_type = coordinator_task.task_type; + sleep(Duration::from_secs(WORKER_SLEEP_SEC)).await; + } + } + + async fn handle_task(&self, coordinator_client: &CoordinatorClient) -> anyhow::Result<()> { + let coordinator_task = self.get_coordinator_task(coordinator_client).await?; + let proving_task = self.request_proving(&coordinator_task).await?; + self.handle_proving_progress(coordinator_client, &coordinator_task, proving_task.task_id) + .await + } + + async fn get_coordinator_task( + &self, + coordinator_client: &CoordinatorClient, + ) -> anyhow::Result { + let get_task_request = self.build_get_task_request().await; + let coordinator_task = coordinator_client.get_task(&get_task_request).await?; - let proving_input = match self.build_proving_input(&coordinator_task).await { - Ok(input) => input, - Err(e) => { - log::error!( - "{:?}: failed to build proving input. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, err: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - e, + if coordinator_task.errcode != ErrorCode::Success { + anyhow::bail!( + "Failed to get task, errcode: {:?}, errmsg: {:?}", + coordinator_task.errcode, + coordinator_task.errmsg + ); + } + + coordinator_task + .data + .ok_or_else(|| anyhow::anyhow!("No task available")) + } + + async fn request_proving( + &self, + coordinator_task: &GetTaskResponseData, + ) -> anyhow::Result { + let proving_input = self.build_proving_input(coordinator_task).await?; + let proving_task = self.proving_service.prove(proving_input).await; + + if let Some(error) = proving_task.error { + anyhow::bail!( + "Failed to request proving_service to prove. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, err: {:?}", + coordinator_task.task_type, + coordinator_task.uuid, + coordinator_task.task_id, + error, + ); + } + + Ok(proving_task) + } + + async fn handle_proving_progress( + &self, + coordinator_client: &CoordinatorClient, + coordinator_task: &GetTaskResponseData, + proving_service_task_id: String, + ) -> anyhow::Result<()> { + let prover_name = &coordinator_client.prover_name; + let task_type = coordinator_task.task_type; + let coordinator_task_uuid = &coordinator_task.uuid; + let coordinator_task_id = &coordinator_task.task_id; + + loop { + let task = self + .proving_service + .query_task(QueryTaskRequest { + task_id: proving_service_task_id.clone(), + }) + .await; + + match task.status { + TaskStatus::Queued | TaskStatus::Proving => { + info!( + ?prover_name, + ?task_type, + ?coordinator_task_uuid, + ?coordinator_task_id, + ?proving_service_task_id, + status = ?task.status, + "Task status update" ); - continue; + sleep(Duration::from_secs(WORKER_SLEEP_SEC)).await; } - }; - - let proving_task = self.proving_service.prove(proving_input).await; - if proving_task.error.is_some() { - log::error!( - "{:?}: failed to request proving_service to prove. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, err: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_task.error, - ); - continue; - } else { - let proving_service_task_id = proving_task.task_id; - loop { - let task = self - .proving_service - .query_task(QueryTaskRequest { - task_id: proving_service_task_id.clone(), - }) - .await; - match task.status { - TaskStatus::Queued => { - log::info!( - "{:?}: task queued. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_service_task_id.clone(), - ); - thread::sleep(std::time::Duration::from_secs(WORKER_SLEEP_SEC)); - } - TaskStatus::Proving => { - log::info!( - "{:?}: task proving. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_service_task_id.clone(), - ); - thread::sleep(std::time::Duration::from_secs(WORKER_SLEEP_SEC)); - } - TaskStatus::Success => { - log::info!( - "{:?}: task proved successfully. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_service_task_id.clone(), - ); - let submit_proof_req = SubmitProofRequest { - uuid: coordinator_task_uuid.clone(), - task_id: coordinator_task_id.clone(), - // task_type: task.circuit_type, // TODO: task.circuit_type is incorrect atm - task_type, - status: ProofStatus::Ok, - proof: task.proof.unwrap(), - failure_type: None, - failure_msg: None, - }; - match coordinator_client.submit_proof(&submit_proof_req).await { - Ok(_) => { - log::info!( - "{:?}: proof submitted. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_service_task_id.clone(), - ); - } - Err(e) => { - log::error!( - "{:?}: failed to submit proof. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}, submission err: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_service_task_id.clone(), - e, - ); - } - }; - break; - } - TaskStatus::Failed => { - let task_err = task.error.unwrap(); - log::error!( - "{:?}: task failed. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}, err: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_service_task_id.clone(), - task_err, - ); - let submit_proof_req = SubmitProofRequest { - uuid: coordinator_task_uuid.clone(), - task_id: coordinator_task_id.clone(), - task_type: task.circuit_type, - status: ProofStatus::Error, - proof: "".to_string(), - failure_type: Some(ProofFailureType::Panic), // TODO: handle ProofFailureType::NoPanic - failure_msg: Some(task_err), - }; - match coordinator_client.submit_proof(&submit_proof_req).await { - Ok(_) => { - log::info!( - "{:?}: proof_err submitted. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_service_task_id.clone(), - ); - } - Err(e) => { - log::error!( - "{:?}: failed to submit proof_err. task_type: {:?}, coordinator_task_uuid: {:?}, coordinator_task_id: {:?}, proving_service_task_id: {:?}, submission err: {:?}", - prover_name, - task_type, - coordinator_task_uuid, - coordinator_task_id, - proving_service_task_id.clone(), - e, - ); - } - }; - break; - } - } + TaskStatus::Success => { + info!( + ?prover_name, + ?task_type, + ?coordinator_task_uuid, + ?coordinator_task_id, + ?proving_service_task_id, + "Task proved successfully" + ); + self.submit_proof( + coordinator_client, + coordinator_task, + task, + ProofStatus::Ok, + None, + ) + .await?; + break; + } + TaskStatus::Failed => { + let task_err = task.error.clone().unwrap(); + error!( + ?prover_name, + ?task_type, + ?coordinator_task_uuid, + ?coordinator_task_id, + ?proving_service_task_id, + ?task_err, + "Task failed" + ); + self.submit_proof( + coordinator_client, + coordinator_task, + task, + ProofStatus::Error, + Some(task_err), + ) + .await?; + break; } } } + + Ok(()) + } + + async fn submit_proof( + &self, + coordinator_client: &CoordinatorClient, + coordinator_task: &GetTaskResponseData, + task: proving_service::QueryTaskResponse, + status: ProofStatus, + failure_msg: Option, + ) -> anyhow::Result<()> { + let submit_proof_req = SubmitProofRequest { + uuid: coordinator_task.uuid.clone(), + task_id: coordinator_task.task_id.clone(), + task_type: coordinator_task.task_type, + status, + proof: task.proof.unwrap_or_default(), + failure_type: failure_msg.as_ref().map(|_| ProofFailureType::Panic), // TODO: handle ProofFailureType::NoPanic + failure_msg, + }; + + coordinator_client.submit_proof(&submit_proof_req).await?; + info!( + prover_name = ?coordinator_client.prover_name, + ?coordinator_task.task_type, + ?coordinator_task.uuid, + ?coordinator_task.task_id, + ?task.task_id, + "Proof submitted" + ); + Ok(()) } async fn build_get_task_request(&self) -> GetTaskRequest { @@ -280,13 +264,7 @@ impl Prover { input, }) } - CircuitType::Batch => Ok(ProveRequest { - circuit_type: task.task_type, - circuit_version: self.circuit_version.clone(), - hard_fork_name: task.hard_fork_name.clone(), - input: task.task_data.clone(), - }), - CircuitType::Bundle => Ok(ProveRequest { + CircuitType::Batch | CircuitType::Bundle => Ok(ProveRequest { circuit_type: task.task_type, circuit_version: self.circuit_version.clone(), hard_fork_name: task.hard_fork_name.clone(), From 0523a716cfa0c682450e1d6f59a3e745e8f7782d Mon Sep 17 00:00:00 2001 From: 0xmountaintop <37070449+0xmountaintop@users.noreply.github.com> Date: Thu, 10 Oct 2024 21:12:00 +1100 Subject: [PATCH 23/46] support general proofs (#25) --- examples/cloud.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 071dff7..0be929e 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -1,7 +1,6 @@ use async_trait::async_trait; use clap::Parser; use core::time::Duration; -use prover_darwin_v2::ChunkProof; use reqwest::{ header::{CONTENT_ENCODING, CONTENT_TYPE}, Url, @@ -52,7 +51,7 @@ struct SindriTaskStatusResponse { // pub compute_time_sec: Option, // pub queue_time_sec: Option, pub verification_key: Option, - pub proof: Option, // TODO: support other proof types + pub proof: Option, // pub public: Option, // TODO: fix me pub warnings: Option>, pub error: Option, From 5ced57e9e52e8dec6952b4a5eabfc0c0454b5d66 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Sun, 13 Oct 2024 16:59:18 +1100 Subject: [PATCH 24/46] fix prover_type in login --- src/coordinator_handler/coordinator_client.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/coordinator_handler/coordinator_client.rs b/src/coordinator_handler/coordinator_client.rs index fa61635..db57161 100644 --- a/src/coordinator_handler/coordinator_client.rs +++ b/src/coordinator_handler/coordinator_client.rs @@ -107,11 +107,16 @@ impl CoordinatorClient { .as_ref() .ok_or_else(|| anyhow::anyhow!("Missing challenge token"))?; + let prover_types = match self.circuit_type { + CircuitType::Batch | CircuitType::Bundle => vec![CircuitType::Batch], // to conform to coordinator logic + _ => vec![self.circuit_type], + }; + let login_message = LoginMessage { challenge: login_response_data.token.clone(), prover_name: self.prover_name.clone(), prover_version: get_version(&self.circuit_version).to_string(), - prover_types: vec![self.circuit_type], + prover_types, vks: self.vks.clone(), }; From dcc26bc43b754b9470252fb631566fa64530df38 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Wed, 16 Oct 2024 01:35:53 +0000 Subject: [PATCH 25/46] update --- examples/cloud.rs | 47 +++++++++++++++++++++++++++++++- src/coordinator_handler/types.rs | 2 ++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 0be929e..c3401e4 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -7,6 +7,7 @@ use reqwest::{ }; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware}; +use scroll_proving_sdk::coordinator_handler::BundleTaskDetail; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -166,8 +167,52 @@ impl ProvingService for CloudProver { perform_verify: bool, } + let input = if req.circuit_type == CircuitType::Bundle { + match serde_json::from_str::(&req.input) { + Ok(bundle_task_detail) => { + match serde_json::to_string(&bundle_task_detail.batch_proofs) { + Ok(input) => input, + Err(e) => { + return ProveResponse { + task_id: String::new(), + circuit_type: req.circuit_type, + circuit_version: req.circuit_version, + hard_fork_name: req.hard_fork_name, + status: TaskStatus::Failed, + created_at: 0, + started_at: None, + finished_at: None, + input: Some(req.input.clone()), + proof: None, + vk: None, + error: Some(format!("Failed to serialize batch_proofs: {}", e)), + } + } + } + } + Err(e) => { + return ProveResponse { + task_id: String::new(), + circuit_type: req.circuit_type, + circuit_version: req.circuit_version, + hard_fork_name: req.hard_fork_name, + status: TaskStatus::Failed, + created_at: 0, + started_at: None, + finished_at: None, + input: Some(req.input.clone()), + proof: None, + vk: None, + error: Some(format!("Failed to parse BundleTaskDetail: {}", e)), + } + } + } + } else { + req.input.clone() + }; + let sindri_req = SindriProveRequest { - proof_input: req.input.clone(), + proof_input: input, perform_verify: true, }; diff --git a/src/coordinator_handler/types.rs b/src/coordinator_handler/types.rs index 85981f6..ba5be23 100644 --- a/src/coordinator_handler/types.rs +++ b/src/coordinator_handler/types.rs @@ -76,6 +76,8 @@ pub struct ChunkTaskDetail { pub block_hashes: Vec, } +pub type BundleTaskDetail = prover_darwin_v2::BundleProvingTask; + #[derive(Serialize, Deserialize)] // TODO: Default? pub struct SubmitProofRequest { pub uuid: String, From c13a0cc6f2bcae27ea4b6bdb2fbb94c5e75768a2 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Wed, 16 Oct 2024 01:38:40 +0000 Subject: [PATCH 26/46] clean up --- examples/cloud.rs | 3 +-- src/coordinator_handler/types.rs | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index c3401e4..2ef4323 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -7,7 +7,6 @@ use reqwest::{ }; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware}; -use scroll_proving_sdk::coordinator_handler::BundleTaskDetail; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -168,7 +167,7 @@ impl ProvingService for CloudProver { } let input = if req.circuit_type == CircuitType::Bundle { - match serde_json::from_str::(&req.input) { + match serde_json::from_str::(&req.input) { Ok(bundle_task_detail) => { match serde_json::to_string(&bundle_task_detail.batch_proofs) { Ok(input) => input, diff --git a/src/coordinator_handler/types.rs b/src/coordinator_handler/types.rs index ba5be23..85981f6 100644 --- a/src/coordinator_handler/types.rs +++ b/src/coordinator_handler/types.rs @@ -76,8 +76,6 @@ pub struct ChunkTaskDetail { pub block_hashes: Vec, } -pub type BundleTaskDetail = prover_darwin_v2::BundleProvingTask; - #[derive(Serialize, Deserialize)] // TODO: Default? pub struct SubmitProofRequest { pub uuid: String, From bc5533a3338626cdb6f882018d89e4439ae378f4 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Wed, 16 Oct 2024 01:53:01 +0000 Subject: [PATCH 27/46] refactor --- examples/cloud.rs | 108 +++++++++++++++------------------------------- 1 file changed, 34 insertions(+), 74 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index 2ef4323..a3feeef 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -143,21 +143,12 @@ impl ProvingService for CloudProver { async fn prove(&self, req: ProveRequest) -> ProveResponse { if req.circuit_version != THIS_CIRCUIT_VERSION { - return ProveResponse { - task_id: String::new(), - circuit_type: req.circuit_type, - circuit_version: req.circuit_version, - hard_fork_name: req.hard_fork_name, - status: TaskStatus::Failed, - created_at: 0, - started_at: None, - finished_at: None, - // compute_time_sec: None, - input: Some(req.input.clone()), - proof: None, - vk: None, - error: Some("circuit version mismatch".to_string()), - }; + return build_prove_error_response(&req, "circuit version mismatch"); + }; + + let input = match reprocess_prove_input(&req) { + Ok(input) => input, + Err(e) => return build_prove_error_response(&req, &e.to_string()), }; #[derive(serde::Deserialize, serde::Serialize)] @@ -166,50 +157,6 @@ impl ProvingService for CloudProver { perform_verify: bool, } - let input = if req.circuit_type == CircuitType::Bundle { - match serde_json::from_str::(&req.input) { - Ok(bundle_task_detail) => { - match serde_json::to_string(&bundle_task_detail.batch_proofs) { - Ok(input) => input, - Err(e) => { - return ProveResponse { - task_id: String::new(), - circuit_type: req.circuit_type, - circuit_version: req.circuit_version, - hard_fork_name: req.hard_fork_name, - status: TaskStatus::Failed, - created_at: 0, - started_at: None, - finished_at: None, - input: Some(req.input.clone()), - proof: None, - vk: None, - error: Some(format!("Failed to serialize batch_proofs: {}", e)), - } - } - } - } - Err(e) => { - return ProveResponse { - task_id: String::new(), - circuit_type: req.circuit_type, - circuit_version: req.circuit_version, - hard_fork_name: req.hard_fork_name, - status: TaskStatus::Failed, - created_at: 0, - started_at: None, - finished_at: None, - input: Some(req.input.clone()), - proof: None, - vk: None, - error: Some(format!("Failed to parse BundleTaskDetail: {}", e)), - } - } - } - } else { - req.input.clone() - }; - let sindri_req = SindriProveRequest { proof_input: input, perform_verify: true, @@ -238,21 +185,7 @@ impl ProvingService for CloudProver { vk: resp.verification_key.map(|vk| vk.verification_key), error: resp.error, }, - Err(e) => ProveResponse { - task_id: String::new(), - circuit_type: req.circuit_type, - circuit_version: req.circuit_version, - hard_fork_name: req.hard_fork_name, - status: TaskStatus::Failed, - created_at: 0, - started_at: None, - finished_at: None, - // compute_time_sec: None, - input: Some(req.input.clone()), - proof: None, - vk: None, - error: Some(format!("Failed to request proof: {}", e)), - }, + Err(e) => return build_prove_error_response(&req, &format!("Failed to request proof: {}", e)), } } @@ -311,6 +244,33 @@ impl ProvingService for CloudProver { } } +fn build_prove_error_response(req: &ProveRequest, error_msg: &str) -> ProveResponse { + ProveResponse { + task_id: String::new(), + circuit_type: req.circuit_type, + circuit_version: req.circuit_version.clone(), + hard_fork_name: req.hard_fork_name.clone(), + status: TaskStatus::Failed, + created_at: 0, + started_at: None, + finished_at: None, + // compute_time_sec: None, + input: Some(req.input.clone()), + proof: None, + vk: None, + error: Some(error_msg.to_string()), + } +} + +fn reprocess_prove_input(req: &ProveRequest) -> anyhow::Result { + if req.circuit_type == CircuitType::Bundle { + let bundle_task_detail: prover_darwin_v2::BundleProvingTask = serde_json::from_str(&req.input)?; + Ok(serde_json::to_string(&bundle_task_detail.batch_proofs)?) + } else { + Ok(req.input.clone()) + } +} + const THIS_CIRCUIT_VERSION: &str = "v0.13.1"; impl CloudProver { From 0643b29c197f7f9c394a0fb5dda63ffb3a5ee4c3 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Wed, 16 Oct 2024 21:15:54 +0000 Subject: [PATCH 28/46] update types --- examples/cloud.rs | 29 ++++++++++++++++------------- src/prover/proving_service.rs | 16 ++++++++-------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/examples/cloud.rs b/examples/cloud.rs index a3feeef..85dc5e7 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -48,11 +48,11 @@ struct SindriTaskStatusResponse { pub project_name: String, pub perform_verify: bool, pub status: SindriTaskStatus, - // pub compute_time_sec: Option, - // pub queue_time_sec: Option, + pub compute_time_sec: Option, + pub queue_time_sec: Option, pub verification_key: Option, pub proof: Option, - // pub public: Option, // TODO: fix me + pub public: Option, pub warnings: Option>, pub error: Option, } @@ -176,16 +176,18 @@ impl ProvingService for CloudProver { circuit_version: req.circuit_version, hard_fork_name: req.hard_fork_name, status: resp.status.into(), - created_at: 0, // TODO: + created_at: 0.0, // TODO: started_at: None, // TODO: finished_at: None, // TODO: - // compute_time_sec: resp.compute_time_sec, + compute_time_sec: resp.compute_time_sec, input: Some(req.input.clone()), proof: serde_json::to_string(&resp.proof).ok(), vk: resp.verification_key.map(|vk| vk.verification_key), error: resp.error, }, - Err(e) => return build_prove_error_response(&req, &format!("Failed to request proof: {}", e)), + Err(e) => { + return build_prove_error_response(&req, &format!("Failed to request proof: {}", e)) + } } } @@ -213,10 +215,10 @@ impl ProvingService for CloudProver { circuit_version: "".to_string(), hard_fork_name: "".to_string(), status: resp.status.into(), - created_at: 0, // TODO: + created_at: 0.0, // TODO: started_at: None, // TODO: finished_at: None, // TODO: - // compute_time_sec: resp.compute_time_sec, + compute_time_sec: resp.compute_time_sec, input: None, proof: serde_json::to_string(&resp.proof).ok(), vk: resp.verification_key.map(|vk| vk.verification_key), @@ -230,10 +232,10 @@ impl ProvingService for CloudProver { circuit_version: "".to_string(), hard_fork_name: "".to_string(), status: TaskStatus::Queued, - created_at: 0, + created_at: 0.0, started_at: None, finished_at: None, - // compute_time_sec: None, + compute_time_sec: None, input: None, proof: None, vk: None, @@ -251,10 +253,10 @@ fn build_prove_error_response(req: &ProveRequest, error_msg: &str) -> ProveRespo circuit_version: req.circuit_version.clone(), hard_fork_name: req.hard_fork_name.clone(), status: TaskStatus::Failed, - created_at: 0, + created_at: 0.0, started_at: None, finished_at: None, - // compute_time_sec: None, + compute_time_sec: None, input: Some(req.input.clone()), proof: None, vk: None, @@ -264,7 +266,8 @@ fn build_prove_error_response(req: &ProveRequest, error_msg: &str) -> ProveRespo fn reprocess_prove_input(req: &ProveRequest) -> anyhow::Result { if req.circuit_type == CircuitType::Bundle { - let bundle_task_detail: prover_darwin_v2::BundleProvingTask = serde_json::from_str(&req.input)?; + let bundle_task_detail: prover_darwin_v2::BundleProvingTask = + serde_json::from_str(&req.input)?; Ok(serde_json::to_string(&bundle_task_detail.batch_proofs)?) } else { Ok(req.input.clone()) diff --git a/src/prover/proving_service.rs b/src/prover/proving_service.rs index 7a8ca12..2625828 100644 --- a/src/prover/proving_service.rs +++ b/src/prover/proving_service.rs @@ -32,10 +32,10 @@ pub struct ProveResponse { pub circuit_version: String, pub hard_fork_name: String, pub status: TaskStatus, - pub created_at: u64, - pub started_at: Option, - pub finished_at: Option, - // pub compute_time_sec: Option, + pub created_at: f64, + pub started_at: Option, + pub finished_at: Option, + pub compute_time_sec: Option, pub input: Option, pub proof: Option, pub vk: Option, @@ -52,10 +52,10 @@ pub struct QueryTaskResponse { pub circuit_version: String, pub hard_fork_name: String, pub status: TaskStatus, - pub created_at: u64, - pub started_at: Option, - pub finished_at: Option, - // pub compute_time_sec: Option, + pub created_at: f64, + pub started_at: Option, + pub finished_at: Option, + pub compute_time_sec: Option, pub input: Option, pub proof: Option, pub vk: Option, From 24894e858f7671e3058cd01439637d4609439bd2 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Wed, 16 Oct 2024 23:28:35 +0000 Subject: [PATCH 29/46] update comments --- examples/cloud.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/cloud.rs b/examples/cloud.rs index 85dc5e7..b1f0611 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -85,6 +85,7 @@ enum MethodClass { Proof(String), } +// reencode the vk because the encoding scheme used in sindri is different from the one used in scroll internally fn reformat_vk(vk_old: String) -> anyhow::Result { log::debug!("vk_old: {:?}", vk_old); @@ -264,6 +265,7 @@ fn build_prove_error_response(req: &ProveRequest, error_msg: &str) -> ProveRespo } } +// get rid of the "batch_proofs" layer because sindri expects the inner array as the input directly fn reprocess_prove_input(req: &ProveRequest) -> anyhow::Result { if req.circuit_type == CircuitType::Bundle { let bundle_task_detail: prover_darwin_v2::BundleProvingTask = From 76d59737582678d9ff82be55c27887238cef2f43 Mon Sep 17 00:00:00 2001 From: Zhuo Zhang Date: Thu, 17 Oct 2024 00:25:06 +0000 Subject: [PATCH 30/46] add comments --- examples/cloud.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/cloud.rs b/examples/cloud.rs index b1f0611..e325bac 100644 --- a/examples/cloud.rs +++ b/examples/cloud.rs @@ -276,6 +276,7 @@ fn reprocess_prove_input(req: &ProveRequest) -> anyhow::Result { } } +// alternatively, we can just read it from the config const THIS_CIRCUIT_VERSION: &str = "v0.13.1"; impl CloudProver { From 709396b563f101cdabe2aacb152975e86a1a4069 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Thu, 17 Oct 2024 15:16:23 +0200 Subject: [PATCH 31/46] add helm chart --- .github/workflows/publish-chart.yaml | 202 +++++++++++++++++ .github/workflows/publish-dev-chart.yaml | 208 ++++++++++++++++++ .gitignore | 4 + charts/scroll-proving-sdk/Chart.yaml | 14 ++ charts/scroll-proving-sdk/README.md | 63 ++++++ charts/scroll-proving-sdk/index.yaml | 20 ++ .../scroll-proving-sdk/templates/common.yaml | 14 ++ .../templates/config-file.yaml | 10 + .../scroll-proving-sdk/templates/helpers.tpl | 47 ++++ charts/scroll-proving-sdk/values.yaml | 55 +++++ 10 files changed, 637 insertions(+) create mode 100644 .github/workflows/publish-chart.yaml create mode 100644 .github/workflows/publish-dev-chart.yaml create mode 100644 charts/scroll-proving-sdk/Chart.yaml create mode 100644 charts/scroll-proving-sdk/README.md create mode 100644 charts/scroll-proving-sdk/index.yaml create mode 100644 charts/scroll-proving-sdk/templates/common.yaml create mode 100644 charts/scroll-proving-sdk/templates/config-file.yaml create mode 100644 charts/scroll-proving-sdk/templates/helpers.tpl create mode 100644 charts/scroll-proving-sdk/values.yaml diff --git a/.github/workflows/publish-chart.yaml b/.github/workflows/publish-chart.yaml new file mode 100644 index 0000000..a553a7d --- /dev/null +++ b/.github/workflows/publish-chart.yaml @@ -0,0 +1,202 @@ +name: Lint, test and publish charts + +on: + push: + branches: [ main ] + paths: + - 'charts/**' + +jobs: + helm-chart-testing-not-scroll-sdk: + name: chart-testing-without-scroll-sdk + runs-on: ubuntu-latest + environment: test + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Helm + uses: azure/setup-helm@v3 + with: + version: v3.12.1 + + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + check-latest: true + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.0 + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + # List chart change except scroll-sdk + - name: Run chart-testing (list-changed) + id: list-changed + run: | + changed=$(ct list-changed --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} ) + if [[ -n "$changed" ]]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Run chart-testing (lint) + if: steps.list-changed.outputs.changed == 'true' + run: ct lint --config ct.yaml --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} + + publish-ghcr-not-scroll-sdk: + name: publish-to-github-without-scroll-sdk + runs-on: ubuntu-latest + needs: + - helm-chart-testing-not-scroll-sdk + outputs: + charts: ${{ steps.list-changed.outputs.changed }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dorny/paths-filter@v2 + id: filter + with: + base: ${{ github.event.repository.default_branch }} + list-files: shell + filters: | + addedOrModified: + - added|modified: 'charts/**' + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + # We filter here the scroll-sdk chart + - name: Push chart to ghcr + if: steps.filter.outputs.addedOrModified == 'true' + env: + HELM_EXPERIMENTAL_OCI: 1 + run: | + set -x + CHARTS=() + PATHS=(${{ steps.filter.outputs.addedOrModified_files }}) + echo ${PATHS} + # Get only the chart paths + for i in "${PATHS[@]}" + do + chart=$(echo $i | awk -F "/" '{print $2}') + if [ "$chart" != "scroll-sdk" ]; then + CHARTS+=($chart) + fi + done + # Remove duplicates + CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) + echo "CHARTS: ${CHARTS[@]}" + for chart in ${CHARTS[@]}; do + helm dependencies build charts/$chart + helm package charts/$chart + export CHART_VERSION=$(grep 'version:' charts/$chart/Chart.yaml | head -n1 | awk '{ print $2 }') + helm push $chart-${CHART_VERSION}.tgz oci://ghcr.io/scroll-tech/scroll-sdk/helm + done + + helm-chart-testing-scroll-sdk: + name: chart-testing-scroll-sdk + runs-on: ubuntu-latest + needs: + - publish-ghcr-not-scroll-sdk + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Helm + uses: azure/setup-helm@v3 + with: + version: v3.12.1 + + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + check-latest: true + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.0 + + - name: Setup scroll-sdk values + run: cd charts/scroll-sdk && docker run --rm -t -v .:/contracts/volume scrolltech/scroll-stack-contracts:gen-configs-v0.0.18 + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + # List scroll-sdk chart if it has changed + - name: Run chart-testing (list-changed) + id: list-changed + run: | + changed=$(ct list-changed --chart-dirs charts/scroll-sdk --target-branch ${{ github.event.repository.default_branch }} ) + if [[ -n "$changed" ]]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Run chart-testing (lint) + if: steps.list-changed.outputs.changed == 'true' + run: ct lint --config ct.yaml --charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} + + publish-ghcr-scroll-sdk: + name: publish-scroll-sdk-to-github + runs-on: ubuntu-latest + needs: + - helm-chart-testing-scroll-sdk + outputs: + charts: ${{ steps.list-changed.outputs.changed }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dorny/paths-filter@v2 + id: filter + with: + base: ${{ github.event.repository.default_branch }} + list-files: shell + filters: | + addedOrModified: + - added|modified: 'charts/scroll-sdk/**' + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + - name: Push chart to ghcr + if: steps.filter.outputs.addedOrModified == 'true' + env: + HELM_EXPERIMENTAL_OCI: 1 + run: | + set -x + CHARTS=() + PATHS=(${{ steps.filter.outputs.addedOrModified_files }}) + echo ${PATHS} + # Get only the chart paths + for i in "${PATHS[@]}" + do + CHARTS+=($(echo $i | awk -F "/" '{print $2}')) + done + # Remove duplicates + CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) + echo "CHARTS: ${CHARTS[@]}" + for chart in ${CHARTS[@]}; do + helm dependencies build charts/$chart + helm package charts/$chart + export CHART_VERSION=$(grep 'version:' charts/$chart/Chart.yaml | head -n1 | awk '{ print $2 }') + helm push $chart-${CHART_VERSION}.tgz oci://ghcr.io/scroll-tech/scroll-sdk/helm + done diff --git a/.github/workflows/publish-dev-chart.yaml b/.github/workflows/publish-dev-chart.yaml new file mode 100644 index 0000000..382a3bd --- /dev/null +++ b/.github/workflows/publish-dev-chart.yaml @@ -0,0 +1,208 @@ +name: Lint, test and publish dev charts + +on: + push: + paths: + - 'charts/**' + +env: + HELM_REGISTRY: ghcr.io/scroll-tech/scroll-sdk/helm/dev + +jobs: + helm-chart-testing-not-scroll-sdk: + name: chart-testing-without-scroll-sdk + runs-on: ubuntu-latest + environment: test + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Helm + uses: azure/setup-helm@v3 + with: + version: v3.12.1 + + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + check-latest: true + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.0 + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + # List chart change except scroll-sdk + - name: Run chart-testing (list-changed) + id: list-changed + run: | + changed=$(ct list-changed --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} ) + if [[ -n "$changed" ]]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Run chart-testing (lint) + if: steps.list-changed.outputs.changed == 'true' + run: ct lint --config ct.yaml --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} + + publish-ghcr-not-scroll-sdk: + name: publish-to-github-without-scroll-sdk + runs-on: ubuntu-latest + needs: + - helm-chart-testing-not-scroll-sdk + outputs: + charts: ${{ steps.list-changed.outputs.changed }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dorny/paths-filter@v2 + id: filter + with: + base: ${{ github.event.repository.default_branch }} + list-files: shell + filters: | + addedOrModified: + - added|modified: 'charts/**' + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + # We filter here the scroll-sdk chart + - name: Push chart to ghcr + if: steps.filter.outputs.addedOrModified == 'true' + env: + HELM_EXPERIMENTAL_OCI: 1 + run: | + set -x + CHARTS=() + PATHS=(${{ steps.filter.outputs.addedOrModified_files }}) + echo ${PATHS} + # Get only the chart paths + for i in "${PATHS[@]}" + do + chart=$(echo $i | awk -F "/" '{print $2}') + if [ "$chart" != "scroll-sdk" ]; then + CHARTS+=($chart) + fi + done + # Remove duplicates + CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) + echo "CHARTS: ${CHARTS[@]}" + for chart in ${CHARTS[@]}; do + helm dependencies build charts/$chart + helm package charts/$chart + export CHART_VERSION=$(grep 'version:' charts/$chart/Chart.yaml | head -n1 | awk '{ print $2 }') + helm push $chart-${CHART_VERSION}.tgz oci://${HELM_REGISTRY} + done + + helm-chart-testing-scroll-sdk: + name: chart-testing-scroll-sdk + runs-on: ubuntu-latest + needs: + - publish-ghcr-not-scroll-sdk + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Helm + uses: azure/setup-helm@v3 + with: + version: v3.12.1 + + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + check-latest: true + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.0 + + - name: Setup scroll-sdk values + run: cd charts/scroll-sdk && docker run --rm -t -v .:/contracts/volume scrolltech/scroll-stack-contracts:gen-configs-v0.0.18 + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + # List scroll-sdk chart if it has changed + - name: Run chart-testing (list-changed) + id: list-changed + run: | + changed=$(ct list-changed --chart-dirs charts/scroll-sdk --target-branch ${{ github.event.repository.default_branch }} ) + if [[ -n "$changed" ]]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Run chart-testing (lint) + if: steps.list-changed.outputs.changed == 'true' + run: ct lint --config ct.yaml --charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} + + publish-ghcr-scroll-sdk: + name: publish-scroll-sdk-to-github + runs-on: ubuntu-latest + needs: + - helm-chart-testing-scroll-sdk + outputs: + charts: ${{ steps.list-changed.outputs.changed }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dorny/paths-filter@v2 + id: filter + with: + base: ${{ github.event.repository.default_branch }} + list-files: shell + filters: | + addedOrModified: + - added|modified: 'charts/scroll-sdk/**' + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + - name: Replace helm registry by helm/dev + run: | + sed -i 's|oci://ghcr.io/scroll-tech/scroll-sdk/helm|oci://ghcr.io/scroll-tech/scroll-sdk/helm/dev|g' charts/scroll-sdk/Chart.yaml + + - name: Push chart to ghcr + if: steps.filter.outputs.addedOrModified == 'true' + env: + HELM_EXPERIMENTAL_OCI: 1 + run: | + set -x + CHARTS=() + PATHS=(${{ steps.filter.outputs.addedOrModified_files }}) + echo ${PATHS} + # Get only the chart paths + for i in "${PATHS[@]}" + do + CHARTS+=($(echo $i | awk -F "/" '{print $2}')) + done + # Remove duplicates + CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) + echo "CHARTS: ${CHARTS[@]}" + for chart in ${CHARTS[@]}; do + helm dependencies build charts/$chart + helm package charts/$chart + export CHART_VERSION=$(grep 'version:' charts/$chart/Chart.yaml | head -n1 | awk '{ print $2 }') + helm push $chart-${CHART_VERSION}.tgz oci://${HELM_REGISTRY} + done diff --git a/.gitignore b/.gitignore index 9c0348c..e0082f6 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,7 @@ target/ config.json keys/ + +# Helm chart related +*.lock +*.tgz \ No newline at end of file diff --git a/charts/scroll-proving-sdk/Chart.yaml b/charts/scroll-proving-sdk/Chart.yaml new file mode 100644 index 0000000..6017467 --- /dev/null +++ b/charts/scroll-proving-sdk/Chart.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: v2 +description: scroll-proving-sdk helm charts +name: scroll-proving-sdk +version: 0.0.1 +appVersion: v0.1.0 +kubeVersion: ">=1.22.0-0" +maintainers: + - name: scroll-tech + email: sebastien@scroll.io +dependencies: + - name: common + repository: "oci://ghcr.io/scroll-tech/scroll-sdk/helm" + version: 1.5.1 diff --git a/charts/scroll-proving-sdk/README.md b/charts/scroll-proving-sdk/README.md new file mode 100644 index 0000000..3bc5317 --- /dev/null +++ b/charts/scroll-proving-sdk/README.md @@ -0,0 +1,63 @@ +# scroll-proving-sdk + +![Version: 0.0.1](https://img.shields.io/badge/Version-0.0.1-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) + +scroll-proving-sdk helm charts + +## Maintainers + +| Name | Email | Url | +| ---- | ------ | --- | +| scroll-tech | | | + +## Requirements + +Kubernetes: `>=1.22.0-0` + +| Repository | Name | Version | +|------------|------|---------| +| oci://ghcr.io/scroll-tech/scroll-sdk/helm | common | 1.5.1 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| command[0] | string | `"/bin/sh"` | | +| command[1] | string | `"-c"` | | +| command[2] | string | `"exec cloud --config /sdk_prover/config.json"` | | +| defaultProbes.custom | bool | `true` | | +| defaultProbes.enabled | bool | `true` | | +| defaultProbes.spec.httpGet.path | string | `"/"` | | +| defaultProbes.spec.httpGet.port | int | `80` | | +| global.fullnameOverride | string | `"scroll-proving-sdk"` | | +| global.nameOverride | string | `"scroll-proving-sdk"` | | +| image.pullPolicy | string | `"Always"` | | +| image.repository | string | `"scrolltech/sdk-cloud-prover"` | | +| image.tag | string | `"sindri-2791edca"` | | +| persistence.app_name.enabled | bool | `true` | | +| persistence.app_name.mountPath | string | `"/sdk_prover/"` | | +| persistence.app_name.name | string | `"scroll-proving-sdk-config"` | | +| persistence.app_name.type | string | `"configMap"` | | +| probes.liveness.<<.custom | bool | `true` | | +| probes.liveness.<<.enabled | bool | `true` | | +| probes.liveness.<<.spec.httpGet.path | string | `"/"` | | +| probes.liveness.<<.spec.httpGet.port | int | `80` | | +| probes.readiness.<<.custom | bool | `true` | | +| probes.readiness.<<.enabled | bool | `true` | | +| probes.readiness.<<.spec.httpGet.path | string | `"/"` | | +| probes.readiness.<<.spec.httpGet.port | int | `80` | | +| probes.startup.<<.custom | bool | `true` | | +| probes.startup.<<.enabled | bool | `true` | | +| probes.startup.<<.spec.httpGet.path | string | `"/"` | | +| probes.startup.<<.spec.httpGet.port | int | `80` | | +| resources.limits.cpu | string | `"100m"` | | +| resources.limits.memory | string | `"500Mi"` | | +| resources.requests.cpu | string | `"50m"` | | +| resources.requests.memory | string | `"100Mi"` | | +| scrollConfig | string | `"{\n \"prover_name_prefix\": \"sindri_\",\n \"keys_dir\": \"keys\",\n \"coordinator\": {\n \"base_url\": \"https://coordinator-api.oct.sdk.scroll.xyz\",\n \"retry_count\": 3,\n \"retry_wait_time_sec\": 5,\n \"connection_timeout_sec\": 60\n },\n \"l2geth\": {\n \"endpoint\": \"https://l2-rpc.oct.sdk.scroll.xyz\"\n },\n \"prover\": {\n \"circuit_type\": 3,\n \"circuit_version\": \"v0.13.1\",\n \"n_workers\": 1,\n \"cloud\": {\n \"base_url\": \"https://sindri.app/api/v1/\",\n \"api_key\": \"sindri_TQcZKJHoPhAho7UuBFw8evEvP4nQkjQ4_0807\",\n \"retry_count\": 3,\n \"retry_wait_time_sec\": 5,\n \"connection_timeout_sec\": 60\n }\n }\n}"` | | +| service.main.enabled | bool | `true` | | +| service.main.ports.http.enabled | bool | `true` | | +| service.main.ports.http.port | int | `80` | | + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2) diff --git a/charts/scroll-proving-sdk/index.yaml b/charts/scroll-proving-sdk/index.yaml new file mode 100644 index 0000000..4466a03 --- /dev/null +++ b/charts/scroll-proving-sdk/index.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +entries: + common: + - apiVersion: v2 + created: "2024-08-05T16:32:51.061701+02:00" + description: Function library for Helm charts + digest: e75d90ca3a07e1b5ed4677c893ab007ba85c67d7ff60cca217b4ab0776050d0d + keywords: + - common + - library + kubeVersion: '>=1.22.0-0' + maintainers: + - email: sebastien@scroll.io + name: sebastien + name: common + type: library + urls: + - charts/common-1.5.1.tgz + version: 1.5.1 +generated: "2024-08-05T16:32:51.059889+02:00" diff --git a/charts/scroll-proving-sdk/templates/common.yaml b/charts/scroll-proving-sdk/templates/common.yaml new file mode 100644 index 0000000..ed32775 --- /dev/null +++ b/charts/scroll-proving-sdk/templates/common.yaml @@ -0,0 +1,14 @@ +--- +{{- include "scroll.common.loader.init" . }} + +{{- define "app-template.hardcodedValues" -}} +# Set the nameOverride based on the release name if no override has been set +{{ if not .Values.global.nameOverride }} +global: + nameOverride: "{{ .Release.Name }}" +{{ end }} +{{- end -}} +{{- $_ := mergeOverwrite .Values (include "app-template.hardcodedValues" . | fromYaml) -}} + +{{/* Render the templates */}} +{{ include "scroll.common.loader.generate" . }} diff --git a/charts/scroll-proving-sdk/templates/config-file.yaml b/charts/scroll-proving-sdk/templates/config-file.yaml new file mode 100644 index 0000000..0d8136b --- /dev/null +++ b/charts/scroll-proving-sdk/templates/config-file.yaml @@ -0,0 +1,10 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: scroll-proving-sdk-config + labels: + {{- include "scroll-sdk.labels" $ | nindent 4 }} +data: + config.json: | +{{ .Values.scrollConfig | indent 4 }} diff --git a/charts/scroll-proving-sdk/templates/helpers.tpl b/charts/scroll-proving-sdk/templates/helpers.tpl new file mode 100644 index 0000000..d762ba1 --- /dev/null +++ b/charts/scroll-proving-sdk/templates/helpers.tpl @@ -0,0 +1,47 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "scroll-sdk.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "scroll-sdk.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} +{{/* +Create chart name and build as used by the chart label. +*/}} +{{- define "scroll-sdk.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} +{{/* +Common labels +*/}} +{{- define "scroll-sdk.labels" -}} +helm.sh/chart: {{ include "scroll-sdk.chart" . }} +{{ include "scroll-sdk.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/build: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} +{{/* +Selector labels +*/}} +{{- define "scroll-sdk.selectorLabels" -}} +app.kubernetes.io/name: {{ include "scroll-sdk.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml new file mode 100644 index 0000000..85476d8 --- /dev/null +++ b/charts/scroll-proving-sdk/values.yaml @@ -0,0 +1,55 @@ +--- +global: + nameOverride: &app_name scroll-proving-sdk + fullnameOverride: *app_name + +image: + repository: scrolltech/sdk-cloud-prover + pullPolicy: Always + tag: sindri-2791edca + +command: + - "/bin/sh" + - "-c" + - "exec cloud --config /sdk_prover/config.json" + +resources: + requests: + memory: "100Mi" + cpu: "50m" + limits: + memory: "500Mi" + cpu: "100m" + +persistence: + *app_name: + enabled: true + type: configMap + mountPath: /sdk_prover/ + name: scroll-proving-sdk-config + +service: + main: + enabled: true + ports: + http: + enabled: true + port: 80 + +defaultProbes: &default_probes + enabled: true + custom: true + spec: + httpGet: + path: "/" + port: 80 + +probes: + liveness: + <<: *default_probes + readiness: + <<: *default_probes + startup: + <<: *default_probes + +scrollConfig: {} \ No newline at end of file From 5b0c30569a89deb136661b27aa96e49d4196e0df Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Thu, 17 Oct 2024 15:18:49 +0200 Subject: [PATCH 32/46] add config for ct tool --- .github/chart_schema.yaml | 37 ++++++++++++++++++++++++++++++++++ .github/lintconf.yaml | 42 +++++++++++++++++++++++++++++++++++++++ ct.yaml | 7 +++++++ 3 files changed, 86 insertions(+) create mode 100644 .github/chart_schema.yaml create mode 100644 .github/lintconf.yaml create mode 100644 ct.yaml diff --git a/.github/chart_schema.yaml b/.github/chart_schema.yaml new file mode 100644 index 0000000..af357f4 --- /dev/null +++ b/.github/chart_schema.yaml @@ -0,0 +1,37 @@ +name: str() +home: str(required=False) +version: str() +apiVersion: str() +appVersion: any(str(), num(), required=False) +description: str(required=False) +keywords: list(str(), required=False) +sources: list(str(), required=False) +maintainers: list(include('maintainer'), required=False) +dependencies: list(include('dependency'), required=False) +icon: str(required=False) +engine: str(required=False) +condition: str(required=False) +tags: str(required=False) +deprecated: bool(required=False) +kubeVersion: str(required=False) +annotations: map(str(), str(), required=False) +type: str(required=False) +--- +maintainer: + name: str() + email: str(required=False) + url: str(required=False) +--- +dependency: + name: str() + version: str() + repository: str(required=False) + condition: str(required=False) + tags: list(str(), required=False) + enabled: bool(required=False) + import-values: any(list(str()), list(include('import-value')), required=False) + alias: str(required=False) +--- +import-value: + child: str() + parent: str() \ No newline at end of file diff --git a/.github/lintconf.yaml b/.github/lintconf.yaml new file mode 100644 index 0000000..6789bc5 --- /dev/null +++ b/.github/lintconf.yaml @@ -0,0 +1,42 @@ +--- +rules: + braces: + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + brackets: + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + colons: + max-spaces-before: 0 + max-spaces-after: 1 + commas: + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: + require-starting-space: true + min-spaces-from-content: 2 + document-end: disable + document-start: disable # No --- to start a file + empty-lines: + max: 2 + max-start: 0 + max-end: 0 + hyphens: + max-spaces-after: 1 + indentation: + spaces: consistent + indent-sequences: whatever # - list indentation will handle both indentation and without + check-multi-line-strings: false + key-duplicates: enable + line-length: disable # Lines can be any length + new-line-at-end-of-file: enable + new-lines: + type: unix + trailing-spaces: enable + truthy: + level: warning \ No newline at end of file diff --git a/ct.yaml b/ct.yaml new file mode 100644 index 0000000..5a22705 --- /dev/null +++ b/ct.yaml @@ -0,0 +1,7 @@ +remote: origin +target-branch: main +chart-dirs: + - charts +validate-maintainers: true +check-version-increment: true +debug: true From f8df30784b4391076245da21df101311c686fdf5 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Thu, 17 Oct 2024 15:19:35 +0200 Subject: [PATCH 33/46] trigger a change --- .github/workflows/publish-chart.yaml | 115 ++--------------------- .github/workflows/publish-dev-chart.yaml | 107 +-------------------- charts/scroll-proving-sdk/Chart.yaml | 2 +- charts/scroll-proving-sdk/README.md | 4 +- charts/scroll-proving-sdk/values.yaml | 3 +- 5 files changed, 13 insertions(+), 218 deletions(-) diff --git a/.github/workflows/publish-chart.yaml b/.github/workflows/publish-chart.yaml index a553a7d..9aee48b 100644 --- a/.github/workflows/publish-chart.yaml +++ b/.github/workflows/publish-chart.yaml @@ -7,8 +7,8 @@ on: - 'charts/**' jobs: - helm-chart-testing-not-scroll-sdk: - name: chart-testing-without-scroll-sdk + helm-chart-testing: + name: chart-testing runs-on: ubuntu-latest environment: test steps: @@ -32,7 +32,7 @@ jobs: - name: Helm registry login run: | - helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} env: HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" @@ -49,11 +49,11 @@ jobs: if: steps.list-changed.outputs.changed == 'true' run: ct lint --config ct.yaml --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} - publish-ghcr-not-scroll-sdk: - name: publish-to-github-without-scroll-sdk + publish-ghcr: + name: publish-to-github runs-on: ubuntu-latest needs: - - helm-chart-testing-not-scroll-sdk + - helm-chart-testing outputs: charts: ${{ steps.list-changed.outputs.changed }} steps: @@ -72,11 +72,10 @@ jobs: - name: Helm registry login run: | - helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} env: HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" - # We filter here the scroll-sdk chart - name: Push chart to ghcr if: steps.filter.outputs.addedOrModified == 'true' env: @@ -90,106 +89,6 @@ jobs: for i in "${PATHS[@]}" do chart=$(echo $i | awk -F "/" '{print $2}') - if [ "$chart" != "scroll-sdk" ]; then - CHARTS+=($chart) - fi - done - # Remove duplicates - CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) - echo "CHARTS: ${CHARTS[@]}" - for chart in ${CHARTS[@]}; do - helm dependencies build charts/$chart - helm package charts/$chart - export CHART_VERSION=$(grep 'version:' charts/$chart/Chart.yaml | head -n1 | awk '{ print $2 }') - helm push $chart-${CHART_VERSION}.tgz oci://ghcr.io/scroll-tech/scroll-sdk/helm - done - - helm-chart-testing-scroll-sdk: - name: chart-testing-scroll-sdk - runs-on: ubuntu-latest - needs: - - publish-ghcr-not-scroll-sdk - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up Helm - uses: azure/setup-helm@v3 - with: - version: v3.12.1 - - - uses: actions/setup-python@v5 - with: - python-version: '3.x' - check-latest: true - - - name: Set up chart-testing - uses: helm/chart-testing-action@v2.6.0 - - - name: Setup scroll-sdk values - run: cd charts/scroll-sdk && docker run --rm -t -v .:/contracts/volume scrolltech/scroll-stack-contracts:gen-configs-v0.0.18 - - - name: Helm registry login - run: | - helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} - env: - HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" - - # List scroll-sdk chart if it has changed - - name: Run chart-testing (list-changed) - id: list-changed - run: | - changed=$(ct list-changed --chart-dirs charts/scroll-sdk --target-branch ${{ github.event.repository.default_branch }} ) - if [[ -n "$changed" ]]; then - echo "changed=true" >> "$GITHUB_OUTPUT" - fi - - - name: Run chart-testing (lint) - if: steps.list-changed.outputs.changed == 'true' - run: ct lint --config ct.yaml --charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} - - publish-ghcr-scroll-sdk: - name: publish-scroll-sdk-to-github - runs-on: ubuntu-latest - needs: - - helm-chart-testing-scroll-sdk - outputs: - charts: ${{ steps.list-changed.outputs.changed }} - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: dorny/paths-filter@v2 - id: filter - with: - base: ${{ github.event.repository.default_branch }} - list-files: shell - filters: | - addedOrModified: - - added|modified: 'charts/scroll-sdk/**' - - - name: Helm registry login - run: | - helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} - env: - HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" - - - name: Push chart to ghcr - if: steps.filter.outputs.addedOrModified == 'true' - env: - HELM_EXPERIMENTAL_OCI: 1 - run: | - set -x - CHARTS=() - PATHS=(${{ steps.filter.outputs.addedOrModified_files }}) - echo ${PATHS} - # Get only the chart paths - for i in "${PATHS[@]}" - do - CHARTS+=($(echo $i | awk -F "/" '{print $2}')) done # Remove duplicates CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) diff --git a/.github/workflows/publish-dev-chart.yaml b/.github/workflows/publish-dev-chart.yaml index 382a3bd..6765665 100644 --- a/.github/workflows/publish-dev-chart.yaml +++ b/.github/workflows/publish-dev-chart.yaml @@ -34,7 +34,7 @@ jobs: - name: Helm registry login run: | - helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} env: HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" @@ -78,7 +78,6 @@ jobs: env: HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" - # We filter here the scroll-sdk chart - name: Push chart to ghcr if: steps.filter.outputs.addedOrModified == 'true' env: @@ -92,110 +91,6 @@ jobs: for i in "${PATHS[@]}" do chart=$(echo $i | awk -F "/" '{print $2}') - if [ "$chart" != "scroll-sdk" ]; then - CHARTS+=($chart) - fi - done - # Remove duplicates - CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) - echo "CHARTS: ${CHARTS[@]}" - for chart in ${CHARTS[@]}; do - helm dependencies build charts/$chart - helm package charts/$chart - export CHART_VERSION=$(grep 'version:' charts/$chart/Chart.yaml | head -n1 | awk '{ print $2 }') - helm push $chart-${CHART_VERSION}.tgz oci://${HELM_REGISTRY} - done - - helm-chart-testing-scroll-sdk: - name: chart-testing-scroll-sdk - runs-on: ubuntu-latest - needs: - - publish-ghcr-not-scroll-sdk - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up Helm - uses: azure/setup-helm@v3 - with: - version: v3.12.1 - - - uses: actions/setup-python@v5 - with: - python-version: '3.x' - check-latest: true - - - name: Set up chart-testing - uses: helm/chart-testing-action@v2.6.0 - - - name: Setup scroll-sdk values - run: cd charts/scroll-sdk && docker run --rm -t -v .:/contracts/volume scrolltech/scroll-stack-contracts:gen-configs-v0.0.18 - - - name: Helm registry login - run: | - helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} - env: - HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" - - # List scroll-sdk chart if it has changed - - name: Run chart-testing (list-changed) - id: list-changed - run: | - changed=$(ct list-changed --chart-dirs charts/scroll-sdk --target-branch ${{ github.event.repository.default_branch }} ) - if [[ -n "$changed" ]]; then - echo "changed=true" >> "$GITHUB_OUTPUT" - fi - - - name: Run chart-testing (lint) - if: steps.list-changed.outputs.changed == 'true' - run: ct lint --config ct.yaml --charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} - - publish-ghcr-scroll-sdk: - name: publish-scroll-sdk-to-github - runs-on: ubuntu-latest - needs: - - helm-chart-testing-scroll-sdk - outputs: - charts: ${{ steps.list-changed.outputs.changed }} - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: dorny/paths-filter@v2 - id: filter - with: - base: ${{ github.event.repository.default_branch }} - list-files: shell - filters: | - addedOrModified: - - added|modified: 'charts/scroll-sdk/**' - - - name: Helm registry login - run: | - helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} - env: - HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" - - - name: Replace helm registry by helm/dev - run: | - sed -i 's|oci://ghcr.io/scroll-tech/scroll-sdk/helm|oci://ghcr.io/scroll-tech/scroll-sdk/helm/dev|g' charts/scroll-sdk/Chart.yaml - - - name: Push chart to ghcr - if: steps.filter.outputs.addedOrModified == 'true' - env: - HELM_EXPERIMENTAL_OCI: 1 - run: | - set -x - CHARTS=() - PATHS=(${{ steps.filter.outputs.addedOrModified_files }}) - echo ${PATHS} - # Get only the chart paths - for i in "${PATHS[@]}" - do - CHARTS+=($(echo $i | awk -F "/" '{print $2}')) done # Remove duplicates CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) diff --git a/charts/scroll-proving-sdk/Chart.yaml b/charts/scroll-proving-sdk/Chart.yaml index 6017467..44a82cb 100644 --- a/charts/scroll-proving-sdk/Chart.yaml +++ b/charts/scroll-proving-sdk/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 description: scroll-proving-sdk helm charts name: scroll-proving-sdk -version: 0.0.1 +version: 0.0.2 appVersion: v0.1.0 kubeVersion: ">=1.22.0-0" maintainers: diff --git a/charts/scroll-proving-sdk/README.md b/charts/scroll-proving-sdk/README.md index 3bc5317..1ac32f5 100644 --- a/charts/scroll-proving-sdk/README.md +++ b/charts/scroll-proving-sdk/README.md @@ -1,6 +1,6 @@ # scroll-proving-sdk -![Version: 0.0.1](https://img.shields.io/badge/Version-0.0.1-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) +![Version: 0.0.2](https://img.shields.io/badge/Version-0.0.2-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) scroll-proving-sdk helm charts @@ -54,7 +54,7 @@ Kubernetes: `>=1.22.0-0` | resources.limits.memory | string | `"500Mi"` | | | resources.requests.cpu | string | `"50m"` | | | resources.requests.memory | string | `"100Mi"` | | -| scrollConfig | string | `"{\n \"prover_name_prefix\": \"sindri_\",\n \"keys_dir\": \"keys\",\n \"coordinator\": {\n \"base_url\": \"https://coordinator-api.oct.sdk.scroll.xyz\",\n \"retry_count\": 3,\n \"retry_wait_time_sec\": 5,\n \"connection_timeout_sec\": 60\n },\n \"l2geth\": {\n \"endpoint\": \"https://l2-rpc.oct.sdk.scroll.xyz\"\n },\n \"prover\": {\n \"circuit_type\": 3,\n \"circuit_version\": \"v0.13.1\",\n \"n_workers\": 1,\n \"cloud\": {\n \"base_url\": \"https://sindri.app/api/v1/\",\n \"api_key\": \"sindri_TQcZKJHoPhAho7UuBFw8evEvP4nQkjQ4_0807\",\n \"retry_count\": 3,\n \"retry_wait_time_sec\": 5,\n \"connection_timeout_sec\": 60\n }\n }\n}"` | | +| scrollConfig | object | `{}` | | | service.main.enabled | bool | `true` | | | service.main.ports.http.enabled | bool | `true` | | | service.main.ports.http.port | int | `80` | | diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml index 85476d8..e0d9b92 100644 --- a/charts/scroll-proving-sdk/values.yaml +++ b/charts/scroll-proving-sdk/values.yaml @@ -52,4 +52,5 @@ probes: startup: <<: *default_probes -scrollConfig: {} \ No newline at end of file +scrollConfig: | + {} From 987332a65e3e6fc6b39b08116490adec62d6ebb1 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Fri, 18 Oct 2024 10:07:25 +0200 Subject: [PATCH 34/46] add production.yaml file in chart --- charts/scroll-proving-sdk/values/production.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 charts/scroll-proving-sdk/values/production.yaml diff --git a/charts/scroll-proving-sdk/values/production.yaml b/charts/scroll-proving-sdk/values/production.yaml new file mode 100644 index 0000000..5dfadd0 --- /dev/null +++ b/charts/scroll-proving-sdk/values/production.yaml @@ -0,0 +1,15 @@ +persistence: + scroll-proving-sdk: + enabled: true + type: secret + mountPath: /sdk_prover/ + name: scroll-proving-sdk-config + +externalSecrets: + scroll-proving-sdk-config: + data: + - remoteRef: + key: scroll/scroll-proving-sdk-config + secretKey: config.json + refreshInterval: 2m + serviceAccount: external-secrets From 107c6d93f667e7a1b59f8a44c1128e5970fb9bb9 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Fri, 18 Oct 2024 10:07:52 +0200 Subject: [PATCH 35/46] bump chart version --- charts/scroll-proving-sdk/Chart.yaml | 2 +- charts/scroll-proving-sdk/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/scroll-proving-sdk/Chart.yaml b/charts/scroll-proving-sdk/Chart.yaml index 44a82cb..be92049 100644 --- a/charts/scroll-proving-sdk/Chart.yaml +++ b/charts/scroll-proving-sdk/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 description: scroll-proving-sdk helm charts name: scroll-proving-sdk -version: 0.0.2 +version: 0.0.3 appVersion: v0.1.0 kubeVersion: ">=1.22.0-0" maintainers: diff --git a/charts/scroll-proving-sdk/README.md b/charts/scroll-proving-sdk/README.md index 1ac32f5..5635371 100644 --- a/charts/scroll-proving-sdk/README.md +++ b/charts/scroll-proving-sdk/README.md @@ -1,6 +1,6 @@ # scroll-proving-sdk -![Version: 0.0.2](https://img.shields.io/badge/Version-0.0.2-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) +![Version: 0.0.3](https://img.shields.io/badge/Version-0.0.3-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) scroll-proving-sdk helm charts @@ -54,7 +54,7 @@ Kubernetes: `>=1.22.0-0` | resources.limits.memory | string | `"500Mi"` | | | resources.requests.cpu | string | `"50m"` | | | resources.requests.memory | string | `"100Mi"` | | -| scrollConfig | object | `{}` | | +| scrollConfig | string | `"{}\n"` | | | service.main.enabled | bool | `true` | | | service.main.ports.http.enabled | bool | `true` | | | service.main.ports.http.port | int | `80` | | From 07897d7330d6ef90a0bdc97828751686002e3579 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Fri, 18 Oct 2024 17:04:03 +0200 Subject: [PATCH 36/46] add example-config --- charts/scroll-proving-sdk/example-config.yaml | 25 +++++++++++++++++++ charts/scroll-proving-sdk/values.yaml | 1 + 2 files changed, 26 insertions(+) create mode 100644 charts/scroll-proving-sdk/example-config.yaml diff --git a/charts/scroll-proving-sdk/example-config.yaml b/charts/scroll-proving-sdk/example-config.yaml new file mode 100644 index 0000000..06eb2fd --- /dev/null +++ b/charts/scroll-proving-sdk/example-config.yaml @@ -0,0 +1,25 @@ +{ + "prover_name_prefix": "sindri_", + "keys_dir": "keys", + "coordinator": { + "base_url": "https://coordinator-api.scrollsdk", + "retry_count": 3, + "retry_wait_time_sec": 5, + "connection_timeout_sec": 60 + }, + "l2geth": { + "endpoint": "https://l2-rpc.scrollsdk" + }, + "prover": { + "circuit_type": 3, + "circuit_version": "v0.13.1", + "n_workers": 1, + "cloud": { + "base_url": "https://sindri.app/api/v1/", + "api_key": , + "retry_count": 3, + "retry_wait_time_sec": 5, + "connection_timeout_sec": 60 + } + } +} \ No newline at end of file diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml index e0d9b92..f4221de 100644 --- a/charts/scroll-proving-sdk/values.yaml +++ b/charts/scroll-proving-sdk/values.yaml @@ -52,5 +52,6 @@ probes: startup: <<: *default_probes +# Add here the config.json file. You can see an example in example-config.yaml scrollConfig: | {} From b6f902a9745f2b353ffb274b56a11fa11681b821 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Mon, 21 Oct 2024 23:12:14 +0200 Subject: [PATCH 37/46] adjusting following comments in PR --- charts/scroll-proving-sdk/example-config.yaml | 25 ----------- charts/scroll-proving-sdk/values.yaml | 27 +++++++++++- .../scroll-proving-sdk/values/production.yaml | 41 ++++++++++++------- 3 files changed, 52 insertions(+), 41 deletions(-) delete mode 100644 charts/scroll-proving-sdk/example-config.yaml diff --git a/charts/scroll-proving-sdk/example-config.yaml b/charts/scroll-proving-sdk/example-config.yaml deleted file mode 100644 index 06eb2fd..0000000 --- a/charts/scroll-proving-sdk/example-config.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{ - "prover_name_prefix": "sindri_", - "keys_dir": "keys", - "coordinator": { - "base_url": "https://coordinator-api.scrollsdk", - "retry_count": 3, - "retry_wait_time_sec": 5, - "connection_timeout_sec": 60 - }, - "l2geth": { - "endpoint": "https://l2-rpc.scrollsdk" - }, - "prover": { - "circuit_type": 3, - "circuit_version": "v0.13.1", - "n_workers": 1, - "cloud": { - "base_url": "https://sindri.app/api/v1/", - "api_key": , - "retry_count": 3, - "retry_wait_time_sec": 5, - "connection_timeout_sec": 60 - } - } -} \ No newline at end of file diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml index f4221de..ba18451 100644 --- a/charts/scroll-proving-sdk/values.yaml +++ b/charts/scroll-proving-sdk/values.yaml @@ -52,6 +52,31 @@ probes: startup: <<: *default_probes -# Add here the config.json file. You can see an example in example-config.yaml +# scrollConfig should be overwritten the config in json format. See the example below. scrollConfig: | {} +#{ +# "prover_name_prefix": "sindri_", +# "keys_dir": "keys", +# "coordinator": { +# "base_url": "https://coordinator-api.scrollsdk", +# "retry_count": 3, +# "retry_wait_time_sec": 5, +# "connection_timeout_sec": 60 +# }, +# "l2geth": { +# "endpoint": "https://l2-rpc.scrollsdk" +# }, +# "prover": { +# "circuit_type": 3, +# "circuit_version": "v0.13.1", +# "n_workers": 1, +# "cloud": { +# "base_url": "https://sindri.app/api/v1/", +# "api_key": , +# "retry_count": 3, +# "retry_wait_time_sec": 5, +# "connection_timeout_sec": 60 +# } +# } +#} \ No newline at end of file diff --git a/charts/scroll-proving-sdk/values/production.yaml b/charts/scroll-proving-sdk/values/production.yaml index 5dfadd0..bd8ee52 100644 --- a/charts/scroll-proving-sdk/values/production.yaml +++ b/charts/scroll-proving-sdk/values/production.yaml @@ -1,15 +1,26 @@ -persistence: - scroll-proving-sdk: - enabled: true - type: secret - mountPath: /sdk_prover/ - name: scroll-proving-sdk-config - -externalSecrets: - scroll-proving-sdk-config: - data: - - remoteRef: - key: scroll/scroll-proving-sdk-config - secretKey: config.json - refreshInterval: 2m - serviceAccount: external-secrets +scrollConfig: | + { + "prover_name_prefix": "sindri_", + "keys_dir": "keys", + "coordinator": { + "base_url": "https://coordinator-api.scrollsdk", + "retry_count": 3, + "retry_wait_time_sec": 5, + "connection_timeout_sec": 60 + }, + "l2geth": { + "endpoint": "https://l2-rpc.scrollsdk" + }, + "prover": { + "circuit_type": 3, + "circuit_version": "v0.13.1", + "n_workers": 1, + "cloud": { + "base_url": "https://sindri.app/api/v1/", + "api_key": , + "retry_count": 3, + "retry_wait_time_sec": 5, + "connection_timeout_sec": 60 + } + } + } From 62af83f294afafdafa6df802171c304180c48750 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Mon, 21 Oct 2024 23:17:11 +0200 Subject: [PATCH 38/46] fix the description --- charts/scroll-proving-sdk/Chart.yaml | 2 +- charts/scroll-proving-sdk/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/scroll-proving-sdk/Chart.yaml b/charts/scroll-proving-sdk/Chart.yaml index be92049..f4ef8c0 100644 --- a/charts/scroll-proving-sdk/Chart.yaml +++ b/charts/scroll-proving-sdk/Chart.yaml @@ -1,6 +1,6 @@ --- apiVersion: v2 -description: scroll-proving-sdk helm charts +description: Example chart for showing how to package a service built using the scroll-proving-sdk library name: scroll-proving-sdk version: 0.0.3 appVersion: v0.1.0 diff --git a/charts/scroll-proving-sdk/README.md b/charts/scroll-proving-sdk/README.md index 5635371..1f09f51 100644 --- a/charts/scroll-proving-sdk/README.md +++ b/charts/scroll-proving-sdk/README.md @@ -2,7 +2,7 @@ ![Version: 0.0.3](https://img.shields.io/badge/Version-0.0.3-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) -scroll-proving-sdk helm charts +Example chart for showing how to package a service built using the scroll-proving-sdk library ## Maintainers From 3246c1c92d3321a809173747d3740fd7a3a50692 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Mon, 21 Oct 2024 23:21:32 +0200 Subject: [PATCH 39/46] fix linting --- charts/scroll-proving-sdk/values.yaml | 50 +++++++++++++-------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml index ba18451..7c128a0 100644 --- a/charts/scroll-proving-sdk/values.yaml +++ b/charts/scroll-proving-sdk/values.yaml @@ -55,28 +55,28 @@ probes: # scrollConfig should be overwritten the config in json format. See the example below. scrollConfig: | {} -#{ -# "prover_name_prefix": "sindri_", -# "keys_dir": "keys", -# "coordinator": { -# "base_url": "https://coordinator-api.scrollsdk", -# "retry_count": 3, -# "retry_wait_time_sec": 5, -# "connection_timeout_sec": 60 -# }, -# "l2geth": { -# "endpoint": "https://l2-rpc.scrollsdk" -# }, -# "prover": { -# "circuit_type": 3, -# "circuit_version": "v0.13.1", -# "n_workers": 1, -# "cloud": { -# "base_url": "https://sindri.app/api/v1/", -# "api_key": , -# "retry_count": 3, -# "retry_wait_time_sec": 5, -# "connection_timeout_sec": 60 -# } -# } -#} \ No newline at end of file +# { +# "prover_name_prefix": "sindri_", +# "keys_dir": "keys", +# "coordinator": { +# "base_url": "https://coordinator-api.scrollsdk", +# "retry_count": 3, +# "retry_wait_time_sec": 5, +# "connection_timeout_sec": 60 +# }, +# "l2geth": { +# "endpoint": "https://l2-rpc.scrollsdk" +# }, +# "prover": { +# "circuit_type": 3, +# "circuit_version": "v0.13.1", +# "n_workers": 1, +# "cloud": { +# "base_url": "https://sindri.app/api/v1/", +# "api_key": , +# "retry_count": 3, +# "retry_wait_time_sec": 5, +# "connection_timeout_sec": 60 +# } +# } +# } From e6e60a67ab2191896f02637dbe89cbfcf751f1af Mon Sep 17 00:00:00 2001 From: sbaizet <74511063+sbaizet-ledger@users.noreply.github.com> Date: Mon, 21 Oct 2024 23:28:10 +0200 Subject: [PATCH 40/46] add helm chart (#30) --- .github/chart_schema.yaml | 37 +++++++ .github/lintconf.yaml | 42 +++++++ .github/workflows/publish-chart.yaml | 101 +++++++++++++++++ .github/workflows/publish-dev-chart.yaml | 103 ++++++++++++++++++ .gitignore | 4 + charts/scroll-proving-sdk/Chart.yaml | 14 +++ charts/scroll-proving-sdk/README.md | 63 +++++++++++ charts/scroll-proving-sdk/index.yaml | 20 ++++ .../scroll-proving-sdk/templates/common.yaml | 14 +++ .../templates/config-file.yaml | 10 ++ .../scroll-proving-sdk/templates/helpers.tpl | 47 ++++++++ charts/scroll-proving-sdk/values.yaml | 82 ++++++++++++++ .../scroll-proving-sdk/values/production.yaml | 26 +++++ ct.yaml | 7 ++ 14 files changed, 570 insertions(+) create mode 100644 .github/chart_schema.yaml create mode 100644 .github/lintconf.yaml create mode 100644 .github/workflows/publish-chart.yaml create mode 100644 .github/workflows/publish-dev-chart.yaml create mode 100644 charts/scroll-proving-sdk/Chart.yaml create mode 100644 charts/scroll-proving-sdk/README.md create mode 100644 charts/scroll-proving-sdk/index.yaml create mode 100644 charts/scroll-proving-sdk/templates/common.yaml create mode 100644 charts/scroll-proving-sdk/templates/config-file.yaml create mode 100644 charts/scroll-proving-sdk/templates/helpers.tpl create mode 100644 charts/scroll-proving-sdk/values.yaml create mode 100644 charts/scroll-proving-sdk/values/production.yaml create mode 100644 ct.yaml diff --git a/.github/chart_schema.yaml b/.github/chart_schema.yaml new file mode 100644 index 0000000..af357f4 --- /dev/null +++ b/.github/chart_schema.yaml @@ -0,0 +1,37 @@ +name: str() +home: str(required=False) +version: str() +apiVersion: str() +appVersion: any(str(), num(), required=False) +description: str(required=False) +keywords: list(str(), required=False) +sources: list(str(), required=False) +maintainers: list(include('maintainer'), required=False) +dependencies: list(include('dependency'), required=False) +icon: str(required=False) +engine: str(required=False) +condition: str(required=False) +tags: str(required=False) +deprecated: bool(required=False) +kubeVersion: str(required=False) +annotations: map(str(), str(), required=False) +type: str(required=False) +--- +maintainer: + name: str() + email: str(required=False) + url: str(required=False) +--- +dependency: + name: str() + version: str() + repository: str(required=False) + condition: str(required=False) + tags: list(str(), required=False) + enabled: bool(required=False) + import-values: any(list(str()), list(include('import-value')), required=False) + alias: str(required=False) +--- +import-value: + child: str() + parent: str() \ No newline at end of file diff --git a/.github/lintconf.yaml b/.github/lintconf.yaml new file mode 100644 index 0000000..6789bc5 --- /dev/null +++ b/.github/lintconf.yaml @@ -0,0 +1,42 @@ +--- +rules: + braces: + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + brackets: + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + colons: + max-spaces-before: 0 + max-spaces-after: 1 + commas: + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: + require-starting-space: true + min-spaces-from-content: 2 + document-end: disable + document-start: disable # No --- to start a file + empty-lines: + max: 2 + max-start: 0 + max-end: 0 + hyphens: + max-spaces-after: 1 + indentation: + spaces: consistent + indent-sequences: whatever # - list indentation will handle both indentation and without + check-multi-line-strings: false + key-duplicates: enable + line-length: disable # Lines can be any length + new-line-at-end-of-file: enable + new-lines: + type: unix + trailing-spaces: enable + truthy: + level: warning \ No newline at end of file diff --git a/.github/workflows/publish-chart.yaml b/.github/workflows/publish-chart.yaml new file mode 100644 index 0000000..9aee48b --- /dev/null +++ b/.github/workflows/publish-chart.yaml @@ -0,0 +1,101 @@ +name: Lint, test and publish charts + +on: + push: + branches: [ main ] + paths: + - 'charts/**' + +jobs: + helm-chart-testing: + name: chart-testing + runs-on: ubuntu-latest + environment: test + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Helm + uses: azure/setup-helm@v3 + with: + version: v3.12.1 + + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + check-latest: true + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.0 + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + # List chart change except scroll-sdk + - name: Run chart-testing (list-changed) + id: list-changed + run: | + changed=$(ct list-changed --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} ) + if [[ -n "$changed" ]]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Run chart-testing (lint) + if: steps.list-changed.outputs.changed == 'true' + run: ct lint --config ct.yaml --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} + + publish-ghcr: + name: publish-to-github + runs-on: ubuntu-latest + needs: + - helm-chart-testing + outputs: + charts: ${{ steps.list-changed.outputs.changed }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dorny/paths-filter@v2 + id: filter + with: + base: ${{ github.event.repository.default_branch }} + list-files: shell + filters: | + addedOrModified: + - added|modified: 'charts/**' + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + - name: Push chart to ghcr + if: steps.filter.outputs.addedOrModified == 'true' + env: + HELM_EXPERIMENTAL_OCI: 1 + run: | + set -x + CHARTS=() + PATHS=(${{ steps.filter.outputs.addedOrModified_files }}) + echo ${PATHS} + # Get only the chart paths + for i in "${PATHS[@]}" + do + chart=$(echo $i | awk -F "/" '{print $2}') + done + # Remove duplicates + CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) + echo "CHARTS: ${CHARTS[@]}" + for chart in ${CHARTS[@]}; do + helm dependencies build charts/$chart + helm package charts/$chart + export CHART_VERSION=$(grep 'version:' charts/$chart/Chart.yaml | head -n1 | awk '{ print $2 }') + helm push $chart-${CHART_VERSION}.tgz oci://ghcr.io/scroll-tech/scroll-sdk/helm + done diff --git a/.github/workflows/publish-dev-chart.yaml b/.github/workflows/publish-dev-chart.yaml new file mode 100644 index 0000000..6765665 --- /dev/null +++ b/.github/workflows/publish-dev-chart.yaml @@ -0,0 +1,103 @@ +name: Lint, test and publish dev charts + +on: + push: + paths: + - 'charts/**' + +env: + HELM_REGISTRY: ghcr.io/scroll-tech/scroll-sdk/helm/dev + +jobs: + helm-chart-testing-not-scroll-sdk: + name: chart-testing-without-scroll-sdk + runs-on: ubuntu-latest + environment: test + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Helm + uses: azure/setup-helm@v3 + with: + version: v3.12.1 + + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + check-latest: true + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.0 + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + # List chart change except scroll-sdk + - name: Run chart-testing (list-changed) + id: list-changed + run: | + changed=$(ct list-changed --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} ) + if [[ -n "$changed" ]]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Run chart-testing (lint) + if: steps.list-changed.outputs.changed == 'true' + run: ct lint --config ct.yaml --excluded-charts scroll-sdk --target-branch ${{ github.event.repository.default_branch }} + + publish-ghcr-not-scroll-sdk: + name: publish-to-github-without-scroll-sdk + runs-on: ubuntu-latest + needs: + - helm-chart-testing-not-scroll-sdk + outputs: + charts: ${{ steps.list-changed.outputs.changed }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dorny/paths-filter@v2 + id: filter + with: + base: ${{ github.event.repository.default_branch }} + list-files: shell + filters: | + addedOrModified: + - added|modified: 'charts/**' + + - name: Helm registry login + run: | + helm registry login ghcr.io/scroll-tech/helm/scroll-sdk --username ${{ github.actor }} --password ${{ secrets.HELM_GITHUB_PASSWORD }} + env: + HELM_GITHUB_PASSWORD: "${{ secrets.HELM_GITHUB_PASSWORD }}" + + - name: Push chart to ghcr + if: steps.filter.outputs.addedOrModified == 'true' + env: + HELM_EXPERIMENTAL_OCI: 1 + run: | + set -x + CHARTS=() + PATHS=(${{ steps.filter.outputs.addedOrModified_files }}) + echo ${PATHS} + # Get only the chart paths + for i in "${PATHS[@]}" + do + chart=$(echo $i | awk -F "/" '{print $2}') + done + # Remove duplicates + CHARTS=( `for i in ${CHARTS[@]}; do echo $i; done | sort -u` ) + echo "CHARTS: ${CHARTS[@]}" + for chart in ${CHARTS[@]}; do + helm dependencies build charts/$chart + helm package charts/$chart + export CHART_VERSION=$(grep 'version:' charts/$chart/Chart.yaml | head -n1 | awk '{ print $2 }') + helm push $chart-${CHART_VERSION}.tgz oci://${HELM_REGISTRY} + done diff --git a/.gitignore b/.gitignore index 9c0348c..e0082f6 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,7 @@ target/ config.json keys/ + +# Helm chart related +*.lock +*.tgz \ No newline at end of file diff --git a/charts/scroll-proving-sdk/Chart.yaml b/charts/scroll-proving-sdk/Chart.yaml new file mode 100644 index 0000000..f4ef8c0 --- /dev/null +++ b/charts/scroll-proving-sdk/Chart.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: v2 +description: Example chart for showing how to package a service built using the scroll-proving-sdk library +name: scroll-proving-sdk +version: 0.0.3 +appVersion: v0.1.0 +kubeVersion: ">=1.22.0-0" +maintainers: + - name: scroll-tech + email: sebastien@scroll.io +dependencies: + - name: common + repository: "oci://ghcr.io/scroll-tech/scroll-sdk/helm" + version: 1.5.1 diff --git a/charts/scroll-proving-sdk/README.md b/charts/scroll-proving-sdk/README.md new file mode 100644 index 0000000..1f09f51 --- /dev/null +++ b/charts/scroll-proving-sdk/README.md @@ -0,0 +1,63 @@ +# scroll-proving-sdk + +![Version: 0.0.3](https://img.shields.io/badge/Version-0.0.3-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) + +Example chart for showing how to package a service built using the scroll-proving-sdk library + +## Maintainers + +| Name | Email | Url | +| ---- | ------ | --- | +| scroll-tech | | | + +## Requirements + +Kubernetes: `>=1.22.0-0` + +| Repository | Name | Version | +|------------|------|---------| +| oci://ghcr.io/scroll-tech/scroll-sdk/helm | common | 1.5.1 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| command[0] | string | `"/bin/sh"` | | +| command[1] | string | `"-c"` | | +| command[2] | string | `"exec cloud --config /sdk_prover/config.json"` | | +| defaultProbes.custom | bool | `true` | | +| defaultProbes.enabled | bool | `true` | | +| defaultProbes.spec.httpGet.path | string | `"/"` | | +| defaultProbes.spec.httpGet.port | int | `80` | | +| global.fullnameOverride | string | `"scroll-proving-sdk"` | | +| global.nameOverride | string | `"scroll-proving-sdk"` | | +| image.pullPolicy | string | `"Always"` | | +| image.repository | string | `"scrolltech/sdk-cloud-prover"` | | +| image.tag | string | `"sindri-2791edca"` | | +| persistence.app_name.enabled | bool | `true` | | +| persistence.app_name.mountPath | string | `"/sdk_prover/"` | | +| persistence.app_name.name | string | `"scroll-proving-sdk-config"` | | +| persistence.app_name.type | string | `"configMap"` | | +| probes.liveness.<<.custom | bool | `true` | | +| probes.liveness.<<.enabled | bool | `true` | | +| probes.liveness.<<.spec.httpGet.path | string | `"/"` | | +| probes.liveness.<<.spec.httpGet.port | int | `80` | | +| probes.readiness.<<.custom | bool | `true` | | +| probes.readiness.<<.enabled | bool | `true` | | +| probes.readiness.<<.spec.httpGet.path | string | `"/"` | | +| probes.readiness.<<.spec.httpGet.port | int | `80` | | +| probes.startup.<<.custom | bool | `true` | | +| probes.startup.<<.enabled | bool | `true` | | +| probes.startup.<<.spec.httpGet.path | string | `"/"` | | +| probes.startup.<<.spec.httpGet.port | int | `80` | | +| resources.limits.cpu | string | `"100m"` | | +| resources.limits.memory | string | `"500Mi"` | | +| resources.requests.cpu | string | `"50m"` | | +| resources.requests.memory | string | `"100Mi"` | | +| scrollConfig | string | `"{}\n"` | | +| service.main.enabled | bool | `true` | | +| service.main.ports.http.enabled | bool | `true` | | +| service.main.ports.http.port | int | `80` | | + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2) diff --git a/charts/scroll-proving-sdk/index.yaml b/charts/scroll-proving-sdk/index.yaml new file mode 100644 index 0000000..4466a03 --- /dev/null +++ b/charts/scroll-proving-sdk/index.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +entries: + common: + - apiVersion: v2 + created: "2024-08-05T16:32:51.061701+02:00" + description: Function library for Helm charts + digest: e75d90ca3a07e1b5ed4677c893ab007ba85c67d7ff60cca217b4ab0776050d0d + keywords: + - common + - library + kubeVersion: '>=1.22.0-0' + maintainers: + - email: sebastien@scroll.io + name: sebastien + name: common + type: library + urls: + - charts/common-1.5.1.tgz + version: 1.5.1 +generated: "2024-08-05T16:32:51.059889+02:00" diff --git a/charts/scroll-proving-sdk/templates/common.yaml b/charts/scroll-proving-sdk/templates/common.yaml new file mode 100644 index 0000000..ed32775 --- /dev/null +++ b/charts/scroll-proving-sdk/templates/common.yaml @@ -0,0 +1,14 @@ +--- +{{- include "scroll.common.loader.init" . }} + +{{- define "app-template.hardcodedValues" -}} +# Set the nameOverride based on the release name if no override has been set +{{ if not .Values.global.nameOverride }} +global: + nameOverride: "{{ .Release.Name }}" +{{ end }} +{{- end -}} +{{- $_ := mergeOverwrite .Values (include "app-template.hardcodedValues" . | fromYaml) -}} + +{{/* Render the templates */}} +{{ include "scroll.common.loader.generate" . }} diff --git a/charts/scroll-proving-sdk/templates/config-file.yaml b/charts/scroll-proving-sdk/templates/config-file.yaml new file mode 100644 index 0000000..0d8136b --- /dev/null +++ b/charts/scroll-proving-sdk/templates/config-file.yaml @@ -0,0 +1,10 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: scroll-proving-sdk-config + labels: + {{- include "scroll-sdk.labels" $ | nindent 4 }} +data: + config.json: | +{{ .Values.scrollConfig | indent 4 }} diff --git a/charts/scroll-proving-sdk/templates/helpers.tpl b/charts/scroll-proving-sdk/templates/helpers.tpl new file mode 100644 index 0000000..d762ba1 --- /dev/null +++ b/charts/scroll-proving-sdk/templates/helpers.tpl @@ -0,0 +1,47 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "scroll-sdk.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "scroll-sdk.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} +{{/* +Create chart name and build as used by the chart label. +*/}} +{{- define "scroll-sdk.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} +{{/* +Common labels +*/}} +{{- define "scroll-sdk.labels" -}} +helm.sh/chart: {{ include "scroll-sdk.chart" . }} +{{ include "scroll-sdk.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/build: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} +{{/* +Selector labels +*/}} +{{- define "scroll-sdk.selectorLabels" -}} +app.kubernetes.io/name: {{ include "scroll-sdk.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml new file mode 100644 index 0000000..7c128a0 --- /dev/null +++ b/charts/scroll-proving-sdk/values.yaml @@ -0,0 +1,82 @@ +--- +global: + nameOverride: &app_name scroll-proving-sdk + fullnameOverride: *app_name + +image: + repository: scrolltech/sdk-cloud-prover + pullPolicy: Always + tag: sindri-2791edca + +command: + - "/bin/sh" + - "-c" + - "exec cloud --config /sdk_prover/config.json" + +resources: + requests: + memory: "100Mi" + cpu: "50m" + limits: + memory: "500Mi" + cpu: "100m" + +persistence: + *app_name: + enabled: true + type: configMap + mountPath: /sdk_prover/ + name: scroll-proving-sdk-config + +service: + main: + enabled: true + ports: + http: + enabled: true + port: 80 + +defaultProbes: &default_probes + enabled: true + custom: true + spec: + httpGet: + path: "/" + port: 80 + +probes: + liveness: + <<: *default_probes + readiness: + <<: *default_probes + startup: + <<: *default_probes + +# scrollConfig should be overwritten the config in json format. See the example below. +scrollConfig: | + {} +# { +# "prover_name_prefix": "sindri_", +# "keys_dir": "keys", +# "coordinator": { +# "base_url": "https://coordinator-api.scrollsdk", +# "retry_count": 3, +# "retry_wait_time_sec": 5, +# "connection_timeout_sec": 60 +# }, +# "l2geth": { +# "endpoint": "https://l2-rpc.scrollsdk" +# }, +# "prover": { +# "circuit_type": 3, +# "circuit_version": "v0.13.1", +# "n_workers": 1, +# "cloud": { +# "base_url": "https://sindri.app/api/v1/", +# "api_key": , +# "retry_count": 3, +# "retry_wait_time_sec": 5, +# "connection_timeout_sec": 60 +# } +# } +# } diff --git a/charts/scroll-proving-sdk/values/production.yaml b/charts/scroll-proving-sdk/values/production.yaml new file mode 100644 index 0000000..bd8ee52 --- /dev/null +++ b/charts/scroll-proving-sdk/values/production.yaml @@ -0,0 +1,26 @@ +scrollConfig: | + { + "prover_name_prefix": "sindri_", + "keys_dir": "keys", + "coordinator": { + "base_url": "https://coordinator-api.scrollsdk", + "retry_count": 3, + "retry_wait_time_sec": 5, + "connection_timeout_sec": 60 + }, + "l2geth": { + "endpoint": "https://l2-rpc.scrollsdk" + }, + "prover": { + "circuit_type": 3, + "circuit_version": "v0.13.1", + "n_workers": 1, + "cloud": { + "base_url": "https://sindri.app/api/v1/", + "api_key": , + "retry_count": 3, + "retry_wait_time_sec": 5, + "connection_timeout_sec": 60 + } + } + } diff --git a/ct.yaml b/ct.yaml new file mode 100644 index 0000000..5a22705 --- /dev/null +++ b/ct.yaml @@ -0,0 +1,7 @@ +remote: origin +target-branch: main +chart-dirs: + - charts +validate-maintainers: true +check-version-increment: true +debug: true From c05f9dd782e4e328c404cef60e086757b8dced08 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Tue, 22 Oct 2024 08:48:24 +0200 Subject: [PATCH 41/46] allow multiple versions of scroll-proving-sdk --- charts/scroll-proving-sdk/templates/config-file.yaml | 2 +- charts/scroll-proving-sdk/values.yaml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/charts/scroll-proving-sdk/templates/config-file.yaml b/charts/scroll-proving-sdk/templates/config-file.yaml index 0d8136b..85d99a3 100644 --- a/charts/scroll-proving-sdk/templates/config-file.yaml +++ b/charts/scroll-proving-sdk/templates/config-file.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: ConfigMap metadata: - name: scroll-proving-sdk-config + name: {{ .Release.name }}-config labels: {{- include "scroll-sdk.labels" $ | nindent 4 }} data: diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml index 7c128a0..a8bba75 100644 --- a/charts/scroll-proving-sdk/values.yaml +++ b/charts/scroll-proving-sdk/values.yaml @@ -26,7 +26,7 @@ persistence: enabled: true type: configMap mountPath: /sdk_prover/ - name: scroll-proving-sdk-config + name: scroll-proving-sdk-config # Change this value to -config service: main: @@ -55,7 +55,7 @@ probes: # scrollConfig should be overwritten the config in json format. See the example below. scrollConfig: | {} -# { +# { # "prover_name_prefix": "sindri_", # "keys_dir": "keys", # "coordinator": { @@ -79,4 +79,4 @@ scrollConfig: | # "connection_timeout_sec": 60 # } # } -# } +# } From 384533ea14063a59f5fddca1e113c81834076fc5 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Tue, 22 Oct 2024 08:53:23 +0200 Subject: [PATCH 42/46] chart bump --- charts/scroll-proving-sdk/Chart.yaml | 2 +- charts/scroll-proving-sdk/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/scroll-proving-sdk/Chart.yaml b/charts/scroll-proving-sdk/Chart.yaml index f4ef8c0..22d10ac 100644 --- a/charts/scroll-proving-sdk/Chart.yaml +++ b/charts/scroll-proving-sdk/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 description: Example chart for showing how to package a service built using the scroll-proving-sdk library name: scroll-proving-sdk -version: 0.0.3 +version: 0.0.4 appVersion: v0.1.0 kubeVersion: ">=1.22.0-0" maintainers: diff --git a/charts/scroll-proving-sdk/README.md b/charts/scroll-proving-sdk/README.md index 1f09f51..691def2 100644 --- a/charts/scroll-proving-sdk/README.md +++ b/charts/scroll-proving-sdk/README.md @@ -1,6 +1,6 @@ # scroll-proving-sdk -![Version: 0.0.3](https://img.shields.io/badge/Version-0.0.3-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) +![Version: 0.0.4](https://img.shields.io/badge/Version-0.0.4-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) Example chart for showing how to package a service built using the scroll-proving-sdk library From a67adcf2ab0c25e0aefd7d95b5cf6c019e8d7a8e Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Tue, 22 Oct 2024 08:55:27 +0200 Subject: [PATCH 43/46] fix lint --- charts/scroll-proving-sdk/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml index a8bba75..1cd8408 100644 --- a/charts/scroll-proving-sdk/values.yaml +++ b/charts/scroll-proving-sdk/values.yaml @@ -26,7 +26,7 @@ persistence: enabled: true type: configMap mountPath: /sdk_prover/ - name: scroll-proving-sdk-config # Change this value to -config + name: scroll-proving-sdk-config # Change this value to -config service: main: From abf763a9840af834df3845421992b9a487136e41 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Tue, 22 Oct 2024 13:50:52 +0200 Subject: [PATCH 44/46] fix typo --- charts/scroll-proving-sdk/Chart.yaml | 2 +- charts/scroll-proving-sdk/README.md | 2 +- charts/scroll-proving-sdk/templates/config-file.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/scroll-proving-sdk/Chart.yaml b/charts/scroll-proving-sdk/Chart.yaml index 22d10ac..71e9f87 100644 --- a/charts/scroll-proving-sdk/Chart.yaml +++ b/charts/scroll-proving-sdk/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 description: Example chart for showing how to package a service built using the scroll-proving-sdk library name: scroll-proving-sdk -version: 0.0.4 +version: 0.0.5 appVersion: v0.1.0 kubeVersion: ">=1.22.0-0" maintainers: diff --git a/charts/scroll-proving-sdk/README.md b/charts/scroll-proving-sdk/README.md index 691def2..336a711 100644 --- a/charts/scroll-proving-sdk/README.md +++ b/charts/scroll-proving-sdk/README.md @@ -1,6 +1,6 @@ # scroll-proving-sdk -![Version: 0.0.4](https://img.shields.io/badge/Version-0.0.4-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) +![Version: 0.0.5](https://img.shields.io/badge/Version-0.0.5-informational?style=flat-square) ![AppVersion: v0.1.0](https://img.shields.io/badge/AppVersion-v0.1.0-informational?style=flat-square) Example chart for showing how to package a service built using the scroll-proving-sdk library diff --git a/charts/scroll-proving-sdk/templates/config-file.yaml b/charts/scroll-proving-sdk/templates/config-file.yaml index 85d99a3..21c9537 100644 --- a/charts/scroll-proving-sdk/templates/config-file.yaml +++ b/charts/scroll-proving-sdk/templates/config-file.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: ConfigMap metadata: - name: {{ .Release.name }}-config + name: {{ .Release.Name }}-config labels: {{- include "scroll-sdk.labels" $ | nindent 4 }} data: From af81e18e75e4533805a61fb7227cd57f30c84e4c Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Tue, 22 Oct 2024 14:10:25 +0200 Subject: [PATCH 45/46] update certificates in docker image --- charts/scroll-proving-sdk/values.yaml | 2 +- docker/Dockerfile.cloud | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml index 1cd8408..5ae2f4a 100644 --- a/charts/scroll-proving-sdk/values.yaml +++ b/charts/scroll-proving-sdk/values.yaml @@ -22,7 +22,7 @@ resources: cpu: "100m" persistence: - *app_name: + config: enabled: true type: configMap mountPath: /sdk_prover/ diff --git a/docker/Dockerfile.cloud b/docker/Dockerfile.cloud index df5d7c0..c47b08a 100644 --- a/docker/Dockerfile.cloud +++ b/docker/Dockerfile.cloud @@ -14,7 +14,7 @@ RUN cargo build --release --example cloud FROM ubuntu:20.04 # Install necessary dependencies -RUN apt-get update && apt-get install -y libssl-dev && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y libssl-dev ca-certificates && rm -rf /var/lib/apt/lists/* # Copy the built binary from the builder stage COPY --from=builder /usr/src/app/target/release/examples/cloud /usr/local/bin/cloud From 4638b7d7becf2643fc5d086731c46533d1c605f7 Mon Sep 17 00:00:00 2001 From: Sebastien Baizet Date: Tue, 22 Oct 2024 14:39:24 +0200 Subject: [PATCH 46/46] add certificates to docker image and persistent volume to store keys on the chart --- charts/scroll-proving-sdk/README.md | 15 ++++++++++----- charts/scroll-proving-sdk/values.yaml | 8 +++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/charts/scroll-proving-sdk/README.md b/charts/scroll-proving-sdk/README.md index 336a711..026be1d 100644 --- a/charts/scroll-proving-sdk/README.md +++ b/charts/scroll-proving-sdk/README.md @@ -33,11 +33,16 @@ Kubernetes: `>=1.22.0-0` | global.nameOverride | string | `"scroll-proving-sdk"` | | | image.pullPolicy | string | `"Always"` | | | image.repository | string | `"scrolltech/sdk-cloud-prover"` | | -| image.tag | string | `"sindri-2791edca"` | | -| persistence.app_name.enabled | bool | `true` | | -| persistence.app_name.mountPath | string | `"/sdk_prover/"` | | -| persistence.app_name.name | string | `"scroll-proving-sdk-config"` | | -| persistence.app_name.type | string | `"configMap"` | | +| image.tag | string | `"sindri-v0.0.1"` | | +| persistence.config.enabled | bool | `true` | | +| persistence.config.mountPath | string | `"/sdk_prover/"` | | +| persistence.config.name | string | `"scroll-proving-sdk-config"` | | +| persistence.config.type | string | `"configMap"` | | +| persistence.keys.accessMode | string | `"ReadWriteOnce"` | | +| persistence.keys.enabled | bool | `true` | | +| persistence.keys.mountPath | string | `"/keys/"` | | +| persistence.keys.size | string | `"10Mi"` | | +| persistence.keys.type | string | `"pvc"` | | | probes.liveness.<<.custom | bool | `true` | | | probes.liveness.<<.enabled | bool | `true` | | | probes.liveness.<<.spec.httpGet.path | string | `"/"` | | diff --git a/charts/scroll-proving-sdk/values.yaml b/charts/scroll-proving-sdk/values.yaml index 5ae2f4a..b04acae 100644 --- a/charts/scroll-proving-sdk/values.yaml +++ b/charts/scroll-proving-sdk/values.yaml @@ -6,7 +6,7 @@ global: image: repository: scrolltech/sdk-cloud-prover pullPolicy: Always - tag: sindri-2791edca + tag: sindri-v0.0.1 command: - "/bin/sh" @@ -27,6 +27,12 @@ persistence: type: configMap mountPath: /sdk_prover/ name: scroll-proving-sdk-config # Change this value to -config + keys: + enabled: true + type: pvc + mountPath: /keys/ + size: 10Mi + accessMode: ReadWriteOnce service: main: