Skip to main content

Circuit

Trait Circuit 

Source
pub trait Circuit<F: Fancy> {
    type Input;
    type Output: Flatten<Item = F::Item>;

    // Required method
    fn execute(
        &self,
        backend: &mut F,
        inputs: Self::Input,
        channel: &mut Channel<'_>,
    ) -> Result<Self::Output>;
}
Expand description

Trait for defining computations over Fancy objects.

A Circuit computation is defined by a Circuit::Input associated type, a Circuit::Output associated type, and a Circuit::execute method that maps Circuit::Input to Circuit::Output. The body of Circuit::execute may use other Circuits internally.

For mapping arbitrary inputs into the correct Circuit input representation, use the CircuitInputMapper trait.

§Example

Below is a simple circuit computing an add gate. The computation is defined in execute by directly calling operations on the underlying Fancy backend (crate::FancyArithmetic in this example).

struct AddCircuit;
impl<F: FancyArithmetic> Circuit<F> for AddCircuit {
    type Input = (F::Item, F::Item);
    type Output = F::Item;

    fn execute(
        &self,
        backend: &mut F,
        inputs: Self::Input,
        channel: &mut Channel,
    ) -> Result<Self::Output> {
        Ok(backend.add(&inputs.0, &inputs.1))
    }
}

Given AddCircuit, any object instantiating the required Fancy traits can evaluate the circuit by calling AddMany.execute(...).

Required Associated Types§

Source

type Input

The input type of the circuit.

Source

type Output: Flatten<Item = F::Item>

The output type of the circuit.

The Flatten trait allows the output type to be converted into a Vec<F::Item>.

Required Methods§

Source

fn execute( &self, backend: &mut F, inputs: Self::Input, channel: &mut Channel<'_>, ) -> Result<Self::Output>

Execute a circuit on a given Fancy backend using the provided inputs.

Implementors§

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for Equality<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for FractionalMixedRadix<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a [u16])

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for LessThan<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>, &'a str)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for MixedRadixAddition<'a>
where F::Item: 'a,

Source§

type Input = &'a [CrtBundle<<F as Fancy>::Item>]

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for PmrLessThan<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for ReLU<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a str, Option<&'a [u16]>)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for Sgn<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a str, Option<&'a [u16]>)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for Sign<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a str)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyArithmetic + FancyProj> Circuit<F> for ToPmr<'a>
where F::Item: 'a,

Source§

type Input = &'a CrtBundle<<F as Fancy>::Item>

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyArithmetic> Circuit<F> for AddMany<'a>
where F::Item: 'a,

Source§

type Input = &'a [<F as Fancy>::Item]

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyArithmetic> Circuit<F> for Addition<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyArithmetic> Circuit<F> for ConstantMultiplication<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, u128)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyArithmetic> Circuit<F> for Mask<'a>
where F::Item: 'a,

Source§

type Input = (&'a <F as Fancy>::Item, &'a CrtBundle<<F as Fancy>::Item>)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyArithmetic> Circuit<F> for Multiplication<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyArithmetic> Circuit<F> for Subtraction<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary + FancyArithmetic + FancyProj + CrtGadgets> Circuit<F> for Division<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary + FancyArithmetic + FancyProj> Circuit<F> for GreaterThanOrEqual<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>, &'a str)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary + FancyArithmetic + FancyProj> Circuit<F> for Max<'a>
where F::Item: 'a,

Source§

type Input = (&'a [CrtBundle<<F as Fancy>::Item>], &'a str)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary + FancyArithmetic + FancyProj> Circuit<F> for PmrGreaterThanOrEqual<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, &'a CrtBundle<<F as Fancy>::Item>)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for AndMany<'a>
where F::Item: 'a,

Source§

type Input = &'a [<F as Fancy>::Item]

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryAbs<'a>
where F::Item: 'a,

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryAdder<'a>
where F::Item: 'a,

Source§

