본문 바로가기
Blockchain/News

바이낸스 준비금 증명 Proof Of Reserve system A to Z

by soccerman 2022. 12. 27.
반응형

개요

  1. 결론
  2. PoR 관련 변수들
  3. 머클트리
  4. 바이낸스 PoR에서의 머클트리
  5. 머클 리프 검증
  6. 머클 트리 검증
  7. 마무리

 

 

Binance Releases Proof of Reserves System | Binance Support

Wallet Maintenance Updates

www.binance.com


FTX가 파산하고 가상자산 거래소의 준비금에 대한 우려가 커지자

바이낸스는 11월 25일 준비금 증명 시스템인 Proof Of Reserves System(POR) 을 발표했습니다. (이하 PoR 시스템)


 

이에 대해 크라켄(가상자산 거래소) 전 CEO는 바이낸스의 준비금 증명이 무지하거나 잘못된 이해를 의도한다는 말을 했습니다. 추가로 감사인이나 마이너스 잔액을 포함하지 않아 의미가 없다고 했습니다.

 


 

먼저 글에 들어가기 앞서 결론부터 말씀드리겠습니다.


결론

바이낸스의 Proof Of Reserve System특정 감사 스냅샷 시점의 고객 예치금 총액에 나의 잔고가 포함되었는지 검증할 수 있는 시스템입니다.

개인적인 의견으로는, 이것으로 바이낸스가 모든 고객들에게 예치금을 돌려줄 수 있다는 것을 증명한다고 보기는 어렵다고 생각합니다.

왜냐하면, 발표한 보고서에 나타난 총 고객 예치금에 나의 잔액이 포함됐다하더라도 1. 총 잔액이 나를 포함한 다른 모든 유저의 잔액을 모두 포함했는지의 여부를 확신하기 어렵습니다. 이는 바이낸스 데이터베이스와 대조작업을 하는 외부 감사인의 몫입니다. 또한 2. 바이낸스의 비트코인이 다른 활동의 담보로 잡히지 않았는지 여부도 점검해봐야할 사항으로 보입니다.

해당 시스템은 머클트리 방식으로 구성되었고 머클리프 검증과 머클트리 검증을 제공합니다. 일반인 입장에서 이해하기 어려운 시스템으로 여겨집니다. 따라서 Proof Of Reserve System 이라는 네이밍이 바이낸스가 고객 예치금을 돌려줄 수 있다는 것을 증명하는 시스템이라는 옳지 않은 이해를 낳을 수 있다고 생각합니다. 크라켄 전 CEO의 비판을 개인적으로 공감합니다.

위의 결론에 도달하게된 과정을 말씀드리기 위해 바이낸스 PoR 시스템을 살펴보겠습니다.

 

바이낸스의 설명자료에 따르면, 바이낸스 웹페이지 로그인 한 후 Wallet => Audit 섹션으로 가면 나의 잔고가 감사되었는지 여부와 관련된 정보들을 조회할 수 있다고 합니다.

 

PoR 관련 변수들

Wallet => Audit

 

개인 계정에서 조회했을 때 뜨는 화면입니다. 이곳에서 조회되는 정보들을 설명하면 아래와 같습니다.

  • Record ID : 특정 감사의 내 계정의 정보
  • Asset Coverage : 감사에 해당하는 코인 종류
  • Account Code : 내 계정의 식별 Code
  • Merkle Hash : Record ID + 코인 잔액
  • Merkle Leaf : Merkel Hash의 해쉬 값으로 최종적으로 PoR 시스템에서 활용되는 값

