diff --git a/core/src/lib.rs b/core/src/lib.rs index 54d51410c..7ded46377 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,4 +1,9 @@ -use alloy_primitives::{Address, FixedBytes}; +use crate::{ + interfaces::{ProofRequest, RaikoError, RaikoResult}, + preflight::preflight, + provider::BlockDataProvider, +}; +use alloy_primitives::{Address, B256}; use alloy_rpc_types::EIP1186AccountProofResponse; use raiko_lib::{ builder::{BlockBuilderStrategy, TaikoStrategy}, @@ -9,7 +14,7 @@ use raiko_lib::{ utils::HeaderHasher, }; use serde_json::Value; -use std::collections::HashMap; +use std::{collections::HashMap, hint::black_box}; use tracing::{debug, error, info, warn}; pub mod interfaces; @@ -17,12 +22,6 @@ pub mod preflight; pub mod prover; pub mod provider; -use crate::{ - interfaces::{ProofRequest, RaikoError, RaikoResult}, - preflight::preflight, - provider::BlockDataProvider, -}; - pub type MerkleProof = HashMap; pub struct Raiko { @@ -51,8 +50,8 @@ impl Raiko { preflight( provider, self.request.block_number, - self.l1_chain_spec.clone(), - self.taiko_chain_spec.clone(), + self.l1_chain_spec.to_owned(), + self.taiko_chain_spec.to_owned(), TaikoProverData { graffiti: self.request.graffiti, prover: self.request.prover, @@ -111,19 +110,15 @@ impl Raiko { &header.parent_beacon_block_root, "parent_beacon_block_root", ); - check_eq( - &exp.extra_data.clone(), - &header.extra_data.clone(), - "extra_data", - ); + check_eq(&exp.extra_data, &header.extra_data, "extra_data"); // Make sure the blockhash from the node matches the one from the builder - assert_eq!( - Into::>::into(header.hash().0), - input.block_hash_reference, - "block hash unexpected for block {}", - input.block_number, - ); + require_eq( + &B256::from(header.hash().0), + &input.block_hash_reference, + "block hash unexpected", + )?; + let output = GuestOutput::Success { header, hash: pi }; Ok(output) @@ -138,21 +133,32 @@ impl Raiko { } pub async fn prove(&self, input: GuestInput, output: &GuestOutput) -> RaikoResult { + let data = serde_json::to_value(&self.request)?; self.request .proof_type - .run_prover( - input.clone(), - output, - &serde_json::to_value(self.request.clone())?, - ) + .run_prover(input, output, &data) .await } } fn check_eq(expected: &T, actual: &T, message: &str) { + // printing out error, if any, but ignoring the result + // making sure it's not optimized out + let _ = black_box(require_eq(expected, actual, message)); +} + +fn require_eq( + expected: &T, + actual: &T, + message: &str, +) -> RaikoResult<()> { if expected != actual { - error!("Assertion failed: {message} - Expected: {expected:?}, Found: {actual:?}"); + let msg = + format!("Assertion failed: {message} - Expected: {expected:?}, Found: {actual:?}",); + error!("{}", msg); + return Err(anyhow::Error::msg(msg).into()); } + Ok(()) } /// Merges two json's together, overwriting `a` with the values of `b` @@ -160,10 +166,10 @@ pub fn merge(a: &mut Value, b: &Value) { match (a, b) { (Value::Object(a), Value::Object(b)) => { for (k, v) in b { - merge(a.entry(k.clone()).or_insert(Value::Null), v); + merge(a.entry(k).or_insert(Value::Null), v); } } - (a, b) if !b.is_null() => *a = b.clone(), + (a, b) if !b.is_null() => *a = b.to_owned(), // If b is null, just keep a (which means do nothing). _ => {} } @@ -230,12 +236,13 @@ mod tests { let provider = RpcBlockDataProvider::new(&taiko_chain_spec.rpc, proof_request.block_number - 1) .expect("Could not create RpcBlockDataProvider"); - let raiko = Raiko::new(l1_chain_spec, taiko_chain_spec, proof_request.clone()); + let proof_type = proof_request.proof_type.to_owned(); + let raiko = Raiko::new(l1_chain_spec, taiko_chain_spec, proof_request); let mut input = raiko .generate_input(provider) .await .expect("input generation failed"); - if is_ci() && proof_request.proof_type == ProofType::Sp1 { + if is_ci() && proof_type == ProofType::Sp1 { input.taiko.skip_verify_blob = true; } let output = raiko.get_output(&input).expect("output generation failed"); diff --git a/provers/risc0/guest/Cargo.lock b/provers/risc0/guest/Cargo.lock index 6e93e10cc..07ab5ec72 100644 --- a/provers/risc0/guest/Cargo.lock +++ b/provers/risc0/guest/Cargo.lock @@ -1736,6 +1736,7 @@ dependencies = [ "sha3", "thiserror", "thiserror-no-std", + "tracing", "url", ] diff --git a/provers/sp1/guest/elf/bn254-add b/provers/sp1/guest/elf/bn254-add index cdf078e91..618c32738 100755 Binary files a/provers/sp1/guest/elf/bn254-add and b/provers/sp1/guest/elf/bn254-add differ diff --git a/provers/sp1/guest/elf/bn254-mul b/provers/sp1/guest/elf/bn254-mul index f19295aa3..2e70042ff 100755 Binary files a/provers/sp1/guest/elf/bn254-mul and b/provers/sp1/guest/elf/bn254-mul differ diff --git a/provers/sp1/guest/elf/ecdsa b/provers/sp1/guest/elf/ecdsa index 542134874..c3aacde27 100755 Binary files a/provers/sp1/guest/elf/ecdsa and b/provers/sp1/guest/elf/ecdsa differ diff --git a/provers/sp1/guest/elf/sha256 b/provers/sp1/guest/elf/sha256 index 43d67ff8a..c60b6702b 100755 Binary files a/provers/sp1/guest/elf/sha256 and b/provers/sp1/guest/elf/sha256 differ diff --git a/provers/sp1/guest/elf/sp1-guest b/provers/sp1/guest/elf/sp1-guest index ff0ae0381..611a80bd6 100755 Binary files a/provers/sp1/guest/elf/sp1-guest and b/provers/sp1/guest/elf/sp1-guest differ diff --git a/provers/sp1/guest/elf/test-sp1-guest b/provers/sp1/guest/elf/test-sp1-guest index 0d3c328b6..9f9cc645e 100755 Binary files a/provers/sp1/guest/elf/test-sp1-guest and b/provers/sp1/guest/elf/test-sp1-guest differ diff --git a/provers/sp1/guest/src/zk_op.rs b/provers/sp1/guest/src/zk_op.rs index 70dcfcf36..2a55859a9 100644 --- a/provers/sp1/guest/src/zk_op.rs +++ b/provers/sp1/guest/src/zk_op.rs @@ -27,7 +27,9 @@ impl ZkvmOperator for Sp1Operator { .map(|chunk| u32::from_le_bytes(chunk.try_into().unwrap())) .collect::>() .try_into() - .map_err(|e| Error::ZkvmOperation("Input point processing failed".to_string()))?; + .map_err(|e| { + Error::ZkvmOperation(format!("Input point processing failed. Details: {:?}", e)) + })?; p.mul_assign(&k); Ok(point_to_be_bytes(p)) @@ -98,7 +100,6 @@ fn point_to_be_bytes(p: AffinePoint) -> [u8; 64] { ([x, y]).concat().try_into().unwrap() } - harness::zk_suits!( pub mod tests { use revm_precompile::bn128;