Circom(Circuit Compiler)는 제로 지식 증명(Zero-Knowledge Proof, ZKP) 시스템에서 사용할 산술 회로(arithmetic circuits)를 설계하기 위한 도메인 특화 언어(Domain-Specific Language, DSL)입니다. 이더리움 생태계의 주요 연구 기관인 iden3 팀이 개발했으며, 특히 zk-SNARKs 프로토콜과 호환되는 회로 작성에 최적화되어 있습니다.
직관적인 회로 설계 문법
template Multiplier() {
signal input a;
signal input b;
signal output c;
c <== a * b;
}
위 예제는 간단한 곱셈 회로를 보여줍니다. signal
키워드로 입력/출력을 선언하고 <==
연산자로 제약 조건을 설정합니다.
계층적 회로 구성
component main = Multiplier();
템플릿을 컴포넌트로 인스턴스화하여 복잡한 회로를 모듈식으로 구성할 수 있습니다.
R1CS(Rank-1 Constraint System) 자동 생성
Circom 컴파일러는 작성한 코드를 R1CS 형식으로 변환하여 zk-SNARKs 프레임워크(예: SnarkJS)와의 호환성을 보장합니다.
pragma circom 2.0.0;
template VotingSystem() {
signal input vote; // 0 또는 1
signal input salt; // 랜덤 값 (프라이버시 보호)
signal output commitment;
// 투표가 유효한지 확인 (0 또는 1)
vote * (vote - 1) === 0;
// 커밋트 생성 (해시 함수 사용)
commitment <== vote + 2*salt;
}
component main {public [vote]} = VotingSystem();
이 예제에서는:
1. 유권자가 0 또는 1로 투표
2. 무작위 salt로 프라이버시 보장
3. 투표 유효성 검증
4. 해시 기반 커밋트 생성
<--
(할당)와 ===
(제약) 분리template RangeProof(n) {
signal input in;
signal input bound;
// in이 0 <= in < bound인지 확인
component lt = LessThan(n);
lt.in[0] <== in;
lt.in[1] <== bound;
lt.out === 1;
}
Circom은 복잡한 제로 지식 증명 시스템을 보다 접근하기 쉽게 만들어주는 강력한 도구입니다. 블록체인, 투표 시스템, 프라이버시 보호가 필요한 모든 애플리케이션에서 활용될 수 있으며, 점점 더 많은 프로젝트에서 Circom을 표준 회로 작성 언어로 채택하고 있습니다.
초보자는 Circom 공식 문서에서 시작하고, circomlib의 예제 코드를 참고하는 것이 좋습니다. 제로 지식 증명의 세계에서 Circom은 개발자들에게 강력하면서도 우아한 솔루션을 제공합니다.