기본 콘텐츠로 건너뛰기

라벨이 영지식 증명인 게시물 표시

ZKP-7. 다항식 약정 - 설정(Setup) 단계 상세 설명

영지식 증명, 특히 zk-SNARKs와 같은 시스템에서 설정(Setup) 단계는 전체 시스템의 보안과 신뢰성을 좌우하는 가장 중요한 첫 단추입니다. 이 단계의 주된 목적은 증명 생성(Proving)과 검증(Verifying) 과정에서 공통적으로 사용될 공개된 파라미터(Public Parameters)를 생성하는 것입니다. 이 파라미터를 CRS(Common Reference String) 또는 SRS(Structured Reference String)라고 부릅니다. 설정 단계의 핵심 목표 설정 단계의 목표는 명확합니다. 증명자와 검증자가 다항식에 대한 약속(Commitment)을 만들고, 특정 지점에서의 다항식 값을 공개하지 않으면서도 그 값이 올바르다는 것을 증명하고 검증할 수 있는 '암호학적 기반'을 마련하는 것입니다. 설정 단계의 세부 과정 설정 단계는 크게 두 가지 핵심 과정으로 나눌 수 있습니다. 1. 암호학적 기본 요소 선택 먼저, 다항식 약정 스킴에 사용할 기본적인 암호학적 환경을 결정합니다. 유한체(Finite Field) 선택: 다항식의 계수와 변수가 속할 숫자 체계를 정의합니다. 보통 매우 큰 소수 p를 사용하여 Fp​와 같은 유한체를 사용합니다. 타원 곡선 그룹(Elliptic Curve Group) 선택: 약속(Commitment)을 생성하기 위해 타원 곡선 암호(ECC)를 사용합니다. 특정 타원 곡선과 그 위의 생성점(Generator Point) G를 선택합니다. 이 그룹 연산은 이산 로그 문제(Discrete Logarithm Problem)의 어려움에 기반하여 보안성을 가집니다. 2. CRS(Common Reference String) 생성 이것이 설정 단계의 가장 핵심적인 부분입니다. CRS는 비밀 값(Secret Value)으로부터 파생된 일련의 암호화된 정보이며, 한번 생성되면 증명자와 검증자 모두가 사용하게 됩니다. 비밀 값(Toxic Waste) 생성: 아무도 알아서는 안 되는 비밀 값, τ (타우)를 ...

ZKP-6. 다항식 약정 - 기본 개념부터 KZG 스킴까지

어떻게 하면 수백만 개의 데이터로 이루어진 계산을 올바르게 수행했음을, 계산 과정 전체를 보여주지 않고도 간결하게 증명할 수 있을까요? 혹은, 내가 특정 비밀 정보(다항식)를 알고 있다는 사실을, 그 정보를 전혀 노출하지 않고 어떻게 신뢰시킬 수 있을까요? 이 어려운 질문에 대한 암호학적 해답이 바로 다항식 약정 스킴(Polynomial Commitment Scheme)입니다. 이는 zk-SNARKs와 같은 현대 영지식 증명 시스템의 핵심 엔진 역할을 합니다. 1. 다항식 약정이란? 다항식 약정을 간단히 비유하자면, '내용을 숨긴 채 상자를 봉인하는 것'과 같습니다. 여기서 '상자'는 다항식 P(x) 자체를, '봉인'하는 행위가 '약정(Commit)'에 해당하며, 봉인된 상자에 붙이는 고유한 '밀랍 인장'이 바로 '약정값(Commitment)' C입니다. 약정 (Commit): 증명자는 자신이 알고 있는 다항식 P(x)를 암호학적으로 처리하여 매우 짧은 길이의 '약정(Commitment)' C를 생성합니다. 이는 마치 다항식의 '지문'이나 '해시'와 같습니다. 이 C를 검증자(Verifier)에게 먼저 보냅니다. 개봉 (Open): 나중에 검증자가 다항식에 대한 정보(예: 특정 지점 z에서의 평가값 P(z))를 요구하면, 증명자는 해당 정보와 함께 이 정보가 처음에 약정한 다항식 P(x)와 일치함을 증명하는 '증명(Proof)' π를 제출합니다. 이 과정의 핵심 속성은 다음과 같습니다. 은닉성 (Hiding): 약정 C만으로는 원래 다항식 P(x)에 대한 어떤 정보도 알 수 없습니다. 결속성 (Binding): 증명자가 한번 약정 C를 제출하고 나면, 원래 약속했던 다항식 P(x)가 아닌 다른 다항식 P'(x)에 대한 유효한 증명을 만들어내는 것은 계산적으로 불가능합니다. 즉, 말을 바꿀 수 없습니다. 2...

ZKP-5. 타원곡선 페어링 - 덧셈의 세계에서 곱셈의 세계로

