
후오비 벤처스 최신 보고서: 하드코어 해설 최신 메이크 $NOVA
저자: 후오비 벤처스(Huobi Ventures) 수석 연구원 쉬진빈
현재 가장 핫한 밈코인(Memecoin)—Nova가 NFT계의 '구세주'로 등장했다.
공식 웹사이트에 따르면, 밈 프로젝트 NOVA의 스마트 계약 코드는 ChatGPT가 작성했으며, 7월 10일 정식으로 발행되었다. NOVA는 모든 블루칩 NFT 보유자들에게 에어드랍을 제공할 계획이다. 계약에는 판매 시 9%의 세금(구매 시 세금은 0%)이 부과되며, 이 중 3%는 자동으로 ETH를 매수해 상위 30개 블루칩 NFT 프로젝트 보유자들에게 분배된다. 공식 웹사이트 데이터에 따르면, NOVA는 1단계에서 10,000 ETH를 배분하여 블루칩 대규모 보유자들을 지원할 예정이다.
본고에서는 Nova의 기반 기술을 심도 있게 해설하며, 화려한 스토리텔링을 넘어서 코드 자체로 돌아간다.
본 리서치 보고서는 후오비 벤처스(Huobi Ventures)가 제작하였으며, 후오비 벤처스는 후오비 그룹의 글로벌 투자 부서로, 투자, 인큐베이션 및 리서치를 통합하여 세계 최고이며 유망한 프로젝트를 발굴한다.
서론
제로지식 증명은 암호학에서 중요한 기술로서, 한 사람이 다른 사람에게 어떤 진술이 사실임을 입증하면서 추가 정보를 전혀 공개하지 않도록 한다. 이 기술은 신원 인증, 블록체인, 보안 컴퓨팅 등 다양한 분야에서 광범위하게 활용되고 있다. Nova는 마이크로소프트가 개발한 새로운 제로지식 증명 시스템으로, "완화된 순위 1 제약 시스템(Relaxed Rank-1 Constraint Systems, Relaxed R1CS)"이라는 기술을 사용하여 증명의 효율성과 유연성을 향상시킨다.마지막 장에서는 소스코드를 상세히 분석한다.
Nova의 장점
Nova의 주요 장점은 완화된 R1CS 기술을 사용한다는 점이다. R1CS는 제로지식 증명을 구축하기 위한 시스템으로, 다항식 등식 집합의 해를 알고 있음을 입증하되, 해에 관한 정보는 전혀 공개하지 않는다. 그러나 전통적인 R1CS 시스템은 증명 생성 및 검증 과정에서 많은 난수를 필요로 하여 복잡하고 시간이 오래 걸린다. Nova는 완화된 R1CS를 사용함으로써 증명에 필요한 난수를 줄여 증명 효율을 크게 향상시켰다.
Nova는 또 다른 몇 가지 장점을 지닌다. 예를 들어, 증분 계산(incremental computation)을 지원하므로 전체 함수를 일괄적으로 계산하지 않고 단계별로 복잡한 함수를 계산할 수 있다. 이는 대량의 데이터 처리나 복잡한 계산 수행 시 매우 유용하다. 또한, 다항식 계산을 지원하여 더 복잡한 증명 작업을 처리할 수 있다.
Nova의 단점
Nova는 많은 장점을 지녔지만 일부 단점도 존재한다. 먼저, Nova는 완화된 R1CS를 사용하므로 전통적인 R1CS 시스템만큼 강력하지 않을 수 있다. 완화된 R1CS는 증명에 사용되는 난수를 줄이기 때문에 증명의 보안성이 낮아질 가능성이 있다. 그러나 Nova 개발팀은 이를 해결하기 위해 더 강력한 암호화 알고리즘과 복잡한 증명 전략을 도입하였다.
둘째, Nova의 구현이 비교적 복잡하여 사용 및 유지 관리가 어려울 수 있다. Nova는 다항식 계산, 군 연산(group operations), 랜덤 오라클(random oracle) 등 고급 암호학 기술을 많이 사용하므로, 이를 효과적으로 사용하고 수정하려면 해당 기술에 대한 깊은 이해가 필요하다.
Nova의 제로지식 증명 분야에서의 중요성
Nova는 제로지식 증명 분야에서 중요한 위치를 차지하고 있다. Nova의 등장은 제로지식 증명 발전에 새로운 길을 열었다. 완화된 R1CS 기술을 채택한 Nova는 증명 생성 및 검증 과정을 더욱 효율적으로 만들어 대규모 제로지식 증명 응용에 필수적이다. 또한, 증분 계산과 다항식 계산을 지원하여 더 복잡한 증명 작업을 처리할 수 있어 제로지식 증명의 적용 범위를 더욱 확대한다.
Nova의 소스코드 분석
https://github.com/microsoft/Nova
src/ 디렉터리 내 다음과 같은 중요한 하위 디렉터리들이 있다:
bellperson/: 이 디렉터리는 Bellman-Ford 알고리즘 관련 코드를 포함하고 있을 수 있다.
gadgets/: 이 디렉터리는 zk-SNARK 증명을 구성하는 데 사용되는 도구들(gadget)을 포함하고 있을 수 있다.
provider/: 이 디렉터리는 keccak.rs처럼 Keccak 해시 함수를 구현한 코드를 포함한 제공자(providers) 코드를 포함하고 있을 수 있다.
spartan/: 이 디렉터리는 Spartan 프로토콜 관련 코드를 포함하고 있을 수 있다.
traits/: 이 디렉터리는 공통 동작을 정의하는 Rust traits를 포함하고 있을 수 있다.
src/bellperson/mod.rs 파일 내용:
이 모듈은 주로 R1CS(Rank-1 Constraint Systems, zk-SNARKs에 사용되는 제약 시스템) 생성을 담당한다.
다음 세 개의 하위 모듈을 포함한다:
r1cs: 이 모듈은 R1CS 관련 코드를 포함하고 있을 수 있다.
shape_cs: 이 모듈은 형태 제약 시스템 관련 코드를 포함하고 있을 수 있다.
solver: 이 모듈은 제약 시스템 해결 관련 코드를 포함하고 있을 수 있다.
테스트 부분에서는 제약 시스템을 받아 두 비트 입력이 실제로 비트인지 확인하는 제약 조건을 추가하는 함수 synthesize_alloc_bit를 정의한다. 이후 test_alloc_bit_with 함수를 정의하는데, 이 함수는 먼저 형태를 생성한다.
src/bellperson/r1cs.rs 파일 내용:
이 파일은 주로 두 개의 trait `NovaWitness`와 `NovaShape`를 정의한다. 각각은 구현체로부터 `R1CSInstance`와 `R1CSWitness`, 그리고 `R1CSShape`와 `CommitmentKey`를 가져오는 메서드를 제공한다.
- `NovaWitness` trait는 `r1cs_instance_and_witness`라는 메서드를 가지며, 이는 `R1CSShape`와 `CommitmentKey`를 받아 `R1CSInstance`와 `R1CSWitness`를 반환한다. 이 trait는 `SatisfyingAssignment` 구조체에 대해 구현되므로, 모든 `SatisfyingAssignment`는 이 메서드를 사용하여 `R1CSInstance`와 `R1CSWitness`를 얻을 수 있다.
- `NovaShape` trait는 `r1cs_shape`라는 메서드를 가지며, 이는 `R1CSShape`와 `CommitmentKey`를 반환한다. 이 trait는 `ShapeCS` 구조체에 대해 구현되므로, 모든 `ShapeCS`는 이 메서드를 사용하여 `R1CSShape`와 `CommitmentKey`를 얻을 수 있다.
또한 이 파일은 `add_constraint` 함수를 정의하는데, 이 함수는 제약 시스템과 세 개의 선형 조합을 받아 제약 시스템에 새 제약을 추가한다. 이 함수는 `NovaShape` 구현체가 `R1CSShape`를 생성할 때 사용된다.
요약하면, 이 파일은 특정 조건을 만족하는 시스템(예: `SatisfyingAssignment` 또는 `ShapeCS`)에서 R1CS 인스턴스, 증거, 형상 및 커밋 키를 생성할 수 있는 방법을 제공한다.
src/bellperson/shape_cs.rs
이 파일은 `ShapeCS`라는 구조체를 정의하며, 이는 `ConstraintSystem` trait를 구현한다. `ShapeCS`는 R1CS 형상을 생성하기 위한 제약 시스템이다.
`ShapeCS` 구조체는 다음 필드들을 포함한다:
- `named_objects`: 경로와 연결된 객체를 저장하는 맵
- `current_namespace`: 현재 네임스페이스를 저장하는 문자열 벡터
- `constraints`: `ShapeCS`에 추가된 모든 제약 조건을 저장하는 벡터
- `inputs`: 모든 입력을 저장하는 문자열 벡터
- `aux`: 모든 보조 입력을 저장하는 문자열 벡터
`ShapeCS` 구조체는 `ConstraintSystem` trait를 구현하므로 다음 메서드들을 제공한다:
- `alloc`: 새로운 변수를 할당하기 위한 메서드
- `alloc_input`: 새로운 입력 변수를 할당하기 위한 메서드
- `enforce`: 새로운 제약 조건을 추가하기 위한 메서드
- `push_namespace`: 새로운 네임스페이스를 푸시하기 위한 메서드
- `pop_namespace`: 현재 네임스페이스를 팝하기 위한 메서드
- `get_root`: 루트 제약 시스템을 가져오기 위한 메서드
또한 `proc_lc` 및 `compute_path`와 같은 보조 함수를 정의하여 각각 선형 조합 처리 및 경로 계산을 수행한다.
요약하면, 이 파일은 특정 조건을 만족하는 시스템(예: `ShapeCS`)에서 R1CS 형상을 생성할 수 있는 방법을 제공한다.
src/bellperson/solver.rs
이 파일은 `SatisfyingAssignment`라는 구조체를 정의하며, 이는 `ConstraintSystem` trait를 구현한다. `SatisfyingAssignment`는 R1CS 인스턴스와 증거를 생성하기 위한 제약 시스템이다.
`SatisfyingAssignment` 구조체는 다음 필드들을 포함한다:
- `a_aux_density`, `b_input_density`, `b_aux_density`: 쿼리 밀도를 추적하는 `DensityTracker` 타입 필드
- `a`, `b`, `c`: A, B, C 다항식 평가 결과를 저장하는 벡터
- `input_assignment`, `aux_assignment`: 변수 할당을 저장하는 벡터
`SatisfyingAssignment` 구조체는 `ConstraintSystem` trait를 구현하므로 다음 메서드들을 제공한다:
- `new`: 새로운 `SatisfyingAssignment` 인스턴스를 생성하기 위한 메서드
- `alloc`: 새로운 보조 변수를 할당하기 위한 메서드
- `alloc_input`: 새로운 입력 변수를 할당하기 위한 메서드
- `enforce`: 새로운 제약 조건을 추가하기 위한 메서드
- `push_namespace`, `pop_namespace`: 네임스페이스를 조작하기 위한 메서드 (단, 이 맥락에서는 실제 작동 없음)
- `get_root`: 루트 제약 시스템을 가져오기 위한 메서드
- `is_extensible`, `extend`: 제약 시스템을 확장하기 위한 메서드
요약하면, 이 파일은 특정 조건을 만족하는 시스템(예: `SatisfyingAssignment`)에서 R1CS 인스턴스와 증거를 생성할 수 있는 방법을 제공한다.
"src/circuit.rs", 이는 Nova 프로토콜의 증강 회로(Augmented Circuit)를 정의한다.
이 회로는 단계 회로(Step Circuit)와 Nova의 비대화형 접힘 방식(Non-Interactive Folding Scheme)의 검증자 회로를 포함한다.
파일 내 정의된 주요 구조체와 메서드들은 다음과 같다:
- `NovaAugmentedCircuitParams`: 회로의 파라미터를 포함하는 구조체로, limb 너비, limb 수량, 주 회로 여부를 나타내는 불리언 값 등을 포함한다.
- `NovaAugmentedCircuitInputs`: 회로의 입력을 포함하는 구조체로, 파라미터, i, z0, zi, U, u, T 등을 포함한다.
- `NovaAugmentedCircuit`: Nova 증강 회로의 주요 정의 구조체로, 회로 파라미터, 읽기 전용 상수, 입력, 단계 회로를 포함한다. 또한 `alloc_witness`(증거 할당), `synthesize_base_case`(기초 사례 합성), `synthesize_non_base_case`(비기초 사례 합성) 등의 메서드를 정의한다.
- `synthesize` 메서드: Nova 증강 회로의 주요 합성 메서드로, 먼저 모든 증거를 할당한 후 기초 사례 여부에 따라 회로를 합성하고 마지막으로 계산된 해시값과 u.X[1]을 출력한다.
이 파일에는 재귀 회로 기능을 테스트하기 위한 테스트 코드들도 포함되어 있다.
요약하면, 이 파일은 Nova 프로토콜의 핵심 요소인 증강 회로를 정의하며, 단계 회로와 검증자 회로를 포함하고 회로 합성 방법을 제공한다.
"src/constants.rs", 이는 프로젝트 전반에서 널리 사용되는 상수들을 정의한다.
이러한 상수들의 의미는 다음과 같다:
- `NUM_CHALLENGE_BITS`: 도전(challenge)의 비트 수를 정의하며, 값은 128이다. 도전은 증명자가 생성하는 난수로, zk-SNARK 증명 과정의 상호작용 단계에서 사용된다.
- `NUM_HASH_BITS`: 해시의 비트 수를 정의하며, 값은 250이다. 해시 함수는 임의 길이의 입력 데이터를 고정 길이 출력으로 매핑하는 함수이며, 여기서 출력 길이는 250비트이다.
- `BN_LIMB_WIDTH`: 큰 수(Big Number)의 limb 너비를 정의하며, 값은 64이다. 컴퓨터 과학에서 큰 수는 표준 데이터 타입이 표현할 수 있는 범위를 초과하는 수이며, 일반적으로 여러 "limb"로 나누어 저장 및 연산된다.
- `BN_N_LIMBS`: 큰 수의 limb 수를 정의하며, 값은 4이다. 즉, 각 큰 수는 4개의 limb로 나누어 저장 및 연산된다.
- `NUM_FE_WITHOUT_IO_FOR_CRHF`: 충돌 저항성 해시 함수(CRHF)에 대해 입력/출력을 제외한 필드 요소(FE) 수를 정의하며, 값은 17이다.
- `NUM_FE_FOR_RO`: 랜덤 오라클(RO)에 대한 필드 요소(FE) 수를 정의하며, 값은 24이다.
이러한 상수들은 Nova 프로토콜 구현에서 중요한 역할을 하며, 도전의 비트 수, 해시의 비트 수, 큰 수의 limb 너비 및 수량 등 중요한 파라미터를 정의한다.
"src/errors.rs", 이는 Nova 라이브러리가 반환할 수 있는 오류 타입들을 정의한다.
이러한 오류 타입들은 `NovaError`라는 enum에 묶여있다. 각 오류 타입의 의미는 다음과 같다:
- `InvalidIndex`: (row, col, val) 튜플에서 제공된 행이나 열이 범위를 벗어난 경우 반환됨
- `OddInputLength`: 제공된 입력 길이가 짝수가 아닌 경우 반환됨
- `InvalidInputLength`: 제공된 입력 길이가 올바르지 않은 경우 반환됨
- `InvalidWitnessLength`: 제공된 증거 길이가 올바르지 않은 경우 반환됨
- `UnSat`: 제공된 증거가 주어진 형상과 인스턴스를 만족하지 않는 경우 반환됨
- `DecompressionError`: 제공된 압축 커밋을 해제할 수 없는 경우 반환됨
- `ProofVerifyError`: 증명 검증에 실패한 경우 반환됨
- `InvalidNumSteps`: 제공된 단계 수가 0인 경우 반환됨
- `InvalidIPA`: 잘못된 내적 파라미터를 제공한 경우 반환됨
- `InvalidSumcheckProof`: 잘못된 sumcheck 증명을 제공한 경우 반환됨
- `InvalidInitialInputLength`: 증분 계산의 초기 입력이 이전에 선언된 원소 수와 일치하지 않는 경우 반환됨
- `InvalidStepOutputLength`: 단계 실행 결과 출력 길이가 이전에 선언된 원소 수와 일치하지 않는 경우 반환됨
- `InternalTranscriptError`: 전사 엔진이 라운드 오버플로우를 만나는 경우 반환됨
- `InvalidMultisetProof`: 다중 집합 검사에 실패한 경우 반환됨
- `InvalidProductProof`: 제품 증명 검사에 실패한 경우 반환됨
- `IncorrectWitness`: 공개 I/O 및 사용된 할당 간 일관성 검사에 실패한 경우 반환됨
이러한 오류 타입들은 입력 오류, 증명 오류, 내부 오류 등을 포함하여 Nova 라이브러리에서 발생할 수 있는 다양한 문제들을 포괄한다. Nova 라이브러리 함수가 문제를 만나면 이러한 오류를 반환하여 호출자가 문제를 인지하고 적절한 조치를 취할 수 있도록 한다.
"ecc.rs", 이는 Rust 언어로 작성된 파일이다.
이 파일은 Nova 프레임워크 내 타원 곡선 암호학(ECC) 관련 구현을 주로 포함한다.
타원 곡선 암호학(Elliptic Curve Cryptography, ECC)은 공개키 암호 기술의 일종으로, 동일한 보안 수준을 제공하면서 더 짧은 키를 사용할 수 있다는 장점이 있다. 즉, ECC는 더 작은 계산 자원과 전력을 사용할 수 있으므로 모바일 기기 및 임베디드 시스템과 같은 많은 장치에 매우 중요하다.
이 파일에서는 Nova 프레임워크의 ECC 기능을 구현하기 위한 Rust 구조체(structs) 및 구현(impls) 정의를 볼 수 있다. 예를 들어, `struct EccGadget`은 ECC의 주요 구현으로, ECC 상태 및 관련 변수를 저장하는 `value` 및 `pb_variable` 필드를 포함한다.
또한, 암호화, 복호화 등의 다양한 ECC 연산을 구현하는 함수(functions) 정의도 볼 수 있다. 예를 들어, `fn encrypt`는 평문과 공개키를 받아 암호문을 반환하는 암호화 함수이다.
요약하면, 이 파일은 Nova 프레임워크 내 ECC 기능을 구현하는 핵심 부분이다.
"src/gadgets/mod.rs", 이는 Nova 프레임워크의 모듈로, Nova 및 Nova 기반 애플리케이션에 필요한 다양한 "gadget"을 구현한다.
암호학에서 "gadget"은 특정 기능을 구현하는 코드 블록을 설명하는 일반적인 용어이다. zk-SNARKs(제로지식 간결 비대화형 증명)에서 gadget은 일반적으로 특정 알고리즘 또는 프로토콜의 증명 시스템을 의미한다.
이 파일에서는 다음 하위 모듈들을 볼 수 있다:
- `ecc`: 타원 곡선 암호학(Elliptic Curve Cryptography) 관련 gadget을 포함하고 있을 수 있다.
- `nonnative`: 비네이티브(non-native) 필드 관련 gadget을 포함하고 있을 수 있다.
- `r1cs`: R1CS(Rank-1 Constraint Systems) 관련 gadget을 포함하고 있을 수 있다.
- `utils`: 유틸리티 함수 또는 클래스를 포함하고 있을 수 있다.
이러한 하위 모듈들은 함께 Nova 프레임워크에 필요한 다양한 기능을 제공한다.
"bignat.rs", 이는 Nova 프로젝트의 일부로, 주로 큰 정수(BigNat) 연산을 구현한다.
컴퓨터 과학에서 큰 정수(또는 임의 정밀도 정수)는 int나 long과 같은 일반 정수 타입이 표현할 수 있는 범위를 초과하는 정수를 표현하고 조작할 수 있는 정수이다. 이는 암호학, 컴퓨터 그래픽스, 대수 계산 등 많은 분야에서 매우 유용하다.
이 파일의 주요 부분들을 자세히 살펴보면:
1. `use super::super::gadgets::GadgetCaller;`: 이 줄은 GadgetCaller를 가져온다. 이는 다른 gadget을 호출하는 데 사용되는 trait이다.
2. `pub struct BigNatGadget;`: 이 줄은 BigNatGadget이라는 이름의 구조체를 정의한다. Rust에서 구조체는 복잡한 데이터 타입을 생성하는 데 사용된다.
3. `impl GadgetCaller for BigNatGadget`: 이는 BigNatGadget 구조체의 구현으로, GadgetCaller trait를 구현한다. 즉, BigNatGadget은 GadgetCaller trait가 요구하는 모든 메서드를 구현해야 한다.
4. 이 구현에서는 `add`, `sub`, `mul`, `div`, `rem`과 같은 큰 정수 연산의 기본 연산 메서드들이 있다.
5. `pub fn from(&self, val: u64) -> Self`: 이 메서드는 u64 타입 값을 사용하여 BigNatGadget을 생성한다.
6. `pub fn to_u64(&self) -> u64`: 이 메서드는 BigNatGadget을 u64 타입 값으로 변환한다.
7. `pub fn eq(&self, other: &Self) -> bool`: 이 메서드는 두 BigNatGadget이 동일한지 판단한다.
요약하면, 이 파일은 큰 정수를 처리하기 위한 도구를 제공하며, 큰 정수 생성, 다른 타입 값으로 변환, 기본 연산 수행 등을 포함한다.
"mod.rs", 이는 "src/gadgets/nonnative/" 디렉터리에 위치한다.
이 파일은 비네이티브 필드의 산술 연산을 구현하는 데 주로 사용된다.
암호학에서 비네이티브 필드는 하드웨어에서 직접 지원되지 않는 필드를 말한다. 예를 들어, 일부 암호 알고리즘은 64비트 이상의 필드에서 연산이 필요할 수 있지만, 대부분의 현대 컴퓨터 하드웨어는 최대 64비트까지만 직접 지원한다. 이런 경우 비네이티브 필드의 산술 연산이 필요하다.
이 파일에서는 다음 주요 부분들을 볼 수 있다:
1. `OptionExt` trait: `Option` 타입에 `grab`과 `grab_mut` 메서드를 추가하며, 이들은 `Option` 내 값을 가져오려 시도하고 `None`일 경우 오류를 반환한다.
2. `BitAccess` trait: `get_bit` 메서드를 제공하며, 이는 인덱스 `i`를 받아 해당 위치의 비트가 `1`인지 여부를 반환한다.
3. `impl BitAccess for Scalar`: 이는 `Scalar` 타입에 대한 `BitAccess` trait의 구현으로, `Scalar`는 소수 필드를 나타내는 타입이다.
4. `pub mod bignat;` 및 `pub mod util;`: 이 두 줄은 `bignat`과 `util` 두 하위 모듈을 가져오며, 이들은 비네이티브 필드 산술 연산을 구현하는 함수 또는 클래스를 포함하고 있을 수 있다.
요약하면, 이 파일은 비네이티브 필드에서 산술 연산을 수행하는 방법을 제공하며, 특정 암호 알고리즘 구현에 매우 중요하다.
"util.rs", 이는 "src/gadgets/nonnative/" 디렉터리에 위치한다.
이 파일은 비네이티브 필드에서 연산을 수행하기 위한 유틸리티 함수들을 구현하는 데 주로 사용된다.
이 파일의 주요 부분들은 다음과 같다:
1. `Bit` 구조체: 하나의 비트를 나타내며, 선형 조합과 증거 시간에 채워지는 값을 포함한다.
2. `Bitvector` 구조체: 비트 벡터를 나타내며, 선형 조합 벡터, 값 벡터, 할당된 비트 벡터를 포함한다.
3. `Num` 구조체: 숫자를 나타내며, 선형 조합과 값을 포함한다.
4. `Bit` 구조체의 `alloc` 메서드: 제약 시스템에서 부울 값만 가능한 변수를 할당한다.
5. `Num` 구조체의 `fits_in_bits` 메서드: 숫자가 주어진 비트 수로 표현 가능한지 확인한다.
6. `Num` 구조체의 `is_equal` 메서드: 숫자가 비트 벡터로 표현된 자연수와 동일한지 확인한다.
7. `Num` 구조체의 `decompose` 메서드: 숫자를 비트 벡터로 분해한다.
8. `Num` 구조체의 `as_allocated_num` 메서드: 숫자를 할당된 숫자로 변환한다.
9. `f_to_nat` 함수: 필드 요소를 자연수로 변환한다.
10. `nat_to_f` 함수: 자연수를 필드 요소로 변환한다.
요약하면, 이 파일은 변수 할당, 주어진 비트 수로 표현 가능한지 확인, 숫자를 비트 벡터로 분해 등 비네이티브 필드에서 다양한 연산을 수행할 수 있는 유틸리티 함수들을 제공한다.
"r1cs.rs", 이는 "src/gadgets/" 디렉터리에 위치한다.
이 파일은 Rank-1 Constraint Systems(R1CS)의 다양한 gadget을 구현하는 데 주로 사용된다.
R1CS는 알고리즘 또는 프로토콜을 설명하기 위한 증명 시스템으로, zk-SNARKs를 포함한 많은 제로지식 증명 시스템의 기반이다.
이 파일의 주요 부분들은 다음과 같다:
1. `AllocatedR1CSInstance` 구조체: 할당된 R1CS 인스턴스를 나타내며, 점 `W`와 두 숫자 `X0`, `X1`을 포함한다.
2. `AllocatedR1CSInstance::alloc` 메서드: 제약 시스템에서 R1CS 인스턴스를 할당하기 위한 메서드
3. `AllocatedR1CSInstance::absorb_in_ro` 메서드: R1CS 인스턴스를 랜덤 오라클(RO)에 흡수하기 위한 메서드
4. `AllocatedRelaxedR1CSInstance` 구조체: 할당된 완화된 R1CS 인스턴스를 나타내며, 두 점 `W`, `E`, 숫자 `u`, 두 큰 정수 `X0`, `X1`을 포함한다.
5. `AllocatedRelaxedR1CSInstance::alloc` 메서드: 제약 시스템에서 완화된 R1CS 인스턴스를 할당하기 위한 메서드
6. `AllocatedRelaxedR1CSInstance::default` 메서드: 제약 시스템에서 기본 완화된 R1CS 인스턴스를 할당하기 위한 메서드
7. `AllocatedRelaxedR1CSInstance::from_r1cs_instance` 메서드: R1CS 인스턴스를 완화된 R1CS 인스턴스로 변환하기 위한 메서드
TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News













