Kraken

보유고 증명

감사

크라켄의 감사 과정에 대해서 알아보세요

크라켄 보유고 증명(Proof-of-Reserves) 감사 프로세스  

소개

본 문서는 크라켄의 감사 프로세스에 대한 배경과 지침을 제공하고 있습니다.

크라켄은 전체 준비금을 보유하고 있으며, 당사 고객 및 제3자에게 고객들의 자금을 적절하게 보유하고 있음을 입증하기 위해 저희는 독립적이고 암호화된 검증 방식으로 감사를 실시합니다. 투명하고 독립적인 감사는 기업들이 고객 자금에 대한 전체 준비금을 확실하게 보유하고 있음을 보증하는 매우 중요한 요소입니다. 이와 관련하여 공개 보유고 증명(PoR) 제도는 기술적으로 구현이 될 수 있지만, 구체적인 실행 단계에 있어서 사용자의 프라이버시 등 주요 외부적 영향들을 신중하게 고려해야 합니다. 크라켄은 거래소와 월렛이 책임을 통해 신뢰를 쌓아야 하며, 투명성을 향한 지역사회의 열망을 해소해야 할 책임이 있다고 생각합니다.

지난 수주 간 크라켄은 업계를 선도하는 독립적이고 암호화로 검증된 감사를 성공적으로 개발하여 완성해왔습니다. 저희는 이러한 프로세스의 개관을 글로벌 디지털 통화 커뮤니티에 공유할 수 있게 되었음을 영광스럽게 생각합니다. 크라켄은 비트코인 업계가 전통적인 금융서비스 업계를 능가하는 수준의 보장과 책임감을 제공할 수 있다고 여기고 있으며, 저희의 목표는 최적의 투명성을 위하여 그 임무를 선도해 나가는 일입니다.

현재 상황

본 계획은 거래소와 월렛이 가지고 있는 비트코인 예치금을 증명하도록 하는 그레그 맥스웰(Greg Maxwell)의 제안으로부터 비롯되었습니다. [1]

오늘날까지 비트코인 업계의 감사들은 공적으로 개방되지 않은 상태로 불투명하고, 피상적이며, 독립적으로 검증 가능한 암호화 검증 방식을 갖추지 못했습니다. 크라켄은 개념 증명을 제공하고 보다 투명하고 책임 있는 업계 표준을 제정함으로써 보다 나은 디지털 화폐 생태계를 형성할 수 있도록 아낌없는 노력을 기울이고 있습니다.

높은 수준의 과정

맥스웰(Maxwell)의 제안에 따르면 비트코인 회사는 잔액이 포함 된 모든 주소를 공개해야 했습니다. 이 방법을 사용하면 거래소 또는 월렛 제공 업체의 비트 코인 월렛 및 총 보유, 상업적으로 민감한 정보 및 회사와 사용자에게 잠재적 인 보안 위험을 나타내는 정보를 공개적으로 알 수 있습니다. 더구나, 개인 정보 및 금융 활동의 이력과 궤적을 원인이나 정당한 절차없이 제 3 자에 의해 추적 할 수있는 사용자 개인 정보 침해는 허용되지 않습니다.

크라켄의 절차는 저희에게 총액, 주소 또는 열쇠를 공개할 것을 요구하지 않습니다. 크라켄 감사는 신뢰할 수 있는 감사자와 공개적으로 검증 가능한 암호화의 장점을 결합하고 활용함으로써 개인 정보 보호와 투명성 사이의 이상적인 균형을 가지고 있습니다.

비트코인이 우세한 암호화폐인 만큼 저희의 초기 감사는 비트코인 적립금만 담당하게 됩니다. 그러나 향후 개발을 위해 다른 자산에 대한 감사가 검토될 것입니다.

프로세스 개요

  • 제1단계 – 감사자가 크라켄의 전체 월렛 자금을 점검함

    크라켄은 감사자에게 당사의 모든 공공 주소를 주고 서명을 합니다. 서명 당시의 블록 해시는 서명된 전체 메시지의 일부로서, 서명이 작성된 시점을 위한 타임스탬프로 활용될 수 있습니다. 이를 통해 해당 공공 주소의 서명을 검증하여, 감사자가 비트코인 블록체인으로 특정 시점에서 관련 주소에 사용 가능한 총 금액을 도출할 수 있습니다.

    이 단계에서 필요한 코드는 Payward의 COO인 Michael Gronager에 의해 작성되었으며, 향후 오픈 소스로 전체 개방될 가능성도 열어두고 있습니다. 하지만 대부분의 코드는 리브코인(libcoin) 기반 코드로 이미 상당 부분이 오픈 소스로 열려 있습니다.[2]

  • 제2단계 – 감사자가 크라켄 사용자들의 잔액이 크라켄 월렛의 자금과 맞는지 점검함

    크라켄은 감사자에게 당사 사용자들 각각의 BTC 잔액을 제공하고 머클 트리를 생성합니다. 감사자는 루트 노드 해시를 게시하여 모든 사람이 볼 수 있도록 하고, 루트 해시로 대표되는 총자산이 블록체인에서 크라켄이 보유한 월렛의 자산 값과 근사한지 확인합니다. 이러한 과정은 크라켄이 루트 노드를 포함한 전체 노드에 어떤 것도 숨기고 있지 않다는 사실을 보증해 줍니다.

    해당 감사 단계를 위해 감사자는 트리를 생성하는 프로그램의 소스 코드와 개별 계정의 잔고 데이터 파일에 접근할 수 있습니다. 크라켄은 MIT 라이센스에 따라 이 단계에 대한 C++ 코드를 공개하였습니다: https://github.com/payward/krakendb

  • 제3단계 – 사용자들이 직접 자신의 계정 잔고가 감사 데이터에 들어있는 사실을 검증함

    크라켄은 사용자에게 당사가 감사자에게 보고한 금액과 함께 그들의 계정에서부터 해당 루트까지의 노드와 인접 노드 정보를 제공하며, 이는 감사자가 게시한 금액과 일치하게 됩니다. 또한 저희는 해당 노드의 해시를 생성하는데 사용된 해싱 방법을 공개하여, 사용자가 직접 노드가 크라켄이 공개한 금액을 잘 대변하고 있는지 검증할 수 있도록 합니다.

    이를 통해 사용자들은 각자 스스로 자신의 계정이 감사자가 검증한 데이터에 포함되어 있는지 여부를 확인할 수 있습니다.

