원본 출처:보조 제목
개요
개요
블록체인 시스템의 작동 원리를 연구할 때 곡선인 secp 256 k 1 과 비트코인 및 이더리움 시스템에서 서명에 사용되는 비대칭 서명 알고리즘 등 다양한 암호화 지식을 이해하고 계정을 검증해야 합니다. 예를 들어, sha 256은 가변 길이 정보를 고정 길이 코드로 압축하는 데 사용되는 해시 알고리즘입니다. 정보 인코딩을 인쇄 가능한 문자로 표시되는 문자열로 변환할 수 있는 base 58과 같은 것입니다. 예를 들어, Diffie-Hellman 키 교환 알고리즘인 ECDH는 P2P 노드 간에 통신 키를 안전하게 교환하는 데 사용됩니다.
ZKP는 1985년에 처음 제안되었지만 오랫동안 대규모 응용 시나리오를 찾지 못하여 기술 개발이 매우 느립니다. 2009년 비트코인이 탄생할 때까지 사람들은 블록체인의 개인 정보 보호 및 확장성 문제를 해결하는 데 매우 적합하다는 것을 알았고 그 이후로 이 기술의 개발 및 엔지니어링 응용 프로그램에 많은 자본과 재능이 투자되었습니다. Groth 16, PlonK, STARK 등과 같은 많은 ZKP 구현이 있으며 지금까지 실제 산업 표준은 없습니다. 이 기사에서는 다양한 ZKP 구현의 기술적 특성을 살펴보고 귀하의 연구, 연구 및 엔지니어링 개발 .
ZKP 적용분야
보조 제목
1. 개인정보 보호 인증서
Tornado Cash는 이더리움에서 실행되는 코인 믹서입니다.ZKP를 사용하여 Merkle-Tree의 노드를 증명합니다.사용자는 고정 금액의 토큰을 자금 풀에 예치한 다음 ZKP에서 생성된 증명을 사용하여 예치되었음을 증명할 수 있습니다. 단, 입금 시 거래내역을 공개할 필요는 없습니다.
보조 제목
2. 컴퓨팅 아웃소싱
zksync 1.0이 좋은 예인데, 이더리움 토큰 전송과 오프체인 트랜잭션을 수행한 후 그 결과를 노드에 제출합니다.
보조 제목
3. 데이터 압축
Mina는 또 다른 예입니다.많은 고속 블록체인 시스템에서 트랜잭션 데이터가 매우 큽니다.시스템은 합의 프로토콜의 검증을 위해 모든 블록을 유지해야 합니다.따라서 시스템은 하드웨어 및 영구 저장소에 대한 요구 사항이 매우 높습니다. 즉, 블록 체인 노드는 디스크 공간과 데이터 인덱싱 기능을 지속적으로 늘려야 합니다. 이때 ZKP를 이용하여 검증 데이터를 압축할 수 있는데, Mina는 재귀적 영지식 증명을 통해 원장을 11KB로 압축하지만 여전히 블록의 정확성을 검증할 수 있습니다.
첫 번째 레벨 제목
증명 시스템은 ZKP의 기본 알고리즘 구현이며 대화형 및 비대화형의 두 가지 유형으로 나눌 수 있습니다.
보조 제목
1. 인터랙티브 증명 시스템
대화식 증명 시스템은 Prover(줄여서 P)와 Verifier(줄여서 V)라고 하는 두 당사자로 구성되며 여기서 P는 특정 비밀(예: 공개 키 암호 시스템의 비밀 키 또는 2차 방정식의 제곱근)을 알고 있습니다. 잔류물 x), P는 V가 자신이 비밀을 가지고 있다고 확신시키기를 희망합니다. Interactive proof는 여러 라운드로 구성되며, 각 라운드에서 P와 V는 서로로부터 받은 메시지와 스스로 계산한 결과를 기반으로 서로에게 메시지를 보내야 할 수 있습니다. 대표적인 방법은 매 라운드마다 V가 P에게 쿼리를 보내고 P가 V에 응답하는 것입니다. 모든 라운드가 실행된 후 V는 P가 각 라운드에서 자신이 보낸 쿼리에 올바르게 대답할 수 있는지 여부에 따라 P의 증명을 수락할지 여부를 결정합니다.
2. 비대화식 증명 시스템
위에서 언급한 대화식 증명 시스템에서 P와 V는 상호 작용하지 않고 P에서 V로 직접 증명을 생성하고 V가 직접 증명을 검증하는 방식을 NIZK(Non-interactive Proof System)라고 합니다.
우리가 블록체인에서 사용하는 증명 시스템은 일반적으로 NIZK이고 블록체인의 노드는 검증자 V이며 최종 사용자 또는 2계층 네트워크(계층 2)는 증명자 P입니다.
기사 끝에 있는 참조 링크 [ 1 ]는 지난 10년 동안 공개적으로 게시된 NIZK 체계 및 특성을 설명합니다.
Bulletproofs
실제 엔지니어링 응용 분야에서는 주로 성능과 다용도성에 중점을 두므로 몇 가지 일반적인 증명 시스템을 보다 자세히 분류하고 비교합니다. 기사 [2] 끝에 있는 참조 링크를 참조하십시오.
기능: 간결한 증명 크기, 신뢰할 수 있는 설정이 필요하지 않지만 증명 생성 및 확인에 오랜 시간이 걸립니다.
SNARKs (Succinct Non-interactive ARguments of Knowledge)
대표작 : 방탄, 헤일로, 헤일로2
특징: 증명의 크기가 간결하고 증명 검증 시간이 상대적으로 짧지만 각 회로를 신뢰할 수 있어야 합니다.
SNORKs (Succinct Non-interactive Oecumenical (Universal) aRguments of Knowledge)
대표사업 : 그로스 16.
특징: 소형 크기 증명, 모든 회로에 하나의 신뢰할 수 있는 설정만 필요합니다.
STARKs (Succinct (Scalable) Transparent ARguments of Knowledge)
대표작: Sonic, PlonK, Marlin, Plonky 2.
특징: 증명이 매우 크고 신뢰할 수 있는 설정이 필요하지 않으며 확장성이 좋습니다.
위의 분류가 절대적인 것은 아닙니다.예를 들어 Halo/Halo 2 프로젝트도 Plonk에서 디자인에 많은 아이디어를 차용했습니다.또한 SNORK는 모두 신뢰할 수 있는 설정이 필요하기 때문에 일반적으로 SNARK로 분류됩니다.
3. 성능 비교
(기사 [3] 끝에 있는 참조 링크 참조)
첫 번째 레벨 제목
회로 프로그래밍
회로는 ZKP 시스템의 비즈니스 로직 구현이며 ZKP 애플리케이션 개발에는 회로 프로그래밍이 필요합니다. ZKP 로직 코드를 "회로"라고 부르는 이유는 무엇입니까? 주로 다음과 같은 이유가 있습니다.
ZKP 증명의 코드는 간단한 제약 조건을 가진 일련의 R 1 CS 표현식으로 변환된 다음 라그랑주 보간법을 사용하여 거대한 다항식 QAP로 변환되며 최종적으로 게이트 회로 형태로 제약됩니다.
하드웨어 회로와 마찬가지로 모든 코드 분기가 함께 실행됩니다.
ZKP 응용 프로그램을 처음부터 구현하기 위해 암호화를 사용할 필요가 없습니다. 이러한 기본 증명 시스템을 구현한 많은 개발 라이브러리가 있습니다. 우리는 비즈니스 로직 구현에만 집중하면 됩니다. 물론 라이브러리마다 추상화 수준이 다르고 회로를 설명하는 표현을 익혀야 하는 경우도 있고 프로세스에 따라 코드만 정의하면 쉽게 구현할 수 있는 경우도 있다.
보조 제목
libsnark
1. 일반적으로 사용되는 개발 라이브러리
일반 증명 시스템, 기본 회로 라이브러리 및 응용 예제는 C++ 언어로 구현됩니다.
증명 시스템: BBFR 15, BCCT 12, BCCT 13, BCGT V1 3, BCIOP 13, BCT V1 4a, BCT V1 4b, CT V1 5, DFGK 14, Groth 16, GM 17, GGPR 13, PGHR 13.
gnark
링크: https://github.com/scipr-lab/libsnark.
Go로 구현된 증명 시스템으로, 회로 설계를 위한 높은 수준의 API를 제공합니다.
증명 시스템: Groth 16, PlonK.
bellman
링크: https://github.com/consensys/gnark.
회로 인터페이스, 인프라, 부울 및 숫자 추상화와 같은 일부 기본 회로 구현을 제공하는 Rust로 구현된 증명 시스템입니다.
증명 시스템: Groth 16.
snarkjs
링크: https://github.com/zkcrypto/bellman.
설정을 신뢰하고, 증명을 생성하고, 증명을 확인하는 데 사용할 수 있는 Javascript 및 WASM으로 구현된 증명 시스템입니다. snarkjs는 iden 3의 자체 circom 컴파일러를 사용하여 DSL에서 정의한 회로를 컴파일합니다.
증명 시스템: Groth 16, PlonK.
ethsnarks
링크: https://github.com/iden3/snarkjs.
Python으로 구현되어 Ethereum 스마트 계약을 유효성 검사기로 사용하여 사용자의 브라우저에서 증명을 생성할 수 있습니다. 현재 프로젝트 개발이 활발하지 않으며 동일한 시나리오에서 Circcom을 사용하는 것이 더 나은 선택일 수 있습니다.
증명 시스템: Groth 16.
bulletproofs
링크: https://github.com/HarryR/ethsnarks.
단일 및 집계 범위 증명, 강력한 유형의 다자 계산 및 임의의 진술을 증명하기 위한 프로그래밍 가능한 제약 시스템 API를 사용하여 Rust에서 구현된 증명 시스템이 개발 중입니다.
증명 시스템: 방탄.
halo 2
링크: https://github.com/dalek-cryptography/bulletproofs.
ZCash 팀이 유지 관리하는 Rust 구현을 기반으로 하는 증명 시스템입니다. Halo 2는 PLONKish 전용으로 산술 연산에서 회로가 표현되는 방식을 매우 직접적으로 제어할 수 있어 고도로 최적화된 회로를 작성하는 데 이상적입니다.
링크: https://github.com/zcash/halo 2.
보조 제목
2. 개발 과정
gnark를 예로 들면 일반적인 워크플로는 다음과 같습니다.
1) 코드를 사용하여 해결해야 할 문제를 설명합니다.
2) R 1 CS 제약 시스템으로 컴파일합니다.
3) Proving key와 Verify key를 얻기 위해 R 1 CS에서 신뢰할 수 있는 설정을 합니다.
5) 검증자는 검증 키를 사용하여 증명을 검증합니다.
회로 프로그래밍을 위한 특수 언어
보조 제목
Cairo
1. 이더리움 플랫폼 기반
Cairo는 한 당사자가 특정 계산이 올바르게 수행되었음을 다른 당사자에게 증명할 수 있는 증명 가능한 프로그램을 작성하기 위한 프로그래밍 언어입니다. 카이로 및 이와 유사한 증명 시스템을 사용하여 블록체인에 확장성을 제공할 수 있습니다. StarkNet은 인프라 및 StarkNet 계약 작성을 위해 Cairo 프로그래밍 언어를 사용합니다.
증명 시스템: STARK.
Zokrates
링크: https://www.cairo-lang.org/docs/.
ZoKrates는 DSL을 사용하여 회로를 설명하고 일반적으로 사용되는 일부 회로 라이브러리를 제공합니다. 이를 통해 고급 언어로 프로그램을 표준화하는 것부터 계산 증명을 생성한 다음 Solidity에서 이러한 증명을 검증하는 것까지 DApp에서 검증 가능한 계산을 사용할 수 있습니다.
증명 시스템: GM 17, Groth 16, Marlin.
Circom
링크: https://zokrates.github.io/.
Circcom 언어는 DSL을 사용하여 회로를 설명하고 snarkjs와 협력하여 Ethereum 스마트 계약을 검증자로 사용하여 사용자 브라우저에서 증명을 생성할 수 있습니다.
증명 시스템: Groth 16, PlonK.
Noir
링크: https://iden 3.io/circom.
Aztec의 Rust 기반 프라이버시 프로그래밍 언어는 DSL을 사용하여 회로를 설명하므로 프라이버시를 보호하는 영지식 회로를 안전하고 원활하게 구성할 수 있습니다.
증명 시스템: PlonK.
zkEVM
링크: https://noir-lang.org/index.html.
현재 zkSync, Polygon, Scroll, Starkware 및 기타 팀에서 zkEVM을 구현하기 위해 노력하고 있으며 상당한 진전을 이루었습니다.
보조 제목
zkApp (Mina)
2. 퍼블릭 체인 플랫폼 기반
zkApps는 영지식 증명으로 구동되는 Mina Protocol의 스마트 계약입니다. zkApps는 계산을 온체인에서 실행하고 가변 가스 수수료를 사용하는 다른 블록체인과 달리 생성된 영지식 증명을 체인으로 전송하여 이 계산을 검증하기 위해 고정 수수료만 부과하면서 오프체인에서 임의로 복잡한 계산을 수행할 수 있습니다. zkApp은 Typescript로 작성됩니다.
증명 시스템: PlonK.
LEO (Aleo)
링크: https://docs.minaprotocol.com/zkapps.
Leo는 개인 응용 프로그램 작성을 위해 특별히 제작된 기능적이고 정적으로 유형이 지정된 프로그래밍 언어입니다. 개발자를 위해 설계되었으며 Aleo 블록체인 위에 직관적으로 구축할 수 있어 프라이빗하고 분산된 생태계의 기반을 제공합니다.
링크: https://leo-lang.org/.
첫 번째 레벨 제목
ZKP 공통 보안 문제
지난 몇 년 동안 SlowMist 보안 팀은 ZKSwap, Zkdex, Zksafe 등을 포함하여 잘 알려진 많은 ZKP 제품에 대한 회로 및 애플리케이션 보안 감사를 수행했으며 다수의 중간 및 고위험 취약점을 발견했습니다. 더 깊은 이해. ZKP 애플리케이션 감사에서 SlowMist 보안 팀이 발견한 일반적인 보안 문제는 다음과 같습니다.
신뢰 매개변수 위험
zk-SNARK를 사용하려면 공통 참조 문자열(CRS)이라는 공통 매개변수 세트가 필요합니다. 그러나 이러한 매개변수를 생성하면 일부 개인 매개변수도 생성되며 당사자가 이러한 개인 매개변수를 획득하면 증명을 위조할 수 있습니다.
또한 CRS 생성 프로세스를 감사하여 난수 백도어가 없거나 개인 매개변수가 의도적으로 보존되지 않았는지 확인해야 합니다. zk-SNORK를 사용하려면 SRS(Structured Reference String)를 신뢰할 수 있어야 합니다.
신뢰할 수 있는 구성 단계의 보안 위험은 안전한 MPC(Multi-party Computing)를 사용하여 해결할 수 있습니다. 신뢰할 수 있는.
정적 코드 보안
이 부분은 주로 확인되지 않은 매개변수, 처리되지 않은 반환 값, 숫자 오버플로, 확인되지 않은 경계 등과 같은 비표준 코딩으로 인한 보안 문제 때문입니다. 회로 작성 언어가 C/C++인 경우에도 위험이 있습니다. 메모리 오버플로우 .
공급망 공격 위험
공급망 위험은 주로 이전 버전 창고와 같은 취약한 코드 기반의 사용에서 비롯됩니다. 보통 ZKP 애플리케이션도 클라이언트나 웹 프론트엔드와 연동해서 사용해야 하는데 이 부분도 여러모로 해커에게 취약하다.
논리적 오류
논리 오류는 회로 구현에서 발생 가능성이 가장 높은 오류로 요구 사항 문서와 함께 회로 설계가 요구 사항을 충족하는지 확인해야 합니다.
이중 지출 공격
잘못된 설계는 이중 지출 공격으로 이어질 수 있습니다.예를 들어 일부 ZKP 라이브러리에는 확장성 위험이 있습니다.공격자는 알려진 증명을 사용하여 다른 증명을 생성할 수 있습니다.설계가 부적절하면 이중 지출 공격으로 이어집니다.
위조를 증명하다
효과적인 증명은 ZKP가 해결해야 할 주요 문제로, 완전성과 신뢰성을 보장합니다. 즉, "거짓은 참일 수 없고, 참은 거짓일 수 없습니다." 기본 라이브러리, 일반적으로 프로젝트 당사자는 공개 감사 ZKP 라이브러리를 사용하고 안정적인 릴리스 버전을 사용하는 것이 좋습니다.
사이드 채널 공격
회로가 제대로 설계되지 않은 경우 개인 정보마다 컴퓨팅 특성이 다를 수 있으며 공격자는 공개 입력 또는 증명을 통해 개인 입력 데이터를 추측할 수 있습니다.
회로 제약 조건 실패
부적절한 회로 표현은 제약되지 않은 변수를 초래할 수 있습니다.
특별한 가치 공격
0, null 등과 같은 일부 특수 입력 값은 시스템의 유효성 검사 논리를 우회할 수 있습니다.
프라이버시 입력 추측
Tornado Cash와 같은 애플리케이션의 경우 입력 정보를 추측할 수 있는 경우 심각한 개인 정보 유출 문제가 발생할 수 있으며 이때 입력 데이터를 추측할 수 없도록 엄격한 감사가 필요합니다.
일부 프로젝트에는 특별한 관리자 권한이 있을 수 있으며 권한이 불법적으로 사용되면 프로젝트 자금과 사용자 자산이 도난당할 수 있습니다.
스마트 계약 위험
스마트 계약 위험
첫 번째 레벨 제목
요약하다
요약하다
마지막으로, 전문적인 기술 자문을 제공한 선도적인 원스톱 디지털 자산 셀프 커스터디 서비스 제공업체인 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
