Reputation: 402
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?
Upvotes: 4
Views: 431
Reputation: 51
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.
Upvotes: 3
Reputation: 885
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
Upvotes: 3