영지식 증명(Zero-Knowledge Proof, ZKP)을 공부하다 보면 '타원곡선 페어링(Elliptic Curve Pairing)'이라는 개념을 자주 접하게 됩니다. 페어링은 타원곡선이라는 '덧셈의 세계'와 또 다른 '곱셈의 세계'를 연결하는 마법 같은 다리 역할 을 합니다. 타원곡선 암호는 덧셈 연산에 기반하는데, 많은 영지식 증명은 '곱셈 관계'의 검증을 필요로 합니다. 페어링은 바로 이 간극을 메워, 덧셈의 세계에 있는 값들을 이용해 곱셈 관계가 성립하는지를 검증할 수 있게 해줍니다. 이 덕분에 zk-SNARKs와 같은 고급 암호화 프로토콜이 가능해집니다. 이 글에서는 타원곡선 페어링이 무엇인지, 그리고 어떻게 영지식 증명에 사용되는지 쉽게 풀어 설명해 보겠습니다. 1. 페어링이란 무엇인가요? (기본 개념) 페어링은 간단히 말해, 특정 수학적 구조(타원곡선 위의 점들의 그룹)에 있는 두 개의 원소를 입력으로 받아, 다른 수학적 구조(곱셈 순환 그룹)에 있는 하나의 원소로 매핑(mapping)하는 함수입니다. 이 함수를 e 라고 표현한다면, 다음과 같이 나타낼 수 있습니다. e(P, Q) -> n 여기서 P는 그룹 $G_1$의 원소(타원곡선 위의 점), Q는 그룹 $G_2$의 원소(또 다른 타원곡선 위의 점)이며, 페어링 함수 e 는 이 둘을 곱셈 연산이 정의된 대상 그룹 $G_T$의 원소 n으로 변환합니다. 즉, 두 개의 타원곡선 위 점을 입력받아 곱셈 세계의 원소 하나를 출력하는 함수라고 생각할 수 있습니다. 이 함수가 특별한 이유는 바로 '쌍선형성(Bilinearity)'이라는 독특한 성질 때문입니다. 2. 페어링의 핵심 성질: 쌍선형성(Bilinearity) 쌍선형성은 페어링을 암호학적으로 유용하게 만드는 가장 중요한 특징입니다. 수식으로 표현하면 조금 복잡해 보이지만, 그 의미는 생각보다 직관적입니다. e(aP, bQ) = e(P, Q)^(ab) 이 수식이 의미하는...

ZKP-4. 영지식 증명: 계산을 다항식 문제로 변환하기

영지식 증명(Zero-Knowledge Proof)의 핵심은 '무언가를 안다’는 사실을, 그 ‘무엇’ 자체는 공개하지 않고 증명하는 것입니다. 이를 실현하기 위해 암호학자들은 아주 독창적인 방법을 고안했습니다. 바로 컴퓨터가 수행하는 복잡한 '계산’을, 간결하고 강력한 '다항식의 관계’로 번역 하는 것입니다. 이 번역 과정만 이해하면 영지식 증명의 가장 중요한 원리를 파악할 수 있습니다. 이 문서에서는 간단한 예제를 통해 그 과정을 단계별로 살펴보겠습니다. 우리가 증명하려는 계산은 x³ + x + 5 = 35 입니다. 증명자(Prover)는 이 방정식의 해인 x=3 이라는 비밀값을 알고 있음을 검증자(Verifier)에게 증명하고자 합니다. 1단계: 계산의 평탄화 (Flattening) - 산술 회로로 변환 가장 먼저, 복잡한 계산식을 기본적인 산술 연산(덧셈, 뺄셈, 곱셈)의 연속으로 분해하여 산술 회로(Arithmetic Circuit)로 만듭니다. 각 연산은 하나의 '게이트(gate)'가 됩니다. 이 과정은 컴퓨터가 이해하는 복잡한 로직을 영지식 증명 시스템이 처리할 수 있는 표준화된 형식으로 바꾸는 첫 단계입니다. x³ + x + 5 식은 다음과 같이 분해할 수 있습니다. sym_1 = x * x (x²) sym_2 = sym_1 * x (x³) sym_3 = sym_2 + x (x³ + x) ~out = sym_3 + 5 (x³ + x + 5) 이제 x=3 이라는 비밀값을 각 단계에 대입하여 중간 결과값을 계산합니다. x = 3 sym_1 = 3 * 3 = 9 sym_2 = 9 * 3 = 27 sym_3 = 27 + 3 = 30 ~out = 30 + 5 = 35 이 산술 회로는 계산의 흐름을 명확하게 보여주는 청사진 역할을 합니다. 위 다이어그램은 각 변수가 게이트를 통해 어떻게 연결되고 변환되는지 시각적으로 보여줍니다. 2단계: R1CS(Rank-1 Constraint System)로 표현 다음으로,...

