Skip to main content

data_anchor_dawn_sla_verifier/
lib.rs

1#![allow(unexpected_cfgs)]
2// Allow unexpected_cfgs because anchor macros add cfgs which are not in the original code
3
4use anchor_lang::prelude::*;
5use data_anchor_blober::{
6    checkpoint::{Checkpoint, CheckpointConfig},
7    state::blober::Blober,
8};
9
10declare_id!("6tTBF2LExPXRHcAzLRsh99wancTHs2NvxY7GZED3uqXu");
11
12#[program]
13pub mod data_anchor_dawn_sla_verifier {
14
15    use super::*;
16
17    pub fn verify(
18        ctx: Context<Verify>,
19        proof: [u8; data_anchor_blober::GROTH16_PROOF_SIZE],
20        public_values: Vec<u8>,
21        verification_key: String,
22        slot: u64,
23    ) -> Result<()> {
24        let checkpoint = Checkpoint::new(proof, public_values, verification_key, slot)?;
25
26        #[cfg(feature = "sp1")]
27        checkpoint.verify_zk_proof()?;
28
29        let sla_bytes = checkpoint
30            .non_base_commitments()
31            .ok_or_else(|| error!(DawnSlaError::NoSlaCommitmentsFound))?;
32
33        let sla_score: f64 = bincode::deserialize(sla_bytes)
34            .map_err(|_| error!(DawnSlaError::InvalidSlaScoreFormat))?;
35
36        require_gte!(sla_score, 0.0, DawnSlaError::InvalidScore);
37
38        checkpoint.cpi_create_checkpoint(
39            ctx.accounts.blober.key(),
40            ctx.accounts.data_anchor.to_account_info(),
41            ctx.accounts.into(),
42            &[ctx.bumps.pda_signer],
43        )
44    }
45}
46
47#[derive(Accounts)]
48pub struct Verify<'info> {
49    #[account(
50        mut,
51        seeds = [
52            data_anchor_blober::SEED,
53            data_anchor_blober::CHECKPOINT_SEED,
54            blober.key().as_ref(),
55        ],
56        seeds::program = data_anchor_blober::ID,
57        bump
58    )]
59    pub checkpoint: Account<'info, Checkpoint>,
60
61    #[account(
62        seeds = [
63            data_anchor_blober::SEED,
64            data_anchor_blober::CHECKPOINT_SEED,
65            data_anchor_blober::CHECKPOINT_CONFIG_SEED,
66            blober.key().as_ref(),
67        ],
68        seeds::program = data_anchor_blober::ID,
69        bump
70    )]
71    pub checkpoint_config: Account<'info, CheckpointConfig>,
72
73    pub blober: Account<'info, Blober>,
74
75    #[account(
76        mut,
77        seeds = [
78            data_anchor_blober::SEED,
79            data_anchor_blober::CHECKPOINT_SEED,
80            data_anchor_blober::CHECKPOINT_PDA_SIGNER_SEED,
81            blober.key().as_ref(),
82        ],
83        bump
84    )]
85    pub pda_signer: SystemAccount<'info>,
86
87    #[account(mut)]
88    pub payer: Signer<'info>,
89
90    pub data_anchor: Program<'info, data_anchor_blober::program::Blober>,
91
92    pub system_program: Program<'info, System>,
93}
94
95impl<'info> From<&mut Verify<'info>>
96    for data_anchor_blober::cpi::accounts::CreateCheckpoint<'info>
97{
98    fn from(verify: &mut Verify<'info>) -> Self {
99        data_anchor_blober::cpi::accounts::CreateCheckpoint {
100            checkpoint: verify.checkpoint.to_account_info(),
101            checkpoint_config: verify.checkpoint_config.to_account_info(),
102            pda_signer: verify.pda_signer.to_account_info(),
103            payer: verify.payer.to_account_info(),
104            system_program: verify.system_program.to_account_info(),
105        }
106    }
107}
108
109#[error_code]
110pub enum DawnSlaError {
111    #[msg("No SLA commitments found in public values")]
112    NoSlaCommitmentsFound,
113    #[msg("Invalid SLA score format")]
114    InvalidSlaScoreFormat,
115    #[msg("Invalid SLA score, must be greater than or equal to 0")]
116    InvalidScore,
117}