1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00
ZoKrates/zokrates_common/src/helpers.rs
2022-07-06 15:09:14 +02:00

158 lines
5.2 KiB
Rust

use crate::constants::*;
use std::convert::TryFrom;
#[derive(Debug, PartialEq, Eq)]
pub enum CurveParameter {
Bn128,
Bls12_381,
Bls12_377,
Bw6_761,
}
impl std::fmt::Display for CurveParameter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use CurveParameter::*;
match self {
Bn128 => write!(f, "bn128"),
Bls12_381 => write!(f, "bls12_381"),
Bls12_377 => write!(f, "bls12_377"),
Bw6_761 => write!(f, "bw6_761"),
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum BackendParameter {
#[cfg(feature = "bellman")]
Bellman,
#[cfg(feature = "ark")]
Ark,
}
impl std::fmt::Display for BackendParameter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use BackendParameter::*;
match self {
#[cfg(feature = "bellman")]
Bellman => write!(f, "bellman"),
#[cfg(feature = "ark")]
Ark => write!(f, "ark"),
}
}
}
#[allow(clippy::upper_case_acronyms)]
#[derive(Debug, PartialEq, Eq)]
pub enum SchemeParameter {
G16,
GM17,
MARLIN,
}
impl std::fmt::Display for SchemeParameter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use SchemeParameter::*;
match self {
G16 => write!(f, "g16"),
GM17 => write!(f, "gm17"),
MARLIN => write!(f, "marlin"),
}
}
}
impl TryFrom<&str> for CurveParameter {
type Error = String;
fn try_from(s: &str) -> Result<Self, Self::Error> {
match s {
BN128 => Ok(CurveParameter::Bn128),
BLS12_381 => Ok(CurveParameter::Bls12_381),
BLS12_377 => Ok(CurveParameter::Bls12_377),
BW6_761 => Ok(CurveParameter::Bw6_761),
_ => Err(format!("Unknown curve {}", s)),
}
}
}
impl TryFrom<&str> for BackendParameter {
type Error = String;
fn try_from(s: &str) -> Result<Self, Self::Error> {
match s {
#[cfg(feature = "bellman")]
BELLMAN => Ok(BackendParameter::Bellman),
#[cfg(feature = "ark")]
ARK => Ok(BackendParameter::Ark),
_ => Err(format!("Unknown backend {}", s)),
}
}
}
impl TryFrom<&str> for SchemeParameter {
type Error = String;
fn try_from(s: &str) -> Result<Self, Self::Error> {
match s {
G16 => Ok(SchemeParameter::G16),
GM17 => Ok(SchemeParameter::GM17),
MARLIN => Ok(SchemeParameter::MARLIN),
_ => Err(format!("Unknown proving scheme {}", s)),
}
}
}
#[derive(Debug)]
pub struct Parameters(
pub BackendParameter,
pub CurveParameter,
pub SchemeParameter,
);
impl TryFrom<(&str, &str, &str)> for Parameters {
type Error = String;
fn try_from(s: (&str, &str, &str)) -> Result<Parameters, Self::Error> {
let backend = BackendParameter::try_from(s.0)?;
let curve = CurveParameter::try_from(s.1)?;
let proving_scheme = SchemeParameter::try_from(s.2)?;
match (&backend, &curve, &proving_scheme) {
#[cfg(feature = "bellman")]
(BackendParameter::Bellman, CurveParameter::Bn128, SchemeParameter::G16) => Ok(()),
#[cfg(feature = "bellman")]
(BackendParameter::Bellman, CurveParameter::Bls12_381, SchemeParameter::G16) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bn128, SchemeParameter::G16) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bls12_381, SchemeParameter::G16) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bls12_377, SchemeParameter::G16) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bw6_761, SchemeParameter::G16) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bn128, SchemeParameter::GM17) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bls12_377, SchemeParameter::GM17) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bls12_381, SchemeParameter::GM17) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bw6_761, SchemeParameter::GM17) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bn128, SchemeParameter::MARLIN) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bls12_381, SchemeParameter::MARLIN) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bls12_377, SchemeParameter::MARLIN) => Ok(()),
#[cfg(feature = "ark")]
(BackendParameter::Ark, CurveParameter::Bw6_761, SchemeParameter::MARLIN) => Ok(()),
#[cfg(feature = "bellman")]
_ => Err(format!(
"Unsupported combination of parameters (backend: {}, curve: {}, proving scheme: {})",
s.0, s.1, s.2
)),
}.map(|_: ()| Parameters(backend, curve, proving_scheme))
}
}