data_anchor_dawn_sla_verifier/
lib.rs1#![allow(unexpected_cfgs)]
2use 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}