회전문
TL;DR
- 회전문은 각 실드 풀로 얼마나 많은 가치가 들어오고 나가는지를 추적하는 공개 회계 규칙입니다
- 이를 통해 누구나 풀 내부의 거래는 비공개이더라도, 풀이 들어온 양보다 더 많이 지급하지 않았음을 검증할 수 있습니다
- 이는 위조 코인이 집계 규칙을 깨뜨리지 않고는 풀을 빠져나갈 수 없기 때문에, 숨겨진 버그로부터 ZEC 공급량을 보호합니다
- 풀 내부의 결제는 비공개로 유지됩니다. ZEC을 풀 간에 이동시키는 거래는 이동하는 금액을 표시합니다
- 회전문은 Orchard에서 Ironwood로의 마이그레이션이 실드 공급량의 건전성을 증명할 수 있는 이유입니다
이 문서는 누구를 위한 것인가
- Zcash가 어떻게 프라이빗 공급량의 신뢰성을 유지하는지 이해하고 싶은 모든 사람
- Orchard에서 Ironwood로의 마이그레이션을 따라가며 그것이 어떻게 공급량이 진짜임을 증명하는지 궁금한 사용자
- 프라이빗 머니 시스템이 어떻게 여전히 감사를 받을 수 있는지 궁금한 입문자
과제
실드된 Zcash는 금액, 송신자, 수신자를 숨깁니다. 그것이 바로 프라이버시의 핵심입니다. 하지만 이것은 어려운 질문을 낳습니다. 아무도 실드 풀 내부를 볼 수 없다면, 전체 ZEC 총량이 올바른지 누가 어떻게 알 수 있을까요? 볼 수 없는 돈을 어떻게 감사할 수 있을까요?
만약 어떤 버그가 누군가가 실드 풀 내부에서 코인을 위조할 수 있게 한다면, 그 위조는 정직한 사용자를 보호하는 바로 그 프라이버시에 의해 숨겨질 것입니다. 안전장치가 없다면, 그런 불확실성은 전체 공급량에 대한 신뢰를 무너뜨릴 것입니다. 회전문은 이 문제를 해결하는 안전장치입니다.
회전문이란 무엇인가
각 실드 풀을 하나의 계산되는 출입문이 있는 방이라고 생각해 보세요. 가치가 외부에서 풀로 들어오거나, 풀을 떠나 다른 곳으로 나갈 때마다, 그 가치는 그 출입문을 통과하며 공개적으로 집계됩니다. 방 안의 거래는 비공개로 유지되지만, 출입문에 기록되는 누적 총량은 모두가 볼 수 있습니다.
규칙은 간단합니다. 풀은 들어온 것보다 더 많은 가치를 절대 내보낼 수 없습니다. 노드는 어떤 풀의 잔액을 0 아래로 밀어내는 블록은 거부합니다. 풀 안에 있다고 여겨지는 금액은 언제나 알 수 있는데, 그것은 단지 들어온 총량에서 나간 총량을 뺀 값이기 때문입니다. 이 공개 집계가 바로 회전문입니다.
어떻게 작동하는가
Zcash는 역사적으로 Sprout, Sapling, Orchard와 같은 여러 실드 풀을 가져왔습니다. 가치는 투명 체인과 이 풀들 사이를 이동하며, 때로는 풀들끼리도 이동합니다. 회전문은 이러한 이동을 감시합니다.
- ZEC가 실드 풀로 들어가면, 그 금액이 해당 풀의 공개 잔액에 더해집니다
- ZEC가 풀에서 나오면, 그 금액이 차감됩니다
- 네트워크는 어떤 풀의 잔액을 음수로 만드는 블록, 즉 들어온 적보다 더 많이 나간 상태를 만드는 블록을 거부합니다
- 각 거래에는 풀로 들어가거나 풀에서 나오는 순흐름, 즉 가치 잔액만 표시됩니다. 하나의 풀 안에서 이루어지는 결제의 경우, 이는 수수료뿐입니다
네트워크는 Sprout, Sapling, Orchard, 새로운 Ironwood 풀, 그리고 transparent 및 lockbox 잔액을 포함해 모든 value pool의 잔액을 이런 방식으로 추적합니다. 이 때문에 풀의 정확한 내부 내용은 숨겨져 있더라도, 밖으로 나올 수 있는 최대치는 안으로 들어간 양으로 제한됩니다. 숨겨진 인플레이션은 유통으로 빠져나올 수 없습니다.
value balance는 어떻게 검증되는가
출입문에서의 집계가 신뢰할 수 있는 이유는, 모든 거래가 실제 금액 자체는 숨긴 채로도 자신이 진실한 금액을 이동시켰음을 반드시 증명해야 하기 때문입니다. 각 실드 거래는 하나의 정직한 숫자를 공개합니다. 바로 풀 안으로 또는 밖으로 이동한 순가치이며, 이를 value balance라고 부릅니다. 양수 value balance는 자금이 풀에서 transparent 쪽으로 나갔음을 뜻하고, 음수는 자금이 풀로 들어왔음을 뜻합니다. 비공개 세부사항은 봉인된 채 남지만, 이 단일 순수치는 공개되며, 회전문은 바로 이 값을 합산합니다.
영리한 부분은 거래가 그 공개 숫자가 정직하다는 것을, 그 뒤에 있는 비공개 금액들을 드러내지 않고 어떻게 증명하느냐입니다. 이 메커니즘은 풀마다 다르며, 이것이 회전문의 실제 작동 장치입니다.
원래의 Sprout 풀에서는 각 거래가 JoinSplit을 사용합니다. JoinSplit은 두 개의 숨겨진 note를 소비하고 두 개의 새로운 note를 생성하며, 두 개의 공개 필드를 가집니다. vpub_old는 transparent 쪽에서 실드 풀로 들어가는 가치이고, vpub_new는 풀이 transparent 쪽으로 다시 내보내는 가치입니다. 모든 JoinSplit은 그 자체로 균형을 맞춰야 하며, 그 영지식 증명은 숨겨진 입력과 숨겨진 출력이 올바르게 합산된다는 것을 보장합니다. Sprout의 풀 잔액은 체인 전체에 걸친 모든 vpub_old의 누적합에서 모든 vpub_new의 누적합을 뺀 값일 뿐입니다. 그래서 Sprout는 뒤에서 유용한 예시가 됩니다. vpub_old가 가치가 풀로 들어올 수 있는 유일한 경로이기 때문에, 이것을 끄는 단 하나의 규칙만으로도 풀을 영구적으로 봉인할 수 있기 때문입니다.
Sapling, Orchard, Ironwood에서는 balance가 더 똑똑한 방식으로, binding signature를 사용해 증명됩니다. 각 전송이 따로 균형을 맞추는 대신, 전체 거래가 각 숨겨진 금액에 대해 value commitment를 사용해 커밋합니다. value commitment는 숫자를 위한 봉인된 봉투와 같은 것으로, homomorphic Pedersen commitment로 만들어지며 특별한 성질이 있습니다. 바로 봉투를 열지 않고도 더하고 뺄 수 있다는 점입니다. 네트워크는 모든 입력 커밋먼트를 더하고, 모든 출력 커밋먼트를 빼고, 그 결과를 거래가 단 하나로 선언한 순수치인 valueBalance 필드와 비교합니다. 숨겨진 금액들이 그 공개 valueBalance와 진짜로 일치하는 거래만이 결합된 커밋먼트들에 대해 유효한 binding signature를 생성할 수 있습니다. 누군가가 자신이 선언한 것보다 더 많은 가치를 이동시키려 한다면, 커밋먼트의 합이 맞지 않고, binding signature 검증에 실패하며, 그 거래는 거부됩니다. Ironwood는 Orchard와 동일한 프로토콜을 사용하므로 같은 방식으로 작동합니다.
이것은 또한 풀 간 전송이 왜 안전하게 검증될 수 있는지를 설명합니다. 자금이 한 실드 풀에서 다른 실드 풀로 이동할 때, 예를 들어 Orchard에서 Ironwood로 이동할 때, 거래는 회계에서 금액을 숨길 수 없습니다. 각 풀은 자체적인 value balance를 가지며, 이는 각각의 증명으로 충족되어야 합니다. Orchard 쪽은 자신의 binding signature를 통해 일치하는 유출을 보여야 하고, Ironwood 쪽은 자신의 증명을 통해 그에 대응하는 유입을 보여야 합니다. 한 풀을 떠나는 가치와 다른 풀로 들어가는 가치는 각각 독립적으로 증명되므로, 풀 간 이동은 사실상 하나의 거래 안에서 일어나는 두 번의 회전문 통과입니다. 하나는 나가는 쪽, 하나는 들어가는 쪽이며, 기저 금액은 비공개로 남아 있어도 둘 다 공개적으로 집계됩니다.
따라서 회전문은 신뢰에 기대는 장치가 아닙니다. 모든 거래는 자신의 순효과를 수학적으로 증명하고, 네트워크는 풀별로 그 증명된 순효과를 합산하며, 합의 규칙(ZIP 209)은 어떤 풀의 잔액이라도 음수로 만드는 블록을 거부합니다. 거래 수준에서의 증명, 체인 수준에서의 강제입니다.
왜 중요한가
회전문은 Zcash에 세 가지를 동시에 제공합니다.
첫째, 위험을 구획화합니다. 한 풀의 암호학적 버그는 그 풀 안에만 갇히는데, 회전문이 위조된 가치가 더 넓은 공급량으로 넘어가는 것을 막기 때문입니다.
둘째, 공동체가 사후적으로 공급량을 검증할 수 있게 합니다. 나중에 버그가 발견되더라도, 회전문 기록은 어떤 풀에서 들어온 양보다 더 많은 가치가 나간 적이 있는지를 보여줍니다. 깨끗한 기록은 위조가 악용되지 않았다는 강력한 증거입니다.
셋째, 이 모든 일을 하면서도 풀 내부의 결제는 비공개로 유지합니다. 각 거래는 풀로의 순유입 또는 풀에서의 순유출만 공개하며, 하나의 풀 내부에서 이루어지는 결제의 경우 이는 수수료뿐입니다. Orchard에서 Ironwood로 이동하는 것과 같은 풀 간 전송은 풀을 가로지르는 금액을 보여 줍니다. 감사 가능성과 프라이버시가 공존하는데, 이것은 흔치 않으며 Zcash의 조용한 강점 중 하나입니다.
실제로 작동하는 회전문
회전문은 새로운 개념이 아니며, Zcash 역사에서 중요한 순간들에 사용되어 왔습니다.
Zcash가 원래의 Sprout 풀에서 더 새로운 Sapling 풀로 이동했을 때, 회전문이 그 전환을 보호했습니다. 이후 Sprout 풀은 새로운 유입을 받을 수 없도록 제한되었고, 이는 사용자들의 마이그레이션을 유도하는 동시에 회전문이 회계를 정직하게 유지하도록 했습니다. 몇 년이 지난 뒤에도 Sprout에서 어떤 가치도 부당하게 빠져나간 적이 없다는 사실은, 초기 암호 구조가 성공적으로 악용된 적이 없었다는 증거로 남아 있습니다.
이제 같은 설계가 Orchard에서 Ironwood로의 이동도 보호합니다. 2026년에 Orchard 증명 시스템에서 건전성 버그가 발견되어 패치되었습니다. 그것이 실제로 악용되었다는 증거는 없지만, 실드 활동은 비공개이기 때문에 확실성을 가질 수는 없었습니다. 이에 대한 대응은 오래된 Orchard 풀을 봉인하고, 모두가 자신의 자금을 회전문을 통해 수정된 프로토콜을 사용하는 새로운 풀 Ironwood로 옮기게 하는 것입니다. 자금을 회전문을 통과시키도록 강제하면, 가정적인 위조 코인이 뒤에 남아 있더라도 함께 따라나올 수 없고, 마이그레이션이 완료되면 누구나 실드 공급량이 건전하다는 것을 확인할 수 있습니다.
일방향 풀 폐기
회전문은 공급량 보장을 결코 깨뜨리지 않으면서, 오래된 풀을 오직 한 방향으로만 안전하게 퇴역시킬 수 있게 합니다. 핵심은 출구를 열어둔 채 입구를 닫는 것입니다.
가장 명확한 예는 Sprout입니다. 이를 폐기하기 위해 ZIP 211은 하나의 합의 규칙을 추가했습니다. 활성화 높이부터 모든 JoinSplit의 vpub_old 필드는 0이어야 한다는 규칙입니다. vpub_old는 가치가 Sprout로 들어갈 수 있는 유일한 경로이므로, 이를 0으로 강제하면 새로운 가치는 더 이상 들어갈 수 없게 되고, 기존 가치는 여전히 transparent 쪽이나 Sapling으로 흘러나갈 수 있습니다. 이로써 풀은 일방향이 되었습니다. 채워질 수는 없고, 오직 비워질 수만 있습니다. 회전문은 그동안 계속 집계를 유지하므로, 자금이 빠져나가면서 잔액은 줄어들 수는 있어도 다시 늘어날 수는 없고, 절대 음수가 될 수도 없습니다.
Orchard에서 Ironwood로의 마이그레이션도 같은 아이디어를 사용합니다. NU6.3 업그레이드에서 Orchard 풀은 새로운 유입에 대해 닫히고, 지갑들은 Orchard 자금을 회전문을 넘어 새로운 Ironwood 풀로 보내도록 안내됩니다. Orchard는 오직 비워질 수만 있는 일방향 풀이 됩니다. 모든 출구는 반드시 증명되어야 하는 회전문 통과이므로, 가정적인 위조 가치가 Orchard에 남아 있더라도 정직한 자금과 함께 조용히 빠져나올 수 없습니다. 그것은 오직 배출만 가능한 풀에 갇혀 있고, 출입문에서 감시받습니다. 시간이 지나면서 이는 오래된 풀을 비어 가게 만들고, 밖으로 나온 가치가 정직하게 들어간 가치보다 결코 많지 않았음을 누구나 확인할 수 있게 합니다.
이것이 단순한 회계를 넘어 회전문이 중요한 더 깊은 이유입니다. 그것은 Zcash가 Sprout의 경우처럼 복잡성을 줄이기 위해서든, Orchard의 경우처럼 발견된 버그에서 회복하기 위해서든, 실드 풀을 폐기하면서도 공급량에 대한 연속적이고 공개적이며 증명 가능한 보장을 유지할 수 있게 해주는 메커니즘입니다.
흔한 오해
- 회전문은 누가 누구에게 무엇을 보냈는지 드러내지 않습니다. 다만 풀 간에 ZEC를 이동시키는 모든 거래의 금액은 표시합니다
- 위조자를 이름으로 찾아내는 장치가 아닙니다. 한 풀이 얼마나 많이 내보낼 수 있는지를 제한하는 것이며, 그것이 공급량을 보호합니다
- Ironwood를 위해 새로 발명된 것이 아닙니다. Zcash 역사상 모든 주요 실드 풀 전환을 보호해 왔습니다
- 공개된 풀 총량은 풀 내부 결제의 프라이버시를 약화시키지 않습니다. 풀 간에 ZEC를 이동하면 이동한 금액이 표시되므로, ZIP 318은 지갑이 시간이 지남에 따라 표준 금액으로 마이그레이션하도록 요청합니다
자료
- ZIP 209: 범위를 벗어난 체인 value pool 잔액 금지 - 회전문의 기반이 되는 합의 규칙
- ZIP 211: Sprout 체인 value pool에 새로운 가치 추가 비활성화 - Sprout 풀이 새로운 입금에 대해 어떻게 닫혔는지
- ZIP 258: NU6.3 - Ironwood 풀을 도입하고 회전문을 통해 가치를 이동시키도록 하는 업그레이드
- 위조 방지를 위한 회전문 강제 - Electric Coin Company의 원래 설명
- Zcash 프로토콜 명세 - 전체 세부사항은 balance와 binding signature 관련 섹션 참조
- Value Pools, Zebra Book - 노드가 각 풀의 value balance를 어떻게 추적하는지
관련 문서
- 실드 풀 - Zcash 실드 거래가 세부사항을 어떻게 비공개로 유지하는지
- Halo - Orchard 풀의 기반이 되는 증명 시스템
- 네트워크 업그레이드 - Zcash가 새로운 실드 풀 같은 변경 사항을 어떻게 활성화하는지