> For the complete documentation index, see [llms.txt](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/advanced/zk-snartks.md).

# zk-SNARTKs

사전 지식

[영지식 증명](/smartcontract-security-docs/basics/undefined/zero-knowledge-proof-zkp.md): 비대화형 영지식 증명의 원리와 영지식 증명이 왜 개인정보 보호에 유리한지를 이해한 후 읽는 것을 추천한다.

### zk-SNARK 개요

zk-SNARK는 영지식 증명의 한 종류로, 그 이름인 **Zero-Knowledge Succinct Non-Interactive Argument of Knowledge**는 이 기술의 핵심적인 네 가지 특성을 압축적으로 담고 있다.

* **S**uccinct (간결성): zk-SNARK의 가장 큰 특징 중 하나는 생성된 증명의 크기가 매우 작다는 것이다. 증명해야 할 계산의 복잡도와 무관하게, 증명 자체는 수백 바이트(bytes) 수준으로 간결하며, 이를 검증하는 데 걸리는 시간 또한 수 밀리초(milliseconds)에 불과하다.
* **N**on-interactive (비대화형): 증명자는 독립적으로 증명을 생성하고, 이 단일 증명 메시지를 제출하면 누구나, 언제든지 이를 검증할 수 있다. 이는 증명을 블록체인에 트랜잭션으로 게시하고 불특정 다수의 노드가 이를 검증하는 시나리오에 부합한다.
* **Ar**gument (논증): '논증(argument)'은 현재의 기술 수준에서 현실적인 계산 능력(polynomially bounded)을 가진 공격자는 거짓 증명을 만들어 검증자를 속일 수 없다는 가정을 전제로 한다.
* **K**nowledge (지식): zk-SNARK는 증명자가 단순히 어떤 명제가 참이라는 사실을 증명하는 것을 넘어, 그 명제를 참으로 만드는 구체적인 정보, 즉 '증인(witness)'을 실제로 '알고 있음(knowledge)'을 증명하는 것이다. 예를 들어, "x³ + x + 5 = 35를 만족하는 x가 존재한다"가 참임을 증명하는 것은, "나는 그 x가 3이라는 사실을 알고 있다"는 지식 자체를 증명한다. 증명자는 증인(witness) 없이는 유효한 증명을 생성할 수 없으며, 이는 증명자가 단순히 추측하거나 다른 사람의 증명을 복사한 것이 아님을 보장한다. 블록체인에서 증인(witness)은 지출하려는 주소, 특정 머클트리 노드의 경로 등이 될 수 있다.

zk-snarks는 작동을 위해 **신뢰 설정(Trusted Setup)'**&#xC774;라는 사전 준비 단계를 필요로 한다. 이 단계는 zk-SNARK의 보안과 신뢰성에 결정적인 영향을 미친다.

신뢰 설정의 주된 목적은 증명 생성과 검증에 필요한 '증명 키(Proving Key)'와 '검증 키(Verification Key)'를 생성하는 것이다. 이 키들은 통칭하여 공통 참조 문자열(Common Reference String, CRS)이라고 불린다. CRS는 증명자가 검증에 필요한 계산을 수행할 수 있도록 돕지만, 증명자 자신은 이 비밀 값을 알지 못하도록 하는 역할을 한다.

CRS 생성이 완료된 후, 이 비밀 값은 즉시 그리고 영구적으로 파기되어야 한다. 만약 어떤 악의적인 행위자가 이 비밀 값을 획득하게 되면, 그는 시스템의 제약 조건을 따르지 않는 거짓 명제에 대해서도 유효해 보이는 증명을 무한정 생성할 수 있게 된다.

\[출처] <https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell>,

{% embed url="<https://medium.com/qed-it/diving-into-the-snarks-setup-phase-b7660242a0d7>" %}

***

### Private 데이터 보호를 위한 zk-SNARKs 활용

[**Ethernaut 8번** ](/smartcontract-security-docs/ethernaut/8.-vault.md)문제에서 알아봤듯, private 변수여도 **온체인에 저장된 데이터**에는 진정한 의미의 프라이버시가 존재하지 않는다. 이런 이더리움의 투명성 문제를 해결하기 위해 zk-SNARKs 기반으로 '오프체인(Off-chain) 연산, 온체인(On-chain) 검증'이라는 핵심적인 패러다임을 채택한다.

즉, 민감한 데이터와 관련된 모든 계산은 온체인 외부에서 수행하고, 그 계산이 정당하게 이루어졌다는 사실만을 zk-SNARK 증명을 통해 온체인에서 검증하는 방식이다.

<figure><img src="https://2462457462-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLf9vwRuaws92ULgGvzTi%2Fuploads%2FeTDSLo6prmcbychBvEe4%2Fimage.png?alt=media&amp;token=4e03cb82-e47e-41ba-9e97-90fc8735341e" alt=""><figcaption><p>[출처] <a href="https://rareskills.io/post/how-does-tornado-cash-work">https://rareskills.io/post/how-does-tornado-cash-work</a></p></figcaption></figure>

### 상세 과정

* **상태 커밋먼트 (State Commitment)**

