forked from yetanotherco/aligned_layer
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmod.rs
More file actions
91 lines (87 loc) · 3.57 KB
/
mod.rs
File metadata and controls
91 lines (87 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use crate::halo2::ipa::verify_halo2_ipa;
use crate::halo2::kzg::verify_halo2_kzg;
use crate::risc_zero::verify_risc_zero_proof;
use crate::sp1::verify_sp1_proof;
use crate::{gnark::verify_gnark, mina::verify_protocol_state_proof_integrity};
use aligned_batcher_lib::types::{ProvingSystemId, VerificationData};
use log::{debug, warn};
pub(crate) fn verify(verification_data: &VerificationData) -> bool {
match verification_data.proving_system {
ProvingSystemId::SP1 => {
if let Some(elf) = &verification_data.vm_program_code {
return verify_sp1_proof(verification_data.proof.as_slice(), elf.as_slice());
}
warn!("Trying to verify SP1 proof but ELF was not provided. Returning false");
false
}
ProvingSystemId::Halo2KZG => {
let vk = verification_data
.verification_key
.as_ref()
.expect("Verification key is required");
let pub_input = verification_data
.pub_input
.as_ref()
.expect("Public input is required");
let is_valid = verify_halo2_kzg(&verification_data.proof, pub_input, vk);
debug!("Halo2-KZG proof is valid: {}", is_valid);
is_valid
}
ProvingSystemId::Halo2IPA => {
let vk = verification_data
.verification_key
.as_ref()
.expect("Verification key is required");
let pub_input = verification_data
.pub_input
.as_ref()
.expect("Public input is required");
let is_valid = verify_halo2_ipa(&verification_data.proof, pub_input, vk);
debug!("Halo2-IPA proof is valid: {}", is_valid);
is_valid
}
ProvingSystemId::Risc0 => {
if let Some(image_id_slice) = &verification_data.vm_program_code {
let mut image_id = [0u8; 32];
image_id.copy_from_slice(image_id_slice.as_slice());
return verify_risc_zero_proof(verification_data.proof.as_slice(), &image_id);
}
warn!("Trying to verify Risc0 proof but image ID was not provided. Returning false");
false
}
ProvingSystemId::GnarkPlonkBls12_381
| ProvingSystemId::GnarkPlonkBn254
| ProvingSystemId::Groth16Bn254 => {
let vk = verification_data
.verification_key
.as_ref()
.expect("Verification key is required");
let pub_input = verification_data
.pub_input
.as_ref()
.expect("Public input is required");
let is_valid = verify_gnark(
&verification_data.proving_system,
&verification_data.proof,
pub_input,
vk,
);
debug!("Gnark proof is valid: {}", is_valid);
is_valid
}
ProvingSystemId::Mina => {
let pub_input = verification_data
.pub_input
.as_ref()
.expect("Public input is required");
verify_protocol_state_proof_integrity(&verification_data.proof, pub_input)
// TODO(xqft): add Pickles aggregator checks which are run alongside the Kimchi
// verifier. These checks are fast and if they aren't successful then the Pickles proof
// isn't valid.
}
ProvingSystemId::Kimchi => {
// TODO(gabrielbosio): add Kimchi checks
true
}
}
}