Number of wires in a ZKP Circom circuit is greater than expected

250 views Asked by At

I compile this simple circuit:

pragma circom 2.0.0;

template Multiplier2() {
    signal input a;
    signal input b;
    signal output c;
    c <== a*b;
 }

 component main = Multiplier2();

and the compiler says 4 wires:

circom 1.circom --r1cs --wasm --sym --c
template instances: 1
non-linear constraints: 1
linear constraints: 0
public inputs: 0
public outputs: 1
private inputs: 2
private outputs: 0
wires: 4
labels: 4

I have expected that the number of wires will be the number of signals (3), I wonder where the 4th wire comes from?

2

There are 2 answers

0
Pavel Fedotov On BEST ANSWER

In the circuit you've provided, the template Multiplier2() has 3 signals: a, b, and c. However, when you instantiate Multiplier2() in your main component, you are also instantiating the default end signal that gets generated by Circom. This end signal is automatically generated when components in Circom don't have an explicit output specified.

So, even though the Multiplier2() template only has 3 signals, you are instantiating it in a way that causes Circom to also generate the end signal, resulting in a total of 4 wires.

Very interesting article that goes into details: https://medium.com/@yujiangtham/lets-dissect-a-zksnark-part-2-5f92f1d7d2e9

1
Mehri On

While converting a circuit into R1CS, constant 1 is considered as an extra input. I believe that is the thing that authors decided to do for simplicity.