이후 바이낸스의 자료(https://www.binance.com/en/proof-of-reserves)에 따르면 머클 트리에 대한 개념 설명이 이어지고 머클 리프 검증으로 이어집니다.

 

간단히 말하면, 개인 Wallet => Audit 페이지에서 조회했던 데이터(Record ID, Account Code, Merkel Hash)들을 오른쪽 파이썬 코드에 반영하고 실행하면 본인의 Merkel Leaf값을 검증할 수 있다는 내용입니다.

 

머클트리

머클리프 검증이 무엇을 의미하는지 이해하기 위해 머클트리 개념을 조금 알고 넘어가겠습니다.


머클 트리

머클 트리는 부모노드가 두 개의 자식노드를 갖는 트리구조로 두 자식의 해시 값을 합하여 다시 해싱한 값을 부모노드가 갖게되는 구조입니다. 이러한 암호학적 기법을 활용해서 궁극적으로 트리에 딸린 수많은 노드들의 상태를 하나의 루트 해쉬값으로 종합해서 보여줄 수 있습니다.

 

해시와 머클트리의 특성상 노드중 단 하나의 값만 변하더라도 해시 계산을 다시 했을 때 루트 해시 값이 달라지기 때문에 적은 데이터로 위변조 되지 않은 특정 상태의 취합정보를 보여줄 수 있다는 장점이 있습니다.


PoR 에서의 머클트리

바이낸스 보고서에서도 머클 루트 해시값과 이것이 나타내는 총 비트코인 예치 잔액이 얼마인지를 보여주고 있습니다.

해당 머클 루트 해시와 고객 총 예치금액을 연결시킬 수 있는 이유는, 머클 루트의 각 리프(트리의 가장 아래 단의 노드)가 고객들의 잔고를 반영한 해시값을 가지고 있기 때문입니다.

즉, 머클 리프가 개인 Account ID와 비트코인 잔고를 나타내는 정보를 해시한 값을 가지고 있습니다. 따라서 모든 고객들의 정보를 위와 같이 해시하여 머클 리프를 구성하고, 수천만개의 리프를 활용하여 거듭된 해싱 끝에 하나의 머클 트리를 만들게 되면, 이 머클 트리의 루트 해시 값은 특정 감사시점에 모든 고객들의 잔고를 반영한 하나의 상태값이 되는 것입니다.


이 머클트리 해시값 즉 상태값이 의미가 있는 이유는, 이것을 활용해 하나의 오픈 시스템을 만들 수 있기 때문입니다.


먼저 감사가 어떻게 진행될 수 있는지 알아보겠습니다. (이해를 위해 간단하게 유추/묘사한 과정입니다.)

  1. 바이낸스가 제 3자에 감사요청
  2. 감사인은 바이낸스로부터 머클트리 정보(머클루트 해시값, 모든 머클리프)와 데이터베이스에 저장되어있는 모든 고객의 정보를 제공 받음
  3. 감사인은 모든 고객이 하나의 머클 리프를 갖는지 확인
  4. 감사인은 고객정보와 고객 잔고가 각각의 머클리프에 정확하게 반영했는지 확인
  5. 감사인은 제공받은 머클 리프로 만든 머클 루트 해시값이 바이낸스가 제공한 해시값과 일치하는지 확인
  6. 감사인은 머클루트 해시값의 상태가 디비에서 조회한 모든 유저의 잔고를 반영한다고 감사의견을 냄
  7. 특정 머클루트 해시값일 때 총 고객 예치금 잔액과 바이낸스 보유 비트코인을 보고서로 발표

이렇게 되면 감사인의 보증 덕분에 해당 머클루트 값이 특정 총 고객 예치금 잔액을 의미한다고 유저는 생각할 수 있습니다.

 

따라서 유저는 바이낸스의 PoR에 접속하여 바이낸스가 활용한 자신의 머클리프값이 자신의 Account ID와 잔고를 잘 반영했는지 확인만 하면 자신의 잔고가 PoR 보고서의 총 고객 예치금 잔액에 포함되었다는 것을 검증할 수 있는 것입니다. 이와 같은 이유로 위에서 오픈 시스템이라고 표현했습니다.


머클 리프 검증 

이러한 이유로 바이낸스는 PoR 시스템에 머클리프 검증 하는 방법을 제공하고 있는 것입니다.

위의 파이썬 코드는, Account Code + Audit ID를 해시한 값이 Record ID 와 일치하는지 여부를 보여주고, Merkel Hash를 해시했을 때 바이낸스가 나의 정보 대표값으로 활용한 Merkel Leaf값이 나오는지를 확인하는 코드입니다.


이를 정확히 알기 위해서는 바이낸스 PoR이 머클리프를 만드는 로직을 살펴볼 필요가 있습니다.

블파스 9기 바이낸스 PoR 발표자료

그림의 좌측 하단에 머클리프 생성 로직, 우측 상단에 해싱 과정이 나타나 있습니다.

  1. Account ID 와 Audit ID를 합해서 해싱하여 Record ID를 만듭니다.
  2. Record ID 뒤에 비트코인 잔액 정보를 붙이고 해싱하여 Merkle Hash를 만듭니다.
  3. Merkle Hash를 해싱한 값의 앞 16자리를 구하여 Merkle Leaf를 만듭니다.

즉, 최종 Merkle Leaf값을 만들기 까지 유저의 계정 정보, 감사 정보, 잔액 정보가 해싱됩니다. 따라서 해당 정보들이 조금이라도 바뀌게 되면 해싱의 특징에 의해 Merkle Leaf값이 변하게 됩니다. 따라서 바이낸스가 제공하는 Self Merkle Leaf 검증을 통해 나의 정보가 Merkle Leaf에 잘 반영되었는지를 확인할 수 있습니다.

 

따라서 머클리프 검증에서는 바이낸스가 고객 총 예치금 잔액 상태를 보여주기 위해 클트리를 만드는 과정에서 활용된 나의 머클 리프가 나의 계정, 잔액 정보를 잘 반영했다는 결론을 내릴 수 있습니다. 


머클 트리 검증

바이낸스 PoR은 머클트리 검증 또한 아래와 같이 제공하고 있습니다.

블파스 9기 바이낸스 PoR 발표자료

바이낸스 웹 사이트에서 머클트리 검증을 위한 Node js 파일과 머클트리 리프 데이터를 다운받고 Node js 파일을 실행하면 된다고 합니다.

 

머클트리 검증을 통해 유저는 감사 결과로 제시된 머클루트를 만드는 데에 나의 머클리프 사용가 사용되었는지 여부를 확인할 수 있습니다.

 

검증 과정을 따라해보겠습니다.

먼저 Node js 파일과 Merkle Tree 데이터를 다운받습니다.

머클 트리 데이터는 대략 천만개의 머클리프 정보를 포함하고 있습니다.

npm 패키지를 다운받고 verify.js 파일을 실행시키며 머클트리 데이터와 나의 머클리프 값을 인수로 제공하면 된다고 합니다.

 

실행시키니, 다운받은 머클트리 데이터에서 나의 머클리프 값을 발견했고, 천만개의 머클 리프를 활용해 만든 머클 트리의 루트의 해시값이 출력되었습니다. 이 머클 루트값을 PoR에서 제시된 값과 비교해보니 일치했습니다.

 

verify.js의 코드를 조금 살펴보면,

첫번째 빨간 박스에서 머클트리 데이터를 읽습니다.

두번째 빨간 박스에서 머클트리 데이터를 한 줄 씩 읽으며 내가 제시한 나의 머클 리프값과 일치하는지 확인합니다.

일치하는 경우 Successful로 시작하는 문구를 출력합니다.

읽은 머클리프값을 leaves에 추가합니다.

머클트리 데이터의 모든 줄을 읽고 난 후 모든 머클 리프가 저장된 leaves를 활용해 머클 트리를 만듭니다.

 만들어진 머클트리에서 머클루트 해시값을 얻습니다.

이를 통해 바이낸스 PoR에 기재된 머클트리를 만드는 데에 나의 Merkle Leaf 값이 활용되었음을 확인할 수 있습니다.

 

즉, 머클트리 검증에서는 바이낸스가 고객 총 예치금 잔액 상태를 보여주기 위해 클트리를 만드는 과정에서 나의 머클 리프 활용되었다는 결론을 내릴 수 있습니다. 


마무리

따라서, 바이낸스의 Proof Of Reserve System은

1. 머클 리프 검증을 통해 유저는 고객 총 예치금 잔액 상태를 보여주기 위해 클트리를 만드는 과정에서 활용된 나의 머클 리프가 나의 계정, 잔액 정보를 잘 반영했다는 결론을 내릴 수 있습니다.

2. 머클 트리 검증을 통해 바이낸스가 고객 총 예치금 잔액 상태를 보여주기 위해 클트리를 만드는 과정에서 나의 머클 리프 활용되었다는 결론을 내릴 수 있습니다.

 

 결론적으로, 바이낸스 PoR 시스템은 고객 총 예치금액을 계산하는 과정에서 개인 고객의 잔액이 포함되었는지 여부를 확인시켜주는 시스템이라고 생각합니다. 유저가 궁금해하는 부분은 고객 예치금을 모두 돌려줄 수 있는지 여부입니다. 이 부분은 바이낸스의 부채와 비트코인 담보여부와 관련이 있다고 생각됩니다. 물론 바이낸스는 가상자산 세계 1위 거래소로 예치금을 안전히 다 돌려줄 능력을 갖추고 있다고 생각합니다. 하지만 바이낸스 Proof Of Reserve System으로 해당 능력을 증명했다고 보기는 어려운 것 같습니다. 

 하지만 기업의 보유 자산과 총 고객예치금을 비교할 수 있는 하나의 오픈 시스템을 제공한 것은 시사하는 바가 크다고 생각합니다. 거래소 투명성을 제고하는 방법을 제시/도입한 것으로 선도 가상자산 거래소로서 모범을 보였다고 생각합니다.

 

참고자료

 

반응형

댓글