Skip to content

Functions

In circom, functions define generic abstract pieces of code that can perform some computations to obtain a value or an expression to be returned.

function funid ( param1, ... , paramn ) {

 .....

 return x;
}

Functions compute numeric (or arrays of) values or expressions. Functions can be recursive. Consider the next function from the circom library.

/*
    This function calculates the number of extra bits 
    in the output to do the full sum.
 */

function nbits(a) {
    var n = 1;
    var r = 0;
    while (n-1<a) {
        r++;
        n *= 2;
    }
    return r;
}

Functions cannot declare signals or generate constraints (use templates if you need so). The next function produces the error message: "Template operator found".

function nbits(a) {
    signal input in; //This is not allowed.
    var n = 1;
    var r = 0;
    while (n-1<a) {
        r++;
        n *= 2;
    }
    r === a; //This is also not allowed.
    return r;
}

As usual, there can be many return statements, but every execution trace must end in a return statement (otherwise, a compile error will be produced). The execution of the return statement returns the control to the caller of the function.

function example(N){
     if(N >= 0){ return 1;}
//   else{ return 0;}
}

The compilation of function example produces the next error message: "In example there are paths without return".