poseidon::Domain: Remove Spec trait bound.

The methods in the Domain trait are not generic over Spec.
This commit is contained in:
therealyingtong 2021-08-13 14:47:02 +08:00
parent 5f0c3b3585
commit 1f852544cf
3 changed files with 15 additions and 17 deletions

View File

@ -43,14 +43,14 @@ pub trait PoseidonDuplexInstructions<
fn initial_state( fn initial_state(
&self, &self,
layouter: &mut impl Layouter<F>, layouter: &mut impl Layouter<F>,
domain: &impl Domain<F, S, T, RATE>, domain: &impl Domain<F, T, RATE>,
) -> Result<State<Self::Word, T>, Error>; ) -> Result<State<Self::Word, T>, Error>;
/// Pads the given input (according to the specified domain) and adds it to the state. /// Pads the given input (according to the specified domain) and adds it to the state.
fn pad_and_add( fn pad_and_add(
&self, &self,
layouter: &mut impl Layouter<F>, layouter: &mut impl Layouter<F>,
domain: &impl Domain<F, S, T, RATE>, domain: &impl Domain<F, T, RATE>,
initial_state: &State<Self::Word, T>, initial_state: &State<Self::Word, T>,
input: &SpongeState<Self::Word, RATE>, input: &SpongeState<Self::Word, RATE>,
) -> Result<State<Self::Word, T>, Error>; ) -> Result<State<Self::Word, T>, Error>;
@ -91,7 +91,7 @@ fn poseidon_duplex<
F: FieldExt, F: FieldExt,
PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>, PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>,
S: Spec<F, T, RATE>, S: Spec<F, T, RATE>,
D: Domain<F, S, T, RATE>, D: Domain<F, T, RATE>,
const T: usize, const T: usize,
const RATE: usize, const RATE: usize,
>( >(
@ -111,7 +111,7 @@ pub struct Duplex<
F: FieldExt, F: FieldExt,
PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>, PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>,
S: Spec<F, T, RATE>, S: Spec<F, T, RATE>,
D: Domain<F, S, T, RATE>, D: Domain<F, T, RATE>,
const T: usize, const T: usize,
const RATE: usize, const RATE: usize,
> { > {
@ -125,7 +125,7 @@ impl<
F: FieldExt, F: FieldExt,
PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>, PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>,
S: Spec<F, T, RATE>, S: Spec<F, T, RATE>,
D: Domain<F, S, T, RATE>, D: Domain<F, T, RATE>,
const T: usize, const T: usize,
const RATE: usize, const RATE: usize,
> Duplex<F, PoseidonChip, S, D, T, RATE> > Duplex<F, PoseidonChip, S, D, T, RATE>
@ -215,7 +215,7 @@ pub struct Hash<
F: FieldExt, F: FieldExt,
PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>, PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>,
S: Spec<F, T, RATE>, S: Spec<F, T, RATE>,
D: Domain<F, S, T, RATE>, D: Domain<F, T, RATE>,
const T: usize, const T: usize,
const RATE: usize, const RATE: usize,
> { > {
@ -226,7 +226,7 @@ impl<
F: FieldExt, F: FieldExt,
PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>, PoseidonChip: PoseidonDuplexInstructions<F, S, T, RATE>,
S: Spec<F, T, RATE>, S: Spec<F, T, RATE>,
D: Domain<F, S, T, RATE>, D: Domain<F, T, RATE>,
const T: usize, const T: usize,
const RATE: usize, const RATE: usize,
> Hash<F, PoseidonChip, S, D, T, RATE> > Hash<F, PoseidonChip, S, D, T, RATE>

View File

@ -273,7 +273,7 @@ impl<F: FieldExt, S: Spec<F, WIDTH, 2>> PoseidonDuplexInstructions<F, S, WIDTH,
fn initial_state( fn initial_state(
&self, &self,
layouter: &mut impl Layouter<F>, layouter: &mut impl Layouter<F>,
domain: &impl Domain<F, S, WIDTH, 2>, domain: &impl Domain<F, WIDTH, 2>,
) -> Result<State<Self::Word, WIDTH>, Error> { ) -> Result<State<Self::Word, WIDTH>, Error> {
let config = self.config(); let config = self.config();
layouter.assign_region( layouter.assign_region(
@ -304,7 +304,7 @@ impl<F: FieldExt, S: Spec<F, WIDTH, 2>> PoseidonDuplexInstructions<F, S, WIDTH,
fn pad_and_add( fn pad_and_add(
&self, &self,
layouter: &mut impl Layouter<F>, layouter: &mut impl Layouter<F>,
domain: &impl Domain<F, S, WIDTH, 2>, domain: &impl Domain<F, WIDTH, 2>,
initial_state: &State<Self::Word, WIDTH>, initial_state: &State<Self::Word, WIDTH>,
input: &SpongeState<Self::Word, 2>, input: &SpongeState<Self::Word, 2>,
) -> Result<State<Self::Word, WIDTH>, Error> { ) -> Result<State<Self::Word, WIDTH>, Error> {

View File

@ -242,9 +242,7 @@ impl<F: FieldExt, S: Spec<F, T, RATE>, const T: usize, const RATE: usize> Duplex
} }
/// A domain in which a Poseidon hash function is being used. /// A domain in which a Poseidon hash function is being used.
pub trait Domain<F: FieldExt, S: Spec<F, T, RATE>, const T: usize, const RATE: usize>: pub trait Domain<F: FieldExt, const T: usize, const RATE: usize>: Copy + fmt::Debug {
Copy + fmt::Debug
{
/// The initial capacity element, encoding this domain. /// The initial capacity element, encoding this domain.
fn initial_capacity_element(&self) -> F; fn initial_capacity_element(&self) -> F;
@ -262,8 +260,8 @@ pub trait Domain<F: FieldExt, S: Spec<F, T, RATE>, const T: usize, const RATE: u
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
pub struct ConstantLength<const L: usize>; pub struct ConstantLength<const L: usize>;
impl<F: FieldExt, S: Spec<F, T, RATE>, const T: usize, const RATE: usize, const L: usize> impl<F: FieldExt, const T: usize, const RATE: usize, const L: usize> Domain<F, T, RATE>
Domain<F, S, T, RATE> for ConstantLength<L> for ConstantLength<L>
{ {
fn initial_capacity_element(&self) -> F { fn initial_capacity_element(&self) -> F {
// Capacity value is $length \cdot 2^64 + (o-1)$ where o is the output length. // Capacity value is $length \cdot 2^64 + (o-1)$ where o is the output length.
@ -300,7 +298,7 @@ impl<F: FieldExt, S: Spec<F, T, RATE>, const T: usize, const RATE: usize, const
pub struct Hash< pub struct Hash<
F: FieldExt, F: FieldExt,
S: Spec<F, T, RATE>, S: Spec<F, T, RATE>,
D: Domain<F, S, T, RATE>, D: Domain<F, T, RATE>,
const T: usize, const T: usize,
const RATE: usize, const RATE: usize,
> { > {
@ -311,7 +309,7 @@ pub struct Hash<
impl< impl<
F: FieldExt, F: FieldExt,
S: Spec<F, T, RATE>, S: Spec<F, T, RATE>,
D: Domain<F, S, T, RATE>, D: Domain<F, T, RATE>,
const T: usize, const T: usize,
const RATE: usize, const RATE: usize,
> fmt::Debug for Hash<F, S, D, T, RATE> > fmt::Debug for Hash<F, S, D, T, RATE>
@ -330,7 +328,7 @@ impl<
impl< impl<
F: FieldExt, F: FieldExt,
S: Spec<F, T, RATE>, S: Spec<F, T, RATE>,
D: Domain<F, S, T, RATE>, D: Domain<F, T, RATE>,
const T: usize, const T: usize,
const RATE: usize, const RATE: usize,
> Hash<F, S, D, T, RATE> > Hash<F, S, D, T, RATE>