diff --git a/Cargo.lock b/Cargo.lock index 338c5ec8d..fed709b10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6111,6 +6111,7 @@ dependencies = [ "sgx-prover", "sha2", "sp1-driver", + "test-log", "thiserror", "tokio", "tokio-util", @@ -9376,6 +9377,28 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +[[package]] +name = "test-log" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dffced63c2b5c7be278154d76b479f9f9920ed34e7574201407f0b14e2bbb93" +dependencies = [ + "env_logger", + "test-log-macros", + "tracing-subscriber 0.3.18", +] + +[[package]] +name = "test-log-macros" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5999e24eaa32083191ba4e425deb75cdf25efefabe5aaccb7446dd0d4122a3f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", +] + [[package]] name = "textwrap" version = "0.11.0" diff --git a/Cargo.toml b/Cargo.toml index e956cc0a5..131aae088 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -185,6 +185,9 @@ pathdiff = "0.2.1" dotenv = "0.15.0" backoff = "0.4.0" +# test +test-log = "0.2.16" + [patch.crates-io] revm = { git = "https://github.com/taikoxyz/revm.git", branch = "v36-taiko" } revm-primitives = { git = "https://github.com/taikoxyz/revm.git", branch = "v36-taiko" } diff --git a/host/Cargo.toml b/host/Cargo.toml index e6cec5ff8..bc89a1007 100644 --- a/host/Cargo.toml +++ b/host/Cargo.toml @@ -82,6 +82,7 @@ assert_cmd = { workspace = true } rstest = { workspace = true } ethers-core = { workspace = true } rand = { workspace = true } +test-log = { workspace = true } [features] default = [] @@ -89,6 +90,7 @@ sp1 = ["raiko-core/sp1"] risc0 = ["raiko-core/risc0"] sgx = ["raiko-core/sgx"] integration = [] +test-mock-guest = ["risc0-driver/test-mock-guest"] [[bin]] name = "raiko-host" diff --git a/host/tests/common/client.rs b/host/tests/common/client.rs index b80b7d8f7..80948e50a 100644 --- a/host/tests/common/client.rs +++ b/host/tests/common/client.rs @@ -34,9 +34,11 @@ impl Client { .send() .await?; - if !response.status().is_success() { - return Err(response.error_for_status().unwrap_err()); - } + assert!( + response.status().is_success(), + "reqwest post error: {}", + response.text().await? + ); response.json().await } @@ -44,9 +46,11 @@ impl Client { pub async fn get(&self, path: &str) -> Result { let response = self.reqwest_client.get(self.build_url(path)).send().await?; - if !response.status().is_success() { - return Err(response.error_for_status().unwrap_err()); - } + assert!( + response.status().is_success(), + "reqwest get error: {}", + response.text().await? + ); Ok(response) } diff --git a/host/tests/common/request.rs b/host/tests/common/request.rs index d807587a1..f942c261e 100644 --- a/host/tests/common/request.rs +++ b/host/tests/common/request.rs @@ -135,7 +135,7 @@ pub async fn v2_complete_proof_request(client: &Client, request: &ProofRequestOp api::v2::Status::Ok { data: api::v2::ProofResponse::Proof { proof }, } => { - println!("proof generation completed, proof: {}", json!(proof)); + println!("proof generation completed, request: {request:?}"); return proof; } @@ -200,10 +200,7 @@ pub async fn v3_complete_aggregate_proof_request( api::v2::Status::Ok { data: api::v2::ProofResponse::Proof { proof }, } => { - println!( - "aggregation proof generation completed, proof: {}", - json!(proof) - ); + println!("aggregation proof generation completed, request: {request:?}"); return proof; } diff --git a/host/tests/test/aggregate_test.rs b/host/tests/test/aggregate_test.rs index 1dbbd1920..adc1c2a64 100644 --- a/host/tests/test/aggregate_test.rs +++ b/host/tests/test/aggregate_test.rs @@ -6,22 +6,22 @@ use raiko_host::server::api; use raiko_lib::consts::Network; use raiko_lib::proof_type::ProofType; use raiko_tasks::TaskStatus; +use test_log::test; -#[tokio::test] +#[test(tokio::test)] async fn test_v2_mainnet_aggregate_native() { test_v2_mainnet_aggregate(Network::TaikoMainnet, ProofType::Native).await; } +// NOTE: Locally zkVM proof aggregation is not supported yet, we are not able to test it locally. #[ignore] -#[cfg(feature = "risc0")] -#[tokio::test] +#[cfg(all(feature = "risc0", feature = "test-mock-guest"))] +#[test(tokio::test)] async fn test_v2_mainnet_aggregate_risc0() { test_v2_mainnet_aggregate(Network::TaikoMainnet, ProofType::Risc0).await; } async fn test_v2_mainnet_aggregate(network: Network, proof_type: ProofType) { - setup_mock_zkvm_elf(); - let api_version = "v2"; let aggregate_block_count = 2; @@ -92,8 +92,3 @@ async fn test_v2_mainnet_aggregate(network: Network, proof_type: ProofType) { // santy check for report format v2_assert_report(&client).await; } - -// Use mock zkvm elf for testing -fn setup_mock_zkvm_elf() { - std::env::set_var("RAIKO_MOCK_ZKVM_ELF", "true"); -} diff --git a/host/tests/test/cancel_test.rs b/host/tests/test/cancel_test.rs index b5adf04a1..d6d822513 100644 --- a/host/tests/test/cancel_test.rs +++ b/host/tests/test/cancel_test.rs @@ -3,12 +3,21 @@ use raiko_host::server::api; use raiko_lib::consts::Network; use raiko_lib::proof_type::ProofType; use raiko_tasks::TaskStatus; +use test_log::test; -#[tokio::test] -pub async fn test_v2_mainnet_native_cancel() { +#[cfg(all(feature = "risc0", feature = "test-mock-guest"))] +#[test(tokio::test)] +async fn test_v2_mainnet_risc0_cancel() { + test_v2_cancel(Network::TaikoMainnet, ProofType::Risc0).await; +} + +#[test(tokio::test)] +async fn test_v2_mainnet_native_cancel() { + test_v2_cancel(Network::TaikoMainnet, ProofType::Native).await; +} + +async fn test_v2_cancel(network: Network, proof_type: ProofType) { let api_version = "v2"; - let network = Network::TaikoMainnet; - let proof_type = ProofType::Native; let block_number = randomly_select_block(network) .await .expect("randomly select block failed"); diff --git a/host/tests/test/manual_test.rs b/host/tests/test/manual_test.rs index dc73e0c4a..be272c362 100644 --- a/host/tests/test/manual_test.rs +++ b/host/tests/test/manual_test.rs @@ -3,6 +3,7 @@ use raiko_core::interfaces::{ProofRequestOpt, ProverSpecificOpts}; use raiko_host::server::api; use raiko_tasks::TaskStatus; use serde_json::json; +use test_log::test; /// This test is used to manually test the proof process. Operator can use this to test case to /// simplly test online service. @@ -19,7 +20,7 @@ use serde_json::json; /// RAIKO_TEST_MANUAL_PROVE_RAIKO_RPC_URL=https://rpc.raiko.xyz \ /// cargo test --test test_manual_prove -- --ignored /// ``` -#[tokio::test] +#[test(tokio::test)] #[ignore] pub async fn test_manual_prove() { let enabled = std::env::var("RAIKO_TEST_MANUAL_PROVE_ENABLED").unwrap_or_default() == "false"; @@ -38,6 +39,14 @@ pub async fn test_manual_prove() { let raiko_rpc_url = std::env::var("RAIKO_TEST_MANUAL_PROVE_RAIKO_RPC_URL").unwrap_or_default(); let client = Client::new(raiko_rpc_url.clone()); + + let json_guest_input = format!( + "make_prove_request_{}_{}_{}_{}.json", + network, + proof_type, + block_number, + std::time::Instant::now().elapsed().as_secs() + ); let request = ProofRequestOpt { block_number: Some(block_number), network: Some(network.clone()), @@ -52,10 +61,17 @@ pub async fn test_manual_prove() { prover: Some("0x70997970C51812dc3A010C7d01b50e0d17dc79C8".to_owned()), blob_proof_type: Some("proof_of_equivalence".to_string()), prover_args: ProverSpecificOpts { - native: None, + native: Some(json!({ + "json_guest_input": json_guest_input, + })), + risc0: Some(json!({ + "bonsai": false, // run locally + "snark": false, + "profile": false, + "execution_po2" : 20, // DEFAULT_SEGMENT_LIMIT_PO2 = 20 + })), sgx: None, sp1: None, - risc0: None, }, }; diff --git a/host/tests/test/prove_test.rs b/host/tests/test/prove_test.rs index 42da83735..02e0409da 100644 --- a/host/tests/test/prove_test.rs +++ b/host/tests/test/prove_test.rs @@ -5,12 +5,21 @@ use raiko_host::server::api; use raiko_lib::consts::Network; use raiko_lib::proof_type::ProofType; use raiko_tasks::TaskStatus; +use test_log::test; -#[tokio::test] -pub async fn test_v2_mainnet_native_prove() { +#[cfg(all(feature = "risc0", feature = "test-mock-guest"))] +#[test(tokio::test)] +async fn test_v2_mainnet_prove_risc0() { + test_v2_prove(Network::TaikoMainnet, ProofType::Risc0).await; +} + +#[test(tokio::test)] +async fn test_v2_mainnet_native_prove() { + test_v2_prove(Network::TaikoMainnet, ProofType::Native).await; +} + +async fn test_v2_prove(network: Network, proof_type: ProofType) { let api_version = "v2"; - let network = Network::TaikoMainnet; - let proof_type = ProofType::Native; let block_number = randomly_select_block(network) .await .expect("randomly select block failed"); diff --git a/provers/risc0/builder/src/main.rs b/provers/risc0/builder/src/main.rs index 523824f40..5c9b4b66d 100644 --- a/provers/risc0/builder/src/main.rs +++ b/provers/risc0/builder/src/main.rs @@ -6,7 +6,12 @@ use std::path::PathBuf; fn main() { let pipeline = Risc0Pipeline::new("provers/risc0/guest", "release"); pipeline.bins( - &["risc0-guest", "risc0-aggregation"], + &[ + "risc0-guest", + "risc0-aggregation", + "risc0-guest-mock", + "risc0-aggregation-mock", + ], "provers/risc0/driver/src/methods", ); #[cfg(feature = "test")] diff --git a/provers/risc0/driver/Cargo.toml b/provers/risc0/driver/Cargo.toml index 3274acce2..09689342d 100644 --- a/provers/risc0/driver/Cargo.toml +++ b/provers/risc0/driver/Cargo.toml @@ -69,3 +69,4 @@ cuda = ["risc0-zkvm?/cuda"] metal = ["risc0-zkvm?/metal"] bench = [] bonsai-auto-scaling = [] +test-mock-guest = [] diff --git a/provers/risc0/driver/src/bonsai.rs b/provers/risc0/driver/src/bonsai.rs index 11c85119b..9995f40cc 100644 --- a/provers/risc0/driver/src/bonsai.rs +++ b/provers/risc0/driver/src/bonsai.rs @@ -1,5 +1,5 @@ use crate::{ - methods::risc0_guest::RISC0_GUEST_ID, + methods::RISC0_GUEST_ID, snarks::{stark2snark, verify_groth16_from_snark_receipt}, Risc0Response, }; @@ -208,12 +208,15 @@ pub async fn maybe_prove (Default::default(), receipt, false), + Ok(receipt) => { + info!("end running local prover"); + (Default::default(), receipt, false) + } Err(e) => { warn!("Failed to prove locally: {e:?}"); - return Err(ProverError::GuestError( - "Failed to prove locally".to_string(), - )); + return Err(ProverError::GuestError(format!( + "Failed to prove locally: {e:?}" + ))); } } }; @@ -223,7 +226,11 @@ pub async fn maybe_prove