FTX 사태 이후 거래소가 안전한지 의문이 제기되었고, 거래소도 불안을 가라앉히려는 노력을 시작했다. 바이낸스 CZ 대표는 11월 9일 거래소가 준비금 증명을 해야 한다는 트윗을 올리고, 다음날 바이낸스 자산을 담은 블록체인 주소와 잔액을 공개했다. 뒤이어 후오비 글로벌 등 다른 거래소도 자산 투명성 보고서를 발행했다. 한편 Grayscale은 보안 이슈 때문에 준비금 증명을 하지 않지만, 코인베이스 커스터디를 통해 암호화폐를 안전하게 저장한다고 발표했다. CoinGecko와 CoinMarketCap은 발빠르게 거래소 준비금 증명 여부를 제공했고, 체인링크는 준비금 증명 오라클 서비스를 시작했다. 이와중에 비탈릭은 안전한 중앙화 거래소를 제안했고, 거래소의 지지를 받았다. 어제는 미하원이 준비금 증명을 의무화하는 법안을 추진하고 있다는 뉴스가 나왔다. 오늘은 준비금 증명을 알아보자.
준비금 증명 (proof of reserve)
준비금 증명(proof of reserve) 혹은 지불능력 증명(proof of solvency)은 거래소가 소유한 암호화폐 총량이 사용자가 맡긴 암호화폐 총량 보다 같거나 큼을 보여준다. 은행은 지급준비율에 따라 전체 자금을 보관할 필요가 없지만, 암호화폐 성격상 암호화폐 거래소는 암호화폐를 모두 보관할 필요가 있다. 거래소가 소유한 암호화폐 총량은 보유 증명(proof of assets, proof of posession)으로, 사용자가 맡긴 암호화폐 총량은 부채 증명(proof of liabilities, 책임 증명)으로 입증한다.
2014년 초 Mt. Gox 거래소 파산후 준비금 증명이 필요하다는 목소리가 있었고, 이미 2014년에 암호화폐 공동체가 믿을 수 있는 감사인 자격으로 (Mastering Bitcoin 저자) Antonopoulos와 (비트코인 초기 개발자) Mike Hearn이 각각 Coinbase와 Bitstamp를 감사했다. FTX 사태 후 최근에는 바이낸스와 Kucoin이 Mazars 회계회사를 감사로 내세웠다.
다른 한편으로 누구도 신뢰하지 않고 암호학 기법으로 증명하려는 움직임도 있다. 비트코인 코어 개발자 Greg Maxwell의 제안을 시작으로, 제안의 단점을 보완한 Provisions: Privacy-preserving proofs of solvency for Bitcoin exchanges 논문이 2015년 발표된다. 지금 블록체인 분야에서 널리 알려진 연구자들이 일찍부터 블록체인 논문을 발표한 점이 흥미롭다. 이제 이 논문을 참고하여 어떻게 증명하는지 그리고 증명의 한계를 알아보자.
보유 증명 (proof of assets, proof of posession)
가장 간단한 보유 증명은 거래소의 지갑(보통은 cold wallet) 주소를 공개하는 방법이다. 실제로 바이낸스가 예고한지 하루만에 주소를 공개했다. 그러나 거래소가 그 주소를 소유하는지 (즉, 개인키를 아는지) 알 수 없고, 거래소가 소유한 암호화폐 수량이 공개되는 프라이버시 문제도 있다.
암호학 준비금 증명은 주소(혹은 공개키)와 잔액 목록을 준비한다. 주소 목록 (anonymity set) 중에 일부만 거래소 주소이다. 해당 주소의 개인키를 알고 있는 거래소는 영지식 증명을 통해 어떤 주소가 거래소 주소인지 밝히지 않고 보유한 암호화폐 수량을 증명할 수 있다. 이때 이 수량도 암호화되어 제삼자는 정확한 금액을 알 수 없다. (그래도 부채 보다는 크거나 같음은 증명할 수 있다.)
그러나 (빌린 암호화폐 등) 개인키를 안다고 암호화폐를 온전히 소유했다고 말할 수 없고, 여러 거래소가 짜고 동일한 주소를 소유했다고 주장할 수도 있다. 거래소 cold wallet 개인키를 보관하는 하드웨어 모듈(HSM)이 (요청한 메시지만 서명하지) 개인키 자체를 외부로 노출하지 않기 때문에 현업에 그대로 적용하기 어려운 점도 있다.
머클트리 (Merkle tree)
비트코인 때부터 블록체인과 뗄 수 없는 머클트리는 두가지 역할을 한다. 첫번째는 머클트리의 루트(root)를 비교하여 두 자료가 동일한지 확인할 수 있다. (서로 다른 자료가 동일한 머클트리 루트를 만들 가능성, 즉 해시충돌(hash collision)은 우주에 숨겨둔 어떤 원자를 찾을 확률 정도로 매우 낮다.) 그러나 자료가 동일한지는 굳이 트리를 만들지 않고 자료 전체를 해시해서도 알 수 있다.
머클트리의 더 중요한 두번째 역할은 트리에 어떤 자료가 들어있는지 증명하는 기능이다. 증명하고 싶은 자료부터 위로 올라가며 중간값들을 모으면 머클경로(Merkle path) 혹은 머클증명(Merkle proof)가 된다. 상대방은 머클트리 전체 내용을 몰라도 머클증명으로 다시 머클트리 루트를 계산하고, 자신이 이미 알고 있는 루트와 비교하여 증명을 검증할 수 있다. 해시충돌 확률이 매우 낮기 때문에 실제로 없는 자료가 있다고 속이는 머클증명을 만들 수 없다.
블록체인는 머클트리를 많이 활용한다. 먼저 블록에 담긴 트랜잭션들을 트리로 만들어서 루트를 블록 헤더에 저장한다. 경량 클라이언트(light client)는 블록 내용을 모두 저장하지 않고 크기가 작은 블록 헤더만 저장하여 운영 비용을 줄인다. 블록 헤더에 있는 루트를 알기 때문에 블록을 모두 저장하지 않더라도 어떤 트랜잭션이 블록에 담겨있는지 머클증명으로 (다른 서비스를 신뢰하지 않아도) 안전하게 검사할 수 있다. 토큰을 다른 체인으로 이동하는 브리지도 머클트리를 사용한다. 브리지는 암호화폐가 브리지 계정으로 전송되었는지 확인하고 다른 체인으로 옮긴다. 다른 체인은 브리지 계정으로 전송한 트랜잭션이 존재하는지 머클증명으로 검사한다. 이제 볼 부채증명도 머클트리를 사용한다.
부채 증명 (proof of liabilities)
사용자 아이디나 번호를 가지고 머클트리를 만드는데 여기에 잔액을 포함한다 (summation Merkle tree). 아래에서 위로 올라가며 두 노드 잔액의 합을 적어가면 루트에는 모든 사용자 잔액 총합이 나온다. 사용자 프라이버시를 위해 사용자 아이디나 번호에 사용자마다 다른 난수를 섞고, 잔액도 합산할 수 있는 암호화한다 (Pedersen commitment + range proof). 가짜 사용자를 포함할 수 있는데 부채 증명은 기본적으로 거래소는 부채를 가능한 줄여 보이고 싶다고 가정한다.
출처: https://vitalik.ca/general/2022/11/19/proof_of_solvency.html
사용자가 거래소에 로그인하면 자신의 아이디나 번호에 섞은 난수와 자신의 내역이 트리에 포함되었다는 머클증명을 보여준다. 이 정보를 가지고 스냅샷을 만든 시점의 자신의 잔액이 부채 총액에 반영되었는지 확인할 수 있다. 이미 거래소가 서비스와 도구를 제공한 사례가 있다. (2018년 Bitfinex, 2020년 Gate.io, 2021년 BitMEX) 사용자들이 확인하기 쉽도록 소스코드를 의도적으로 단순하게 작성했다.
단점은 사용자가 모두 확인을 하는건 아니기 때문에 일부 사용자를 생략해도 걸리지 않을 가능성이 있다. 트리의 크기를 가지고 대략의 사용자 규모가 노출되는 점도 문제다 (2021년 DAPOL+를 제안한 Generalized Proof of Liabilities 논문은 sparse Merkle tree를 사용하여 해결한다). 머클트리 루트를 (블록체인에 기록하는 식으로) 공개적으로 발표하지 않고, 사용자별로 다른 루트를 알려주는 식으로 속일 수도 있다.
논란
주소 공개에 이어 바이낸스는 2주후 준비금 증명 시스템을 공개했다. Kraken 대표는 엉터리라고 비난했고, MystenLabs는 보안감사 보고서를 작성했다. 지적한 문제는 새로운 것이 아니지만, 기존에 다른 거래소가 공개한 도구와 비교하면 바이낸스가 급하게 발표한 티가 난다.
출처: https://www.binance.com/en/proof-of-reserves
지적한 문제는 올해 초 Broken Proofs of Solvency in Blockchain Custodial Wallets and Exchanges 논문에 정리되있다. (DAPOL+ 논문과 동일 저자이며 직접 MystenLabs 보안감사 보고서를 작성하기도 했다.) 상위 네가지 문제가 바이낸스 사례에도 발견된다.
64 비트로 해시 크기를 줄였다. (해시충돌을 찾을 가능성이 높아진다.)
사용자 번호가 유일한지 보장하지 않는다. (잔액이 동일한 사용자 두명에게 동일한 사용자 번호를 부여할 수 있다.)
머클트리 루트가 모두에게 공개되지 않았다. (사용자마다 다른 루트로 속일 수 있다.)
거래소는 어떤 사용자가 부채 증명을 시도하는지 알 수 있다.
잔액을 포함한 머클트리를 잘못 구성한다. (제대로 잔액을 합산하지 않아서 총액을 줄인다.)
사용자 개별로 부채 증명에 자신이 포함되었는지 확인하는 방법을 제공하지 않는다.
전체 사용자 규모를 예측가능하다.
효율성 개선
비탈릭 글을 보면 ZK-SNARKs와 KZG commitment를 사용한 개선안을 소개한다. 머클트리는 cryptographic accumulator의 일종이다. accumulator는 어떤 항목이 집합에 있는지를 증명하고 검증할 수 있는 기법이다. 블록체인과 한몸처럼 따라다니는 머클트리도 동일한 기능을 하는 다른 부품으로 대체할 수 있다. 영지식 증명과 다항식 커밋먼트 기법을 활용한 더 효율적인 구조들이 최근 제안되었고, 앞으로 부채 증명은 물론이고 블록체인에서도 머클트리 대신 다른 부품이 들어갈 수 있다. 이더리움은 머클트리를 대체할 후보로 Verkle tree를 고려하고 있다.
기존 방식은 해시와 기초적인 범위 증명(range proof)를 활용하여 전체 증명 크기가 크다. 개선안을 적용하면 증명 크기를 매우 줄일 수 있지만, 훨씬 복잡한 계산, 아직 덜 검증된 암호학 기법 의존, trusted setup이 필요하는 등 단점도 있다.
안전한 중앙화 거래소
(수탁형) 중앙화 거래소는 거래소가 암호화폐를 통제하지만, (사용자간 거래에 블록체인 트랜잭션이 필요 없는 등) 암호화폐를 모아서 효율적이다. (비수탁형) 탈중화 거래소는 사용자가 직접 암호화폐를 통제하여 거래소가 파산해도 걱정이 없지만, 개인키 분실 등 문제가 있다. 안전한 중앙화 거래소, 즉 중앙화 거래소와 탈중화 거래소의 장점을 모은 하이브리드 거래소 아이디어가 활발하다. 비탈릭은 중앙화 거래소와 탈중화 거래소 사이에 여러 단계가 있다고 설명한다.
출처: https://vitalik.ca/general/2022/11/19/proof_of_solvency.html
플라즈마를 초기 하이브리드 거래소로 볼 수 있다. 플라즈마 계정을 거래소 계정으로 보면, 거래소 계정 안에 암호화폐가 모여있지만 암호화폐 이동과 출금은 사용자가 본인의 개인키로 통제한다. 사실 2018년 카이버 네트워크의 로이 루는 플라즈마 L2를 샤딩한 Gormos 아이디어를 소개하기도 했다.
다중지갑으로 평소에는 사용자가 암호화폐를 통제하지만, 사용자가 개인키를 분실한 경우 복구가 가능한 방법도 고려할 수 있다. 스탠다드차타드의 자회사 Zodia Custody는 전통적인 방법으로 사용자 자산을 보관하고, 거래소에 자산을 “mirror”하는 서비스를 공개했다.
참고 자료
https://niccarter.info/proof-of-reserves/
https://coinmarketcap.com/alexandria/article/proof-of-reserves-these-exchanges-are-adhering-to-the-new-standard