취약점

이 부분에서는이 감사의 단점 중 일부를 설명합니다. 이것은 분명히 약점의 전체 목록이 아닙니다. 그러나 사용자에게 투명성을 중요하게 여기기 때문에 감사 프로세스에서 식별 한 특정 단점에 대한 비공식적 배경을 제공하고 있습니다.

물리적 자산과 달리 정보를 다른 사람이 소유하기 위해 소유물에서 제거 할 필요는 없습니다. 따라서이 감사 방법을 사용하는 크라켄 또는 다른 회사는 공격자가 개인 키를 복제하지 않았 음을 증명할 수 없습니다. 또한 감사 자금을 독점적으로 소유하고 있음을 증명할 수 없습니다. 저희는 감사 시점에 개인 키를 소유 한 사람 중 하나임을 증명할 수 있습니다.

전체 감사는 사전 고지 없이 온디맨드 방식으로 수행될 수 없습니다. 이 때 필요한 정보, 감사 구조, 업계 표준 콜드 스토리지 보안 관행을 감안할 때 기습적인 당일 감사는 가능하지 않습니다. 저희는 이전에 생성된 서명에 의존하여 더 자주 수행될 수 있는, 이전의 완전한 감사를 근거하여 잠재적인 '경량' 감사를 구상하고 있습니다.

감사는 신뢰할 수 있고 유능해야합니다. 커뮤니티는 감사인이 자신의 평판을 높이 평가하고 기술적으로 능력이 있다고 믿어야합니다. 이 감사 프로세스에는 피 감사인이 덜 기술적 인 또는 편집증적인 감사관을 속이는 기회가 몇 가지 있습니다. 또한 감사인이 의도적으로 또는 실수로 기밀 회사 및 고객 정보를 손상시킬 수있는 기회도 있습니다. 감사인과 피 감사 인 모두 컴퓨터, 감사 공간, 블록 체인, 인터넷 연결, 라우터, DNS 등을 제공하는 사람을 고려해야합니다. 만약 천문학적인 액수에 해당되는 사기 행각을 숨기는 것이 목표라면, 해당 감사를 손상시키기 위해 많은 노력을 기울일 것입니다.

감사는 실시간으로 지속적으로 갱신되지 않습니다. 마지막 감사 시간 이후 키가 손실되거나 자금이 도난되었을 수 있습니다. 전체 감사는 키가 손실되지 않았다는 확인을 갱신하지만 감사를 수행하기 위해 콜드 스토리지 키를 사용해야하기 때문에 더 큰 위협에 노출됩니다.

피 감사인은 감사를 통과하기 위해 일시적으로 자금을 빌리거나 실제 자금 소유자와 키를 공유 할 수 있습니다.

감사인은 피감사인의 위협에 결탁하거나 굴복할 수 있습니다.

지속적

크라켄은 지속적으로 정기적인 감사를 수행하려고 합니다. 보편적으로 신뢰할 수 있는 감사인은 존재하지 않기 때문에, 저희는 매번 다른 감사인 또는 복수의 감사인을 이용할 수도 있습니다. 이는 특정 개별 감사인의 자격에 의구심을 품는 분들의 니즈를 충족합니다.

향후 변경 계획과 개선사항

크라켄은 당사 및 타 업계가 향후 감사 프로세스를 개선해나갈 수 있도록 커뮤니티의 피드백을 받기를 희망합니다. 크라켄은 암호화폐 커뮤니티의 구성원으로서 DATA(www.datauthority.org) 등 산업 기구와의 협력을 통해 업계 표준과 확장 가능한 툴, 포괄적 매뉴얼을 개발하고 산업 내에서 감사 프로세스가 보다 널리 통용될 수 있도록 지원하고자 합니다.

참고사항

