[Bitcoin] 논문 정리 - 1

in #kr7 years ago (edited)

비트코인에 대해 정확히 이해하기 위해서는 사토시 나카모토님이 직접 작성하신 논문을 읽어보는게 정확할 것이라고 생각해서 해당 논문을 읽고, 정리 아닌 정리를 하기로 했다.

어차피 공부하려고 글을 남기는 수준이라 요약보다는 최대한 자세히 정리 할꺼고 정리를 하다보니 내용이 생각보다 길어질 것 같아서 총 2개의 포스팅으로 나눠서 작성하기로 했다.

자, 그럼 시작!

개요


거래를 해싱해 타임스탬프를 찍어서 해시 기반 작업증명(proof of work)을 연결한 사슬로 만들고, 작업증명을 재수행하지 않고서는 변경할 수 없는 기록을 생성한다.
가장 긴 사슬은 목격된 사건의 순서를 증명할 뿐 아니라, 그것이 가장 광대한 CPU 파워에서 비롯됬음을 증명한다.
CPU 파워 과반을 통제하는 노드가 네트워크를 공격하지 않는 한 이들은 가장 긴 사슬을 만들어내며 공격자를 압도한다. 즉, 해킹할 수 없다.

등장 배경


제 3자의 중개를 거치지 않고 개인 대 개인으로 가치의 전달을 가능케 하기 위해 등장했다.
ex) 금융기관을 통한 송금 등

금융기관은 대다수 거래에 충분히 잘 작동 하지만 여전히 신뢰 기반 모델의 태생점 약점을 극복하지 못한다.

  • 중재 비용으로 인한 거래 비용 상승
  • 실거래 최소 규모 제한으로 인해 소소한 일상적 거래 가능성을 가로막음
  • 철회불가 서비스를 위한 철회불가 결제 능력의 상실에서 더 큰 비용 발생
  • 철회가능성을 위해서는 추가적인 신뢰 확산이 요구됨

중재 비용과 신뢰를 위한 추가 비용, 결제 불확실성은 직접 물리적 통화를 사용시 회피될 수 있지만 신뢰받는 제 3자 없이 통신채널로 결제를 수행할 방법이 존재하지 않는다.

컨셉


신뢰 대신 암호학적 증명에 기반해, 거래 의사가 있는 두 당사자가 신뢰받는 제 3자를 필요로 하지 않고 서로 직접 거래하게 해주는 전자화폐 시스템이다.
시간순으로 거래의 전산적 증거를 생성하여 개인 대 개인간 분산 타임스탬프 서버를 사용한 이중지불 문제의 해결책 제시한다.

거래


이중지불의 문제를 해결할 방법이 필요한데 통상적인 솔루션은 신뢰받는 제 3자가 모든 거래의 이중지불 여부를 검사하는 것이다.
하지만 이는 모든 거래가 신뢰받는 제 3자에게 의존적이라는 문제가 있다.
통화의 소유자가 이전에 어떠한 거래에도 서명하지 않았음을 수금자에게 알릴 수단이 필요한데 여기서 서명을 하였다는 의미는 이전에 이미 지불을 한 이력이 있다는 것. 즉, 이중지불을 의미한다.
따라서 가장 앞선 거래 하나를 인정하고, 그 뒤에 이중지불 시도에는 신경쓰지 않기로 한다.
여기에서 이중지불이 없음을 확인할 유일한 방법은 모든 거래를 인식하고 있는 것 뿐이다.
그러기 위해 모든 거래는 공개적으로 알려져야 하고, 노드들이 거래를 받는 순서의 단일 이력에 합의하는 시스템이 필요하다.
수금자는 매 거래시 그게 첫 수금이라는 것에 노드 다수가 동의했음을 증명해야 한다.

타임스탬프 서버


각 블록은 블록이 생성된 시점의 타임스탬프를 가지고 있다.
타임스탬프 서버는 타임스탬프가 찍힌 블록의 해시를 가져와 그 해시를 널리 배포하는 역할을 한다.
이 타임스탬프를 통해 각 노드들은 그 데이터가 해시에 들어가기 위해 해당 시점부터 존재했음을 증명할 수 있다.
각 타임스탬프는 그 해시 안에 먼젓번 타임스탬프를 포함하고, 그에 앞선 것들을 하나씩 연결하여 타임스탬프가 찍힌 사슬을 생성한다.
즉, 블록들이 타임스탬프 순으로 연결된다.

작업증명


