
시리즈: Zcash의 첫 원칙부터 . 제6장. 쉴드 프로토콜 (결론) 대상 독자: 0번에서 5번까지 읽은 초보자들입니다. 여기서 모든 것이 연결됩니다. 학습 결과: 사적인 Zcash 거래에 대한 완전하고 정확한 머리 속 모델을 갖게 될 것입니다. 시리즈의 모든 개념이 올바른 위치에 배치되고, 0번 글에서 언급된 모든 루프가 닫혀 있을 것입니다.
제0장에서는 역설과 공개된 보드 위에 밀봉된 편지의 이야기로 시작했습니다. 이후 다섯 개의 글을 통해 구성 요소들을 만들었습니다: 유한체, 타원 곡선, 약속, 머클 트리, 제로 지식 증명입니다. 이제 그들을 결합하여 실제 사적인 결제가 어떻게 작동하는지 처음부터 끝까지 살펴보겠습니다.
개별적으로, 당신이 배운 각각의 조각은 매우 똑똑합니다. 그러나 Zcash의 마법은 그들이 어떻게 결합되는지에 있습니다. nullifier만으로는 개인정보 보호를 제공하지 않습니다. 약속만으로는 위조를 방지할 수 없습니다. 증명만으로는 유용한 것을 증명할 수 없습니다. 결합이 다섯 가지 구성 요소를 동시에 사적인 것과 신뢰할 수 있는 돈으로 만듭니다.
이 글은 바로 그 결합입니다. 끝까지 읽으면, *"네트워크가 거래를 볼 수 없음에도 불구하고 검증한다"*는 문장이 역설이 아니라 이미 이해한 구성 요소들의 자연스러운 결과처럼 느껴질 것입니다.
여기서는 제0장의 이야기에서 실제 기계로 매핑되어 한 페이지에 전체 시리즈가 나열되어 있습니다.
| 제0장 이야기 요소 | 실제 구성 요소 | 만들어진 것 |
|---|---|---|
| 편지 안의 돈 | 노트(가치, 수신자, 무작위성) | 필드 원소로 인코딩 (제1장) |
| 밀봉된 불투명한 편지 | 노트 약속 | Pedersen / Sinsemilla 약속 (제2장, 제3장) |
| 공개 보드 | 노트 약속 트리(앵커 = 루트) | 점진적 머클 트리 (제4장) |
| 공백 토큰 | nullifier | 노트 + 비밀 키의 ZK-친화적인 해시 (제2장, 제3장) |
| "들어오는 돈은 나가는 돈과 같다" | 가치 약속 + 잔액 확인 | 동형 Pedersen 약속 (제2장, 제3장) |
| 커튼 뒷면의 마법 | 제로 지식 증명 | 산술 회로에 대한 zk-SNARK (제5장) |
| "당신만이 편지를 읽을 수 있다" | 암호화된 노트 + 보기 키 | 암호화 + 키 계층 구조 (이 글) |
사용자가 할 수 있는 모든 것이 단일 비밀, 즉 소비자 키(spending key)에서 시작되며, 이는 한 방향 계층 구조를 통해 진행됩니다(각 화살표는 Article 2와 3에서 언급된 트랩도어(trapdoor)에 의해 불가역적인 유도입니다):

이전 글들에서 두 가지 주요한 점을 알아야 합니다:
노트를 사적으로 사용하려면, 당신은 네 가지 사실을 동시에 노트, 가치, 위치, 또는 신분을 드러내지 않고 네트워크에 설득해야 합니다. 각각의 주장은 이미 알고 있는 구성 요소로 충족됩니다.

