느린 안개: ZKP 주류 구현 방안 기술 특징 정리

슬로우미스트
2023-02-13 19:23:03
수집
개발자가 제로 지식 증명 회로를 개발할 때, 요구 사항에 따라 적합한 프레임워크를 선택하고 프로젝트가 출시되기 전에 애플리케이션의 보안성에 대한 포괄적인 보안 감사를 수행해야 한다는 점에 유의해야 한다.

출처: 느린 안개

개요

블록체인 시스템의 작동 원리를 연구할 때, 우리는 secp256k1와 같은 다양한 암호학 지식을 이해해야 합니다. 이는 곡선 및 비대칭 서명 알고리즘으로, 비트코인 및 이더리움 시스템에서 계정을 서명하고 검증하는 데 사용됩니다. 예를 들어 sha256은 가변 길이 정보를 고정 길이 인코딩으로 압축하는 해시 알고리즘입니다. base58은 정보를 인코딩하여 인쇄 가능한 문자로 표현된 문자열로 변환할 수 있습니다. ECDH는 P2P 노드 간에 통신 키를 안전하게 교환하는 데 사용되는 Diffie-Hellman 키 교환 알고리즘입니다.

제로 지식 증명(Zero-knowledge Proof) 또한 암호학 알고리즘의 일종으로, ZKP 또는 ZK로 약칭되며, 다른 정보를 누출하지 않고도 명제의 진위를 증명할 수 있는 특징이 있습니다(많은 사람들은 제로 지식 증명이라는 이름에 이의를 제기하며 "제로 누출 증명"이 본질적인 능력을 더 잘 나타낸다고 생각합니다).

ZKP는 1985년에 처음 제안되었지만, 오랫동안 대규모 응용 사례를 찾지 못해 기술 발전이 매우 느렸습니다. 2009년 비트코인이 탄생한 이후, 사람들은 블록체인에서 프라이버시와 확장성 문제를 해결하는 데 매우 적합하다는 것을 발견하였고, 이후 많은 자본과 인재가 이 기술의 개발 및 엔지니어링 응용에 투입되었습니다. ZKP에는 Groth16, PlonK, STARK 등 많은 구현이 있으며, 현재까지 진정한 산업 표준은 나타나지 않았습니다. 본 문서에서는 다양한 ZKP 구현의 기술적 특징을 정리하여, 여러분의 학습 연구 및 엔지니어링 개발에 도움이 되기를 바랍니다.

ZKP 응용 분야

1. 프라이버시 증명

Zcash는 ZKP가 널리 사용된 첫 번째 응용 프로그램일 수 있으며, 비트코인 소스 코드를 기반으로 ZKP를 토큰 전송에 적용하여 거래 정보를 완전히 비밀로 유지하면서도 블록체인 노드에서 검증할 수 있도록 합니다.

Tornado Cash는 이더리움에서 실행되는 믹서로, ZKP를 사용하여 Merkle-Tree의 노드를 증명합니다. 사용자는 고정 금액의 토큰을 자금 풀에 예치한 후, ZKP로 생성된 증명을 통해 자신이 자금을 예치했음을 증명할 수 있지만, 예치 시의 거래 정보를 노출할 필요는 없습니다.

2. 계산 아웃소싱

블록체인에서 각 노드의 계산 능력은 제한적이지만, ZKP 기술을 활용하면 노드는 대량의 계산을 오프체인 노드에 아웃소싱할 수 있습니다. 이 경우 아웃소싱 제출된 계산 결과와 계산 증명을 검증하기만 하면 계산이 올바른지 알 수 있습니다.

zksync1.0은 좋은 예로, 오프체인에서 이더리움 토큰 전송 및 거래를 수행한 후 결과를 노드에 제출합니다. 노드는 ZKP 증명을 검증하여 그것이 선언된 방법에 따라 계산되었는지 알 수 있습니다.

3. 데이터 압축

