# 당신이 이 글을 읽어야 하는 이유

솔직히 한 번쯤 이런 생각을 해본 적이 있을 것이다.

> "요즘 다들 zk-SNARK, zk-STARK, 롤업, 프라이버시 얘기하던데… 나도 쓰긴 쓰지만, **정확히 어떻게 돌아가는지는 모른다**."

문제는, 지금 이 순간에도 사용자가 접근하는 L2, 프라이버시 프로토콜, 지갑, 해커톤 프로젝트 어딘가에서 **"남이 짠 zk 회로"에 자산과 신뢰를 그대로 맡기고 있다는 점이다.**

영지식 증명(Zero-knowledge Proof, ZKP)은 이제 "있으면 멋있는 기술"이 아니라, 잘못 이해하면 **바로 공격 벡터가 되는 인프라**이다. 라이브러리를 한 줄만 호출하면 끝나는 것처럼 보이지만, 회로를 어떻게 설계했는지, 어떤 가정을 쓰는지 모른 채로 도입하면 오히려 프로토콜 전체를 위험하게 만들 수 있다.

이 문서는 이러한 상황을 피하기 위해, **ZKP를 한국어로, 단계별로, 실제 개발·보안 관점에서 이해하고자 하는 사람**을 위한 학습 허브이다. 단순히 정의를 외우는 수준을 넘어서,

* 왜 이런 증명이 필요한지
* Groth16, Plonk, STARK가 각각 무엇을 전제로 어떻게 설계되었는지
* Circom / Noir / Halo2 같은 도구들이 실제로 어떤 "레벨"에서 무엇을 해주는지
* 회로와 증명 시스템이 어디에서 깨지고, 어떤 방식으로 공격이 이루어지는지

까지 한 번에 연결해서 보는 것을 목표로 한다.

***

이 글의 전체 구조는 다음과 같은 STEP으로 구성되어 있다.

* **STEP 0 - Prerequisite** 영지식 증명을 이해하기 위해 필요한 최소한의 수학·암호학 배경을 정리한다. 군, 다항식, 커밋먼트, 보안 가정 등 이후 단계에서 반복적으로 등장하는 개념을 미리 정리하는 구간이다.
* **STEP 1 - Groth16** 가장 클래식한 SNARK인 Groth16을 통해, R1CS, trusted setup, 증명·검증 과정이 어떻게 이어지는지 **첫 번째 전체 그림**을 잡는다.
* **STEP 2 - KZG & Plonk** KZG 다항식 커밋먼트와 Plonk 계열 프로토콜을 다룬다. Groth16과 무엇이 다른지, 왜 "범용 회로"에 더 적합한지, 셋업과 회로 설계에서 어떤 트레이드오프가 발생하는지 살펴본다.
* **STEP 3 - STARK** 해시 기반, 투명한 셋업, IOP 구조를 사용하는 STARK를 정리한다. "SNARK vs STARK"라는 밈 뒤에 숨은 실제 구조적 차이를 설명한다.
* **STEP 4 - ZK Lang & Proof System** Circom, Noir, Halo2를 중심으로 **ZK 개발 스택**을 소개한다. 무엇이 "언어(DSL)"이고 무엇이 "프루빙 시스템"인지, 각 도구가 어디에 위치해 어떤 역할을 수행하는지 한 페이지에서 비교한다.
* **STEP 5 - ZK Circuit Security** 잘못된 constraint, 입력 검증 누락, 파라미터 오용 등으로 실제로 어떤 취약점이 발생하는지, ZK 회로와 proof 레벨의 공격 표면을 정리한다.
* **부록 / 용어 정리** 본문에서 자주 등장하는 용어·기호·수식을 따로 모아둔 부분이다. 읽다가 막히면 "용어 정리"를, 더 깊게 파고들고 싶으면 "부록"을 참고하면 된다.

***

이 문서의 목표는 단순히

> "ZKP는 프라이버시를 지키는 멋있는 기술이다"

라는 이해에서 끝나는 것이 아니다.

최소한,

> "지금 사용하는 프로토콜은 Groth16/Plonk/STARK 중 무엇을 사용하며,
>
> 어떤 회로·프루빙 구조와 어떤 보안 가정을 갖고 있고, 어디가 잠재적으로 취약한지"

를 설명할 수 있는 상태에 도달하는 것을 목표로 한다. STEP 0부터 순서대로 따라가도 되고, 이미 알고 있는 부분은 건너뛰고 관심 있는 STEP만 선택해서 읽어도 무방하다.

이제 "남이 짜 준 zk"에 의존하는 단계에서 벗어나, **이해하고 선택한 zk**를 다루는 단계로 넘어가는 것을 이 문서의 최종 지향점으로 삼는다.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://upsidezkp.gitbook.io/upside-zkp-docs/intro.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
