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
use crate::{
algorithms::{CommitmentScheme, EncryptionScheme, SignatureScheme, CRH, PRF},
curves::PrimeField,
gadgets::algorithms::{
CRHGadget,
CommitmentGadget,
EncryptionGadget,
PRFGadget,
SignaturePublicKeyRandomizationGadget,
},
};
pub trait DPCComponents: 'static + Sized {
const NUM_INPUT_RECORDS: usize;
const NUM_OUTPUT_RECORDS: usize;
type InnerField: PrimeField;
type OuterField: PrimeField;
type AccountEncryption: EncryptionScheme;
type AccountEncryptionGadget: EncryptionGadget<Self::AccountEncryption, Self::InnerField>;
type AccountCommitment: CommitmentScheme;
type AccountCommitmentGadget: CommitmentGadget<Self::AccountCommitment, Self::InnerField>;
type AccountSignature: SignatureScheme;
type AccountSignatureGadget: SignaturePublicKeyRandomizationGadget<Self::AccountSignature, Self::InnerField>;
type EncryptedRecordCRH: CRH;
type EncryptedRecordCRHGadget: CRHGadget<Self::EncryptedRecordCRH, Self::InnerField>;
type InnerSNARKVerificationKeyCRH: CRH;
type InnerSNARKVerificationKeyCRHGadget: CRHGadget<Self::InnerSNARKVerificationKeyCRH, Self::OuterField>;
type LocalDataCRH: CRH;
type LocalDataCRHGadget: CRHGadget<Self::LocalDataCRH, Self::InnerField>;
type LocalDataCommitment: CommitmentScheme;
type LocalDataCommitmentGadget: CommitmentGadget<Self::LocalDataCommitment, Self::InnerField>;
type ProgramVerificationKeyCRH: CRH;
type ProgramVerificationKeyCRHGadget: CRHGadget<Self::ProgramVerificationKeyCRH, Self::OuterField>;
type ProgramVerificationKeyCommitment: CommitmentScheme;
type ProgramVerificationKeyCommitmentGadget: CommitmentGadget<
Self::ProgramVerificationKeyCommitment,
Self::InnerField,
> + CommitmentGadget<Self::ProgramVerificationKeyCommitment, Self::OuterField>;
type PRF: PRF;
type PRFGadget: PRFGadget<Self::PRF, Self::InnerField>;
type RecordCommitment: CommitmentScheme;
type RecordCommitmentGadget: CommitmentGadget<Self::RecordCommitment, Self::InnerField>;
type SerialNumberNonceCRH: CRH;
type SerialNumberNonceCRHGadget: CRHGadget<Self::SerialNumberNonceCRH, Self::InnerField>;
}