Filecoin은 ZKP를 활용하여 시공간 증명 시스템을 구축하여 사용자가 특정 파일을 로컬에 저장했음을 증명할 수 있으며, 현재 저장된 파일의 양은 18 EiB에 달합니다.

Mina는 또 다른 예로, 많은 고속 블록체인 시스템에서 거래 데이터가 매우 방대하여 시스템이 모든 블록을 보존해야 하므로 합의 프로토콜 검증을 위해 하드웨어 요구 사항이 매우 높습니다. 영구 저장은 블록체인 노드가 지속적으로 디스크 공간과 데이터 인덱스 능력을 증가시켜야 함을 의미합니다. 이때 ZKP를 활용하여 검증 데이터를 압축할 수 있으며, Mina는 재귀 제로 지식 증명을 통해 장부를 11 KB로 압축하면서도 블록의 정확성을 검증할 수 있습니다.

ZKP 증명 시스템

증명 시스템은 ZKP의 기본 알고리즘 구현으로, 상호작용식과 비상호작용식으로 나눌 수 있습니다:

1. 상호작용 증명 시스템

상호작용 증명 시스템은 두 당사자가 참여하며, 각각 증명자(Prover, 약칭 P)와 검증자(Verifier, 약칭 V)라고 합니다. P는 특정 비밀(예: 공개 키 암호 체계의 비밀 키 또는 이차 잔여 x의 제곱근)을 알고 있으며, P는 V가 자신이 그 비밀을 실제로 알고 있다고 믿게 하기를 원합니다. 상호작용 증명은 여러 라운드로 구성되며, 각 라운드에서 P와 V는 서로 받은 메시지와 자신이 계산한 결과에 따라 서로에게 메시지를 보낼 수 있습니다. 일반적인 방식은 각 라운드에서 V가 P에게 질문을 하고, P가 V에게 응답하는 것입니다. 모든 라운드가 완료된 후, V는 P가 각 라운드에서 자신이 보낸 질문에 올바르게 응답했는지에 따라 P의 증명을 수용할지 결정합니다.

2. 비상호작용 증명 시스템

위의 상호작용 증명 시스템에서 P와 V는 상호작용하지 않으며, 증명은 P가 생성한 후 직접 V에게 전달되고, V는 증명을 직접 검증합니다. 이러한 증명 시스템을 비상호작용 증명 시스템(NIZK)이라고 합니다.

우리가 블록체인에서 사용하는 증명 시스템은 일반적으로 NIZK이며, 블록체인 내의 노드는 검증자 V이고, 최종 사용자 또는 레이어 2 네트워크는 증명자 P입니다.

문서 끝의 참고 링크 [1]는 지난 10년 동안 공개된 NIZK 솔루션 및 특징을 설명합니다.

실제 엔지니어링 응용에서 우리는 주로 성능과 범용성에 주목하므로, 일반적인 증명 시스템에 대해 더 세부적인 분류 비교를 진행합니다. 문서 끝의 참고 링크 [2]를 참조하십시오:

  • Bulletproofs

    특징: 간결한 증명 크기, 신뢰할 수 있는 설정이 필요 없지만, 증명 생성 및 검증에 시간이 더 걸립니다.

    대표 프로젝트: Bulletproofs, Halo, Halo2.

  • SNARKs (Succinct Non-interactive ARguments of Knowledge)

    특징: 간결한 증명 크기, 증명 검증에 시간이 짧지만, 각 회로에 대해 신뢰할 수 있는 설정이 필요합니다.

    대표 프로젝트: Groth16.

  • SNORKs (Succinct Non-interactive Oecumenical (Universal) ARguments of Knowledge)

    특징: 간결한 증명 크기, 모든 회로에 대해 한 번의 신뢰할 수 있는 설정만 필요합니다.

    대표 프로젝트: Sonic, PlonK, Marlin, Plonky2.

  • STARKs (Succinct (Scalable) Transparent ARguments of Knowledge)

    특징: 증명이 매우 크고, 신뢰할 수 있는 설정이 필요 없으며, 뛰어난 확장성을 가지고 있습니다.

    대표 프로젝트: STARK.