증명은 기본적인 사실(어떤 노트, 누구의 키, 어떤 가치)을 드러내지 않습니다. 오직 네 가지 주장이 모두 참임만 드러냅니다. 이는 쉴드 Zcash의 전체적인 트릭이며, 하나의 다이어그램으로 설명됩니다.
Articles 2와 3에서 우리는 Pedersen 약속이 더해진다는 점을 언급했습니다: v_1에 대한 약속과 v_2에 대한 약속의 합은 v_1 + v_2에 대한 약속입니다. 여기서 그 보상이 나타납니다.
모든 입력 및 출력 노트는 가치 약속(Pedersen 약속 v.G + r.H)을 포함합니다: 이는 금액 v를 숨기는 것입니다. 이러한 약속들이 더해지므로, 네트워크는 다음과 같이 계산할 수 있습니다:
(입력 가치 약속의 합) − (출력 가치 약속의 합)
거래가 균형을 이루고 있다면(돈이 생성되거나 파괴되지 않았다면), v 부분은 정확히 상쇄되어, 0 값에 대한 약속만 남게 됩니다. 이는 잔여 무작위성으로 블라인드 처리됩니다. 발신자는 이 잔여 무작위성을 알고 있음을 증명하기 위해 작은 서명인 바인딩 서명(binding signature)을 생성합니다. 유효한 바인딩 서명은 값이 실제로 균형을 이루고 있을 때만 가능하며, 단 하나의 금액도 드러내지 않고 있습니다.
이는 전체 시리즈에서 왜 동형, 곡선 기반 약속이 필요한지를 가장 깨끗하게 설명하는 예시입니다. "들어오는 돈은 나가는 돈과 같다"는 규칙은 밀봉된 편지들을 더하고 결과가 0으로 봉인되는지 확인함으로써 강제됩니다.
앨리스가 보브에게 지불하는 것을 조립해보겠습니다. 우리는 Sapling의 명확한 "소비 측면 / 출력 측면" 구조를 가르치는 모델로 사용하겠습니다.
쉴드 거래는 두 가지 유형의 설명을 묶습니다:
| 소비 설명 (노트 소모) | 출력 설명 (노트 생성) |
|---|---|
| 입력의 가치 약속 | 출력의 가치 약속 |
| 그가 증명하는 앵커(트리 루트) | 새로운 노트 약속(새로운 리프) |
| 소비된 노트의 nullifier | 암호화를 위한 임시 키 |
| 재난수화된 공개 키 + 소비 권한 서명 | 암호화된 노트(수신자용 암호문) |
| 네 가지 주장에 대한 zk-SNARK 증명 | 출력이 잘 구성되었음을 보여주는 zk-SNARK |
더불어 전체 묶음에 대한 바인딩 서명, 가치 균형을 강제하는 것 (5절).

