Quras는 영지식 증명이라는 “zk-SNARK”를 사용합니다. zk-SNARK를 사용하면 거래와 스마트 컨트랙에서 완전한 프라이버시 (익명성)을 실현할 수 있습니다. zk-SNARK는 “Zero-Knowledge Succinct Non-Interactive Argument of Knowledge”(간결한 비상호작용적 영지식 증명)의 약자입니다. 간결함은 메시지 크기가 실제로 실행될 계산량보다 훨씬 작은 것을 의미합니다. 비상호적은 검증자와 승인자 간의 실시간 통신 없이도 검증이 가능함을 의미합니다. 지식의 논증은 계산에 의한 지식 검증을 말한다. 송금인, 송금 및 금액 정보를 숨기기 위해 zk-SNARK 기술을 사용하더라도 거래를 확인할 수 있는 세 가지 주요 알고리즘이 있습니다.
G: 키를 생성하는 알고리즘 (증명 키(pk) 및 검증 키(vk)는 특정 비밀 값 R과 프로그램 C (pk, vk)= G(R,C)으로 생성됨)
P: 증명은 검증 수행을 위한 검증자에서 알고리즘(증명 키 (pk))에 대한 입력 (h) 및 (X) prf = P(pk, X, h)를 검증하기 위한 정보로 생성
V: 입력 (h)과 증명 (prf)에서 검증이 올바른지 여부와 프로그램 C를 검증하는 알고리즘 (검증 키 (vk))까지 "옳음 또는 틀림"이 반환됨. V (vk, h, prf) = 참 또는 거짓. 이 작업의 목적은 승인자가 질문자에게 질문하지 않고 짧은 시간에 적은 계산량으로 검증 작업을 수행하는 것입니다.
zk-SNARK를 실행하려면 아래 단계가 필요합니다:
계산 연산 회로 R1CS QAP zk-SNARK
연산 회로
거래 효율적인 함수를 수학 식으로 변환하기 위해 논리적 단계를 가능한 한 최소 연산으로 분류하여 "산술 회로"를 만듭니다. A가 (c1 ˙ c2) ˙ (c1 + c3) = 7 인 것으로 c1, c2, c3가 알려 있을 때 c1, c2, c3의 값은 B에 표시되지 않고 c1, c2, c3가 알려져 있음을 증명합니다. , 첫 번째 단계는 산술 회로로 수학 공식을 표시하는 것입니다.
산술 회로는 게이트, 덧셈 및 곱셈을 연결하는 와이어와 같은 게이트 계산 연산자로 표현됩니다. 회로는 아래의 수학 공식과 같습니다:
R1CS:
다음으로, 산술 회로가 랭크 1 제약 시스템 (R1CS)으로 변환됩니다. R1CS는 3 개의 벡터 (a, b, c)로 이루어진 그룹의 시퀀스입니다. R1CS의 솔루션은 벡터 s를 만족시켜야 하며, 여기서 s는 s.a * s.b - s.c = 0. 방정식을 충족해야 합니다. s는 모든 벡터, 즉 [C1 , C2 , C3 , S1 , S2 , S3]을 나타냅니다. 이는 가상 변수 "one"을 추가함으로써 동일한 방법으로 추가 게이트를 표현할 수 있기 때문에, s 벡터는 [one, C1 , C2 , C3 , S1 , S2 , S3]가 됩니다. 이 세 개의 관문은 다음과 같습니다:
a=[0,1,0,0,0,0,0]
b=[0,0,1,0,0,0,0]
c=[0,0,0,0,1,0,0]
a=[1,0,0,0,0,0,0]
b=[0,1,0,1,0,0,0]
c=[0,0,0,0,0,1,0]
a=[0,0,0,0,1,0,0]
b=[0,0,0,0,0,1,0]
c=[0,0,0,0,0,0,1]
QAP:
다음 단계는 이 R1C를 QAP (Quadratic Arithmetic Programs) 형식으로 변환하는 것입니다. 위의 세 벡터 그룹은 x로 표현 된 행렬 a (x), b (x), c (x)를 표시 할 수 있습니다. P(x)=T(x)*H(x)가 증명되면 P(x)=s.a(x) * s.b(x) - s.c(x) , P(x)=T(x)*H(x) 로 표시되는 다항식이 존재합니다. s.a(x)를 L(x)로, s.b(x)를 R(x)로, s.c(x)를 O(x)로 정의함으로써 증명되어야 할 수학 공식은 L(x)*R(x)-O(x) =T(x)*H(x)로 다시 쓸 수 있습니다.
1. A는 위의 방법에 따라 다항식 L, R, O, H를 선택한다.
2. B는 임의의 점 s를 선택하고 E(T(s))를 계산한다.
3. A는 B에서 보낸 E(s2),...)을 기준으로 E(L(s)),E(R(s)),E(O(s)),E(H(s))를 계산한다.
4. B는 E(L(s)* R(s)-O(s))= E(H(s)* T(s))를 확인한다.
준동형 암호화라는 이론을 적용합니다. 준동형 암호화는 숫자 x, 또는 E(x)가 다음 성질을 만족시키는 함수로 정의합니다:
거의 모든 x에 있어서, 일단 E(x)가 발견되면 그것을 찾기가 어렵습니다. 입력이 다를 경우 출력도 달라집니다. 이는 x≠y의 경우 E(x)≠E(y)가 됨을 의미합니다.E(x)와 E(y)를 아는 사람이 있으면 E(x)와 E(y) E를 사용하여 (x + y)를 계산할 수 있습니다. 이것은 x와 y가 숨겨져 있는 동안 다른 사람들이 x + y의 결과를 알고 있다는 것을 증명할 수 있다는 것을 의미합니다.
zk-SNARK 기술을 사용하여 Quras 플랫폼에서 트랜잭션을 익명화할 수 있습니다. 자금을 송수신하는 동안 zk-SNARK 기술을 사용하여 다음과 같은 3 종류의 거래가 가능합니다: 1) 사설(스텔스 주소에서 스텔스 주소로), 2) 비공개 해제(스텔스 주소에서 공개 주소로) 및 3) 비공개 (공개 주소에서 스텔스 주소로).
비공개 (공개 주소에서 스텔스 주소로)
이는 zk-SNARKs를 사용하여 송신자, 수신자, 거래금액을 포함한 거래내역의 암호화를 의미합니다. 이를 사용하면 컨센서스 노드에서 사용자의 개인 키를 모르고도 암호화된 트랜잭션이 올바른지 여부를 결정할 수 있습니다.
zk-SNARK 거래
즉, zk-SNARKs – Commitment (커미트먼트, 확약) 및 Nullifier(무효화) 사용에는 두 가지 새로운 개념이 있습니다. QURAS 블록 체인에서 암호화 된 나머지 잔액이 노트(Note)로 표시된다고 가정하면 비트코인에서 노트의 개념은 UTXO의 유사한 개념으로 볼 수 있습니다. 차이점은 UTXO처럼 노트가 암호화 되어있어 투명성이 없다는 것입니다. 다음은 Verifier가 노트를 확인하는 방법을 설명합니다. Commitment는 비사용 노트(Unspent Note)로 간주될 수 있지만 비트코인의 경우 비사용 UTXO와 동일합니다.
Nullifier는 중복 지불 방지를 위해 사용할 수 있지만 이는 사용된 노트(Spent Note) 입니다. 거래로 입력 된 참조는 해시를 Nullfiler로 설정하여 게시됩니다. 거래 출력은 해시값이며 Commitment는 블록 체인에 게시됩니다. QURAS 블록체인에서 zk-SNARK를 사용하려면 먼저 다음 키가 생성됩니다:
- ZK.ProvingKey: 익명 거래의 작성자가 암호화된 거래를 생성한 후 검증자가 사용할 검증 증명(증명서)을 생성하기 위해 사용하는 키.
- ZK.VerifyingKey: 암호화된 거래의 검증 증명(증명서)과 결합하여 암호화된 거래의 정확성을 검증하는 데 사용되는 키.
- ZK.SecretKey: zk-SNARKs의 ProvingKey 및 VerifyingKey를 생성하기 위해 사용되는 키.
- ZK.PrimaryInput: ZK.Proof를 생성하기 위해 verifier와 공유 및 사용을 위해 vérifier의 입력으로 사용되는 값.
- ZK.AuxiliaryInput: 이 값도 ZK.Proof를 생성하기 위해 사용되는 값.
- ZK.Proof: 이 데이터는 증명자가 증거로 검증자에게 보내기 위한 것이며 증명자의 정보를 포함하지 않습니다. ZK.Proof는 ZK.ProvingKey, ZK.PrimaryInput, ZK.AuxiliaryInput에 근거하여 증명자가 생성합니다. 검증자는 데이터와 이 ZK.VerifyingKey를 사용하여 검증을 진행합니다.
다음은 JoinSplit에 어떤 유형의 항목들이 있는지 설명합니다.
- VAmount_Old: T(투명 계좌)->A(익명 계좌)로 자금을 보낼 때 투명 계좌의 잔액. VAmount_New: 이는 T->A 또는 A->T의 경우에 T로 가는 잔액을 나타냅니다.
- MerkleRoot: 이전 블록 앞 커미트먼트의 머클 트리의 루트 해시 값.
- Nullifier(1, 2): 입력된 2 노트의 Nullfiler 값.
- Commitment(1, 2): 출력에 기록된 노트에 대한 확약 값.
- Epk: 출력 노트를 암호화하기 위해 사용된 KA 키 쌍의 공개 키. 암호화는 ESK와 수신인의 PKenc를 결합하여 수행됨. 즉, 수신인은 자신의 Skenc와 EPK를 사용하여 암호화된 Cenc를 읽을 수 있습니다.
- RandomSeed: JoinSplit의 증명 값을 계산하기 위해 사용된 Random의 바이트 행을 의미함.
- Proof: JoinSplit에 대한 zk-SNARKs의 영지식 증명을 나타냄.
- Cenc: 암호화된 노트 데이터를 표시함.
VAmount_Old 및 VAmount_New의 값은 1 이상이 될 수 없습니다. 이 두 값이 모두 1 이상이면 트랜잭션은 실패로 간주됩니다. 또한, JoinSplit 증명 및 zk-SNARK 검증 키가 있어도 zk-SNARK 검증은 수행됩니다. True이면 트랜잭션은 성공한 것으로 간주됩니다. True가 아니면 트랜잭션은 실패로 간주됩니다.
암호화된 거래는 최소한 1개의 JoinSplit 항목을 포함해야 합니다. JoinSplit가 구축될 때 시그니처 키(JoinSplitSig)에 대한 키 쌍을 1단계에서 생성하여 JoinSplit을 검증해야 합니다. JoinSplit 생성이 완료되면 JoinSplitPrivKey를 사용하여 JoinSplit 바디에 서명합니다. 이 후, 블록체인 방송을 위한 거래를 생성하기 위해 거래에 JoinSplitSig를 입력합니다.
(노트 커미트먼트 트리의 깊이가 머클 뎁스(MerkleDepth)라고 가정.)
Quras 블록체인에서, 머클 트리의 Auth Path 이론을 기반으로 머클 트리의 루트 값과 정확성을 검증할 수 있습니다.
앞에서 언급한 바와 같이 익명 거래에는 JoinSplit 항목이 있습니다. JoinSplit 항목의 VAmount_old는 공개 잔고 풀에서 코인 인출을 의미합니다. VAmount_new는 공개 잔고 풀에 코인을 입금하는 것을 의미합니다. 사용자는 JoinSplit의 VAmount_old와 VAmount_new를 통해 Quras 블록체인의 전체 공개 잔액 풀의 잔금만 확인할 수 있습니다. 다른 해당 계정의 잔고는 볼 수 없습니다.
JoinSplit 항목은 2개 이상 있으며, 블록체인에 거래가 들어가면 JoinSplit의 커미트먼트가 블록체인의 노트 커미트먼트 머클 트리에 추가됩니다.
또한, JoinSplit의 Nullifier가 블록체인에 등록됩니다. 익명 거래를 등록할 때 Tx의 Nullifier가 이미 블록체인에 등록된 경우 거래가 이중 지출로 인식되어 2회 등록이 되지 않고 블록체인으로 반환됩니다.
Nullifer 계산에서, 노트에 임의의 문자열이 입력되더라도 그의 Nullifier 값은 다릅니다. 이런 방법으로 Nullifier는 이중 지출을 방지합니다.
스마트 컨트랙은 자발적으로 계산이 검증될 수 있음을 의미합니다. 토큰 거래의 프라이버시를 보호하기 위한 zk-SNARK 기술의 사용과 함께, 이는 검증 가능하고 익명화 된 계산을 수행하는 것이 가능합니다.