위의 분류는 절대적이지 않으며, Halo/Halo2 프로젝트는 설계 시 Plonk의 많은 아이디어를 참고하였고, SNORKs는 일반적으로 SNARKs에 포함됩니다. 왜냐하면 둘 다 신뢰할 수 있는 설정이 필요하기 때문입니다.

3. 성능 비교

image

image

(문서 끝의 참고 링크 [3] 참조)

회로 프로그래밍

회로는 ZKP 시스템의 비즈니스 논리 구현이며, ZKP 응용 프로그램을 개발하려면 회로 프로그래밍이 필요합니다. 왜 ZKP 논리 코드가 "회로"라고 불리는가? 주로 다음과 같은 몇 가지 이유가 있습니다:

  • ZKP 증명의 코드는 일련의 간단한 제약 조건 표현식 R1CS로 변환되며, 이후 라그랑주 보간법을 사용하여 거대한 다항식 QAP로 변환되고, 최종적으로 게이트 회로 형태로 제약됩니다.

  • 하드웨어 회로와 유사하게, 모든 분기의 코드는 함께 실행됩니다.

  • 하드웨어 회로와 유사하게, ZKP 증명 회로에는 재귀 및 복잡한 루프가 없으며, 루프의 수는 일정해야 합니다.

우리는 암호학을 처음부터 사용하여 ZKP 응용 프로그램을 구현할 필요가 없으며, 많은 개발 라이브러리가 이러한 기본 증명 시스템을 이미 구현하였습니다. 우리는 비즈니스 논리 구현에만 집중하면 됩니다. 물론 각 라이브러리는 서로 다른 추상화 수준을 가지고 있으며, 일부는 회로의 표현식을 배우는 것이 필요하고, 일부는 프로세스에 따라 코드를 정의하기만 하면 쉽게 구현할 수 있습니다.

1. 일반적인 개발 라이브러리

  • libsnark

C++ 언어로 일반 증명 시스템, 기본 회로 라이브러리 및 응용 예제를 구현하였습니다.

증명 시스템: BBFR15, BCCT12, BCCT13, BCGTV13, BCIOP13, BCTV14a, BCTV14b, CTV15, DFGK14, Groth16, GM17, GGPR13, PGHR13.

링크: https://github.com/scipr-lab/libsnark.

  • gnark

Go 언어로 구현된 증명 시스템으로, 회로 설계를 위한 고급 API를 제공합니다.

증명 시스템: Groth16, PlonK.

링크: https://github.com/consensys/gnark.

  • bellman

Rust로 구현된 증명 시스템으로, 회로 인터페이스, 기본 구조 및 일부 기본 회로 구현(예: 불리언 및 수치 추상화)을 제공합니다.

증명 시스템: Groth16.

링크: https://github.com/zkcrypto/bellman.

  • snarkjs

Javascript 및 WASM로 구현된 증명 시스템으로, 신뢰할 수 있는 설정, 증명 생성 및 검증에 사용할 수 있습니다. snarkjs는 iden3의 circom 컴파일러를 사용하여 DSL로 정의된 회로를 컴파일합니다.

증명 시스템: Groth16, PlonK.

링크: https://github.com/iden3/snarkjs.

  • ethsnarks

Python으로 구현되어 사용자의 브라우저에서 증명을 생성할 수 있으며, 이더리움 스마트 계약을 검증자로 사용합니다. 현재 프로젝트 개발이 활발하지 않으며, 동일한 상황에서는 Circom을 사용하는 것이 더 나은 선택일 수 있습니다.

증명 시스템: Groth16.

링크: https://github.com/HarryR/ethsnarks.

  • bulletproofs

Rust로 구현된 증명 시스템으로, 단일 및 집합 범위 증명, 강력한 유형의 다자간 계산을 가지고 있으며, 임의의 문장의 프로그래밍 가능한 제약 시스템 API를 증명하기 위해 개발 중입니다.

