Circom 2 Getting started 문서를 따라하면서 작성한 문서입니다.
실습 환경:
- Windows 11
- Node.js v20.18.0
- circom compiler 2.1.9
- snarkjs@0.7.5
1. 소프트웨어 설치
- Downloads 페이지에서 circom Windows binary를 클릭하고 파일
circom-windows-amd64.exe
를 원하는 디렉토리에 저장합니다. 파일 크기는 약 10MB입니다. 여기서는 파일 이름을circom.exe
로 바꾸고 아래 경로에 저장합니다.C:\DevTools\circom.exe
snarkjs
를 설치합니다.npm install -g snarkjs
2. 회로 생성하기
-
아래 내용을
multiplier2.circom
에 저장합니다.pragma circom 2.0.0; /*This circuit template checks that c is the multiplication of a and b.*/ template Multiplier2 () { // Declaration of signals. signal input a; signal input b; signal output c; // Constraints. c <== a * b; } component main = Multiplier2();
3. 회로 컴파일하기
-
multiplier2.circom
파일을 컴파일합니다.circom multiplier2.circom --r1cs --wasm --sym --c
컴파일 결과 다음과 같은 파일들이 생성됩니다.
multiplier2.r1cs multiplier2.sym multiplier2_cpp\ calcwit.cpp calcwit.hpp circom.hpp fr.asm fr.cpp fr.hpp main.cpp Makefile multiplier2.cpp multiplier2.dat multiplier2_js\ generate_witness.js multiplier2.wasm witness_calculator.js
4. witness 계산하기
입력 값, 중간 신호, 출력 값을 witness라고 합니다.
-
multiplier2_js
디렉토리로 이동합니다.cd multiplier2_js
-
아래 내용을
input.json
파일에 저장합니다.{"a": "3", "b": "11"}
-
witness를 계산하여
witness.wtns
파일에 저장합니다.node generate_witness.js multiplier2.wasm input.json witness.wtns
5. 회로를 영지식으로 증명하기
증명을 생성하기 위하여 아래 두 파일을 사용합니다.
multiplier2.r1cs
: 회로를 기술하는 제약사항 포함witness.wtns
: 모든 계산된 신호 값 포함
여기서는 Groth16 zk-SNARK 프로토콜을 사용하고자 합니다. 이 프로토콜은 trusted setup을 필요로 하고 이 과정은 두 단계로 구성됩니다.
- Powers of tau - 회로에 독립적
- Phase 2 - 회로에 의존적
5.1. Powers of Tau
-
“powers of tau” ceremony 시작
snarkjs powersoftau new bn128 12 pot12_0000.ptau -v
-
ceremony에 기여
snarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau --name="First contribution" -v
5.2. Phase 2
-
Phase 생성
snarkjs powersoftau prepare phase2 pot12_0001.ptau pot12_final.ptau -v
-
.r1cs
파일과 연관된.zkey
파일 생성snarkjs groth16 setup ..\multiplier2.r1cs pot12_final.ptau multiplier2_0000.zkey
-
ceremony의 phase 2에 기여
snarkjs zkey contribute multiplier2_0000.zkey multiplier2_0001.zkey --name="1st Contributor Name" -v
-
검증키 내보내기
snarkjs zkey export verificationkey multiplier2_0001.zkey verification_key.json
5.3. 증명 생성
-
회로 및 witness와 연관된 증명을 생성합니다.
snarkjs groth16 prove multiplier2_0001.zkey witness.wtns proof.json public.json
위 명령은 다음 두 파일을 생성합니다.
proof.json
: 증명 포함{ "pi_a": [ "13983182679953556458842508347137149918023927201985471435159758927740558853016", "17126988695844741179284716898691257368385629126542168835554345497343624722940", "1" ], "pi_b": [ [ "19140696255248677436910729284929621534969442224058440363361064354121562854264", "14257009146984576436317952378148206632799369157719061977972167958840456095938" ], [ "7733560110556055181607998374149392520454003067800483949057392794063019344423", "2891268127818819654691304244486325795969498402824384674233464052246905803426" ], [ "1", "0" ] ], "pi_c": [ "21608704327549608970596366226125688092932784974035385756433099903167703539664", "19614360261086173764968380312474156102058426242974580364381559870892304372835", "1" ], "protocol": "groth16", "curve": "bn128" }
public.json
: 공개 입력 및 출력 값 포함[ "33" ]
5.4. 증명 검증
-
아래 명령을 수행하여 증명을 검증합니다.
snarkjs groth16 verify verification_key.json public.json proof.json
위 명령의 수행 결과는 다음과 같습니다.
[INFO] snarkJS: OK!
6. 정리
실습을 정상적으로 마쳤을 때 multiplier2_js
디렉토리의 파일 목록은 다음과 같습니다.
generate_witness.js
input.json
multiplier2.wasm
multiplier2_0000.zkey
multiplier2_0001.zkey
pot12_0000.ptau
pot12_0001.ptau
pot12_final.ptau
proof.json
public.json
verification_key.json
witness.wtns
witness_calculator.js
Written with StackEdit.
댓글 없음:
댓글 쓰기