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
use crate::prelude::{Deserialize, DeserializeOwned, Serialize};
use snarkvm_curves::{
bls12_377::Bls12_377,
edwards_bls12::{EdwardsAffine, EdwardsParameters},
AffineCurve,
MontgomeryParameters,
PairingEngine,
ProjectiveCurve,
TwistedEdwardsParameters,
};
use snarkvm_fields::{PrimeField, SquareRootField};
use snarkvm_utilities::BigInteger;
use core::{fmt::Debug, hash::Hash};
pub trait Environment:
'static + Copy + Clone + Debug + PartialEq + Eq + Hash + Serialize + DeserializeOwned + Send + Sync
{
type Affine: AffineCurve<
Projective = Self::Projective,
BaseField = Self::Field,
ScalarField = Self::Scalar,
Coordinates = (Self::Field, Self::Field),
>;
type BigInteger: BigInteger;
type Field: PrimeField<BigInteger = Self::BigInteger> + SquareRootField + Copy;
type PairingCurve: PairingEngine<Fr = Self::Field>;
type Projective: ProjectiveCurve<Affine = Self::Affine, BaseField = Self::Field, ScalarField = Self::Scalar>;
type Scalar: PrimeField<BigInteger = Self::BigInteger> + Copy;
const EDWARDS_A: Self::Field;
const EDWARDS_D: Self::Field;
const MONTGOMERY_A: Self::Field;
const MONTGOMERY_B: Self::Field;
const MAX_STRING_BYTES: u32 = u8::MAX as u32;
fn halt<S: Into<String>, T>(message: S) -> T {
panic!("{}", message.into())
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Console;
impl Environment for Console {
type Affine = EdwardsAffine;
type BigInteger = <Self::Field as PrimeField>::BigInteger;
type Field = <Self::Affine as AffineCurve>::BaseField;
type PairingCurve = Bls12_377;
type Projective = <Self::Affine as AffineCurve>::Projective;
type Scalar = <Self::Affine as AffineCurve>::ScalarField;
const EDWARDS_A: Self::Field = <EdwardsParameters as TwistedEdwardsParameters>::EDWARDS_A;
const EDWARDS_D: Self::Field = <EdwardsParameters as TwistedEdwardsParameters>::EDWARDS_D;
const MONTGOMERY_A: Self::Field = <EdwardsParameters as MontgomeryParameters>::MONTGOMERY_A;
const MONTGOMERY_B: Self::Field = <EdwardsParameters as MontgomeryParameters>::MONTGOMERY_B;
}