일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 러스트 기초
- 스마트컨트렉트 예약어 함수이름 중복
- Vue.js
- 스마트 컨트렉트 함수이름 중복
- ambiguous function description
- 컨트렉트 동일한 함수이름 호출
- ethers type
- Vue
- 스마트컨트렉트테스트
- 체인의정석
- nestjs 튜토리얼
- 머신러닝기초
- 컨트렉트 배포 자동화
- vue기초
- ethers websocket
- rust 기초
- nest.js설명
- 러스트 기초 학습
- git rebase
- multicall
- ethers
- 스마트컨트렉트프록시
- ethers v6
- SBT표준
- chainlink 설명
- ethers typescript
- 깃허브명령어
- 프록시배포구조
- 스마트컨트렉트 함수이름 중복 호출
- 러스트기초
- Today
- Total
체인의정석
영지식 증명, circum & snark js 기초예제 본문
영지식 증명에서 많이 쓰이는 최신화된 라이브러리는 circum이라고 한다.
논문에 쓰고 싶어서 찾아보고 있는데 기초 예제부터 진행한 내용을 여기에 작성하려고 한다.
https://docs.circom.io/getting-started/installation/
위의 예제를 보고 기본 예제를 실습해 보았다.
참고로 기본 예제에서 디렉터리 위치를 잘 안보면 온갖 오류가 나기 때문에 readme에 차례차례 정리를 해두었다.
https://github.com/hyunkicho/zkBeginner/tree/main/zktutorial
* 참고로 setup 과정에서 1단계의 경우 랜덤한 값을 입력값으로 설정해 주는 부분으로 생략해도 된다. (실제로는 해야하긴 하지만, 내가 여러번 해봤자 사실 큰 의미는 없고 여러 단체에서 같이 입력을 해야 의미가 있으므로 어차피 혼자 실습할 때는 혼자 랜덤 값 많이 줘봤자 의미가 없기 때문.)
- 영지식 증명은 결국 이산대수를 사용해서 모듈려 연산에서 제곱 부분의 값이 구하기 어렵다는 점을 이용하는 것으로 해당 부분의 연산을 해주는 groth16을 사용한다.
전체 프로세스 흐름은 아래 그림과 같다.
1. circoum 모듈 을 쓰거나 자기가 직접 식을 짜서 회로를 만들고
2. 컴파일을 해서 R1CS 규칙에 맞게 로우 레벨 화를 시키고
3. Witness를 계산해서 생성하고
4. Trusted Setup 과정을 통해서 ProvingKey, ValidationKey를 뽑아태고
5. Proving Key는 proof로서 사용되며 Validation Key는 컨트렉트 화 되어서 verifier code가 된다.
6. 이후 input 중 공개값과 비밀 값을 넣게 되면 proof가 생성되게 된다. (해당 부분의 연산시간이 오래 걸리는 것이 오늘날의 병목 부분)
아래 부분은 4번 과정부터의 ChatGPT의 설명인데 이해하기 쉬워서 남겨둔다.
- Groth 16
이 부분은 Groth16 zk-SNARK 프로토콜을 사용하기 위한 신뢰 설정(Trusted Setup) 절차에 대해 설명하고 있습니다. 이 절차는 ZK-SNARKs에서 매우 중요한 부분인데, 왜냐하면 이 절차를 통해 증명(proof)과 검증(verification)이 안전하게 이루어질 수 있기 때문입니다. 아래에서 각 부분을 상세히 설명하겠습니다.
Groth16 zk-SNARK 프로토콜
Groth16은 ZK-SNARK (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) 프로토콜 중 하나로, 주로 블록체인에서 프라이버시를 보호하는 데 사용됩니다. 이 프로토콜을 사용하면 특정 연산이 올바르게 수행되었음을 증명할 수 있습니다. 중요한 점은 이 증명을 검증하는 사람은 연산의 입력값을 알 필요가 없다는 것입니다.
신뢰 설정(Trusted Setup)
신뢰 설정은 프로토콜이 제대로 작동하도록 보장하기 위한 초기화 과정입니다. Groth16 프로토콜에서는 **각 서킷(circuit)**마다 신뢰 설정이 필요합니다. 서킷은 일종의 계산 모델로, 어떤 특정한 계산을 수행하는 역할을 합니다.
신뢰 설정은 두 단계로 이루어집니다:
- Powers of Tau (1단계 신뢰 설정):
- 이 단계는 서킷에 의존하지 않는 일반적인 설정 과정입니다. "Tau"는 특정한 값 또는 파라미터를 의미하며, 이 값을 다양한 거듭제곱 형태로 생성하는 것이 목표입니다. 이 과정은 여러 사람이 참여할 수 있으며, 참여자들은 그들의 개인적인 비밀을 기여함으로써 신뢰 설정을 더욱 안전하게 만들 수 있습니다.
- 중요한 점은 이 단계에서 생성된 "Powers of Tau"는 여러 서킷에서 재사용 가능하다는 것입니다. 이는 이 단계를 한 번만 수행하면 여러 서킷에서 사용할 수 있다는 뜻입니다.
- Phase 2 (2단계 신뢰 설정):
- 이 단계는 특정 서킷에 의존하는 설정 과정입니다. 여기서는 서킷의 구체적인 형태에 따라 추가적인 파라미터를 생성합니다. 이 과정은 서킷마다 다르게 수행되며, 특정 서킷에 대해 증명을 생성하고 검증하는 데 필요한 모든 정보가 이 단계에서 생성됩니다.
- 따라서, 서킷이 변경되면 2단계 신뢰 설정을 다시 수행해야 합니다.
신뢰 설정을 위한 기본 절차 (Ceremony)
"신뢰 설정"을 만드는 과정은 종종 "Ceremony"라고 불립니다. 이 의식은 모든 참여자가 그들의 비밀을 기여하고, 최종적으로 안전한 초기 설정을 만드는 과정입니다.
이 과정에서는 snarkjs라는 도구를 사용하여 신뢰 설정을 생성하고 Groth16 증명을 만들고 검증할 수 있습니다.
Groth16 증명 생성 및 검증
Groth16 증명 생성과 검증 과정에서는 다음과 같은 명령어를 사용합니다:
- 신뢰 설정 생성:
- Powers of Tau 생성: 이 단계는 여러 서킷에 재사용될 수 있는 파라미터를 생성합니다.
- Phase 2 설정: 특정 서킷에 맞게 파라미터를 추가로 설정합니다.
- 증명 생성:
신뢰 설정이 완료된 후, 입력 데이터를 바탕으로 실제 증명을 생성합니다. - 증명 검증:
생성된 증명이 올바른지 확인하는 단계입니다. 검증자는 증명이 유효한지 여부를 판단할 수 있지만, 입력값의 구체적인 내용은 알 필요가 없습니다.
결론
이 모든 과정은 Groth16 프로토콜이 안전하게 작동하도록 보장하기 위한 필수적인 초기 설정입니다. 신뢰 설정 과정은 복잡할 수 있지만, 한번 설정이 완료되면 그 이후의 증명 생성과 검증은 매우 효율적이고 간단하게 수행될 수 있습니다. snarkjs는 이 모든 과정에서 필요한 도구들을 제공하며, 이를 통해 신뢰할 수 있는 증명을 생성하고 검증할 수 있습니다.
'블록체인 > 계정추상화' 카테고리의 다른 글
영지식증명, poseidon Hash (0) | 2024.08.14 |
---|---|
계정 추상화 참고할만한 자료 (0) | 2024.04.22 |
ERC4337 컨트렉트 핵심 요소 및 커스터마이징 해야할 부분 정리 (0) | 2024.04.08 |
ERC 4337 유저 지갑 컨트렉트 예제 (다중 오너 지갑 예제) (1) | 2023.09.23 |