pub trait SignatureSchemeOperations {
type AffineCurve: Clone + Debug + Default + ToBytes + FromBytes + Hash + Eq + Send + Sync;
type BaseField: Clone + Debug + Default + ToBytes + FromBytes + PartialEq + Eq;
type ScalarField: Clone + Debug + Default + ToBytes + FromBytes + PartialEq + Eq;
type Signature: Clone + Debug + Default + ToBytes + FromBytes + PartialEq + Eq;
fn pk_sig(signature: &Self::Signature) -> Result<Self::AffineCurve>;
fn pr_sig(signature: &Self::Signature) -> Result<Self::AffineCurve>;
fn g_scalar_multiply(&self, scalar: &Self::ScalarField) -> Self::AffineCurve;
fn hash_to_scalar_field(
&self,
input: &[Self::BaseField]
) -> Self::ScalarField;
}