charms 13.0.0

Programmable assets on Bitcoin and beyond
Documentation
use super::block_on;
use sp1_sdk::{
    CpuProver, Elf, ExecutionReport, NetworkProver, ProveRequest, Prover, ProvingKey, SP1ProofMode,
    SP1ProofWithPublicValues, SP1ProvingKey, SP1Stdin, SP1VerifyingKey,
    network::FulfillmentStrategy,
};
use std::{future::IntoFuture, time::Duration};

pub trait CharmsSP1Prover: Send + Sync {
    fn setup(&self, elf: &[u8]) -> (SP1ProvingKey, SP1VerifyingKey);
    fn prove(
        &self,
        pk: &SP1ProvingKey,
        stdin: &SP1Stdin,
        kind: SP1ProofMode,
    ) -> anyhow::Result<(SP1ProofWithPublicValues, u64)>;
    fn execute(
        &self,
        elf: &[u8],
        stdin: &SP1Stdin,
    ) -> anyhow::Result<(sp1_sdk::SP1PublicValues, ExecutionReport)>;
}

impl CharmsSP1Prover for CpuProver {
    fn setup(&self, elf: &[u8]) -> (SP1ProvingKey, SP1VerifyingKey) {
        let pk: SP1ProvingKey =
            block_on(Prover::setup(self, Elf::from(elf)).into_future()).expect("setup failed");
        let vk = pk.verifying_key().clone();
        (pk, vk)
    }

    fn prove(
        &self,
        pk: &SP1ProvingKey,
        stdin: &SP1Stdin,
        kind: SP1ProofMode,
    ) -> anyhow::Result<(SP1ProofWithPublicValues, u64)> {
        let proof = block_on(
            Prover::prove(self, pk, stdin.clone())
                .mode(kind)
                .into_future(),
        )?;
        Ok((proof, 0))
    }

    fn execute(
        &self,
        elf: &[u8],
        stdin: &SP1Stdin,
    ) -> anyhow::Result<(sp1_sdk::SP1PublicValues, ExecutionReport)> {
        Ok(block_on(
            Prover::execute(self, Elf::from(elf), stdin.clone()).into_future(),
        )?)
    }
}

impl CharmsSP1Prover for NetworkProver {
    fn setup(&self, elf: &[u8]) -> (SP1ProvingKey, SP1VerifyingKey) {
        let pk: SP1ProvingKey =
            block_on(Prover::setup(self, Elf::from(elf)).into_future()).expect("setup failed");
        let vk = pk.verifying_key().clone();
        (pk, vk)
    }

    fn prove(
        &self,
        pk: &SP1ProvingKey,
        stdin: &SP1Stdin,
        kind: SP1ProofMode,
    ) -> anyhow::Result<(SP1ProofWithPublicValues, u64)> {
        let proof = block_on(
            Prover::prove(self, pk, stdin.clone())
                .mode(kind)
                .gas_limit(16_000_000_000)
                .cycle_limit(16_000_000_000)
                .max_price_per_pgu(1_000_000_000)
                .skip_simulation(true)
                .auction_timeout(Duration::from_secs(15))
                .strategy(FulfillmentStrategy::Auction)
                .into_future(),
        )?;
        Ok((proof, 0))
    }

    fn execute(
        &self,
        elf: &[u8],
        stdin: &SP1Stdin,
    ) -> anyhow::Result<(sp1_sdk::SP1PublicValues, ExecutionReport)> {
        Ok(block_on(
            Prover::execute(self, Elf::from(elf), stdin.clone()).into_future(),
        )?)
    }
}