실제 민감한 데이터(예: 사용자의 잔액)를 온체인에 직접 저장하지 않고 데이터를 암호학적으로 요약한 값인 '커밋먼트(Commitment)'를 스토리지에 저장한다. 커밋먼트는 주로 해시 함수를 사용하여 생성되며, `commitment = hash(value, salt)`와 같은 형태를 띤다.

* **상태 전이 증명 (State Transition Proof)**

사용자가 트랜잭션을 실행할 때, 이 연산은 **모두 오프체인에서** 이루어진다. 이후 사용자는 이 상태 전이가 유효했음을 증명하는 zk-SNARK를 생성한다. 이 증명은 "나는 송금 전 잔액(`old_balance`)과 송금액(`value`)이라는 비밀 정보를 알고 있으며, 이 정보들을 바탕으로 계산한 새로운 잔액(`new_balance = old_balance - value`)이 정확하고, 송금 전 잔액이 송금액보다 크거나 같았다"는 복합적인 명제를 증명한다.

이 증명 생성 과정에는 `old_balance`, `value`, `new_balance`와 같은 민감한 정보들이 '증인(witness)'으로 사용되지만, 생성된 증명에는 이 정보들이 노출되지 않는다.

* **널리파이어 (Nullifier)를 통한 이중지불 방지**

상태 커밋먼트 모델에서는 어떤 상태(예: 특정 입금 노트(Note))가 사용되었는지를 추적하기 어렵다는 문제가 있다. 이를 해결하기 위해 '널리파이어(Nullifier)'라는 개념이 도입된다.

사용자가 특정 상태(노트)를 사용할 때, 해당 상태에 대한 고유한 널리파이어를 생성하여 온체인에 공개한다. 하지만 널리파이어 자체만으로는 어떤 노트에서 파생되었는지 알 수 없도록 설계되어 익명성을 유지한다. 스마트 컨트랙트는 제출된 널리파이어가 이전에 사용된 적이 있는지 기록하고 확인하여, 동일한 노트가 두 번 이상 사용되는 것을 방지한다.

* **온체인 검증 및 상태 루트 (State Root) 업데이트**

최종적으로 사용자는 생성된 **zk-SNARK 증명**, **상태 커밋먼트**, **널리파이어**를 온체인 스마트 컨트랙트에 제출한다. 컨트랙트는 다음의 두 가지를 검증한다.

1. 제출된 zk-SNARK 증명이 유효한가?
2. 제출된 널리파이어가 이전에 사용된 적이 없는가?

이 두 가지 검증을 모두 통과하면, 컨트랙트는 새로운 상태 커밋먼트를 받아들여 온체인의 상태 루트를 업데이트한다. 이로써 **모든 민감한 정보는 오프체인에 남겨둔 채, 상태 변경의 유효성만이 온체인에서 안전하게 검증되고 기록된다.**

\[출처] <https://medium.com/coinmonks/the-use-of-zk-snark-in-an-ethereum-tumbler-b370ded1ec4e>

아래 zk-SNARKs를 사용한 코인 Tornado Cash의 도식을 보면, 오프체인 연산과 온체인 검증까지의 과정을 한눈에 볼 수 있다.&#x20;

<figure><img src="https://2462457462-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLf9vwRuaws92ULgGvzTi%2Fuploads%2FPv9MvGQdvVRgbEypuJD2%2Fimage.png?alt=media&amp;token=69273eb9-bb11-4d48-b793-f970142053e2" alt=""><figcaption><p>[출처] <a href="https://rareskills.io/post/how-does-tornado-cash-work">https://rareskills.io/post/how-does-tornado-cash-work</a></p></figcaption></figure>

***

### 응용 분야의 확장

zk-SNARKs 기술은 이제 초기 활용 분야였던 프라이버시 코인과 롤업을 넘어, 블록체인 생태계 전반의 신뢰 문제를 해결하는 범용 기술로 확장되고 있다.

* **ZK-Bridge:** 서로 다른 블록체인 간의 상호운용성을 위한 멀티시그(multi-sig) 브릿지는 소수의 신뢰 주체에 의존하여 보안 위험이 컸다. ZK-Bridge는 한 체인의 블록 헤더와 합의 상태를 ZKP로 압축하여 다른 체인의 스마트 컨트랙트에서 검증하는 방식을 사용한다. 이를 통해 외부의 신뢰 가정 없이, 오직 양쪽 체인의 수학적 보안에만 의존하는 브릿지를 구현할 수 있다.
* **ZKML (Zero-Knowledge Machine Learning):** 인공지능(AI) 모델의 추론 과정을 ZKP로 증명하는 기술이다. 이를 통해 모델의 가중치나 학습 데이터와 같은 지적 재산이나 민감한 정보를 공개하지 않으면서도, "특정 AI 모델이 주어진 입력에 대해 특정 결과를 출력했음"을 온체인에서 검증할 수 있다.
* **탈중앙화 신원(DID) 및 소셜 미디어:** 사용자가 자신의 신원 정보(예: "나는 대한민국 국민이다", "나는 19세 이상이다")를 직접 노출하지 않고, 특정 자격 조건을 충족한다는 사실만을 증명하는 데 ZKP를 활용할 수 있다. 이는 투표 시스템 등 다양한 분야에 적용될 수 있다.
