sCrypt-Inc / zokrates

A zero-knowledge proof toolbox on Bitcoin. A fork of zokrates (https://github.com/Zokrates/ZoKrates).
GNU Lesser General Public License v3.0
14 stars 1 forks source link

Flattern circuit #5

Closed xhliu closed 3 years ago

xhliu commented 3 years ago
xhliu commented 3 years ago
Parser

ZirProgram -> FlatProg -> Prog ZirStatement -> FlatStatement -> Statement

pub enum FlatStatement { Return(FlatExpressionList), Condition(FlatExpression, FlatExpression), Definition(FlatVariable, FlatExpression), // start w/ prefix "#", used for computing witness. Not in final r1cs Directive(FlatDirective), }

pub enum FlatExpression { Number(T), Identifier(FlatVariable), Add(Box<FlatExpression>, Box<FlatExpression>), Sub(Box<FlatExpression>, Box<FlatExpression>), Mult(Box<FlatExpression>, Box<FlatExpression>), }

pub enum Statement {         Constraint(QuadComb, LinComb),         Directive(Directive), } pub struct Directive {          pub inputs: Vec<QuadComb>,          pub outputs: Vec,          pub solver: Solver, }

// from_flat.rs impl From<FlatStatement> for Statement {     fn from(flat_statement: FlatStatement) -> Statement { // FlatExpression -> LinComb impl From<FlatExpression> for LinComb {

pub struct QuadComb { pub left: LinComb, pub right: LinComb, } pub struct LinComb(pub Vec<(FlatVariable, T)>);

Uint

pub enum ZirExpression<'ast, T> {
    Boolean(BooleanExpression<'ast, T>),
    FieldElement(FieldElementExpression<'ast, T>),
    Uint(UExpression<'ast, T>),
}

 

pub struct UExpression<'ast, T> {
    pub bitwidth: UBitwidth,
    pub metadata: Option<UMetadata<T>>,
    pub inner: UExpressionInner<'ast, T>,
}

pub enum UExpressionInner<'ast, T> {
    Identifier(Identifier<'ast>),
    Value(u128),
    Add(Box<UExpression<'ast, T>>, Box<UExpression<'ast, T>>),
    Sub(Box<UExpression<'ast, T>>, Box<UExpression<'ast, T>>),
struct FlatUExpression<T: Field> {
    field: Option<FlatExpression<T>>,
    bits: Option<Vec<FlatExpression<T>>>,
}
  Interpreter

impl Interpreter { // circuit/r1cs & inputs => witness/circuit wires pub fn execute(&self, program: &Prog, inputs: &[T]) -> ExecutionResult {

pub struct Witness(pub BTreeMap<FlatVariable, T>); pub type ExecutionResult = Result<Witness, Error>;