use core::fmt::Debug;
use borsh::{BorshDeserialize, BorshSerialize};
use digest::Digest;
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use crate::da::DaSpec;
use crate::RollupAddress;
pub trait ZkvmHost: Zkvm {
type Guest: ZkvmGuest;
fn add_hint<T: Serialize>(&self, item: T);
fn simulate_with_hints(&mut self) -> Self::Guest;
fn run(&mut self, with_proof: bool) -> Result<(), anyhow::Error>;
}
pub trait Zkvm {
type CodeCommitment: Matches<Self::CodeCommitment>
+ Clone
+ Debug
+ Serialize
+ DeserializeOwned;
type Error: Debug + From<std::io::Error>;
fn verify<'a>(
serialized_proof: &'a [u8],
code_commitment: &Self::CodeCommitment,
) -> Result<&'a [u8], Self::Error>;
fn verify_and_extract_output<
Add: RollupAddress,
Da: DaSpec,
Root: Serialize + DeserializeOwned,
>(
serialized_proof: &[u8],
code_commitment: &Self::CodeCommitment,
) -> Result<StateTransition<Da, Add, Root>, Self::Error>;
}
pub trait ZkvmGuest: Zkvm + Send {
fn read_from_host<T: DeserializeOwned>(&self) -> T;
fn commit<T: Serialize>(&self, item: &T);
}
pub trait ValidityCondition:
Serialize
+ DeserializeOwned
+ BorshDeserialize
+ BorshSerialize
+ Debug
+ Clone
+ Copy
+ PartialEq
+ Send
+ Sync
+ Eq
{
type Error: Into<anyhow::Error>;
fn combine<H: Digest>(&self, rhs: Self) -> Result<Self, Self::Error>;
}
#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize, BorshDeserialize, PartialEq, Eq)]
pub struct StateTransition<Da: DaSpec, Address, Root> {
pub initial_state_root: Root,
pub final_state_root: Root,
pub slot_hash: Da::SlotHash,
pub rewarded_address: Address,
pub validity_condition: Da::ValidityCondition,
}
pub trait ValidityConditionChecker<Condition: ValidityCondition>:
BorshDeserialize + BorshSerialize + Debug
{
type Error: Into<anyhow::Error>;
fn check(&mut self, condition: &Condition) -> Result<(), Self::Error>;
}
pub trait Matches<T> {
fn matches(&self, other: &T) -> bool;
}