증명 시스템: bulletproofs.

링크: https://github.com/dalek-cryptography/bulletproofs.

  • halo2

Rust 기반으로 구현된 증명 시스템으로, ZCash 팀이 유지 관리합니다. Halo2는 PLONKish에 특화되어 있으며, 회로의 산술 연산 표현 방식을 매우 직접적으로 제어할 수 있어 고도로 최적화된 회로를 작성하는 데 매우 적합합니다.

증명 시스템: Halo2.

링크: https://github.com/zcash/halo2.

2. 개발 프로세스

gnark를 예로 들어, 전형적인 작업 흐름은 다음과 같습니다:

image

1) 코드로 해결해야 할 문제를 설명합니다.

2) R1CS 제약 시스템으로 컴파일합니다.

3) R1CS에 대해 신뢰할 수 있는 설정을 수행하여 증명 키와 검증 키를 얻습니다.

4) 증명자는 R1CS와 증명 키를 사용하여 비밀 데이터를 계산하고 증명 Proof를 생성합니다.

5) 검증자는 검증 키를 사용하여 Proof를 검증합니다.

회로 프로그래밍 전용 언어

1. 이더리움 플랫폼 기반

  • Cairo

Cairo는 증명 가능한 프로그램을 작성하기 위한 프로그래밍 언어로, 한 쪽이 다른 쪽에 특정 계산이 올바르게 수행되었음을 증명할 수 있습니다. Cairo와 유사한 증명 시스템은 블록체인에 확장성을 제공합니다. StarkNet은 Cairo 프로그래밍 언어를 기반 시설 및 StarkNet 계약 작성에 사용합니다.

증명 시스템: STARK.

링크: https://www.cairo-lang.org/docs/.

  • Zokrates

ZoKrates는 DSL로 회로를 설명하며, 일반적으로 사용되는 회로 라이브러리를 제공하여 DApp에서 검증 가능한 계산을 사용할 수 있도록 돕습니다. 고급 언어로 프로그램을 명세하고, 계산 증명을 생성하며, Solidity에서 이러한 증명을 검증하는 과정까지 지원합니다.

증명 시스템: GM17, Groth16, Marlin.

링크: https://zokrates.github.io/.

  • Circom

Circom 언어는 DSL로 회로를 설명하며, snarkjs와 함께 사용하여 사용자의 브라우저에서 증명을 생성하고 이더리움 스마트 계약을 검증자로 사용할 수 있습니다.

증명 시스템: Groth16, PlonK.

링크: https://iden3.io/circom.

  • Noir

Aztec의 Rust 기반 프라이버시 프로그래밍 언어로, DSL로 회로를 설명하며, 안전하고 원활하게 프라이버시 보호 제로 지식 회로를 구축할 수 있습니다.

증명 시스템: PlonK.

링크: https://noir-lang.org/index.html.

  • zkEVM

EVM과 마찬가지로 zkEVM은 프로그램 작업의 결과로 상태 간 전환을 수행하는 가상 머신입니다. 그러나 zkEVM은 각 부분의 계산의 정확성을 증명하기 위해 증명을 생성합니다. 본질적으로 zkEVM은 실행 단계가 규칙을 따르도록 증명하는 메커니즘을 사용합니다.

현재 zkSync, Polygon, Scroll, Starkware 등 팀이 zkEVM 구현에 힘쓰고 있으며, 중요한 진전을 이루었습니다.

2. 공공 체인 플랫폼 기반

  • zkApp (Mina)

zkApps는 Mina Protocol의 스마트 계약으로, 제로 지식 증명으로 지원됩니다. zkApps는 오프체인에서 임의의 복잡한 계산을 수행할 수 있으며, 생성된 제로 지식 증명을 블록체인에 보내어 이 계산을 검증하는 데 고정 요금만 부과합니다. 이는 다른 블록체인에서 실행되는 계산과 가변 가스 요금을 사용하는 모델과 반대입니다. zkApps는 Typescript로 작성됩니다.

