기본 콘텐츠로 건너뛰기

라벨이 snarkjs인 게시물 표시

ZKP-2. 초보자를 위한 영지식 증명(zk-SNARKs) 실습 가이드: Circom과 SnarkJS 활용

이 가이드는 영지식 증명을 처음 접하는 분들을 위해 Circom과 SnarkJS 라이브러리를 사용하여 zk-SNARKs의 전체 과정을 직접 체험해볼 수 있도록 구성되었습니다. 1. 개발 환경 설정 먼저 영지식 증명 회로를 작성하고 증명을 생성하는 데 필요한 도구들을 설치해야 합니다. 컴퓨터에 Node.js (v16 이상 권장)와 npm이 설치되어 있어야 합니다. Circom & SnarkJS 설치 터미널(Windows의 경우 PowerShell 또는 cmd, macOS의 경우 Terminal)을 열고 아래 명령어를 실행하여 circom과 snarkjs를 전역으로 설치합니다. npm install -g circom snarkjs 설치가 잘 되었는지 확인하기 위해 각 라이브러리의 버전을 확인합니다. circom --version snarkjs --version 버전 정보가 정상적으로 출력되면 개발 환경 설정이 완료된 것입니다. 2. 회로(Circuit) 작성 및 컴파일 영지식 증명에서는 증명하려는 계산 과정을 '회로'라는 형태로 표현합니다. 우리는 "어떤 수 x를 제곱하면 y가 된다"는 관계를 증명하는 회로를 작성해 보겠습니다. 1) 회로 파일 생성 multiplier.circom이라는 이름의 파일을 만들고 아래 코드를 작성하세요. pragma circom 2.0.0; /*   이 회로는 입력 신호 'x'를 제곱한 결과가   출력 신호 'y'와 같은지 검증합니다.   증명자는 'x'를 알고 있음을 증명하고,   검증자는 'y' 값만으로 이를 확인할 수 있습니다. */ template Multiplier() {     // 증명자만 알고 있는 비공개 입력(private input)     signal input x;     // 모두에게 공개되는 공개 입력(public input)     signal output y;     // x *...

ZKP-1. 초보자를 위한 Circom 언어 가이드

Circom은 영지식 증명에 사용되는 '산술 회로'를 설계하기 위한 언어입니다. 이 회로를 통해 증명하고 싶은 논리나 규칙을 코드로 표현할 수 있습니다. 조금 어렵게 들릴 수 있지만, "어떤 비밀 정보(private input)를 공개하지 않으면서, 내가 그 비밀 정보를 알고 있다는 사실을 증명하는 프로그램"을 만드는 언어라고 생각하면 쉽습니다. 1. 핵심 개념: 회로, 신호, 제약 조건 Circom 코드는 3가지 핵심 요소로 이루어집니다. 회로 (Circuit) Circom의 가장 기본 단위입니다. 우리는 템플릿(template)이라는 키워드를 사용해서 회로를 정의합니다. 마치 다른 언어의 함수나 클래스처럼, 재사용 가능한 로직의 묶음이라고 생각할 수 있습니다. 신호 (Signal) 회로의 입력(input)과 출력(output), 그리고 그 사이에서 계산되는 중간값들을 신호라고 부릅니다. 신호는 회로를 통해 흐르는 데이터입니다. input: 회로에 입력되는 신호입니다. public input: 증명을 검증하는 사람에게도 공개되는 입력값입니다. (예: 문제) private input: 증명하는 사람만 알고 있는 비밀 입력값입니다. (예: 문제의 해답) output: 회로의 계산 결과로 나오는 신호입니다. 보통 public으로 간주되어 공개됩니다. var: 회로 내부에서만 사용되는 중간 신호입니다. 일반 프로그래밍 언어의 변수와 달리, Circom의 모든 신호(var 포함)는 최종적으로 제약 조건 시스템의 일부가 되어 증명 과정에 영향을 줍니다. 제약 조건 (Constraint) Circom의 심장과도 같은 가장 중요한 개념입니다. 제약 조건은 신호들 사이에 반드시 성립해야 하는 수학적 관계(방정식)를 정의합니다. 증명(proof)을 생성한다는 것은, 이 모든 제약 조건을 만족하는 신호값들을 찾았다는 것을 의미합니다. A === B: A와 B의 값이 반드시 같아야 한다는 제약 조건을 추가합니다. 이 연산자는 두 신호가 ...

Circom SHA256 해시 예제

Circom SHA256 해시 예제 아래 문서의 예제를 약간 변형해서 SHA256 해시 검증을 실습하였습니다. Zero-Knowledge Proof of SHA256 Hash using zkSNARK , Binod, Medium 회로 생성 프로젝트 디렉토리에서 회로 파일 program.circom 작성 pragma circom 2.0.0; include "./circomlib/circuits/sha256/sha256.circom"; template program() { signal input in[8]; signal output out[256]; component SHA = Sha256(8); SHA.in <== in; out <== SHA.out; } component main = program(); 프로젝트 디렉토리에서 Git 저장소 circomlib 복제 git clone https://github.com/iden3/circomlib.git 회로 컴파일 circom program.circom --r1cs --wasm --sym --c 신뢰 설정 - Powers of Tau 프로젝트 디렉토리에서 ‘powers of tau’ ceremony 시작 snarkjs powersoftau new bn128 15 pot15_0000.ptau -v 첫 번째 기여 snarkjs powersoftau contribute pot15_0000.ptau pot15_0001.ptau --name="First contribution" -v 신뢰 설정 - Phase 2 program_js 디렉토리에서 Phase 2 준비 (시간이 많이 걸림) snarkjs powersoftau prepare phase2 ..\pot15_0001.ptau pot15_final.ptau -v .r1cs 파...

Circom 예제로 영지식 증명 시작하기 (1)

Circom 예제로 영지식 증명 시작하기 (1) 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 ...

snarkjs 예제로 영지식 증명 시작하기 (2)

snarkjs 예제로 영지식 증명 시작하기 (2) snarkjs 예제로 영지식 증명 시작하기 (1) 에서 작성한 회로의 제한 조건 개수를 1000에서 1로 변경하여 다음 두 가지 예시를 보여 줍니다. 증명 성공 예시 a*a + b의 결과가 20인 두 수를 제공할 수 있음 증명 실패 예시 a*a + b의 결과가 21인 두 수를 제공할 수 있음 1. 회로 생성 제한 조건 개수 변경하여 circuit2.circom 파일로 저장 pragma circom 2.0.0; template Multiplier(n) { signal input a; signal input b; signal output c; signal int[n]; int[0] <== a*a + b; for (var i=1; i<n; i++) { int[i] <== int[i-1]*int[i-1] + b; } c <== int[n-1]; } component main = Multiplier(1); 컴파일 circom --r1cs --wasm --c --sym --inspect circuit2.circom 2. 신뢰 설정 - Phase 2 snarkjs 예제로 영지식 증명 시작하기 (1) 의 중간 결과물을 활용하면서 새로 생성하는 파일들이 기존 파일들을 덮어쓰는 것을 피하기 위하여 circuit2_js 디렉토리로 이동하여 다음 작업들을 수행합니다. Phase 2 준비 snarkjs powersoftau prepare phase2 ..\pot14_beacon.ptau pot14_final.ptau -v 마지막 ptau 검증 snarkjs powersoftau verify pot14_final.ptau .r1cs 파일과 연관된 .zkey 파일 생성 snarkjs groth16 setup ..\circuit2.r...

Circom 예제로 영지식 증명 시작하기 (2)

Circom 예제로 영지식 증명 시작하기 (2) Circom 예제로 영지식 증명 시작하기 (1) 에서 작성한 회로를 사용하여 다음 두 가지 예시를 보여 줍니다. 증명 성공 예시 곱셈의 결과가 34인 두 수를 제공할 수 있음 증명 실패 예시 곱셈의 결과가 33인 두 수를 제공할 수 있음 곱셈의 결과가 34인 두 수를 제공할 수 있음 1. witness 계산하기 입력 값, 중간 신호, 출력 값을 witness 라고 합니다. multiplier2_js 디렉토리로 이동합니다. cd multiplier2_js 아래 내용을 input2.json 파일에 저장합니다. {"a": "2", "b": "17"} witness를 계산하여 witness2.wtns 파일에 저장합니다. node generate_witness.js multiplier2.wasm input2.json witness2.wtns 2. 증명 성공 예시 2.1. 증명 생성 회로 및 witness와 연관된 증명을 생성합니다. snarkjs groth16 prove multiplier2_0001.zkey witness2.wtns proof2.json public2.json 위 명령은 다음 두 파일을 생성합니다. proof2.json : 증명 포함 { "pi_a": [ "14743280952072949668948706550574899717145559551048017963794441189237494636481", "14298005267871599183835964858782397954547197261581693679006469198474879205631", "1" ], "pi_b": [ [ "362627714403151142...

snarkjs 예제로 영지식 증명 시작하기 (1)

snarkjs 예제로 영지식 증명 시작하기 (1) snarkjs README.md 문서를 따라하면서 작성한 문서입니다. 실습 환경: 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. 신뢰 설정 - Powers of Tau “powers of tau” ceremony 시작 snarkjs powersoftau new bn128 14 pot14_0000.ptau -v 첫 번째 기여 snarkjs powersoftau contribute pot14_0000.ptau pot14_0001.ptau --name="First contribution" -v 두 번째 기여 snarkjs powersoftau contribute pot14_0001.ptau pot14_0002.ptau --name="Second contribution" -v -e="some random text" 세 번째 기여 snarkjs powersoftau export challenge pot14_0002.ptau challenge_0003 snarkjs powersoftau challenge contribute bn128 challenge_0003 response_0003 -e="some random text" snarkjs powersoftau import respon...