만족
[Blockchain] 비트코인 백서 해설 본문
[Blockchain] 비트코인 백서 해설
BlockChain/이론 Satisfaction 2021. 12. 5. 00:09
아직 블록체인에 대해 오래 공부하지는 않았기 때문에 틀린 내용이 있을 수 있으니
오해설을 발견하게 된다면 댓글을 통해 알려주시면 감사하겠습니다.
https://bitcoin.org/files/bitcoin-paper/bitcoin_ko.pdf
이 포스트에서는 위 문서(비트코인 백서)를 해설할 것이다.
비트코인의 목적은 무엇인가?
기존의 인터넷 기반 상거래(쇼핑몰에서 물건 사기 등)에서 재화를 거래하기 위해서는
판매자와 구매자가 직접 재화를 거래하지 않고 금융기관과 같은 중개 기관을 통해 거래한다.
그러나 이런 중개 기관의 개입은 분쟁 등의 이유로 거래의 취소가 발생할 수 있기 때문에
서로 완전히 믿고 거래를 진행할 수 없다.
비트코인은 위 문제를 해결하기 위해 탄생한
1) 중앙통제를 받지 않고, 2) 거래의 비가역성을 보장하며
그 거래내역들을 3) 암호학적으로 증명할 수 있는 새로운 화폐 시스템이다.
이중지불 (Double Spending) 문제
이중지불이란 하나의 재화를 여러 번 사용할 수 있는 문제를 말한다.
(실제로 그렇게 사용해서는 안됨에도 불구하고)
예를 들어 A가 소유한 전자화폐 1000원을 이용해,
B에게도 1000원을 지불하고 동시에 C에게도 1000원을 지불할 수 있게 되는 문제를 말한다.
이전까지는 이 문제를 해결하기 위해 제 3자인 중개기관이 개입해서 해결했지만,
중개기관 없이 이중지불을 감지하려면 어떻게 해야 할까?
거래 대상자들이 모든 거래내역을 알고 있다면 해결된다.
그러면 그 거래 내역들로부터 특정 재화가 이미 사용된 것인지, 그렇지 않은 것인지를 알아낼 수 있다.
타임스탬프 서버
백서에서 설명하는 타임스탬프 서버 개념은 처음 봤을때도 이해가 안갔던 부분이다만,
검색을 통해 다른 사람들의 설명을 보고 나서 이해할 수 있었다.
타임스탬프 서버는 단순히 각각의 블록들은 서로 어떻게 연결되어 있는지에 관한 개념을 설명하는 것이다.
(아직 블록이 무엇을 포함하는지는 몰라도 된다, 단순히 N개의 데이터를 담고 있는 Object라고 생각해보자)
블록들이 단순히 Array에 들어있는 것은 아닐 테고, 도대체 어떻게 연결되어 있느냐?
예를 들어 N번째 블록은 N-1번째 블록의 해시, 즉 이전에 생성된 블록의 해시를 포함함으로써
N번째 블록은 N-1번째보다 나중에 만들어진 블록임을 알 수 있다.
마찬가지로 N+1번째 블록은 N번째 블록의 해시를 포함할 것이며,
계속해서 새로운 블록은 바로 전 블록의 해시를 포함하면서
모든 블록이 그 블록의 이전 블록과 연관이 되게, 즉 길이를 '연장'하는 방식으로 블록들이 존재한다.
(블록들이 List가 아니라 중구난방으로 주어지더라도 블록의 순서를 계산할 수 있게 된다)
따라서 블록들은 '생성된 시간'에 따라 연결관계를 갖게 되고,
이것이 블록체인 백서에서 말하는 '타임스탬프 서버'의 핵심이다.
작업증명
N번째 블록이 N-1번째 블록의 일부 값(Hash)를 포함한다고 했다.
그런데 새로운 블록을 누구나 짧은 시간안에 만들어낼 수 있다면 어떻게 될까?
악의적인 목적을 가진 공격자 역시 새로운 블록을 마구잡이로 찍어낼 수 있게 되고
네트워크의 참여자는 어떤 블록이 올바른 블록인지 알 수 없다.
이에 비트코인은 블록을 생성할 때 고의적으로 비효율적인 작업을 요구한다.
새로운 블록을 만들기 위해서 그 블록의 해시 값이 특정한 조건을 만족할 때 까지 해시를 반복하게끔 강요한다.
예를 들어 현재 블록이 100개 존재하고, 101번째 블록을 새로 만들기 위해서는
100번째 블록의 해시값을 포함하되, 해시한 값이 10개의 0으로 시작하는 값이 될 때까지 해시를 반복해야만 한다.
해시를 할 때 SHA256을 사용해 블록을 해시하게 되고,
블록에 nonce라는 임시 변수를 이용해 1씩 증가시키면서
그 블록의 해시가 K개의 0으로 시작하는 해시값이 나올때까지 반복하는 것이다.
이 고의적인 '비효율'은 가짜 블록을 막을 때는 꽤나 효율적인데,
만약 현재 N개의 블록이 있고, K번째 블록(K<N)부터 N번째 블록까지를 변조하려면
위의 비효율적인 반복 해싱 과정을 N-K+1개의 블록을 만들 때 까지 반복해야 한다.
물론 조건에 맞는 해시를 찾는 시간은 매우 오래 걸리는데다,
정상적인 사용자들은 계속해서 새로운 블록을 생성할 것이므로
공격자가 만들어야 하는 블록의 갯수는 따라잡을 수 없을 정도로 늘어나게 된다.
난이도
위의 해싱 과정에서 N개의 0으로 시작하는 해시가 그 블록의 올바른 해시라고 했는데,
여기서 N이 바로 채굴 난이도이다.
N이 커질수록 해싱의 횟수가 증가하므로
블록의 생성 주기가 너무 빨라지면 N을 크게 만들어 생성 속도를 늦추고
반대로 너무 생성 주기가 느려지면 N을 작게 만들어 생성 속도를 높인다.
네트워크
비트코인이 위에서 말한 제 3자인 중개기관 역할을 하려면 온라인 상에서 작동해야 한다.
온라인 상에서 블록체인은 다음과 같이 작동한다.
1) 새로운 거래가 모든 노드에 브로드캐스트된다.
2) 각 노드가 새로운 거래를 블록에 수집한다.
3) 각 노드가 그 블록에 맞는 난도의 작업증명을 찾아 나선다.
4) 노드가 작업증명을 찾은 시점에, 거기서 모든 노드로 그 블록을 브로드캐스트한다.
5) 노드는 모든 거래가 유효하며 아직 지불되지 않았다는 조건에 맞을 경우에만 그 블록을 승인한다.
6) 노드는 블록 승인을 표현하기 위해 먼젓번 해시로 승인된 블록의 해시를 사용해 사슬 안에 다음 블록을 생성한다.
드디어 블록 안에 무엇이 들어있는지가 나왔다.
블록에는 위의 타임스탬프 서버로써 작동하기 위한 '현재 블록의 해시, 이전 블록의 해시',
작업증명을 구현하기 위한 임시 값 'Nonce',
그리고 '거래 내역' 리스트가 들어가게 된다.
거래 내역은 생각보다 단순한데, '누가 누구에게 얼마를 송금함'과 같은 정보를 말한다.
이 거래 내역을 누군가 생성하면 그 정보가 네트워크에 브로드캐스트되고
전달받은 거래 내역을 수집해 블록을 만들어
작업증명을 통해 올바른 해시를 찾아 만들어낸 올바른 블록을 네트워크에 브로드캐스트해서
전달받은 그 블록이 올바른 경우(이중지불된 거래가 없음이 확인된 경우) 블록을 승인한다.
그런데 4번에서 새로운 블록을 브로드캐스트할때
거의 동시에 두개 이상의 올바른 블록을 전송받은 경우는 어떻게 될까?
그렇게 되면 모든 노드가 가진 블록이 동일하지 않게 될 것이다.
일단 그 블록들을 보관해 두었다가, 블록이 더 길어지는 쪽을 택한다.
예를 들어 A블록과 B블록 모두 올바른 블록이라면,
그 다음에 생성되는 블록이 A블록에 대한 다음 블록인지, B블록에 대한 다음 블록인지에 따라
어떤 블록을 채택할 것인지를 결정한다.
만약 현재 A블록을 먼저 받았지만, 다음 블록은 B블록에 대한 다음 블록이라면
A블록쪽은 버리고 B블록과 B블록의 다음 블록에서 작업하게 된다.
즉 각 노드들은 블록의 길이가 더 긴 브랜치로 이동하게 되어
노드들이 결국엔 하나의 블록체인으로 모이게 된다.
새로운 거래 내역이나 블록을 수신하지 못했을 경우에도 모든 블록들은 Hash로 연결되어 있기 때문에
다음 정보 수신 때 자신이 일부 데이터를 수신하지 못했음을 알아차리고 데이터를 요청할 수 있다.
인센티브(보상)
블록을 만들기 위해서 비효율적인 작업인 작업 증명을 강요당한다.
아무런 보상 없이 이런 비효율적이고, 많은 전기를 요구하는 작업을 자발적으로 할 사용자는 없다.
따라서 비트코인은 작업 증명을 통해 새로운 블록을 만들어 낸 사용자에게 보상을 지급함으로써
블록체인을 유지하는 데 동기부여를 해줄 수 있다.
그렇지만 인센티브로 지급되는 화폐가 무한하다는 것은 아니다.
모든 사용자는 거래 내역을 등록하기 위해 일정량의 거래 수수료를 지불해야 하는데,
정해진 채굴 보상(화폐량)이 달성되면 새로운 화폐를 만들어내지 않고
거래 수수료를 보상으로 지급해 인플레이션 문제를 해결할 수 있다.
또한 인센티브는 악의적인 행동을 하지 않도록 억제하는 역할도 할 수 있다.
작업증명은 매우 오래 걸리는 CPU연산을 요구하는데,
만약 공격자가 정상적인 유저의 CPU파워의 총합보다 높은 CPU 파워를 가지고 있다고 생각해 보자.
그렇다면 공격자는 네트워크를 공격함으로써 모든 코인의 가치를 0으로 만들 것이 아니라
네트워크에 참여함으로써 더 많은 경제적 이익(인센티브)를 얻을 수 있기 때문에
인센티브 제도는 공격을 하는 행위를 오히려 공격자에게 경제적인 손해를 입히는 것으로 만들어버린다.
디스크 공간 절약
블록 안에는 거래내역이 존재하며, 이 블록은 시간이 지날수록 커진다.
따라서 블록 안의 거래내역을 머클트리 구조로 저장하고,
한 노드가 블록의 모든 거래내역을 가지고 있지 않아도 거래내역의 위변조 확인이 가능하며
잘못된 거래내역이 발견되었을 경우 다른 노드의 도움을 받아 복구할 수 있다.
다시 말하면 모든 노드가 모든 거래내역을 가지고 있을 필요가 없으므로,
블록을 유효하게 유지하는 데 더 적은 공간을 사용할 수 있다.
머클트리에 관한 자세한 내용은 아래에서 확인할 수 있다.
프라이버시
전통적인 방식의 결제에서는 신뢰할 수 있는 제 3기관(은행 등)이 개입한다.
이 때는 제3자가 거래 당사자들을 알 수 있지만,
비트코인에서는 양측 거래 당사자가 '공개키'를 이용해 서로를 확인하고 거래하기 때문에
모두가 자금의 흐름(어디에서 어디로 얼마가 가는지)는 볼 수 있지만
그 당사자들이 누구인지는 알 수 없다.
예를 들어 비트코인에서 A가 B에게 1비트코인을 보낼 때,
거래 내역에는 A의 공개키/1비트코인/B의 공개키 정보가 포함되어 있다.
따라서 자신이 밝히지 않는 한, A의 공개키 값이 A의 것인지 C의 것인지는 알 수 없어 프라이버시가 보장된다.
작성중
'BlockChain > 이론' 카테고리의 다른 글
[Blockchain] js로 이해하는 블록체인의 트랜잭션 서명 (Signing Transaction) (0) | 2021.09.15 |
---|---|
[Blockchain] js로 이해하는 블록체인의 트랜잭션과 채굴 보상 (Transaction & Mining Reward) (0) | 2021.09.14 |
[Blockchain] js로 이해하는 블록체인의 작업 증명 (POW; Proof Of Work) (0) | 2021.09.13 |
[Blockchain] js로 이해하는 블록체인의 기본 구조 (0) | 2021.09.13 |