Vitalik: 중앙화 거래소는 어떻게 자금 증명을 하나요?
저자: Vitalik
편집: 동이밍, ChainCatcher
중요한 중앙화 거래소가 폭발할 때마다, 흔히 제기되는 질문은 우리가 암호 기술을 사용하여 문제를 해결할 수 있는지 여부입니다. 거래소는 그들이 체인에서 보유하고 있는 자금이 사용자에 대한 부채를 지불하기에 충분하다는 것을 나타내는 암호 증명을 생성할 수 있으며, 단순히 정부의 허가, 감사인 및 거래소 운영자의 개인 배경과 같은 "법적" 방법에 의존하지 않을 수 있습니다.
거래소는 예금자의 동의 없이 그들의 자금을 인출할 수 없는 시스템을 구축할 수 있습니다. 잠재적으로, 우리는 "나쁜 일을 하지 말라"는 포부를 가진 좋은 사람들의 CEX와 "나쁜 일을 할 수 없다"는, 그러나 현재 비효율적이고 개인 정보가 유출되는 체인 기반 DEX 사이의 전체 스펙트럼을 탐색할 수 있습니다. 이 글에서는 거래를 신뢰 없는 상태에 가깝게 만들기 위한 역사적 시도, 이러한 기술의 한계, 그리고 ZK-SNARKs 및 기타 고급 기술에 의존하는 업데이트되고 더 강력한 아이디어를 깊이 있게 탐구할 것입니다.
대차대조표 와 Merkle 트리 : 구식의 청산 능력 증명
거래소는 사용자들을 속이지 않았다는 것을 증명하기 위해 암호학적 방법을 처음 시도한 것은 오래전으로 거슬러 올라갑니다. 2011년, 당시 가장 큰 비트코인 거래소인 MtGox는 424242 BTC를 미리 발표된 주소로 전송하는 거래를 통해 자금을 보유하고 있음을 증명했습니다. 2013년에는 고객 예금의 총 규모를 증명하는 문제의 다른 측면을 해결하는 방법에 대한 논의가 시작되었습니다. 고객의 예금이 X와 같다는 것을 증명하고(X는 "부채 증명"), X 코인의 개인 키 소유권을 증명하면("자산 증명"), 당신은 청산 능력을 증명하게 됩니다: 거래소가 모든 예금자에게 반환할 자금을 보유하고 있음을 증명한 것입니다.
예금을 증명하는 가장 간단한 방법은 (사용자 이름, 잔액) 쌍의 목록을 간단히 게시하는 것입니다. 각 사용자는 자신의 잔액이 목록에 포함되어 있는지 확인할 수 있으며, 누구나 전체 목록을 확인하여 (i) 각 잔액이 비음수가 되고, (ii) 총액이 청구 금액과 같음을 확인할 수 있습니다. 물론, 이는 개인 정보 보호를 해치므로, 우리는 약간의 변형을 통해 (해시(사용자 이름, salt), 잔액) 쌍의 목록을 게시하고 각 사용자에게 그들의 salt 값을 비공식적으로 전송할 수 있습니다. 그러나 이렇게 해도 잔액이 유출되고 잔액의 변화 패턴이 드러납니다. 개인 정보 보호의 욕구는 우리를 다음 발명으로 이끌었습니다: Merkle 트리 기술.
초록: Charlie 노드. 파랑: David 노드, Charlie가 수신할 노드로, 그의 증명의 일부로 사용됩니다. 노랑: 루트 노드, 모든 사람에게 공개됩니다.
Merkle 트리 기술은 고객의 잔액 목록을 Merkle sum tree에 넣는 것입니다. Merkle sum tree에서 각 노드는 (잔액, 해시) 쌍입니다. 하위의 리프 노드는 개별 고객의 잔액과 salted 사용자 이름 해시 값을 나타냅니다. 각 상위 노드에서 잔액은 아래 두 잔액의 합계이며, 해시 값은 아래 두 노드의 해시 값입니다. Merkle sum 증명은 Merkle 증명과 마찬가지로 나뭇가지의 "분기"로, 리프에서 루트로 가는 경로의 형제 노드로 구성됩니다.
거래소는 각 사용자에게 그들의 잔액을 증명하기 위해 Merkle sum 증명을 전송합니다. 그러면 사용자는 자신의 잔액이 총액의 일부로 올바르게 포함되어 있다는 보장을 받게 됩니다. 간단한 코드 예제는 ++여기++서 찾을 수 있습니다.
이 설계에서의 개인 정보 유출은 완전히 공개된 목록보다 훨씬 낮으며, 매번 루트 디렉토리를 게시할 때 분기를 셔플하여 개인 정보 유출을 더욱 줄일 수 있지만, 여전히 일부 개인 정보 유출이 존재합니다. Charlie는 누군가의 잔액이 164ETH임을 알 수 있으며, 두 사용자의 잔액이 합쳐서 70ETH임을 알 수 있습니다. 많은 계정을 제어하는 공격자는 여전히 거래소 사용자에 대한 많은 정보를 알 수 있는 가능성이 있습니다.
이 계획의 중요한 미묘한 점 중 하나는 부정 잔액의 가능성입니다: 만약 거래소가 1390ETH의 고객 잔액을 가지고 있지만, 890ETH의 준비금만 있다면, 어떻게 해야 할까요? 트리의 어느 가짜 계정 아래에서 -500ETH의 잔액을 추가하여 차이를 메우려고 시도할까요? 사실, 이러한 가능성은 이 계획을 파괴하지 않으며, 이것이 우리가 일반 Merkle 트리 대신 Merkle sum 트리가 특히 필요한 이유입니다. Henry가 거래소가 제어하는 가짜 계정이라고 가정하고, 거래소가 그곳에 -500ETH를 두었다고 가정해 보겠습니다.
Greta의 증명 검증은 실패할 것입니다: 거래소는 그녀에게 Henry의 -500 ETH 노드를 제공해야 하며, 그녀는 그것이 유효하지 않기 때문에 이 노드를 거부할 것입니다. Eve와 Fred의 검증도 실패할 것입니다. 왜냐하면 Henry 위의 중간 노드의 ETH 총량이 -230이기 때문에, 그것도 유효하지 않기 때문입니다! 도난을 피하기 위해, 거래소는 전체 트리의 오른쪽 절반이 아무도 잔액 증명을 확인하지 않기를 바라야 할 것입니다.
만약 거래소가 500ETH의 가치를 가진 사용자를 식별할 수 있다면, 그들은 이러한 사용자가 증명을 확인할 마음이 없거나, 증명을 받지 못했다고 불평할 때 믿지 않을 것이라고 믿는다면, 그들은 도난의 처벌을 피할 자신이 있을 것입니다. 그러나 거래소는 이러한 사용자를 트리에서 제외할 수도 있어 동일한 효과를 얻을 수 있습니다.
따라서, 단순히 부채 증명의 목표를 달성하기 위해서라면, Merkle 트리 기술은 기본적으로 부채 증명 계획(proof-of-liabilities)과 동일하게 좋습니다. 그러나 그것의 개인 정보 속성은 여전히 이상적이지 않습니다. Merkle 트리를 더 교묘하게 사용하여, 예를 들어++각 satoshi 또는 wei를 개별 리프로 만들기++와 같은 방법을 사용할 수 있지만, 궁극적으로 더 현대적인 기술이 있으며, 이를 수행할 더 나은 방법이 있습니다.
ZK-SNARKs로 개인 정보 및 견고성 개선
ZK-SNARKs는 강력한 기술입니다. ZK-SNARKs가 암호학에서 차지하는 역할은 변압기가 인공지능에서 차지하는 역할과 같을 수 있습니다: 그것은 너무 강력한 범용 기술로, 수십 년 전에 개발된 특정 응용 기술의 많은 문제를 완전히 압도할 것입니다. 따라서, 우리는 ZK-SNARKs를 사용하여 책임 증명 프로토콜의 개인 정보를 크게 단순화하고 개선할 수 있습니다.
우리가 할 수 있는 가장 간단한 일은 모든 사용자의 예금을 Merkle 트리에 넣고(또는 더 간단하게,++KZG 약속++ 사용) ZK-SNARK를 사용하여 그 트리의 모든 잔액이 비음수이며 특정 주장된 값과 같다는 것을 증명하는 것입니다. 개인 정보 보호를 위해 해시 레이어를 추가하면 각 사용자의 Merkle 분기(또는 KZG 증명)는 다른 사용자의 잔액을 누설하지 않게 됩니다.
KZG 약속을 사용하는 것은 개인 정보 유출을 피하는 한 방법입니다. 왜냐하면 "형제 노드"를 증명으로 제공할 필요가 없기 때문입니다. 간단한 ZK-SNARK를 사용하여 잔액의 총합과 각 잔액이 비음수임을 증명할 수 있습니다.
우리는 위의 KZG에서 잔액의 합과 비음성을 증명하기 위해 특별한 용도의 ZK-SNARK를 사용할 수 있습니다. 이를 수행할 수 있는 간단한 예가 있습니다. 우리는 보조 다항식을 도입하여 "각 잔액의 비트를 구축"합니다(예를 들어, 잔액이 있다고 가정합니다) 그리고 16개의 위치마다 오프셋이 있는 실행 총계를 추적하여 실제 총계가 주장된 총계와 일치할 때만 총합이 0이 되도록 합니다. 만약 z가 -128의 단위근이라면, 우리는 다음과 같은 등식을 증명할 수 있습니다.
유효한 설정의 첫 번째 값은 0 0 0 0 0 0 0 0 0 0 1 2 5 10 20 -165 0 0 0 0 0 0 0 0 1 3 6 12 25 50 -300 …
이러한 방정식을 다항식 검사로 변환한 다음 ZK-SNARK로 변환하는 방법에 대한 추가 설명은 제가 작성한++ZK-SNARK에 관한 글++에서++여기++와++여기++에서 확인할 수 있습니다. 이것은 최적의 프로토콜은 아니지만, 이러한 유형의 암호 증명이 요즘 그렇게 기괴하지 않다는 것을 보여줍니다!
몇 개의 추가 공식을 통해, 이러한 제약 시스템은 더 복잡한 환경에 적응할 수 있습니다. 예를 들어, 레버리지 거래 시스템에서는 개별 사용자가 부정 잔액을 가지는 것이 허용되지만, 그들이 충분한 다른 자산을 가지고 있어야 하며, 일부 담보 마진이 있는 자금을 커버할 수 있어야 합니다. SNARK는 이 더 복잡한 제약을 증명하는 데 사용될 수 있으며, 사용자는 거래소가 다른 사용자의 자금을 위험에 빠뜨리는 규칙을 통해 그들의 자금을 보호하지 않을 것이라는 확신을 가질 수 있습니다.
더 먼 미래에는, 이러한 ZK 부채 증명이 고객의 거래소 예금뿐만 아니라 더 넓은 대출에도 사용될 수 있을 것입니다. 대출을 받을 때마다, 대출을 포함하는 다항식이나 트리에 기록을 남기고, 해당 구조의 루트가 체인에 게시됩니다. 이는 대출을 원하는 사람이 대출자에게 자신이 다른 대출을 너무 많이 빌리지 않았다는 ZK 증명을 제공할 수 있게 합니다. 궁극적으로, 법적 혁신은 이미 이러한 방식으로 약속된 대출이 약속되지 않은 대출보다 더 높은 우선 순위를 가질 수 있게 할 것입니다. 이는++"탈중앙화 사회++ ++:++ ++Web3의 영혼 찾기"++에서 논의된 아이디어와 완전히 동일한 방향으로 우리를 이끌 것입니다: 어떤 형태의 "영혼 토큰(soulbound token)"을 통해 체인에서 부정적인 평판이나 담보 개념을 구축하는 것입니다.
자산 증명
자산 증명의 가장 간단한 버전은 우리가 위에서 본 프로토콜입니다: 당신이 X개의 코인을 보유하고 있음을 증명하기 위해, 미리 약속된 시간에 X개의 코인을 이동시키거나 데이터 필드에 "이 자금은 바이낸스에 속한다"는 거래를 수행하면 됩니다. 거래 수수료를 피하기 위해, 당신은 체인 외부의 정보를 서명하여 대신할 수 있습니다; 비트코인과 이더리움 모두 체인 외부 서명 정보의 표준을 가지고 있습니다.
이 간단한 자산 증명 기술에는 두 가지 실제 문제가 있습니다.
- "콜드 스토리지" 처리
- 담보의 이중 용도
보안상의 이유로, 대부분의 거래소는 고객의 자금을 대부분 "콜드 스토리지"에 보관합니다: 오프라인 컴퓨터에서, 거래는 수동으로 서명해야 하며 인터넷으로 전송됩니다. 개인 자금을 위해 설정한 콜드 스토리지는 서명된 거래를 포함하는 QR 코드를 생성하는 영구 오프라인 컴퓨터를 포함했습니다. 현대의 거래 프로토콜은 더욱 복잡하여 여러 장치 간의 다자간 계산을 포함합니다. 이러한 설정을 고려할 때, 주소에 대한 제어를 증명하기 위한 추가 정보조차도 비싼 작업입니다!
거래는 다음과 같은 여러 경로를 취할 수 있습니다:
- 몇 개의 공개적으로 장기 사용되는 주소를 보유합니다. 거래소는 몇 개의 주소를 생성하고, 각 주소에 대해 소유권을 증명하기 위해 한 번 증명을 게시한 후, 이러한 주소를 반복 사용합니다. 이는 지금까지 가장 간단한 계획이지만, 보안과 개인 정보 보호를 어떻게 유지할 것인지에 대한 몇 가지 제한을 추가합니다.
- 많은 주소를 설정하고 무작위로 몇 개를 증명합니다. 거래소는 많은 주소를 보유하며, 아마도 각 주소를 한 번만 사용하고, 한 번의 거래 후 퇴역시킵니다. 이 경우, 거래소는 주기적으로 무작위로 몇 개의 주소를 선택하여 소유권을 증명해야 할 수 있습니다. 일부 거래소는 감사인과 함께 유사한 작업을 수행했지만, 원칙적으로 이 기술은 완전 자동화된 프로그램으로 발전할 수 있습니다.
- 더 복잡한 ZKP 옵션. 예를 들어, 거래소는 모든 주소를 1/2 다중 서명으로 설정할 수 있으며, 각 주소의 키는 다르며, 다른 하나는 특정 "중대한" 긴급 백업 키의 블라인드 버전으로 매우 높은 보안 방식으로 저장됩니다. 개인 정보 보호를 위해 거래소는 블록체인에서 이러한 형식의 주소의 총 잔액을 증명하는 제로 지식 증명을 실행할 수도 있습니다.
또 다른 주요 문제는 담보의 이중 용도를 방지하는 것입니다. 거래소는 서로 간에 담보를 쉽게 이동시켜 준비금 증명을 위해 실제로는 청산 능력이 없을 때 청산 능력이 있다고 가장할 수 있습니다. 이상적으로, 청산 능력 증명은 실시간으로 이루어져야 하며, 각 블록 후에 증명이 업데이트되어야 합니다. 이것이 현실적이지 않다면, 차선책은 서로 다른 거래소 간에 고정된 일정에 따라 조정하는 것입니다. 예를 들어, 매주 화요일 UTC 14시에 준비금을 증명하는 것입니다.
마지막 문제는: 법정 화폐에 대한 자산 증명을 할 수 있을까요? 거래소는 단순히 암호화폐를 보유하는 것이 아니라, 은행 시스템 내에서 법정 화폐를 보유하고 있습니다. 여기서 답은: 가능합니다. 그러나 이러한 프로세스는 불가피하게 "법정 화폐" 신뢰 모델에 의존하게 됩니다: 은행 자체가 잔액을 증명할 수 있고, 감사인이 자산 부채표를 증명할 수 있습니다. 법정 화폐는 암호화 검증이 불가능하다는 점을 고려할 때, 이는 이 프레임워크 내에서 할 수 있는 최선의 방법이지만, 여전히 가치가 있습니다.
또 다른 방법은 거래소를 운영하고 USDC와 같은 자산 지원 스테이블코인을 처리하는 실체와 암호화폐와 전통적인 은행 시스템 간의 현금 이동 프로세스를 처리하는 실체(USDC 자체)를 깔끔하게 분리하는 것입니다. USDC의 "부채"는 체인상의 ERC20 토큰에 불과하므로, 부채 증명은 "무료"이며, 자산 증명만 필요합니다.
Plasma 와 Validium: CEX를 구속받지 않게 할 수 있을까요?
우리가 더 나아가고 싶다고 가정해 보겠습니다: 우리는 거래소가 사용자 자금을 훔치는 것을 완전히 방지하고 싶습니다.
이 분야에서의 첫 번째 중요한 시도는 Plasma로, 2017년과 2018년 이더리움 연구 커뮤니티에서 유행했던 확장 솔루션입니다. Plasma의 작동 원리는 잔액을 개별 "코인" 집합으로 분할하는 것입니다. 각 코인은 인덱스가 할당되며, Plasma 블록의 Merkle 트리의 특정 위치에 위치합니다. 코인을 유효하게 전송하려면 거래를 트리의 올바른 위치에 배치해야 하며, 트리의 루트는 체인에 게시됩니다.
Plasma의 과도하게 단순화된 버전의 도식. 코인은 스마트 계약에 저장되며, 인출 시 Plasma 프로토콜의 규칙을 강제로 실행합니다.
OmiseGo는 이 프로토콜을 기반으로 탈중앙화 거래소를 만들려고 했지만, 그 이후로 그들은 다른 아이디어로 전환했습니다. 이 점에서 Plasma 그룹 자체도 마찬가지로, 현재는 optimistic EVM의 롤업 프로젝트인++Optimism++로 전환했습니다.
2018년에 구상된 Plasma의 기술적 한계(예:++코인 단편화 증명++)는 주목할 만한 것이 아닙니다. 2018년 Plasma 논의의 정점 이후, ZK-SNARKs는 확장과 관련된 사용 사례에서 더욱 실행 가능해졌습니다. 우리가 위에서 언급한 것처럼, ZK-SNARKs는 모든 것을 변화시켰습니다.
Plasma 아이디어의 더 현대적인 버전은 Starkware의++validium++입니다: 기본적으로 ZK-rollup과 동일하지만 데이터가 체인 외부에 저장됩니다. 이 구조는 많은 사용 사례에 사용할 수 있으며, 중앙 집중식 서버가 일부 코드를 실행하고 그 코드가 올바르게 실행되었음을 증명해야 하는 상황을 상상할 수 있습니다. validium 내에서는 운영자가 자금을 훔칠 방법이 없지만, 구현 세부 사항에 따라 운영자가 사라지면 일부 사용자 자금이 묶일 수 있습니다.
이 모든 것은 정말 좋습니다: CEX와 DEX는 이분법적 관계가 아니며, 사실, 효율성과 같은 몇 가지 이점을 얻으면서도 대부분의 형태의 남용을 방지하는 여러 암호 보호 장치가 있는 다양한 형태의 혼합 중앙 집중식 선택이 있습니다.
그러나 이 설계 공간의 오른쪽 절반에서는 사용자 오류를 처리하는 가장 기본적인 문제에 대해 논의할 필요가 있습니다. 지금까지 가장 중요한 오류 유형은: 사용자가 비밀번호를 잊어버리거나, 장치를 분실하거나, 해킹당하거나, 다른 방식으로 계정에 대한 접근을 잃었을 때 어떻게 해야 할까요?
거래소는 이 문제를 해결할 수 있습니다: 첫째, 이메일 복구가 있으며, 이마저도 실패하면 KYC를 통해 더 복잡한 형태의 복구를 할 수 있습니다. 그러나 이러한 문제를 해결하기 위해서는 거래소가 실제로 코인에 대한 통제권을 가져야 합니다. 사용자의 계좌 자금을 정당한 이유로 복구할 수 있는 능력을 가지려면 거래소는 권한이 필요하며, 이는 나쁜 이유로 사용자의 계좌 자금을 훔치는 데에도 사용될 수 있습니다. 이는 피할 수 없는 균형입니다.
이상적인 장기 해결책은 자가 보관에 의존하고,++다중 서명++ ++및 사회적 복구 지갑++과 같은 기술로 사용자가 긴급 상황을 처리하도록 돕는 것입니다. 그러나 단기적으로는 두 가지 명백한 대안이 있으며, 그 비용과 이익은 확연히 다릅니다.
결론: 더 나은 거래소의 미래
단기적으로, 두 가지 명백한 거래소 "범주"가 있습니다: 관리형 거래소와 비관리형 거래소. 오늘날 후자는 DEX, 예를 들어 Uniswap과 같은 것이며, 미래에는 암호학적으로 "구속된" CEX가 등장할 수 있으며, 사용자의 자금은 validium 스마트 계약과 유사한 것에 보관될 수 있습니다. 우리는 또한 법정 화폐를 신뢰하는 반 관리형 거래소를 볼 수 있습니다.
이 두 가지 유형의 거래소는 계속 존재할 것이며, 관리형 거래소의 보안을 높이는 가장 간단한 방법은 준비금 증명을 증가시키는 것입니다. 이는 자산 증명과 부채 증명의 결합을 포함합니다. 이 두 가지를 위한 좋은 프로토콜을 개발하는 것은 기술적 도전이지만, 우리는 이 두 가지 모두에서 가능한 한 많은 진전을 이루고, 가능한 한 소프트웨어와 프로세스를 오픈 소스로 만들어 모든 거래소가 혜택을 받을 수 있도록 해야 합니다.
더 먼 미래에는, 모든 거래소가 비관리형으로 점점 더 가까워지기를 바랍니다. 적어도 암호화폐 측면에서는 말입니다. 지갑 복구는 존재할 것이며, 소액을 처리하는 신규 사용자와 법적 이유로 이러한 배치가 필요한 기관은 높은 집중화된 복구 옵션이 필요할 수 있지만, 이는 거래소 자체가 아닌 지갑 레이어에서 이루어질 수 있습니다.++magic.link++와++Polymarket++와 같은 플랫폼과의 상호작용 방식이 이러한 방법의 한 예입니다. 법정 화폐 측면에서는, 전통적인 은행 시스템과 암호화폐 생태계 간의 흐름은 자산 지원 스테이블코인(예: USDC)의 현금 유입/유출 프로세스를 통해 이루어질 수 있습니다. 그러나 우리가 이 목표를 완전히 달성하기까지는 시간이 필요합니다.
특별히 Balaji Srinivasan과 Coinbase, Kraken, 바이낸스 직원들과의 논의에 감사드립니다.