개인 대 개인 기반으로 분산 타임스탬프 서버를 구현하기 위해 애덤 백의 해시캐시와 유사한 작업증명 시스템을 사용한다.
작업증명은 0비트 여러 개로 시작하는 SHA-256 같은 해시된 값 스캐닝을 수반하며 이에 필요한 평균 작업은 요구되는 0비트 수에 따라 지수적이며 단일 해시를 실행함으로써 확인된다.
블록의 해시에 필요한 0비트를 주는 값이 발견될 때까지 블록 안에 임시값을 증분하며 작업 증명을 만족하는데 한 번 CPU 동작이 사용되었다면 그 블록은 그 작업을 재수행 하기 위해서는 동일한 CPU 동작이 필요하다. (1 CPU 동작 = 1 CPU 파워)
심지어 블록을 변경하기 위한 재수행 작업은 나중에 연결되는 블록 만큼의 CPU 파워가 필요하다.

가장 최근 블록이 10번째이고, 1개가 증가될 때마다 1 CPU 파워가 증가된다고 가정하자. (실제로는 그렇진 않다)
이때 5번째 위치한 블록(5 CPU 파워 사용)의 값을 바꾸기 위해서는
10번째 블록, 9번째 블록, 8번째 블록, 7번째 블록, 6번째 블록, 5번째 블록을 수정해야 함
즉, 10+9+8+7+6+5=45 CPU 파워가 필요함
하지만 11번째 블록이 생성되기 위해서는 11 CPU 파워가 필요함
결과적으로 5번째 블록을 변경하기 전에 11번째 블록이 먼저 생성되므로 변경된 블록은 버려져서 수정이 불가능함

작업증명은 다수결의 대표성 문제도 해결한다.
IP를 1표로 사용할 경우 많은 IP를 할당할 수 있는 이들에 의해 장악될 수 있으나 작업증명은 기본적으로 CPU당 1표를 행사한다. (하지만 이또한 현재 채굴공장에 의해 장악당하고 있음)
다수의사는 최다 작업증명 동작이 투입된 가장 긴 사슬로 대표된다.
다수의 CPU 파워가 정직한 노드에 의해 통제된다면, 가장 정직한 사슬이 빠르게 늘어날 것이며 과거 블록을 변경하려는 공격자들은 그 뒤를 잇는 모든 블록의 작업증명을 재수행하여 가장 정직한 노드들의 작업을 따라잡아 앞질러야 하지만 사실상 불가능하다. (이에 대한 확률은 지수적으로 감소함)

시간이 지날수록 노드를 구동하는 하드웨어의 속도 증가와 변화하는 관여도를 보상하기 위해 작업 증명 난이도는 시간당 평균 블록 수에 따른 평균 목표치 조정에 의해 결정된다.
이를 통해 블록이 너무 빨리 생성되는것을 방지한다.

네트워크


네트워크는 다음 단계로 실행된다.

  1. 새로운 거래가 모든 노드에 브로드캐스트됨
  2. 각 노드가 새로운 거래를 블록에 수집함
  3. 각 노드가 그 블록에 맞는 난이도의 작업증명 찾기에 나섬
  4. 노드가 작업증명을 찾은 시점에, 그는 모든 노드에게 그 블록을 브로드캐스트함
  5. 노드는 모든 거래가 유효하며 아직 지불되지 않았다는 조건에 맞을 경우에만 그 블록을 승인함
  6. 노드는 블록 승인을 표현하기 위해 먼젓번 해시로 승인된 블록의 해시를 사용해 사슬 안에 다음 블록을 생성함

노드는 항상 긴 사슬을 정확한 것으로 간주하고 그것을 연결하는 작업을 진행한다.
만약 두 노드가 동시에 다음 블록을 발견했다고 브로드캐스팅 할 경우 어떠한 노드들은 그 중 하나 또는 다른 블록을 먼저 받을 수 있다.
이 경우 먼저 받은 블록에 대해 작업 증명을 진행하지만 다른 분기도 같이 저장하여 다른 블록이 긴 사슬로 연결될 것에 대비한다.
만약 다른 분기가 더 긴 사슬로 연결되었다면 기존에 작업하던 블록을 버리고 긴 사슬로 대체된다.

새로운 거래 브로드캐스트가 반드시 모든 노드에게 도달할 필요는 없다.
브로드캐스트가 많은 노드에 도달할 수록 더 빨리 한 블록 안에 들어간다.

블록 브로드캐스트는 누락된 메시지에 내성을 갖는다.
만일 노드가 블록을 받지 못하면 그는 다음 블록을 받을 때 누락된 것을 알아차리고 그것을 요청한다.

나머지는 [Bitcoin] 논문 정리 - 2 에서 이어서 포스팅 하도록 하겠다.

참고자료

  1. MINCHEOL IM 님의 비트코인 논문 한국어 번역판 (ver0.9)
  2. 애덤 백의 해시캐시
Sort:  

봐도 이해가안됨.. ㅋㅋ 문과의 최후인가..

전 공돌이지만 마찬가지로 이해하기가 쉽지 않네요 ^^;