[1] Zak Wilcox 의 요약: https://iwilcox.me.uk/2014/proving-bitcoin-reserves. 아이디어를 제공해 주신 그레그 맥스웰(Greg Maxwell)에게 감사를 표합니다.

[2] 리브코인(libcoin)은 비트코인을 모듈화 및 재사용이 가능한 라이브러리로 탈바꿈 시킨 것입니다: https://github.com/libcoin/libcoin

크라켄 감사 시 고객님의 크라켄 계정 잔고를 확인하는 방법

이 글도 참고해주세요: 크러켄의 적립금 증명 감사 프로세스.

이 가이드에는 고객님의 크라켄 계정 잔액과 감사 대상에 포함된 사항들을 어떻게 암호화 된 방법으로 검증하는지를 설명합니다.

이 검증에는 감사 당시 고객님 계좌의 비트코인(XBT) 잔액이 반영될 것입니다.

 

  • 1단계

    아직 로그인을 아직 하지 않았다면 고객님의 크라켄 계정으로 로그인하세요.

    https://www.kraken.com/로 가서 고객님의 브라우저의 주소 입력창이 "https://www.kraken.com/"를 보여주고 있는지 확인하세요.

  • 단계 2

    "자금 조달" 탭을 클릭 -> "감사" 하위 탭 -> 왼쪽에 있는 "비트코인 (XBT)".

    audit screen그림 1. 그림 1. 크라켄 비트코인 감사  페이지

  • 단계 3

    감사자에 의해 검증된 고객님의 계좌에 대한 정보를 보세요

    • 감사 시간 은 감사자가 사용한 시간 스탬프입니다.

    • 제출 코드는 64 비트의 솔트(salt) 입니다.

    • 감사 당시 고객님의 계정에 보관된 비트코인의 금액입니다. 이것은 크라켄이 감사자에게 제공한 여러분 계좌의 잔액 가치입니다.

    • 노트에는 해당 감사에 이용된 루트 해시(root hash)를 증명하는 감사자로부터 받은 정보가 포함되어 있습니다. 서명된 상세 보고서에 대한 링크도 제공됩니다.

    • 고객님의 노드 해시에서 루트 해시까지의 해시에는 인접한 해시가 포함되어 있습니다. 고객님이 직접 경로에 있는 해시 값에는 별표(*)가 표시되어 인접한 노드 해시와 구별이 됩니다. 이해시들을 이용하면 귀하의 노드가 해당 루트에 포함되어 있는지 검증해 볼 수 있습니다:

    • 가장 첫 번째 라인은 감사자가 제공한 루트 해시 값과 일치해야 합니다.

      만약 고객님의 해시 (리스트에서 a*가 들어 있는 가장 마지막 해시)를 검증해보고 싶다면 다음과 같이 해보세요:

      sha256(sha256(<submission code> || ":" || <amount with decimal point removed and leading 0's removed>))

      해당 값은 해시에서 부여된 가장 마지막 값과 일치해야 합니다.

      예시 코드

      제출 코드:  379377cd8190f9bf

      금액: 0.01500000

      Python

      import hashlib; print(hashlib.sha256(hashlib.sha256(b'379377cd8190f9bf:1500000').digest()).hexdigest());
      

      PHP

      echo hash('sha256', hash('sha256', '379377cd8190f9bf:1500000', true));
      

      결과

      66b51ba0f4a5cf8278acac6782ffdfb9a64b9f7c895bc308266b0757c7025b27
      

      고객님은 각 해시의 쌍(또는 "tuple")에 대한 해시를 수행하여 고객님의 머클 브랜치(Merkle branches)를 완전히 검증해 볼 수 있습니다. 형식은 다음과 같습니다:

      sha256(left-hash || right-hash)
      

      그 결과는 이전의 tuple 해시 (또는 루트 해시)를 그 안에 있는 a*와 일치시켜야 합니다. 이 작업은 모든 tuple에 대해 수행하도록 합니다.

      해당 루트 해시를 제외하고 모든 해시는 tuple로 부여되며, 이 순서에 따라 왼쪽 해시와 오른쪽 해시를 나타냅니다. a*는 고객님의 직접 노드를 나타내는 해시에 부여됩니다.

      예시 코드:

      해시:

      306daae528dc137c9053554c45e90a631ef859490a3ede651d488135602500a3* c3fb1f931c681f4a7b779fb19e107bba156cae78c3a928707c42b395b056541b* 5e01ee0fee85641dd5cd4e3005792f973a2a1362180783041eb1719163b1d21c
      

      Python

      import hashlib; print(hashlib.sha256(b'c3fb1f931c681f4a7b779fb19e107bba156cae78c3a928707c42b395b056541b5e01ee0fee85641dd5cd4e3005792f973a2a1362180783041eb1719163b1d21c'.decode('hex'))).hexdigest();
      

      PHP

      echo hash('sha256', hex2bin('c3fb1f931c681f4a7b779fb19e107bba156cae78c3a928707c42b395b056541b5e01ee0fee85641dd5cd4e3005792f973a2a1362180783041eb1719163b1d21c'));
      

      결과

      306daae528dc137c9053554c45e90a631ef859490a3ede651d488135602500a3