1
use {anyhow::Result, tracing::info};
2

            
3
use risc0_zkvm::{sha::Digestible, Groth16ReceiptVerifierParameters};
4

            
5
use bonsol_interface::prover_version::ProverVersion;
6

            
7
3
pub fn verify_prover_version(required: ProverVersion) -> Result<()> {
8
3
    let actual_digest = Groth16ReceiptVerifierParameters::default().digest();
9
3
    let prover_digest = actual_digest.to_string();
10
3

            
11
3
    match required {
12
        ProverVersion::V1_0_1 {
13
2
            verifier_digest, ..
14
2
        } => {
15
2
            if verifier_digest != prover_digest {
16
2
                return Err(anyhow::anyhow!(
17
2
                    "Prover version mismatch, expected: {}, got: {}",
18
2
                    verifier_digest,
19
2
                    prover_digest
20
2
                ));
21
            }
22
            info!("Risc0 Prover with digest {}", verifier_digest);
23
        }
24
        ProverVersion::V1_2_1 {
25
1
            verifier_digest, ..
26
1
        } => {
27
1
            if verifier_digest != prover_digest {
28
                return Err(anyhow::anyhow!(
29
                    "Prover version mismatch, expected: {}, got: {}",
30
                    verifier_digest,
31
                    prover_digest
32
                ));
33
1
            }
34
1
            info!("Risc0 Prover with digest {}", verifier_digest);
35
        }
36
        _ => {
37
            return Err(anyhow::anyhow!("Unsupported prover version"));
38
        }
39
    }
40
1
    Ok(())
41
3
}
42

            
43
#[cfg(test)]
44
mod tests {
45
    use {super::*, bonsol_interface::prover_version::VERSION_V1_0_1};
46

            
47
    #[test]
48
1
    fn test_verify_old_prover_version_fail() {
49
1
        assert!(verify_prover_version(VERSION_V1_0_1).is_err());
50
1
    }
51

            
52
    #[test]
53
1
    fn test_verify_prover_version_fail() {
54
1
        let version_malade = ProverVersion::V1_0_1 {
55
1
            verifier_digest: "malade",
56
1
        };
57
1
        let result = verify_prover_version(version_malade);
58
1
        assert!(result.is_err());
59
1
    }
60

            
61
    #[test]
62
1
    fn test_verify_default_prover_version_is_supported() {
63
1
        let result = verify_prover_version(ProverVersion::default());
64
1
        assert!(result.is_ok());
65
1
    }
66
}