증명 시스템: PlonK.

링크: https://docs.minaprotocol.com/zkapps.

  • LEO (Aleo)

Leo는 개인 응용 프로그램을 작성하기 위해 설계된 함수형 정적 타입 프로그래밍 언어입니다. 개발자를 위해 설계되었으며, Aleo 블록체인에서 직관적으로 구축할 수 있도록 하여 개인적이고 분산된 생태계의 기초를 제공합니다.

증명 시스템: Marlin.

링크: https://leo-lang.org/.

ZKP 일반적인 보안 문제

지난 몇 년 동안, 느린 안개 보안 팀은 여러 유명 ZKP 제품에 대해 회로 및 응용 보안 감사를 수행하였으며, ZKSwap, Zkdex, Zksafe 등에서 여러 중고위험 취약점을 발견하였습니다. Circom, libsnark 등 인기 있는 프레임워크로 개발된 응용 프로그램에 대한 깊은 이해를 가지고 있습니다. 느린 안개 보안 팀은 ZKP 응용 감사에서 발견한 일반적인 보안 문제는 다음과 같습니다:

  • 신뢰할 수 있는 매개변수 위험

zk-SNARKs를 사용하려면 공공 매개변수 집합이 필요하며, 이를 공공 참조 문자열(CRS)이라고 합니다. 그러나 이러한 매개변수의 생성은 일부 비공식 매개변수를 생성할 수 있으며, 만약 한 쪽이 이러한 비공식 매개변수를 얻으면 증명을 위조할 수 있습니다.

또한 CRS 생성 과정은 감사가 필요하며, 무작위 수 백도나 비공식 매개변수가 의도적으로 보존되지 않도록 해야 합니다. zk-SNORKs를 사용할 때도 구조화된 참조 문자열(SRS)이 신뢰할 수 있는지 확인해야 합니다.

신뢰할 수 있는 설정 단계의 보안 위험 문제는 안전한 다자간 계산(MPC)을 사용하여 해결할 수 있습니다. MPC의 특징은 어떤 참여자가 정직하게 참여할 수 있다면, 이 다자간 계산 시스템을 통해 최종적으로 얻어진 계산 결과는 신뢰할 수 있다는 것입니다.

  • 정적 코드 보안

이 부분은 주로 비정상적인 코딩으로 인한 보안 문제입니다. 예를 들어, 매개변수 검증 누락, 반환 값 처리 누락, 수치 오버플로우, 경계 검사 누락 등이 있습니다. 만약 회로를 작성하는 언어가 C/C++라면, 메모리 오버플로우 위험도 존재합니다.

  • 공급망 공격 위험

공급망 위험은 취약한 코드 라이브러리를 사용하는 것에서 주로 발생합니다. 예를 들어, 구버전의 저장소를 사용하는 경우입니다. 일반적으로 ZKP 응용 프로그램은 클라이언트 또는 웹 프론트엔드와 함께 사용해야 하며, 이 부분도 다양한 방식으로 해커 공격을 받을 수 있습니다.

  • 논리 오류

논리 오류는 회로 구현에서 가장 쉽게 발생하는 오류로, 요구 사항 문서를 결합하여 회로 설계가 요구 사항에 부합하는지 확인해야 합니다.

  • 이중 지불 공격

잘못된 설계로 인해 이중 지불 공격이 발생할 수 있습니다. 예를 들어, 일부 ZKP 라이브러리에는 확장성 위험이 존재하여, 공격자가 알려진 증명을 사용하여 다른 증명을 생성할 수 있으며, 잘못 설계된 경우 이중 지불 공격이 발생할 수 있습니다.

  • 증명 위조

