비트코인 백서를 읽으면서 처음 보는 용어들이 많아 이해하는 데 어려움을 겪어 미리 해당 개념들의 정의를 정리한다.
1. 해시 : 하나의 문자열을, 이를 상징하는 더 짧은 길이의 값이나 키로 변환하는 것이다.
2. 해시 함수 : 어떤 데이터를 입력해도 같은 길이의 결과를 도출하는 함수이다. 도출되는 결과가 중복될 가능성이 낮고, 결과 값으로 입력 값을 역으로 추정하기 어렵다. 이 때문에 해시 값을 비교하면 데이터의 변경이 발생했는지 파악할 수 있다.
현재 거래 방식은 신뢰받는 제 3자 역할을 하는 금융기관에 의존되어 진행되고 있다. 이런 방식은 대부분의 거래에서 잘 작동하고 있지만 중재 비용, 신뢰 결핍, 비가역 거래 불가능, 제 3자의 필요 등과 같은 문제점이 발생한다.
암호학적 증명에 기반한 전자 지불 시스템의 구현을 통해 앞선 문제를 해결한다. 이 시스템은 거래 의사가 있는 두 당사자가 서로 직접 거래하게 해주는 전자 화폐 시스템이다. 또한 이 시스템은 P2P(peer to peer 개인 대 개인) 분산 타임스탬프 서버를 통해 이중 지불 문제에 대한 해결책을 제시한다.
해당 그림은 비트코인 백서에서 개인키를 사용하여 거래를 인증하는 방법과 이 코인을 디지털 서명 체인으로 정의하는 방법을 설명한 것이다.
그러나 이 거래 방식을 통해선 받는 사람이 체인에 포함된 소유자 중 한 명의 이중지불 여부를 검증할 수 없다.
일반적으로는 이중 지불 문제 해결을 위해 신뢰할 수 있는 중앙기관을 도입했다.
그러나 블록체인에선 중앙기관이 없기 때문에 가장 먼저 일어난 트랜잭션만을 인정하고, 그 이후의 시도에 대해서는 고려하지 않는 방법을 이용한다. 예를 들어 A가 B와 C 두 명과 거래를 하고, X라는 코인으로 거래한다고 했을 때 둘 중 먼저 받은 거래에 대해서만 인정된다는 것이다.
이 방법을 실현하기 위해 모든 트랜잭션을 인식해야한다. 즉 모든 트랜잭션이 공개적으로 알려져야 하고, 모든 트랜잭션들이 도착한 단일한 시간 순서에 참여자들이 모두 동의할 수 있는 시스템이 필요하다는 것이다.
타임스탬프 서버는 거래가 발생한 시점에 도장을 찍어 거래의 발생 순서를 비교한다. 거래가 발생한 시간을 따진다기 보다는, 어떤 거래가 먼저 발생했는지 상대적인 전후관계를 비교한다.
작업증명은 P2P기반의 분산 타임스탬프 서버를 구현하기 위해 필요한 단계다.
작업증명은 sha-256과 같은 알고리즘을 통해 발생한 해시값을 여러개의 0비트로 시작한다. 블록의 해시에 필요한 0비트의 개수만큼 발견될 때 까지 임시값(nonce)를 증가시키는 방법으로 구현된다.
위의 이미지를 통해 굉장히 작은 변화로 발생하는 해시값이 천차만별임을 확인할 수 있다. 그러므로 필요한 0의 개수만큼 찾는 행위는 많은 시간이 들어가는데, 이 시간은 CPU 파워에 의해 결정된다.
작업증명은 다수결의 대표성 문제도 해결하기 위해 CPU당 1개의 투표권을 부여한다. 다수의 CPU 파워가 정직한 노드들에 의해 제어된다면, 정직한 체인이 가장 빠르게 길어지므로 다른 체인들을 압도할 수 있다.
이전의 블록을 수정하려면, 공격자는 그 블록과 그 뒤를 이은 모든 블록들의 작업증명을 다시 해서 정직한 노드들의 작업증명을 능가해야하기 때문에 체인이 길면 길수록 공격자가 성공할 확률이 지수적으로 감소한다.
네트워크 실행 단계
1) 신규 트랜잭션은 모든 노트에 브로드캐스트된다(알려진다).
2) 각 노드는 새로운 트랜잭션을 모아 블록에 넣음
3) 각 노드는 새로운 블록을 생성하기 위해 어려운 작업증명을 함
4) 작업증명에 성공한 노드는 모든 노드에 블록을 뿌림
5) 노드는 새로 받은 블록의 모든 트랜잭션이 유효하고 이미 소비되지 않은 경우에만 수락함
6) 노드들은 수락한 블록의 해시값을 이전 해시값으로 사용해서 다음 블록을 생성함으로써 승인 의사를 표시함.
즉 개별거래가 알려지고, 블록에 새로운 거래를 수집해서 작업증명을 하고, 조건에 맞을 때 블록을 승인해서 다음 블록을 생성한다는 뜻이다.
이 과정에서 가장 긴 체인을 가장 올바른 것으로 간주하고 확장해 나간다. 또한 노드가 서로 다른 블록을 동시에 브로드캐스트하게 된다면 노드들은 서로 다른 블록을 먼저 받을 수도 있다.
코인은 네트워크를 지지하는 노드들에 대한 인센티브를 지급하며, 중앙기관이 없기 때문에 코인을 발행해서 유통시키는 방법을 제공한다.
인센티브는 코인과 거래 수수료로 지급될 수 있다. 채굴되는 코인의 양이 고정된 값으로 나오는 것이 아니라 계속 줄어들기 때문에 채굴 보상이 0이 되면 채굴을 해도 보상이 안 나오기 때문에 그때는 완전히 거래 수수료로 보상을 제공한다.
만일 욕심 많은 공격자가 모든 다른 정직한 노드보다 더 많은 CPU 파워를 모을 수 있다면(51%) 그 공격자는 지불한 것을 되돌리거나, 새로운 가짜 코인을 발행해서 사람들을 속일 수 있다. 그러나 애초에 51%에 해당하는 CPU 파워를 모을 수 없고, 모은다하더라도 자신이 소유권을 가진 코인에 대해서만 조작이 가능하므로 공격을 당했다는 사실은 자신의 코인의 가치를 떨어뜨리므로 공격자가 51%의 CPU 파워를 얻기 위해 지출보다 이익이 크기 힘들다.
디스크 공간 절약을 하면서 블록의 해시가 깨지는 것을 방지하기 위해 머클트리 구조를 사용한다.
머클트리 구조를 통해 블록 헤더엔 모든 거래 기록 대신 루트해시만 들어간다. 그리고 루트 해시만 헤더 안에 있으면 루트해시를 구하기 위해 필요했던 이전 데이터들은 필요 없다.
1. 새롭게 생성된 거래가 사용하고자 하는 이전 거래(그림의 Tx3)의 정보를 받아온다.
2. 풀 노드로부터 이전 거래가 포함된 블록의 머클루트 해시를 구하는데 필요한 머클트리의 해시들(Hash2, Hash23, Hash01)을 받아온다.
3. 이전 거래의 해시를 받아 온 해시들과 해싱을 반복하여 머클루트 해시까지 도달한다.
4. (풀 노드의 도움으로) 계산한 머클루트의 해시와, (라이트 노드가 보유하고 있는) 블록 헤더에 있는 머클루트 해시를 비교해서 일치하면 검증을 끝낸다.
즉 가장 긴 자격증명 체인을 가지고 있다면 해당 거래에 대한 타임스탬프가 찍힌 블록에 연결한 머클 분기를 얻기만 한다면 이를 통해 거래가 이루어졌음을 확인할 수 있다.
input
output
거래에 사용된 금액의 출처나 정보가 중요한 것이 아니다. 거래의 결과와 기록만 중요한 것이다.
정보의 차단이 어디서 일어나는지가 큰 차이점이다. 전통적 모델에서는 거래상대와 공중의 정보를 차단해 대중들에게 공개하지 않음으로서 프라이버시를 지킨다.
그러나 비트코인 모델에서는 거래 기록이 공중에게 공개되지만 신원과 거래 정보와의 차단 즉, 공개키를 이용해서 거래를 수행해 프라이버시를 보장한다.
다시 말해 어떤 거래가 일어났는지는 알 수 있지만 그 거래를 누가 했는지는 알 수 없다는 것이다.
이 부분에선 여러 수학적 개념과 프로그래밍 과정이 나타나지만 너무 복잡해서 모두 이해하지는 못했다. 그래서 결과만 이해를 했는데 결과는 정상적인 체인보다 공격자가 더 긴 체인을 만든다면 공격은 가능하지만, 이게 가능하게 되더라도 쓰인 노력과 돈이 더 많이 들어간다는 것이다. 그리고 블록이 늘어나면 늘어날수록 공격자가 이득을 볼 가능성이 지수적으로 감소한다. 그러므로 공격자의 공격 시도에 대한 동기 자체를 줄일 수 있다.