Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Risc0 CUDA support #1380

Closed
wants to merge 11 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 121 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion bin/citrea/Cargo.toml
Original file line number Diff line number Diff line change
@@ -92,7 +92,7 @@ citrea-e2e = { git = "https://github.com/chainwayxyz/citrea-e2e", rev = "0a6492e

[features]
default = [] # Deviate from convention by making the "native" feature active by default. This aligns with how this package is meant to be used (as a binary first, library second).

cuda = ["citrea-risc0-bonsai-adapter/cuda"]
bench = ["hex"] # "sov-risc0-adapter/bench", "risc0/bench"]

[[bin]]
1 change: 1 addition & 0 deletions crates/risc0-bonsai/Cargo.toml
Original file line number Diff line number Diff line change
@@ -36,3 +36,4 @@ native = [
"sov-rollup-interface/native",
]
bench = ["native"]
cuda = ["risc0-zkvm/cuda"]
42 changes: 31 additions & 11 deletions crates/risc0-bonsai/src/host.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
//! This module implements the [`ZkvmHost`] trait for the RISC0 VM.
use core::str;
use std::thread;
use std::time::Duration;

@@ -9,11 +10,11 @@ use bonsai_sdk::blocking::Client;
use borsh::{BorshDeserialize, BorshSerialize};
use risc0_zkvm::sha::Digest;
use risc0_zkvm::{
compute_image_id, ExecutorEnvBuilder, ExecutorImpl, Journal, LocalProver, Prover, Receipt,
compute_image_id, ExecutorEnvBuilder, ExecutorImpl, ExternalProver, Journal, Prover,
ProverOpts, Receipt,
};
use sov_db::ledger_db::{LedgerDB, ProvingServiceLedgerOps};
use sov_risc0_adapter::guest::Risc0Guest;
use sov_risc0_adapter::host::add_benchmarking_callbacks;
use sov_rollup_interface::zk::{Proof, Zkvm, ZkvmHost};
use tracing::{error, info, warn};

@@ -299,35 +300,54 @@ impl<'a> ZkvmHost for Risc0BonsaiHost<'a> {
let proof = match (self.client.as_ref(), with_proof) {
// Local execution. If mode is Execute, we always do local execution.
(_, false) => {
let env = add_benchmarking_callbacks(ExecutorEnvBuilder::default())
let env = ExecutorEnvBuilder::default()
.write_slice(&self.env)
.build()
.unwrap();
.expect("Proving environment should be built");
let mut executor = ExecutorImpl::from_elf(env, self.elf)?;

let session = executor.run()?;

tracing::info!(
"Local execution completed.\nProving stats:\nSegments: {}\nTotal Cycles: {}\nUser Cycles: {}",
session.segments.len(),
session.total_cycles,
session.user_cycles
);
let data =
bincode::serialize(&session.journal.expect("Journal shouldn't be empty"))?;

Ok(Proof::PublicInput(data))
}
// Local proving
(None, true) => {
let env = add_benchmarking_callbacks(ExecutorEnvBuilder::default())
let env = ExecutorEnvBuilder::default()
.segment_limit_po2(21)
.write_slice(&self.env)
.build()
.unwrap();
.expect("Proving environment should be built");

let prover = LocalProver::new("citrea");
let receipt = prover.prove(env, self.elf)?.receipt;
// RISC0_SERVER_PATH is used to specify the path to the r0vm binary
// As per https://github.com/chainwayxyz/citrea/issues/1381, it's a good idea to
// start using ric0 env var names
let prover = ExternalProver::new("citrea", std::env::var("RISC0_SERVER_PATH")?);

let start = std::time::Instant::now();
let proving_session =
prover.prove_with_opts(env, self.elf, &ProverOpts::groth16())?;
let end = std::time::Instant::now();

tracing::info!("Local proving completed");

receipt.verify(self.image_id)?;
proving_session.receipt.verify(self.image_id)?;

tracing::info!("Verified the receipt");
tracing::info!(
"Proving stats:\n{:?}\nTime: {}",
proving_session.stats,
(end - start).as_secs_f64()
);

let serialized_receipt = bincode::serialize(&receipt)?;
let serialized_receipt = bincode::serialize(&proving_session.receipt)?;

Ok(Proof::Full(serialized_receipt))
}
24 changes: 0 additions & 24 deletions crates/sovereign-sdk/adapters/risc0/src/host.rs

This file was deleted.

3 changes: 0 additions & 3 deletions crates/sovereign-sdk/adapters/risc0/src/lib.rs
Original file line number Diff line number Diff line change
@@ -8,9 +8,6 @@ use serde::{Deserialize, Serialize};
use sov_rollup_interface::zk::Matches;

pub mod guest;
#[cfg(feature = "native")]
pub mod host;

#[cfg(feature = "bench")]
pub mod metrics;