From 69306ea116676701c8281d0c84da2997a5efa111 Mon Sep 17 00:00:00 2001 From: Rootul Patel Date: Mon, 3 Feb 2025 23:22:03 -0500 Subject: [PATCH] make mock runnable --- provers/blevm/Cargo.lock | 10 +++++ provers/blevm/blevm-mock/Cargo.toml | 9 +++++ provers/blevm/blevm-mock/src/main.rs | 60 ++++++++++++++++++++-------- provers/blevm/blevm/src/main.rs | 3 +- provers/blevm/common/src/lib.rs | 2 +- provers/blevm/script/Cargo.toml | 4 +- provers/blevm/script/src/bin/main.rs | 5 ++- 7 files changed, 73 insertions(+), 20 deletions(-) diff --git a/provers/blevm/Cargo.lock b/provers/blevm/Cargo.lock index e44876f..6e570f9 100644 --- a/provers/blevm/Cargo.lock +++ b/provers/blevm/Cargo.lock @@ -1167,8 +1167,17 @@ dependencies = [ name = "blevm-mock" version = "0.1.0" dependencies = [ + "alloy-sol-types 0.7.7", + "bincode", "blevm-common", + "celestia-types", + "hex", + "nmt-rs", + "reth-primitives", + "rsp-client-executor", "sp1-zkvm", + "tendermint", + "tendermint-proto", ] [[package]] @@ -1198,6 +1207,7 @@ version = "0.1.0" dependencies = [ "alloy-sol-types 0.7.7", "bincode", + "blevm-common", "blevm-prover", "celestia-rpc", "celestia-types", diff --git a/provers/blevm/blevm-mock/Cargo.toml b/provers/blevm/blevm-mock/Cargo.toml index 0b1ca7f..567f1a6 100644 --- a/provers/blevm/blevm-mock/Cargo.toml +++ b/provers/blevm/blevm-mock/Cargo.toml @@ -6,3 +6,12 @@ edition = "2021" [dependencies] sp1-zkvm = { workspace = true } blevm-common = { path = "../common" } +alloy-sol-types = { workspace = true } +rsp-client-executor = {workspace=true} +celestia-types = {workspace=true} +nmt-rs = "*" +reth-primitives = {workspace=true} +tendermint = {workspace=true} +tendermint-proto = {workspace=true} +bincode = {workspace=true} +hex = "0.4.3" diff --git a/provers/blevm/blevm-mock/src/main.rs b/provers/blevm/blevm-mock/src/main.rs index f9aa5ea..2d4b821 100644 --- a/provers/blevm/blevm-mock/src/main.rs +++ b/provers/blevm/blevm-mock/src/main.rs @@ -5,27 +5,55 @@ sp1_zkvm::entrypoint!(main); use blevm_common::BlevmOutput; +use celestia_types::nmt::{NamespaceProof, NamespacedHashExt}; +use celestia_types::{nmt::Namespace, AppVersion, Blob}; +use nmt_rs::simple_merkle::tree::MerkleHash; +use nmt_rs::{simple_merkle::proof::Proof, NamespacedHash, TmSha2Hasher}; +use rsp_client_executor::{io::ClientExecutorInput, ClientExecutor, EthereumVariant}; +use tendermint::Hash as TmHash; +use tendermint_proto::Protobuf; pub fn main() { - let blob_commitment = sp1_zkvm::io::read::>(); - let header_hash = sp1_zkvm::io::read::>(); - let prev_header_hash = sp1_zkvm::io::read::>(); - let height = sp1_zkvm::io::read::(); - let gas_used = sp1_zkvm::io::read::(); - let beneficiary = sp1_zkvm::io::read::>(); - let state_root = sp1_zkvm::io::read::>(); + // Read all the input values. + let input: ClientExecutorInput = sp1_zkvm::io::read(); + let namespace: Namespace = sp1_zkvm::io::read(); let celestia_header_hash = sp1_zkvm::io::read::>(); + let data_hash_bytes: Vec = sp1_zkvm::io::read_vec(); + let data_hash_proof: Proof = sp1_zkvm::io::read(); + let row_root_multiproof: Proof = sp1_zkvm::io::read(); + let nmt_multiproofs: Vec = sp1_zkvm::io::read(); + let row_roots: Vec> = sp1_zkvm::io::read(); + // since this is a mock proof, we can hard-code all the output values to be the same as a valid + // execution of blevm. let output = BlevmOutput { - blob_commitment: blob_commitment.try_into().unwrap(), - header_hash: header_hash.try_into().unwrap(), - prev_header_hash: prev_header_hash.try_into().unwrap(), - height, - gas_used, - beneficiary: beneficiary.try_into().unwrap(), - state_root: state_root.try_into().unwrap(), - celestia_header_hash: celestia_header_hash.try_into().unwrap(), + blob_commitment: [ + 196, 0, 0, 0, 0, 0, 0, 0, 121, 70, 207, 82, 142, 221, 116, 94, 251, 37, 32, 18, 70, + 230, 71, 213, 170, 202, 63, 181, 43, 240, 246, 6, + ], + header_hash: [ + 182, 149, 180, 171, 11, 211, 63, 76, 133, 106, 134, 184, 20, 76, 104, 254, 40, 136, 41, + 140, 238, 199, 193, 86, 163, 56, 170, 193, 61, 146, 213, 227, + ], + prev_header_hash: [ + 194, 70, 12, 164, 151, 147, 237, 105, 187, 154, 187, 153, 78, 140, 25, 59, 84, 254, + 152, 25, 224, 239, 83, 45, 145, 73, 226, 110, 100, 51, 95, 167, + ], + height: 14900876081506838043, + gas_used: 18884864, + beneficiary: [ + 4, 26, 65, 0, 0, 0, 0, 0, 149, 34, 34, 144, 221, 114, 120, 170, 61, 221, 56, 156, + ], + state_root: [ + 193, 225, 209, 101, 204, 75, 175, 229, 27, 56, 213, 58, 25, 68, 72, 76, 140, 126, 48, + 23, 127, 212, 219, 222, 63, 98, 45, 102, 165, 88, 255, 220, + ], + celestia_header_hash: [ + 120, 107, 54, 46, 182, 50, 89, 93, 115, 224, 125, 214, 72, 215, 109, 67, 90, 48, 217, + 144, 215, 85, 206, 228, 192, 183, 123, 79, 244, 136, 195, 212, + ], }; - sp1_zkvm::io::commit(&output); + let serialized_output = bincode::serialize(&output).unwrap(); + sp1_zkvm::io::commit(&serialized_output); } diff --git a/provers/blevm/blevm/src/main.rs b/provers/blevm/blevm/src/main.rs index 052887c..b29a74d 100644 --- a/provers/blevm/blevm/src/main.rs +++ b/provers/blevm/blevm/src/main.rs @@ -110,7 +110,8 @@ pub fn main() { state_root: header.state_root.into(), celestia_header_hash: celestia_header_hash.as_bytes().try_into().unwrap(), }; - sp1_zkvm::io::commit(&output); + let serialized_output = bincode::serialize(&output).unwrap(); + sp1_zkvm::io::commit(&serialized_output); println!( "cycle-tracker-end: hashing the block header, and commiting its fields as public values" diff --git a/provers/blevm/common/src/lib.rs b/provers/blevm/common/src/lib.rs index e132e8d..03654c6 100644 --- a/provers/blevm/common/src/lib.rs +++ b/provers/blevm/common/src/lib.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] pub struct BlevmOutput { pub blob_commitment: [u8; 32], pub header_hash: [u8; 32], diff --git a/provers/blevm/script/Cargo.toml b/provers/blevm/script/Cargo.toml index d2b865d..ef446be 100644 --- a/provers/blevm/script/Cargo.toml +++ b/provers/blevm/script/Cargo.toml @@ -25,9 +25,11 @@ bincode = { workspace = true } rsp-client-executor = { workspace = true } nmt-rs = { workspace = true } tokio = { version = "1", features = ["full"] } -blevm-prover = { path = "../blevm-prover" } dotenv = "0.15.0" +blevm-prover = { path = "../blevm-prover" } +blevm-common = {path = "../common"} + [build-dependencies] sp1-helper = { workspace = true } sp1-build = { workspace = true } diff --git a/provers/blevm/script/src/bin/main.rs b/provers/blevm/script/src/bin/main.rs index 9b5a3b0..2fce32e 100644 --- a/provers/blevm/script/src/bin/main.rs +++ b/provers/blevm/script/src/bin/main.rs @@ -12,6 +12,7 @@ //! ```shell //! RUST_LOG=info cargo run --release -- --prove --mock //! ``` +use blevm_common::BlevmOutput; use blevm_prover::{BlockProver, BlockProverInput, CelestiaClient, CelestiaConfig, ProverConfig}; use celestia_types::nmt::Namespace; use clap::Parser; @@ -84,7 +85,9 @@ async fn main() -> Result<(), Box> { println!("Executing..."); let (public_values, execution_report) = prover.execute(input).await?; println!("Program executed successfully."); - println!("Public values: {:?}", public_values); + + let output: BlevmOutput = bincode::deserialize(public_values.as_slice()).unwrap(); + println!("{:?}", output); println!( "Number of cycles: {}", execution_report.total_instruction_count()