🍣

Circomでコンパイル時に制約が決まらないとエラーになる

2023/05/15に公開

はじめに

zk-SNARKsをDAppsで扱うときにCircomを使うのが一般的かと思いますが、うまくコンパイルが通らない書き方があるのでメモです。

コード

以下コンパイルが通らない書き方です。

pragma circom 2.0.3;

template Test(n) {
    signal input i;

    if (i == 3) {
        1 === 1;
    } else {
        1 === 0;
    }
}

component main { public [i] } = Test(3);

これはThere are constraints depending on the value of the condition and it can be unknown during the constraint generation phaseというエラーでコンパイルが通りません。
if文はコンパイル時にどこを通るか決まらないといけないっていうことですかね。

以下のコードはコンパイル通ります。

pragma circom 2.0.3;

template Test(n) {
    signal input i;

    if (n == 3) { // ここの指定がiではなくn
        1 === 1;
    } else {
        1 === 0;
    }
}

component main { public [i] } = Test(3);

for文でも同様に以下の場合はコンパイル時にfor文が何回ループするかわからないので、同じエラーが出ます。

pragma circom 2.0.3;

template Test() {
    signal input in;
    var j = 0;

    for (var i = 0; i < in; i++) {
        i === j;
        j++;
    }

}

component main  = Test();

Discussion