유효한 증명은 ZKP가 해결해야 할 주요 문제이며, 완전성과 신뢰성을 보장해야 합니다. 즉, "가짜는 진짜가 될 수 없고, 진짜는 가짜가 될 수 없다"는 것입니다. 따라서 만약 회로가 가짜 증명을 생성할 수 있다면, 이는 일반적으로 기본 라이브러리에 취약점이 존재하기 때문입니다. 우리는 일반적으로 프로젝트 측에 공개적으로 감사된 ZKP 라이브러리를 사용하고 안정적인 배포판을 사용할 것을 권장합니다.

  • 측면 채널 공격

회로 설계가 부적절하면, 서로 다른 프라이버시 정보가 서로 다른 계산 특성을 가질 수 있으며, 공격자는 공개된 입력 또는 증명을 통해 비공식 입력 데이터를 추측할 수 있습니다.

  • 회로 제약 실패

부적절한 회로 표현식은 변수가 제약되지 않을 수 있습니다.

  • 특수 값 공격

일부 특수 입력 값은 시스템의 검증 논리를 우회할 수 있습니다. 예를 들어, 0, null 등이 있습니다.

  • 프라이버시 입력 추측

Tornado Cash와 같은 응용 프로그램의 경우, 입력 정보가 추측 가능하다면 심각한 프라이버시 유출 문제가 발생할 수 있습니다. 이 경우 입력 데이터를 철저히 감사하여 추측할 수 없도록 해야 합니다.

  • RugPull 위험

일부 프로젝트는 특별한 관리자 권한이 존재할 수 있으며, 권한이 불법적으로 사용되면 프로젝트 자금과 사용자 자산이 도난당할 수 있습니다.

  • 스마트 계약 위험

일부 ZKP 증명은 스마트 계약을 사용하여 검증됩니다. 예를 들어, Circom, ZoKrates 등이 있습니다. 스마트 계약은 재진입, 재전송, 논리 오류 등의 위험이 발생할 수 있으며, 자세한 내용은 느린 안개 보안 팀의 스마트 계약 보안 감사 서비스를 참조하십시오.

위에서 나열한 ZKP 보안 문제에 대해, 느린 안개 보안 팀은 공격 및 방어 실전에서 안전한 해결책을 요약하였으며, 블랙박스/그레이박스/화이트박스 여러 테스트 방법을 결합하여 블록체인 산업을 위한 ZKP 회로 감사 서비스를 출시하였습니다.

결론

제로 지식 증명은 블록체인의 프라이버시, 계산 확장 및 데이터 압축 문제를 해결하는 효과적인 방법입니다. 현재 많은 구현 솔루션이 있으며, 이러한 구현 솔루션은 서로 다른 성능 매개변수 지표와 보안 기준을 가지고 있습니다. 개발자는 제로 지식 증명 회로를 개발할 때 요구 사항에 따라 적절한 프레임워크를 선택하고, 프로젝트가 출시되기 전에 응용 프로그램의 보안성을 철저히 감사해야 합니다.

마지막으로, 선도적인 원스톱 디지털 자산 자가 관리 서비스 제공업체 Safeheron의 전문 기술 조언에 감사드립니다.

참고 링크:

[1]. https://en.wikipedia.org/wiki/Zero-knowledge_proof

[2]. https://github.com/matter-labs/awesome-zero-knowledge-proofs

[3].https://docs.google.com/presentation/d/1gfB6WZMvM9mmDKofFibIgsyYShdf0RV_Y8TLz3k1Ls0/edit

체인캐처(ChainCatcher)는 독자들에게 블록체인을 이성적으로 바라보고, 리스크 인식을 실제로 향상시키며, 다양한 가상 토큰 발행 및 조작에 경계해야 함을 상기시킵니다. 사이트 내 모든 콘텐츠는 시장 정보나 관련 당사자의 의견일 뿐이며 어떠한 형태의 투자 조언도 제공하지 않습니다. 만약 사이트 내에서 민감한 정보를 발견하면 “신고하기”를 클릭하여 신속하게 처리할 것입니다.
체인캐처 혁신가들과 함께하는 Web3 세상 구축