iwanhae 3 years ago
parent
commit
84ff296c30
2 changed files with 178 additions and 5 deletions
  1. 7 1
      2_비트코인에대한얘기.md
  2. 171 4
      6_블록체인.md

+ 7 - 1
2_비트코인에대한얘기.md

@@ -42,7 +42,13 @@
 
  이렇게 얻은 비트코인을 사용할곳은 유감스럽게도 국내에는 아직 별로 존재하지 않는다. 오프라인에서 비트코인을 사용할 수 있는 장소를 보여주는 사이트인 [코인맵](https://coinmap.org)에 따르면 국내에는 수십개의 비트코인을 사용 가능한 매장이 있다고는 하는데 필자가 서울 신촌과 강남근처에 표시된 장소를 실제 가본 결과 대부분의 경우는 받는다고는 하지만 실제로는 받지 않는경우가 대다수 였다. 이는 어찌보면 당연한데 시골 촌동네 구멍가게에서도 신용카드를 사용할 수 있는 우리나라의 금융 인프라는 솔직히 너무 훌륭해서 비트코인이 끼어들 여지가 없다.
 
- 하지만 해외의 경우 BitPay와 같은 비트코인으로 지불받고 판매자에게 현지화폐로 지불해주는 결제대행업체가 생겨나면서 비트코인을 받는 업체가 눈에띄게 늘어나고 있다. 대표적인 예가 필자의 블로그의 경우 전 세계에 걸쳐 서버를 두고 가상서버 임대사업을 하는 Vultr라는 기업의 서비스를 이용하는데 이 기업이 최근에 Bitpay를 이용한 비트코인 지불이 가능해져 더 저렴한 수수료로 해당 기업의 서비스를 이용할 수 있게 되었다.
+ 하지만 해외의 경우 사정이 다른데, 세계 어느사람도 고객이 될 수 있는 인터넷 호스팅 기업을 중심으로 비트코인을 받는 업체가 하나둘씩 늘어나고 있다. 필자의 블로그도 이러한 비트코인을 받는 업체를 이용하고 있으며, 100달러가량의 상품을 결제하는데 370원가량의 수수료만 지불하여 비트코인 고유의 이득을 보게되었다. 물론 이뿐이 아니며 다음 사이트에 들어가보면 비트코인으로 재화 혹은 서비스를 판매하겠다는 사람들의 글을 많이 확인할 수 있다. 
+
+https://bitcointalk.org/
+
+> BitcoinTalk : 비트코인 초기 개발자들이 만들어낸 비트코인 포럼이며, 현재 가장 규모가 큰 비트코인 커뮤니티이다. 이 커뮤니티에서는 비트코인의 기술적인 내용부터, 초보자들을 위한 가이드까지 비트코인과 관련된 거의 모든 분야를 다루고 있다. 그중 MarketPlace라는 게시판에서 비트코인의 사용처를 쉽게 찾을 수 있다.
+
+ 위 사이트에 올라와 있는 게시글 들을 보면 음식점 홍보, 전자제품 판매, 인터넷 호스팅 같은것 부터 시작해 비트코인 대출, 금괴 판매 까지 다양한 비트코인 사용처를 확인할 수 있다. 하지만 대부분은 검증된 글은 아니며 사기일경우도 종종 있기에 주의를 요한다.
 
  이렇게 각자 자신이 구매할 물건을 정했으면 그 다음은 지불이다. 아쉽게도 비트코인의 거래과정은 우리가 신용카드를 긁으면 바로 결제가 승인 되는것처럼 빠르게 진행되지 않는다. 비트코인 거래가 승인되기까지는 많은 일이 벌어져 이 책 "거래의 생성"부터 "블록의 전파"까지 이에대한 과정을 다룰것인데, 사용하는 입장에서 중요한 것은 
 

+ 171 - 4
6_블록체인.md

@@ -2,7 +2,13 @@
 
 ## 개요
 
- 블록체인은 가상화폐시장, 아니 컴퓨터 과학계에 비잔티움 장군 문제라는 오래된 난제에대해 명쾌한 해답을 제시하여 침체되있고 여태껏 해온대로만 해왔던 컴퓨터 과학계에 딥러닝과 함께 크나큰 혁명을 가져다준 존재이다. 다만 이런 혁명적인 성과를 가져온것 치고는 그 원리는 생각보다 간단한데, 데이터가 블록의 형태로 담겨져 첫번째 부터 N번째까지 배열되어 있는데 2에서 N사이의 임의의 숫자 K에 대해 생각할때 K번째 블록은 K-1번째의 데이터를 해시값, 혹은 그에 준하는 어떤 형태를 가지고 있어, K-1번째 블록의 무결정성을 보장해준다는 것이다. 하지만 아마 이 글만보고 그 가능성을 이해하는 사람도 있겠지만 대다수는 그 가치를 이해하지 못할것으로 생각한다.
+ 비트코인 세상에서 여러분이 발생되는 거래가 정확히 어느시점에서 승인되는지 다시한번 환기해보자. 일단 비트코인 지갑을 사용해 트랜젝션을 생성해 낸다. 그 후 이 트랜젝션을 비트코인 네트워크 전역으로 전파시키며, 채굴자는 비트코인 네트워크를 떠돌아다니는 트렌젝션들을 모아서 블록이라는 형태로 저장한다. 그 후 채굴의 과정을 거쳐 블록체인에 포함시키는 순간 여러분이 발생시킨 거래는 공식적으로 인정받게 되는 것이다. 그럼 여기서 블록체인이란 무엇일까?
+
+ 사실 블록체인의 개념은 별로 복잡하지는 않아서, 그냥 딱 한마디로 표현할수도 있는데 "새로생긴 블록이 이전 블록을 증명해 주는 구조"이다. 물론 이것만으로 이해할 수 있는사람은 별로 없을것이라 생각해 좀 더 세부적으로 표현해 보자면, 일단 비트코인에서 블록은 매 10분에 하나씩 생겨난다. 그리고 새로 생긴 블록은 바로 이전에 새로생긴 블록의 해시값을 가지고 있는 형태이다. 그럼 이게 왜 대단한 것일까?
+
+ 2017년기준 현재 블록체인상에는 약 50만개의 블록이 쌓여있다. 이 50만개의 블록중 필자가 100번째 블록에 있는 거래데이터를 조작하려고 한다 가정해보자. 그럼 100번째 블록의 해시값은 크게 변하게 될것이다. 그리고 그럼으로 인해 101번째 블록에 명시되어있는 100번째 블록의 해시값이 일치하지 않아 데이터가 조작되었음을 바로 확인할 수 있다. 이런 문제점을 파악하고 101번째 블록에 명시되어있는 100번째 블록의 해시값을 바꾸면 이번에는 102번째 블록에 명시된 101번쨰 블록의 해시값이 서로 달라지게 된다. 즉, 필자가 100번째 블록의 거래데이터를 조작하려면 필자는 100번째부터 가장 최근에 생긴 50만번째 블록까지 모두 조작해야된다는 것이다.
+
+ 물론 이 모든것은 컴퓨터상에서 발생하는 일이니 간단한 프로그램만 짜면 단순히 N번째 블록이 N-1번째 블록의 해시값만 가지고 있는 50만개의 블록을 조작하는 일은 말그대로 순식간에 끝낼 수 있다. 이런일을 방지하기 위해 비트코인은 PoW(Proof of Work)라는 개념과 함께 채굴이란 시스템을 도입하였다.
 
  이 파트에서는 비트코인의 블록의 구조에 대해 설명한 뒤, 비트코인의 블록체인이 어떻게 작동하는지, 채굴이란 무엇인지, 비트코인에서 운영되는 블록체인 말고 다른 블록체인은 어떻게 비트코인형태의 블록체인의 단점을 극복하려 했는지 등을 설명할 예정이다.
 
@@ -58,11 +64,172 @@ H4-->H34
 H12-->H1234["H1234: Hash(H12+H34)"]
 H34-->H1234
 
-
 ```
 
  머클트리를 만들기위한 과정은 다음과 같다. 일단 가장먼저 블록에 저장된 각각의 Tx으로부터 해시값을 구한다. 여기서 사용되는 해시함수는 SHA256d로 Tx전체 데이터에대하여 SHA2를 두번돌린 값이다. 이렇게 Tx1부터 Tx4까지 각각 해시값을 구해냈으면 다음과정은  H1이라는 해시값 뒤에다가 H2를 붙혀 탄생한 새로운 데이터의 해시값 H12을 구한다. 같은과정을 H3, H4 쪽에도 행해준다. 마지막으로 H12라는 해시값 뒤에다가 H34를 붙혀 탄생한 새로운 데이터의 해시값 H1234를 구한다...... 이 과정은 최상위에 딱 하나의 노드가 남을 때까지 반복되며 이렇게 마지막으로 하나남은 노드를 머클루트라 하며, 이렇게 완성된 머클루트는 블록헤더에 블록바디 전체의 데이터를 보증해주는 역할로 저장된다.
 
- 다만 
+ -------------------------
+
+> 여기서부터는 핵심만
+
+-------------
+
+그럼 이러한 머클트리 구조에서 머클루트존재 하나만으로도 `블록 바디`에 대한 무결성을 보증할 수 있다는것은 알겠지만 어떻게 SPV 노드가 이를 이용할 수 있을까? 아래 그림에서 `SPV노드`가 Tx4의 데이터를 받았을때, 이것이 올바른 데이터인지에 대해 증명해보려는 상황을 생각해보자.
+
+```mermaid
+graph BT
+
+Tx1-->H1["H1:Hash(Tx1)"]
+Tx2-->H2["H2:Hash(Tx2)"]
+Tx3-->H3(("H3:Hash(Tx3)"))
+Tx4-->H4("H4:Hash(Tx4)")
+H1-->H12(("H12:Hash(H1+H2)"))
+H2-->H12
+H3-->H34["H34:Hash(H3+H4)"]
+H4-->H34
+H12-->H1234["H1234: Hash(H12+H34)"]
+H34-->H1234
+
+Tx5-->H5["H5:Hash(Tx5)"]
+Tx6-->H6["H6:Hash(Tx6)"]
+Tx7-->H7["H7:Hash(Tx7)"]
+Tx8-->H8["H8:Hash(Tx8)"]
+H5-->H56["H56:Hash(H5+H6)"]
+H6-->H56
+H7-->H78["H78:Hash(H7+H8)"]
+H8-->H78
+H56-->H5678(("H5678: Hash(H56+H78)"))
+H78-->H5678
+
+H1234-->H12345678
+H5678-->H12345678["Merkle Root: Hash(H1234+H5678)"]
+
+```
+
+일단 SPV노드는 블록헤더에 포함되어있는 Merkle Root에 대한 정보는 알고있고 Tx4에 대한 정보는 받았으니 Tx4의 해시값인 H4도 알고있다. 그럼 여기서 Tx4에대한 정보를 추가적으로 알아내려면 H3, H12, H5678의 정보만 알면된다. 그 이유는 일단 H3와 H4를 이용해 H34를 구할 수 있으며 H34와 H12를 이용해 H1234를 구할 수 있고, 마지막으로 H1234와 H5678을 이용했더니 Merkle Root와 같은 값이 나오면 SPV노드는 완벽한 100%의 확률은 아니지만 거의 100%에 수렴하는 확률로 Tx4는 실제 블록에 포함되어있는 정보 그대로라는 것을 유추할 수 있는 것이다. 
+
+즉 `SPV노드`는 이러한 머클트리의 특징을 통해 머클트리를 사용하지 않았다면 1MB에 달하는 블록을 통쨰로 받아야만했던 상황으로부터 벗어나, 받으려는 Tx 데이터 그자체와 일반적으로 블록안에 포함된 거래의 개수가 약 1000개라는 점을 생각할때 약 10개의 추가적인 32바이트짜리 해시값을 받아오는것 만으로도 자신이 원하는 Tx이 제대로된 Tx이 검증할 수 있는것이다.
+
+>  일반적으로 Tx가 늘어남에따라 머클트리에서 인증을 하기위해 필요한 해시의 개수는 Log2(N)개, 2^10=1024
+
+> 내용이 좀 부실....;;;; 수정 필요.
+
+### 비트코인의 생성
+
+ 눈치가 빠른 독자분들이라면 앞서 `거래의 생성`부분에 대한 설명을 읽고 있을떄 다음과 같은 한가지 의문이 들것이다.
+
+> 거래의 입력으로 이전거래의 출력을 사용했다면 최초의 거래의 입력은 어디서부터 나온것인가?
+
+ 이에대한 답을 알아보기위한 방법은 간단하다. 
+
+> 이전블록이 존재하지 않는 최초의 거래의 입력은 어디서 부터 나왔을까?
+
+ 일단 비트코인상에서 최초의 거래는 2009년 1월 3일 오후 6시경에 발생했으며 BlockChain.info에서 보여주는 해당 거래 내역은 다음과 같다.
+
+```mermaid
+graph LR
+subgraph TxId:4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
+A["No Inputs (Newly Generated Coins)"] -->|50 BTC| B[1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa]
+subgraph 입력
+A
+end
+subgraph 출력
+B
+end
+end
+```
+
+뭔가 이상하다. 입력값이 없고 새로 생성된 코인이라고 한다. 이게 어떻게 된 일일까?
+
+앞서 여러번 밝혔다시피 블록은 채굴자에 의해서 생성된다. 그럼 채굴자들은 왜 채굴을 하는것일까? 당연히 비트코인을 벌기 위해서다. 그럼 채굴자들은 비트코인을 어떻게 벌 수 있을까?  이에대한 해결책으로 비트코인은 블록을 만들어낸 자에게 일정분량의 비트코인을 사용할 권리를 부여하였다. 이렇게 매 블록 생성되는 비트코인을 사용하는 거래를 `Coinbase Transaction` 혹은 `생성거래`라고 하는데 매 블록의 첫번째 거래는 `생성 거래`로 되어있는것으로 정해져 있으며 이 `생성 거래`의 데이터 구조는 다음과 같은 형태를 가진다.
+
+| 크기      | 이름                        | 설명                                      |
+| ------- | ------------------------- | --------------------------------------- |
+| 32Byte  | Previous Transaction hash | 본래 이전거래의 TxId가 있어야 하나 없으므로 모든 비트가 0이다.  |
+| 4Byte   | Previous Txout-index      | 본래 이전거래의 인덱스번호가 있어야 하나 없으므로 모든 비트가 1이다. |
+| 1~9Byte | Coinbase data bytes       | Coinbase data의 크기를 Byte단위로 나타낸다.        |
+| 가변적     | Coinbase data             | 블록을 생성한 자가 자기가 원하는 데이터를 마음대로 집어넣을 수 있다. |
+| 4Byte   | sequence                  | 무조건 0xFFFFFFFF                          |
+
+비트코인 채굴자는 Coinbase data부분에 자기가 원하는 메세지를 남길 수 있는데 비트코인의 개발자 사토시 나가모토가 처음으로 이곳에 남긴 메세지는 다음과 같다. 
+
+>  ��EThe Times 03/Jan/2009 Chancellor on brink of second bailout for banks
+
+실제 The Times라는 신문사에서 발행한 기사로, 비트코인의 개발동기를 엿볼수 있는 기사라고 한다. 
+
+지금은 이 공간을 완벽하게 개인이 자유롭게 사용할수는 없고 비트코인 개선안에대한 "투표"나 블록헤더에 추가되지 못한 블록의 추가정보, 채굴을 위한 가능성 확보등의 방법으로 사용되고 있다.
+
+이 `생성 거래`를 통해 새로 비트코인 네트워크에 추가되는 금액은 매 블록마다 50BTC로 시작하여 매 210,000개의 블록이 생성될때 마다 (약 4년의 기간이다) 반씩 줄어들어 2012년 11월 블록당 25BTC, 2016년 7월 블록당 12.5BTC로 줄어들었으며, 그렇게 계속 줄어들어 2140년경이 되면 블록당 지불되는 비트코인이 없어져, 총 약 2,100만개의 비트코인이 블록마다 발행될 예정인데, 그럼 문제가 발생한다. 2140년 이후에는 채굴자가 받는 이득이 전혀 없는 것일까? 다행이도 그렇지 않다.
+
+ 2017년 현재기준으로 새로생성되는 블록은 12.5BTC을 새로 생성한다. 하지만 `생성거래`부분을 보면 이보다는 확실히 많은 양의 비트코인을 받고있는것을 확인할 수 있는데 이부분이 바로 수수료를 회수하는 부분이다. 여러분도 알다시피 비트코인을 사용할때는 수수료를 지불해야하며 더 많은 수수료를 지불할수록 더 빨리 블록체인속에 포함될 수 있다. 이 수수료는 각 Tx의 입력값과 출력값의 차이만큼이 되는데 바로 이 차액이 `생성거래`부분에 더해지고 채굴자는 수수료를 회수할 수 있는 것이다. (당연하게도 채굴자는 더 많은금액을 받기위해 수수료가 높은 거래부터 처리한다.)
+
+ 현재 통계상 매 블록마다 약 1BTC의 수수료가 채굴자에게 지불이 된다고 한다. 다만 채굴자들은 이 금액으로는 추후 기본 지급되는 비트코인이 반감되었을때, 운영되는 채굴장비의 유지비를 감당 못해 수수료를 올려야된다고 주장하고 반대로 사용자측은 지금 지불되는 수수료도 많다고 주장해 적절한 수수료의 값이 얼마인가에 대한 논의는 계속되고 있다.
+
+##  비트코인 채굴의 핵심- 작업증명
+
+### 개요
+
+ 아이들이 가지고 놀기 좋은 정육면체 모양의 나무블록을 상상해보자. 블록A가 놓여져있다. 그 옆에 블록B를 두고 블록A와 블록B를 사슬로 엮어놓는다. 다음으로 블록 C를 블록 B옆에다 두고 블록 B와 블록 C를 사슬로 엮는다. 이제 여기서 블록 B를 들어올려보자. 블록 A와 블록 C가 같이 움직일 것이다.
+
+ 비트코인의 블록체인은 위 상황과 매우 유사하다. 모든 블록은 사슬처럼 서로 묶여있으며 그중 블록 하나를 조작하려고하면 다른 블록들이 반응을 해서 블록이 조작됬다는 사실을 알려준다. 그럼 이게 데이터적으로 어떻게 구현되어있을까?
+
+ 구현의 키워드는 데이터의 지문, 해시값이다. 비트코인상의 블록은 모두 이전블록의 해시값을 가지고 있다. 이렇게 다음블록이 자신의 해시값을 가지고 있는 상황에서 만약 해당블록이 조작되었다면 당연히 자기자신의 해시값이 달라져 다음블록에 적혀있는 해시값을 통해 조작된 사실을 쉽게 파악할 수 있다.
+
+ 하지만 여기서 문제가 발생한다. 모든 블록의 해시값이 조작되면, 어떤 블록의 데이터가 조작되어도 파악할 수가 없다. 이런 상황에서 해시값이 조작되어도 판단할 수 있도록 비트코인에서는 PoW, Proof of Work, 작업증명 이라는 개념을 만들어 냈다. 이 작업증명은 자신이 이 블록을 만들기 위해 엄청난 노력을 했음을 증명해주는 내용이기도 하며, 현재 비트코인 채굴자들이 전세계 슈퍼컴퓨터는 아무것도 아니라는 엄청난 컴퓨팅 성능을 소모해서 하는 연산 또한 이 `작업증명`을 위한것이라고 보아도 된다.
+
+ 이 파트에서는 이 `작업증명`이 무엇인지에 대해 다룬다.
+
+### 블록헤더의 해시
+
+비트코인에서 블록체인에 대한 설명에서 빠질 수없는것이 바로 블록 헤더이다. 그 이유는 위에서 말한 블록체인의 모든것이 블록 헤더에서 구현되어 있기 때문이다. 각 블록헤더는 바로 이전 블록헤더의 해시값을 가지고 있고, 각 블록의 해시값이 조작되지 않았음을 증명할 수단도 블록헤더에서 구현되어있다.
+
+ 블록 헤더는 다음과 같은 정보를 가지고 있다.
+
+| 크기     | 이름             | 설명                                    |
+| ------ | -------------- | ------------------------------------- |
+| 4Byte  | Version        | 블록 버전에 대한 정보가 담겨있다.                   |
+| 32Byte | hashPrevBlock  | 이전 블록 헤더의 해시값이 담겨있다.                  |
+| 32Byte | hashMerkleRoot | 블록 바디의 머클 트리로부터 나온 머클루트값이 담겨있다.       |
+| 32Byte | Time           | 유닉스 타임스탬프를 사용한다.                      |
+| 4Byte  | nBits          | 이 블록헤더의 해시값이 충족해야할 조건에대한 정보가 담겨있다.    |
+| 4Byte  | Nonce          | nBits를 만족시키기위해 채굴자가 마음대로 조작가능한 공간이다.. |
+
+여기서 블록체인과 관련되어 주의깊게 살펴보아야 할 사항은 `hashPrevBlock`, `nBits` 그리고 `Nonce`이다. 일단 `hashPrevBlock`는 이전 블록의 해시값으로 블록체인의 핵심이라 할 수 있다. 하지만 `nBits`와 `Nonce`는 무엇일까?
+
+ 이에대한 설명을 하기 앞서 다음을 살펴보자. 다음은 400,000번째 블록헤더의 해시값이다.
+
+`000000000000000004ec466ce4732fe6f1ed1cddc2ed4b328fff5224276e3f6f`
+
+뭔가 이상하다. 앞쪽에 0이 좀 많다고 생각하지 않는가? 
+
+단순히 우연일지도 모르니 바로 그 다음블록인 400,001번쨰 블록헤더의 해시값을 살펴보자.
+
+`000000000000000005421b1b2ee6d06d037557d7f5ec96852542413cfed40c22`
+
+여기에도 엄청난 0이 존재한다. 그뿐이 아니다, 그 다음블록도
+
+`0000000000000000016578099aab6d26d41c8815e9ab5f204f505ba4ac3c084d`
+
+그 다음블록도
+
+`0000000000000000053c5d6913444bcef2a5a2a6ec84cb0dbaef93e6ad3074ba`
+
+로 모두 앞에 0이 많이 존재한다는 사실을 알아낼 수 있다.
+
+
+
+일반적으로 발생하는 해시값은 
+
+`ca2099f4706a7b28c5550b304d1f51ef61389617358b45d9714de5f2699638fe` 
+
+이런 형태를 가진다는 점을 생각해 볼때 위와같이 앞쪽에 0이나온다는 것은 의도되었단 것일까?
+
+
+
+맞다. 
+
+조금만 생각해보면 어떤 데이터의 해시값이 앞부분이 저렇게 0이 많이 나올 확률은 매우 희박하다는 것을 알 수 있을것이다. 그런데 만약 실제 그러한 데이터를 찾아냈다면, 이는 엄청난 우연의 일치로 그런 데이터를 찾아냈던가, 혹은 엄청나게 많은 데이터의 해시값을 돌려본 끝에 해시값이 앞에 0이 많이 나오는 형태를 찾아냈다고 할 수 있을것이다. 비트코인에서 `작업증명`이란 바로 이 과정을 말한다. 
+
+ 비트코인에서 `작업증명`은 바로 이 희박한 확률을 
 
- 
+이와 같은 형태를 가져야 하며 앞쪽에 저렇게 0이 많이 오는것은 확률적으로 나올 확률이 매우 적다.