type Input = (&'a <F as Fancy>::Item, &'a <F as Fancy>::Item, Option<&'a <F as Fancy>::Item>)

Source§

type Output = (<F as Fancy>::Item, <F as Fancy>::Item)

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryAddition<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = (BinaryBundle<<F as Fancy>::Item>, <F as Fancy>::Item)

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryAdditionNoCarry<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = BinaryBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryArithmeticRightShift<'a>
where F::Item: 'a,

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryConstantMultiplication<'a>
where F::Item: 'a,

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryDivision<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = BinaryBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryEquality<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryGreaterThanOrEqual<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryLeftShift<'a>
where F::Item: 'a,

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryLeftShiftExtend<'a>
where F::Item: 'a,

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryLessThan<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryLessThanSigned<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryLogicalRightShift<'a>
where F::Item: 'a,

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryMax<'a>
where F::Item: 'a,

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryMultiplex<'a>
where F::Item: 'a,

Source§

type Input = (<F as Fancy>::Item, &'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = BinaryBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryMultiplication<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = BinaryBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryMultiplicationLowerHalf<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = BinaryBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryRightShift<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, usize, <F as Fancy>::Item)

Source§

type Output = BinaryBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinarySubtraction<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = (BinaryBundle<<F as Fancy>::Item>, <F as Fancy>::Item)

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryToUnary<'a>
where F::Item: 'a,

Source§

type Input = &'a BinaryBundle<<F as Fancy>::Item>

Source§

type Output = Vec<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for BinaryTwosComplement<'a>
where F::Item: 'a,

Source§

impl<'a, F: FancyBinary> Circuit<F> for Mux<'a>
where F::Item: 'a,

Source§

type Input = (&'a <F as Fancy>::Item, &'a <F as Fancy>::Item, &'a <F as Fancy>::Item)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for MuxConstants<'a>
where F::Item: 'a,

Source§

type Input = (&'a <F as Fancy>::Item, bool, bool)

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for OrMany<'a>
where F::Item: 'a,

Source§

type Input = &'a [<F as Fancy>::Item]

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for PairwiseAnd<'a>
where F::Item: 'a,

Source§

type Input = (&'a Vec<<F as Fancy>::Item>, &'a Vec<<F as Fancy>::Item>)

Source§

type Output = Vec<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for PairwiseOr<'a>
where F::Item: 'a,

Source§

type Input = (&'a Vec<<F as Fancy>::Item>, &'a Vec<<F as Fancy>::Item>)

Source§

type Output = Vec<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for PairwiseXor<'a>
where F::Item: 'a,

Source§

type Input = (&'a Vec<<F as Fancy>::Item>, &'a Vec<<F as Fancy>::Item>)

Source§

type Output = Vec<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for TestBinaryMultiplication<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = BinaryBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyBinary> Circuit<F> for XorMany<'a>
where F::Item: 'a,

Source§

type Input = &'a [<F as Fancy>::Item]

Source§

type Output = <F as Fancy>::Item

Source§

impl<'a, F: FancyBinary> Circuit<F> for HmacSha256<'a>
where F::Item: 'a,

Source§

type Input = (&'a [<F as Fancy>::Item; 512], &'a [<F as Fancy>::Item])

Source§

type Output = [<F as Fancy>::Item; 256]

Source§

impl<'a, F: FancyBinary> Circuit<F> for Gcd<'a>
where F::Item: 'a,

Source§

type Input = (&'a BinaryBundle<<F as Fancy>::Item>, &'a BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = BinaryBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyProj> Circuit<F> for ConstantExponentiation<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, u32)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<'a, F: FancyProj> Circuit<F> for Remainder<'a>
where F::Item: 'a,

Source§

type Input = (&'a CrtBundle<<F as Fancy>::Item>, u16)

Source§

type Output = CrtBundle<<F as Fancy>::Item>

Source§

impl<F: Fancy> Circuit<F> for Constant

Source§

impl<F: Fancy> Circuit<F> for BinaryConstant<F>

Source§

impl<F: Fancy> Circuit<F> for fancy_garbling::circuits::binary::TestBinaryConstant

Source§

impl<F: Fancy> Circuit<F> for fancy_garbling::test_circuits::fancy::TestBinaryConstant

Source§

impl<F: FancyArithmetic> Circuit<F> for TestAddMany

Source§

type Input = Vec<<F as Fancy>::Item>

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyArithmetic> Circuit<F> for TestAddition

Source§

type Input = (<F as Fancy>::Item, <F as Fancy>::Item)

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyArithmetic> Circuit<F> for TestCmul

Source§

type Input = <F as Fancy>::Item

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyArithmetic> Circuit<F> for TestConstants

Source§

type Input = <F as Fancy>::Item

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyArithmetic> Circuit<F> for TestMulGate

Source§

type Input = (<F as Fancy>::Item, <F as Fancy>::Item)

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyArithmetic> Circuit<F> for TestMulGateUnequalMods

Source§

type Input = (<F as Fancy>::Item, <F as Fancy>::Item)

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyArithmetic> Circuit<F> for TestSubtraction

Source§

type Input = (<F as Fancy>::Item, <F as Fancy>::Item)

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyBinary> Circuit<F> for AesNonExpanded

Source§

type Input = ([<F as Fancy>::Item; 128], [<F as Fancy>::Item; 128])

Source§

type Output = [<F as Fancy>::Item; 128]

Source§

impl<F: FancyBinary> Circuit<F> for BinaryMultiplexConstantBits

Source§

impl<F: FancyBinary> Circuit<F> for TestBinaryAddition

Source§

type Input = (BinaryBundle<<F as Fancy>::Item>, BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = (BinaryBundle<<F as Fancy>::Item>, <F as Fancy>::Item)

Source§

impl<F: FancyBinary> Circuit<F> for TestBinaryEquality

Source§

impl<F: FancyBinary> Circuit<F> for TestBinaryGreaterThanOrEqual

Source§

impl<F: FancyBinary> Circuit<F> for TestBinaryLessThan

Source§

impl<F: FancyBinary> Circuit<F> for TestBinaryLessThanSigned

Source§

impl<F: FancyBinary> Circuit<F> for TestBinarySubtraction

Source§

type Input = (BinaryBundle<<F as Fancy>::Item>, BinaryBundle<<F as Fancy>::Item>)

Source§

type Output = (BinaryBundle<<F as Fancy>::Item>, <F as Fancy>::Item)

Source§

impl<F: FancyBinary> Circuit<F> for TestBinaryTwosComplement

Source§

impl<F: FancyBinary> Circuit<F> for Sha256

Source§

type Input = Vec<<F as Fancy>::Item>

Source§

type Output = [<F as Fancy>::Item; 256]

Source§

impl<F: FancyBinary> Circuit<F> for Sha256CompressionFunction

Source§

type Input = ([<F as Fancy>::Item; 512], [<F as Fancy>::Item; 256])

Source§

type Output = [<F as Fancy>::Item; 256]

Source§

impl<F: FancyBinary> Circuit<F> for Sha256CompressionFunctionFixedIV

Source§

type Input = [<F as Fancy>::Item; 512]

Source§

type Output = [<F as Fancy>::Item; 256]

Source§

impl<F: FancyBinary> Circuit<F> for TestAndGate

Source§

type Input = (<F as Fancy>::Item, <F as Fancy>::Item)

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyBinary> Circuit<F> for TestAndGateFanN

Source§

type Input = Vec<<F as Fancy>::Item>

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyBinary> Circuit<F> for TestNegateGate

Source§

type Input = <F as Fancy>::Item

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyBinary> Circuit<F> for TestOrGateFanN

Source§

type Input = Vec<<F as Fancy>::Item>

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyBinary> Circuit<F> for TestXorGateFanN

Source§

type Input = Vec<<F as Fancy>::Item>

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyBinary, const N: usize> Circuit<F> for LinearOram<N>

Source§

impl<F: FancyProj> Circuit<F> for ModChange

Source§

type Input = (<F as Fancy>::Item, u16)

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyProj> Circuit<F> for TestProj

Source§

type Input = <F as Fancy>::Item

Source§

type Output = <F as Fancy>::Item

Source§

impl<F: FancyProj> Circuit<F> for TestProjRand

Source§

type Input = <F as Fancy>::Item

Source§

type Output = <F as Fancy>::Item