Documentation ¶
Index ¶
- func IgnoreUnconstrainedInputs(opt *CompileOption) error
- func RegisterDefaultBuilder(b backend.ID, builder NewBuilder)
- func WithBuilder(builder NewBuilder) func(opt *CompileOption) error
- func WithCapacity(capacity int) func(opt *CompileOption) error
- type API
- type Builder
- type Circuit
- type CompileOption
- type CompiledConstraintSystem
- type Counter
- type NewBuilder
- type Tag
- type Variable
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func IgnoreUnconstrainedInputs ¶ added in v0.5.2
func IgnoreUnconstrainedInputs(opt *CompileOption) error
IgnoreUnconstrainedInputs when set, the Compile function doesn't check for unconstrained inputs
func RegisterDefaultBuilder ¶ added in v0.6.0
func RegisterDefaultBuilder(b backend.ID, builder NewBuilder)
RegisterDefaultBuilder registers a frontend f for a backend b. This registration ensures that a correct frontend system is chosen for a specific backend when compiling a circuit. The method does not check that the compiler for that frontend is already registered and the compiler is looked up during compile time. It is an error to double-assign a frontend to a single backend and the mehod panics.
/!\ This is highly experimental and may change in upcoming releases /!\
func WithBuilder ¶ added in v0.6.0
func WithBuilder(builder NewBuilder) func(opt *CompileOption) error
WithBuilder enables the compiler to build the constraint system with a user-defined builder
/!\ This is highly experimental and may change in upcoming releases /!\
func WithCapacity ¶ added in v0.5.2
func WithCapacity(capacity int) func(opt *CompileOption) error
WithOutput is a Compile option that specifies the estimated capacity needed for internal variables and constraints
Types ¶
type API ¶ added in v0.5.2
type API interface { // Add returns res = i1+i2+...in Add(i1, i2 Variable, in ...Variable) Variable // Sub returns res = i1 - i2 - ...in Sub(i1, i2 Variable, in ...Variable) Variable // Neg returns -i Neg(i1 Variable) Variable // Mul returns res = i1 * i2 * ... in Mul(i1, i2 Variable, in ...Variable) Variable // DivUnchecked returns i1 / i2 . if i1 == i2 == 0, returns 0 DivUnchecked(i1, i2 Variable) Variable // Div returns i1 / i2 Div(i1, i2 Variable) Variable // Inverse returns res = 1 / i1 Inverse(i1 Variable) Variable // ToBinary unpacks a Variable in binary, // n is the number of bits to select (starting from lsb) // n default value is fr.Bits the number of bits needed to represent a field element // // The result in in little endian (first bit= lsb) ToBinary(i1 Variable, n ...int) []Variable // FromBinary packs b, seen as a fr.Element in little endian FromBinary(b ...Variable) Variable // Xor returns a ^ b // a and b must be 0 or 1 Xor(a, b Variable) Variable // Or returns a | b // a and b must be 0 or 1 Or(a, b Variable) Variable // Or returns a & b // a and b must be 0 or 1 And(a, b Variable) Variable // Select if b is true, yields i1 else yields i2 Select(b Variable, i1, i2 Variable) Variable // Lookup2 performs a 2-bit lookup between i1, i2, i3, i4 based on bits b0 // and b1. Returns i0 if b0=b1=0, i1 if b0=1 and b1=0, i2 if b0=0 and b1=1 // and i3 if b0=b1=1. Lookup2(b0, b1 Variable, i0, i1, i2, i3 Variable) Variable // IsZero returns 1 if a is zero, 0 otherwise IsZero(i1 Variable) Variable // AssertIsEqual fails if i1 != i2 AssertIsEqual(i1, i2 Variable) // AssertIsDifferent fails if i1 == i2 AssertIsDifferent(i1, i2 Variable) // AssertIsBoolean fails if v != 0 || v != 1 AssertIsBoolean(i1 Variable) // AssertIsLessOrEqual fails if v > bound AssertIsLessOrEqual(v Variable, bound Variable) // Println behaves like fmt.Println but accepts cd.Variable as parameter // whose value will be resolved at runtime when computed by the solver Println(a ...Variable) // NewHint initializes internal variables whose value will be evaluated // using the provided hint function at run time from the inputs. Inputs must // be either variables or convertible to *big.Int. The function returns an // error if the number of inputs is not compatible with f. // // The hint function is provided at the proof creation time and is not // embedded into the circuit. From the backend point of view, the variable // returned by the hint function is equivalent to the user-supplied witness, // but its actual value is assigned by the solver, not the caller. // // No new constraints are added to the newly created wire and must be added // manually in the circuit. Failing to do so leads to solver failure. NewHint(f hint.Function, inputs ...Variable) ([]Variable, error) // Tag creates a tag at a given place in a circuit. The state of the tag may contain informations needed to // measure constraints, variables and coefficients creations through AddCounter Tag(name string) Tag // AddCounter measures the number of constraints, variables and coefficients created between two tags // note that the PlonK statistics are contextual since there is a post-compile phase where linear expressions // are factorized. That is, measuring 2 times the "repeating" piece of circuit may give less constraints the second time AddCounter(from, to Tag) // IsConstant returns true if v is a constant known at compile time IsConstant(v Variable) bool // ConstantValue returns the big.Int value of v. It // panics if v.IsConstant() == false ConstantValue(v Variable) *big.Int // CurveID returns the ecc.ID injected by the compiler Curve() ecc.ID // Backend returns the backend.ID injected by the compiler Backend() backend.ID }
API represents the available functions to circuit developers
type Builder ¶ added in v0.6.0
type Builder interface { API CheckVariables() error NewPublicVariable(name string) Variable NewSecretVariable(name string) Variable Compile() (CompiledConstraintSystem, error) }
Builder represents a constraint system builder
type Circuit ¶
Circuit must be implemented by user-defined circuits
the tag format is as follow:
type MyCircuit struct { Y frontend.Variable `gnark:"name,option"` }
if empty, default resolves to variable name (here "Y") and secret visibility similarly to json or xml struct tags, these are valid:
`gnark:",public"` or `gnark:"-"`
using "-" marks the variable as ignored by the Compile method. This can be useful when you need to declare variables as aliases that are already allocated. For example
type MyCircuit struct { Y frontend.Variable `gnark:",public"` Z frontend.Variable `gnark:"-"` }
it is then the developer responsability to do circuit.Z = circuit.Y in the Define() method
type CompileOption ¶ added in v0.5.2
type CompileOption struct {
// contains filtered or unexported fields
}
CompileOption enables to set optional argument to call of frontend.Compile()
type CompiledConstraintSystem ¶ added in v0.4.0
type CompiledConstraintSystem interface { io.WriterTo io.ReaderFrom // GetNbVariables return number of internal, secret and public Variables GetNbVariables() (internal, secret, public int) GetNbConstraints() int GetNbCoefficients() int CurveID() ecc.ID FrSize() int // ToHTML generates a human readable representation of the constraint system ToHTML(w io.Writer) error // GetCounters return the collected constraint counters, if any GetCounters() []compiled.Counter }
CompiledConstraintSystem interface that a compiled (=typed, and correctly routed) should implement.
func Compile ¶
func Compile(curveID ecc.ID, zkpID backend.ID, circuit Circuit, opts ...func(opt *CompileOption) error) (CompiledConstraintSystem, error)
Compile will generate a ConstraintSystem from the given circuit
1. it will first allocate the user inputs (see type Tag for more info) example:
type MyCircuit struct { Y frontend.Variable `gnark:"exponent,public"` }
in that case, Compile() will allocate one public variable with id "exponent"
2. it then calls circuit.Define(curveID, R1CS) to build the internal constraint system from the declarative code
- finally, it converts that to a ConstraintSystem. if zkpID == backend.GROTH16 --> R1CS if zkpID == backend.PLONK --> SparseR1CS
initialCapacity is an optional parameter that reserves memory in slices it should be set to the estimated number of constraints in the circuit, if known.
type Tag ¶
Tag contains informations needed to measure and display statistics of a delimited piece of circuit
type Variable ¶
type Variable interface{}
Variable represents a variable in the circuit. Any integer type (e.g. int, *big.Int, fr.Element) can be assigned to it. It is also allowed to set a base-10 encoded string representing an integer value. The only purpose of putting this defintion here is to avoid the import cycles (cs/plonk <-> frontend) and (cs/r1cs <-> frontend)