输入输出
/usr/local/bin/node --max-old-space-size=32000 src/compressor12/main_compressor12_exec.js -i /Users/tron/test/polygon_zkevm/pil-stark/tmp/fibonacci.proof.zkin.json -w /Users/tron/test/polygon_zkevm/pil-stark/tmp/fibonacci.verifier_js/fibonacci.verifier.wasm -p /Users/tron/test/polygon_zkevm/pil-stark/tmp/fibonacci.c12.pil -e /Users/tron/test/polygon_zkevm/pil-stark/tmp/fibonacci.c12.exec -m /Users/tron/test/polygon_zkevm/pil-stark/tmp/fibonacci.c12.commit
涉及的输入为:
-
fibonacci.proof.zkin.json
: 基于Goldilocks 生成的STARK 证明 -
fibonacci.verifier.wasm
: 用于生成witness 的wasm -
fibonacci.c12.pil
:main_compressor12_setup
过程生成的pil
输出为:
-
fibonacci.c12.commit
: 生成的承诺多项式
r1cs witness 生成
对r1cs 电路中的withness 赋值,首先将stark 证明作为输入,生成withness w
;
其后由于转换为于Plonk电路,生成了一些临时变量,对这些变量进行赋值。
const pil = await compile(F, pilFile, null, pilConfig);
const cmPols = newCommitPolsArray(pil); // 用于保存生成的withness
const wc = await WitnessCalculatorBuilder(wasm);
const w = await wc.calculateWitness(input); // 将stark proof 作为输入
for (let i=0; i<nAdds; i++) { // 对于转换为Plonk电路时生成的临时变量进行赋值
w.push( F.add( F.mul( w[addsBuff[i*4]], addsBuff[i*4 + 2]), F.mul( w[addsBuff[i*4+1]], addsBuff[i*4+3] )));
}
承诺多项式赋值
根据sMap, 对PIL 中的承诺多项式a[12]
进行赋值,并将最后生成的承诺多项式保存起来。
for (let i=0; i<nSMap; i++) {
for (let j=0; j<12; j++) {
if (sMapBuff[12*i+j] != 0) {
cmPols.Compressor.a[j][i] = w[sMapBuff[12*i+j]];
} else {
cmPols.Compressor.a[j][i] = 0n;
}
}
}
for (let i=nSMap; i<N; i++) {
for (let j=0; j<12; j++) {
cmPols.Compressor.a[j][i] = 0n;
}
}
await cmPols.saveToFile(commitFile);
参考
https://github.com/0xPolygonHermez/pil-stark/blob/main/src/compressor12/main_compressor12_exec.js