ZKP-3. 유한체 산술 회로와 영지식 증명에서의 활용

논리 회로부터 시작해서 어떻게 유한체 산술 회로가 영지식 증명에 활용되는지 차근차근 알아보겠습니다. 1. 논리 회로 (Logic Circuit) 논리 회로는 컴퓨터 과학의 가장 기본적인 개념으로, 참(True/1)과 거짓(False/0)이라는 두 가지 상태(비트)를 입력받아 논리 연산을 수행하고 결과를 출력하는 전자 회로입니다. 컴퓨터의 모든 연산은 근본적으로 이 논리 회로의 조합으로 이루어집니다. 기본 구성 요소: 논리 게이트(Logic Gate)라고 불리는 작은 연산 단위들로 구성됩니다. AND: 두 입력이 모두 참(1)일 때만 참(1)을 출력합니다. OR: 두 입력 중 하나라도 참(1)이면 참(1)을 출력합니다. NOT: 입력을 반대로 뒤집습니다. 참(1)은 거짓(0)으로, 거짓(0)은 참(1)으로 바꿉니다. 이 외에도 NAND, NOR, XOR 등의 게이트가 있습니다. 표현: 주로 불리언(Boolean) 함수를 표현하는 데 사용됩니다. 예를 들어, f(x, y) = x AND y 와 같은 함수를 회로로 나타낼 수 있습니다. 특징: 모든 계산을 0과 1의 이진법(binary)으로 처리하는 데 최적화되어 있습니다.  2. 산술 회로 (Arithmetic Circuit) 산술 회로는 논리 회로와 유사하지만, 0과 1 대신 일반적인 숫자(정수, 유리수 등)를 입력받아 산술 연산을 수행하는 회로입니다. 기본 구성 요소: 산술 게이트(Arithmetic Gate)로 구성됩니다. 덧셈(+) 게이트: 두 숫자를 더합니다. 곱셈(×) 게이트: 두 숫자를 곱합니다. 표현: 주로 다항식(Polynomial)을 표현하는 데 사용됩니다. 예를 들어, f(x, y) = x*y + x + 5  와 같은 계산 과정을 덧셈과 곱셈 게이트의 연결로 나타낼 수 있습니다. 차이점: 논리 회로가 비트 단위의 논리 연산에 중점을 둔다면, 산술 회로는 숫자 단위의 덧셈과 곱셈 연산에 중점을 둡니다. 영지식 증명에서는 증명하려는 계산 과정을 다항식으로 변환해...

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 *...

ECC-2. 숫자가 아닌 원소들로 구성된 필드(Field): 유한체, 함수체

우리가 흔히 아는 유리수, 실수, 복소수 집합 외에도 숫자가 아닌 원소들로 구성된 필드가 존재하며, 수학의 여러 분야에서 매우 중요하게 사용됩니다. 가장 대표적인 예는 유한체(Finite Field) 또는 갈루아 체(Galois Field)와 함수체(Function Field)입니다. 유한체 (Finite Fields) 유한체는 이름 그대로 원소의 개수가 유한한 필드입니다. 이 필드의 원소들은 우리가 일반적으로 생각하는 숫자가 아니라, 특정 규칙에 따라 연산되는 '기호'나 '상징'으로 볼 수 있습니다. 가장 단순한 유한체의 예는 $Z_p$​ (또는 GF(p))입니다. 여기서 p는 소수입니다. 이 필드의 원소는 {0,1,2,…,p−1} 이고, 모든 연산은 p로 나눈 나머지를 기준으로 하는 모듈러 연산(modular arithmetic)으로 정의됩니다. 예시: $Z_2$​ (또는 GF(2)) 필드 원소: {0, 1} 덧셈: 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 (2를 2로 나눈 나머지는 0) 곱셈: 0 · 0 = 0 0 · 1 = 0 1 · 0 = 0 1 · 1 = 1 이 집합 {0, 1}과 위의 연산 규칙은 덧셈, 뺄셈(덧셈의 역원), 곱셈, 나눗셈(곱셈의 역원)에 대한 필드의 모든 공리를 만족합니다. 예를 들어, 1의 덧셈에 대한 역원은 1 자신이며, 1의 곱셈에 대한 역원도 1 자신입니다. 이러한 유한체는 숫자의 집합이라기보다는, 특정 규칙을 따르는 기호들의 집합으로 볼 수 있습니다. 유한체는 암호학(cryptography), 코딩 이론(coding theory), 컴퓨터 과학 등에서 핵심적인 역할을 합니다. 함수체 (Function Fields) 유리함수(rational functions)의 집합 역시 필드를 이룰 수 있습니다. 유리함수는 두 다항식의 분수 형태로 표현되는 함수입니다. 예시: 실수 계수를 갖는 유리함수체 R(x) 이 필드의 원소는 변수 x에 대한 유리함수, 즉 $f(x)=\fra...

