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>;
}