개인정보 보호 추적: 네트워크는 앵커를 확인하고, nullifier가 신선한지 확인하며, 증명을 검증하고, 균형도 확인합니다. 금액, 주소, 또는 어떤 노트가 소비되었는지를 전혀 알지 못하면서 유효한 결제를 수락했습니다. 한편, 소비된 노트의 nullifier(그의 사망)와 보브의 새로운 약속(그의 노트의 탄생)은 Article 0에서 언급된 끊어진 링크처럼 두 개의 다른 공개 구조에 존재하며, 그 사이에는 명백한 연결이 없습니다.
제0장에서는 의도적으로 질문을 열었습니다. 여기서는 모두가 닫혀 있습니다.
| 제0장에서 열린 루프 | 닫음 |
|---|---|
| 밀봉되지만 위조되지 않는 편지가 어떻게 가능한가? | 약속: 무작위성으로 숨기고, 충돌 저항 / 곡선 트랩도어로 결합 (제3장) |
| 키와 비밀 레시피는 어디서 오는가? | 필드 산술과 타원 곡선 스칼라 곱셈 (제1장, 제2장) |
| "보드"란 정확히 무엇인가? | 노트 약속의 점진적 머클 트리; 그 루트는 앵커 (제4장) |
| 공백 토큰이 자신의 편지와 어떻게 연결되지 않는가? | nullifier는 약속과 별도의 집합에 저장된 키 해시로 유지됨 (제2장, 제3장, 제4장) |
| 유효성을 증명하면서 아무것도 드러내지 않으려면 어떻게 하나요? | 산술 회로에서 네 가지 주장 모두를 인코딩한 zk-SNARK (제5장) |
| 수신자가 자신이 지급받았다는 것을 어떻게 알게 되나요? | 노트는 그의 주소에 암호화되어 있고, 보기 키로 시도해 복호화함 (이 글) |
| "들어오는 돈 = 나가는 돈"은 어떻게 사적으로 강제되나요? | 동형 가치 약속 + 바인딩 서명 (5절) |
첫 페이지의 역설, 보지 못하면서 검증하라,는 이제 완전히 해소되었습니다. 네트워크는 숨겨진 데이터에 대한 주장을 검증하며, 데이터 자체를 결코 보지 않습니다.
Sapling의 구조로 가르쳤습니다. 그 이유는 분리가 가장 명확하기 때문입니다. 현재 설계인 Orchard는 이 아이디어들을 개선하는 것이며, 대체하지 않습니다:
| Sapling | Orchard | |
|---|---|---|
| 거래 단위 | 별도의 소비 및 출력 설명 | 통합된 액션(각 액션은 하나의 소비 + 하나의 출력) |
| 증명 시스템 | Groth16(신뢰 설정 필요) | Halo 2(신뢰 설정 불필요) |
| 곡선 | BLS12-381 + Jubjub | Pallas / Vesta (Pasta) |
| 약속 해시 | Pedersen | Sinsemilla |
이 글에서 언급된 모든 개념은 그대로 적용됩니다; Orchard는 주로 소비와 출력을 함께 묶고, 의식적인 증명 시스템으로 교체합니다. 다섯 개의 기둥은 변함없습니다.
이 글은 시리즈에서 가장 완전한 그림입니다. 그러나 여전히 모델일 뿐입니다. 우리는 노트의 정확한 필드 인코딩, 키 유도 공식, 소비 키의 재난수화, 분산 주소, 메모 필드, 수수료 처리, 가치 약속과 노트 약속 사이의 차이, 각 서명의 정확한 역할을 모두 압축했습니다. 또한 하나의 표준 흐름만 제시했으며, 실제 거래는 여러 번의 소비와 출력을 동시에 수행하거나 투명하고 쉴드된 부분을 혼합할 수 있습니다. 공식적인 출처는 Zcash 프로토콜 명세입니다. 지금 당신이 가진 것은 올바른 모양이며, 명세가 모든 측정값을 채워줍니다.
| 용어 | 평범한 영어 의미 |
|---|---|
| Spending key | 사용자의 모든 키가 유래하는 단일 루트 비밀 |
| Viewing Key | 거래 내용을 보여주되 소비 권한은 부여하지 않는 것 |
| Spend description | 거래의 노트를 소모하는 부분 (nullifier, 앵커, 증명) |
| Output description | 거래에서 노트를 생성하는 부분 (약속, 암호문, 증명) |
| Action (Orchard) | 하나의 소비와 하나의 출력을 함께 수행하는 통합 단위 |
| Value commitment | 금액에 대한 동형 Pedersen 약속 |
| Binding signature | 가치 균형을 증명하지만 그 가치를 드러내지 않는 서명 |
| Anchor | 소비가 멤버십을 증명하는 트리 루트 |
| Trial decryption | 수신자가 새로운 약속을 테스트하여 자신에게 의한 노트를 찾는 것 |
네트워크는 금액이나 누가 누구에게 지불했는지를 보게 되나요? 아니요. 증명, nullifier의 신선도, 앵커, 바인딩 서명을 검증합니다. 모든 사적인 값은 숨겨져 있습니다.
노트를 두 번 사용하는 것을 막는 것은 무엇입니까? nullifier입니다. 노트를 소비하면 이를 공개하고, 네트워크는 이미 nullifier 집합에 있는 것을 거부합니다. 같은 노트는 항상 동일한 nullifier를 생성합니다.
금액이 숨겨져 있으면 균형을 어떻게 확인하나요? 가치 약속은 동형적으로 더해지며, 균형 잡힌 거래의 약속들은 0에 대한 약속으로 상쇄됩니다. 이는 바인딩 서명이 증명합니다.
감사자에게 거래를 보여줄 수 있으면서도 제어권을 포기하지 않을 수 있나요? 네. 보기 키를 전달하면 됩니다. 이는 쉴드된 활동을 드러내지만, 한 방향 키 계층 구조 덕분에 소비 권한은 부여되지 않습니다.
Orchard가 존재하므로 Sapling이 오래되어 버렸나요? 둘 다 네트워크 상에서 존재했습니다. Orchard는 현재 설계입니다. 개념은 공유되며, 하나를 이해하면 다른 것도 알 수 있습니다.
친구가 말합니다: "증명이 금액을 숨기므로 도둑은 출력이 입력보다 더 가치 있다고 주장하고 무료 돈을 인쇄할 수 있다." 제5절을 사용하여 두 문장으로 왜 이 시도가 실패하는지 설명해 보세요. (정답 아래에 있습니다.)
금액은 숨겨져 있지만, 각각은 동형 가치 약속으로 둘러싸여 있으며, 네트워크는 모든 입력 약속을 더하고 모든 출력 약속을 빼서 계산합니다. 만약 숨겨진 값들이 균형을 이루지 않았다면 결과가 0에 봉인되지 않으며 유효한 바인딩 서명은 생성될 수 없습니다. 도둑은 얼마나 많은지는 숨길 수 있지만, 균형이 맞지 않는 값을 균형 확인에 통과시키는 것은 불가능하므로, 아무것도 드러내지 않으면서도 산술적으로 잡힐 수 있습니다.
이제 당신은 하나의 역설에서부터 전체적인 사적인 결제로 이동했습니다:

여기서 다음 자연스러운 흐름은 더 깊이 들어갑니다: Groth16과 Halo 2의 내부 작동, 신뢰 설정 의식, Sapling 및 Orchard 회로에 대한 상세한 설명, 키 유도와 분산 주소, 네트워크 업그레이드를 통한 프로토콜 진화 등입니다. 그러나 기초는 이제 마련되었으며, 모든 주제가 붙일 수 있는 곳이 있습니다.
Zcash from First Principles 시리즈의 일부분으로 ZecHub에 게시됨. CC BY-SA 4.0 라이선스.