ECC-1. 수학의 '필드(Field)': 사칙연산이 자유로운 대수적 구조

수학에서 필드(Field), 우리말로는 체(體)는 덧셈, 뺄셈, 곱셈, 나눗셈(0으로 나누는 경우 제외)이라는 네 가지 기본 연산, 즉 사칙연산이 자유롭게 가능하고 우리가 일반적으로 사용하는 수의 체계와 유사한 성질을 만족하는 대수적 구조를 말합니다. 쉽게 말해, 필드는 우리가 일상적으로 숫자를 다루는 방식의 규칙들을 엄밀하게 정의해 놓은 집합이라고 할 수 있습니다. 필드가 되기 위해서는 특정 공리(Axiom)들을 만족해야 합니다. 이 공리들은 덧셈과 곱셈이라는 두 가지 연산에 대해 정의됩니다. 필드의 공리 (Field Axioms) 어떤 집합 F가 두 연산 '+'(덧셈)와 '·'(곱셈)에 대해 필드라고 불리기 위해서는 다음의 조건들을 모두 만족해야 합니다. 덧셈에 관한 공리 (F, +)는 가환군(Abelian Group)을 이룬다: 닫힘: F에 속하는 임의의 두 원소 a, b에 대해, a + b 도 F에 속한다. 결합법칙: F에 속하는 임의의 세 원소 a, b, c에 대해, (a + b) + c = a + (b + c) 가 성립한다. 항등원 존재: 모든 원소 a에 대해 a + 0 = a 를 만족하는 '덧셈에 대한 항등원' 0이 F에 존재한다. 역원 존재: F의 각 원소 a에 대해 a + (-a) = 0 을 만족하는 '덧셈에 대한 역원' -a가 F에 존재한다. (이를 통해 뺄셈이 정의됩니다: a - b = a + (-b)) 교환법칙: F에 속하는 임의의 두 원소 a, b에 대해, a + b = b + a 가 성립한다. 곱셈에 관한 공리 (F \ {0}, ·)는 가환군(Abelian Group)을 이룬다: 닫힘: F에 속하는 임의의 두 원소 a, b에 대해, a · b 도 F에 속한다. 결합법칙: F에 속하는 임의의 세 원소 a, b, c에 대해, (a · b) · c = a · (b · c) 가 성립한다. 항등원 존재: 모든 원소 a에 대해 a · 1 = a 를 만족하는 '곱셈에 대...

정보 보안 vs. PETs: 데이터를 '지키는' 기술과 '안전하게 활용하는' 기술

정보 보안 기술과 개인정보보호 강화 기술(PETs)은 데이터를 보호한다는 공통점을 갖지만, 목표와 범위, 핵심 기능에서 뚜렷한 차이를 보입니다. 정보 보안 기술이 외부의 위협으로부터 데이터라는 성을 지키는 '견고한 방패'라면, PETs는 성 안의 중요한 개인정보를 보호하면서도 안전하게 바깥과 교류(활용)할 수 있도록 길을 열어주는 '마법 열쇠'에 비유할 수 있습니다. 핵심 목표의 차이 가장 큰 차이는 기술이 추구하는 핵심 목표에 있습니다. 정보 보안 기술: 정보의 기밀성(Confidentiality), 무결성(Integrity), 가용성(Availability), 즉 '정보 보안의 3요소(CIA Triad)' 보장을 최우선으로 합니다. 허가되지 않은 접근을 막고, 데이터 위변조를 방지하며, 필요할 때 언제든 데이터에 접근할 수 있도록 시스템을 보호하는 데 초점을 맞춥니다. 개인정보보호 강화 기술 (PETs): 데이터를 적극적으로 활용하면서도 그 과정에서 특정 개인이 노출되지 않도록 '익명성'을 보장하고, 정보 주체가 자신의 데이터를 통제할 수 있는 '통제권'을 부여하는 것을 핵심 목표로 삼습니다. 이는 '데이터 활용 가치 극대화'와 '프라이버시 철저 보호'라는, 자칫 상충될 수 있는 두 마리 토끼를 모두 잡으려는 기술적 시도입니다. 범위 및 주요 기술 목표가 다른 만큼 기술의 범위와 적용되는 주요 기술에도 다음과 같은 차이가 있습니다. 정보 보안 기술 (Information Security Technologies) 주요 목표: 시스템 및 데이터의 기밀성, 무결성, 가용성 확보 보호 대상: 데이터가 저장된 시스템, 네트워크, 서버 등 조직의 '인프라' 전체 (개인정보는 보호해야 할 여러 정보 자산 중 하나로 간주) 핵심 기능: 접근 통제, 암호화, 위협 탐지 및 대응, 방화벽, 백신 기술 예시:   네트워크 보안 (방화벽, 침입 탐지 시스템...

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 파...

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...