Browse Source

블록체인에서 블록구조 작성중. 앞부분 약간 수정

iwanhae 3 years ago
parent
commit
536e672393
3 changed files with 61 additions and 19 deletions
  1. 8 17
      4_지갑과_비트코인_주소.md
  2. 16 2
      5_거래생성및전파.md
  3. 37 0
      6_블록체인.md

+ 8 - 17
4_지갑과_비트코인_주소.md

@@ -104,7 +104,7 @@ graph TD
 
 지갑-->비결정적지갑
 지갑-->결정적지갑
-결정적지갑-->BIP32
+결정적지갑-->HD지갑
 ```
 
 ### 비결정적 지갑
@@ -130,33 +130,24 @@ graph LR
 비밀키3-->...이하생략
 ```
 
- 이게 결정적 지갑에대한 기초적인 아이디어 이다. 다만 편한만큼 보안적으로 위험하기도 한데, 위 방법의 경우 처음 문자열만 알면, 아니 중간에 사용되는 비밀키 하나만 알아내는데 성공하면 다른 비밀키도 유출될 수 있다는 것이다. 이런 상황을 조금이나마 방지하기위해 다음과 같은 방법들이 제시되고 일부는 실제 사용되고 있다. 다만 이 방법을 사용하는것은 강제사항이 아니기에 비트코인 클라이언트마다 그 구현방법이 다를수도 있고 다른 비트코인 클라이언트간에 호환이 되지 않을 수도 있으니 주의 바란다.
+ 이게 결정적 지갑에대한 기초적인 아이디어 이다. 다만 편한만큼 보안적으로 위험하기도 한데, 위 방법의 경우 처음 문자열만 알면, 아니 중간에 사용되는 비밀키 하나만 알아내는데 성공하면 다른 비밀키도 유출될 수 있다는 것이다. 이런 상황을 조금이나마 방지하기위해 다음과 BIP32를 통해 HD지갑, Hierarchical Deterministic Wallets,이 제안되었다. 현재 대다수의 지갑프로그램은 이 표준안에 따르고 있어, 사용자가 12개의 단어만 기억하면 기기 자체에 비밀키가 저장되어있지 않아도 언제 어디서든 어떤 프로그램을 통해서든 비밀키와 그에따른 비트코인 주소를 불러올 수 있다.
 
 #### 연상기호(mnemonic)
 
- 이부분은 처음 "어떤문자열"을 어떻게 정할까?의 부분과 상관이 있다. 개개인이 모두 알아서 정말 예측불가능해서 컴퓨터로 일일히 대입해봐도 수백년뒤에 뚫릴만한 문자열을 사용한다면 최고지만, 아쉽게도 대부분의 경우 "0000"같은 간단한 문자열을 사용하거나 다른 사이트에서 비밀번호로 사용했던 문자열을 그대로 가져오는것이 현실이다. 다른 웹사이트의 경우 비밀번호 유출이 의심될때는 단순히 비밀번호 바꾸기를 통해서 이를 해결하면 되지만 비트코인은 문자열 자체로부터 단서를 획득하는 것이기에 비밀번호 바꾸듯이 쉽게 바꿀 수 없고 기존 지갑을 버리고 새로운 지갑을 사용해야만 한다.(이 과정에서 송금 수수료가 발생한다.)  그럼 처음부터 예측 불가능하지만 기억할만한 문자열을 보편적으로 선택 가능하게 해주어야 하는데 이를 위해 생겨난 방법이 "연상기호"이다.
+ 프로그램에 따라 다르긴하지만, 비트코인 지갑을 처음 생성할때 12개의 단어를 기억하라는 메세지를 본적 있을것이다. 이부분은 앞에서든 예시에서 처음 "어떤문자열"을 어떻게 정할까?의 부분과 상관이 있다. 개개인이 모두 알아서 정말 예측불가능해서 컴퓨터로 일일히 대입해봐도 수백년뒤에 뚫릴만한 문자열을 사용한다면 이런방법이 나올 필요도 없었겠지만, 아쉽게도 대부분의 경우 "0000"같은 간단한 문자열을 사용하거나 다른 사이트에서 비밀번호로 사용했던 문자열을 그대로 가져오는것이 현실이다. 게다가 일반적인 웹사이트가 아이디와 비밀번호를 동시에 맞춰야한다면, 비트코인의 경우 비밀번호만 맞추면 그대로 비밀키가 유출되어 훨씬더 안전한 수단이 필요하다. 가장 간단한 방법은 컴퓨터가 완벽한 임의의 문자열, 아니 비트열을 골라주는것이다. 컴퓨터가 임의의 128bits를 만들어주기만 해도 $$2^{128}$$개의 경우의수가 발생하여 전세계의 모든 컴퓨터를 연산에 투입해도 어느 누구의 비밀키를 1세기 안에 찾아내는것은 불가능할정도의 안전함을 보장할 수 있다. 하지만 이것 또한 한가지 문제가 있으니, 사람이 기억하기가 힘들다. 이를 위해 생겨난 방법이 비트열을 12~24개의 문자열로 바꿔주는 "연상기호"이다.
 
- 사실 이는 비트코인에서 처음 제시된 방법은 아니고 기존에 쓰던방법을 비트코인에서 채용한것에 가까운데, 일단 128bits~256bits 사이의 임의의 데이터를 난수발생기를 통해 발생시킨다. 그 후 만들어진 데이터 뒤에 나중에 입력 실수했을때 잡아내기 위해 데이터의 해시값의 첫 몇바이트를 뒤에다 붙힌다. (이는 Base58Check에서 행한 과정과 목적이 비슷하다.)(이를 검사합이라 부른다.) 그리고 이를 11비트 단위로 나눈다. 그럼 각 11비트는 1에서 2048=2^11 사이의 숫자로 표현 가능한데 이를 미리 정해둔 기억하기 쉬운 영어단어와 매칭시킨다. 그럼 상황에 따라 12단어에서 24단어 사이의 영어단어가 나타나게 되는데 사용자는 이만 기억하면 된다. 만약 잘못기억해도 맨뒤에 포함된 오류보정 데이터가 확인해주기 때문에 몇번 시행착오를 거듭하다보면된다. 이렇게 완성된 영어단어는 대략 다음과 같은 모습을 지닌다. 
+ 사실 이는 비트코인에서 처음 제시된 방법은 아니고 기존에 쓰던방법을 비트코인에서 채용한것에 가까운데, 일단 128bits~256bits 사이의 임의의 데이터를 난수발생기를 통해 발생시킨다. 그 후 만들어진 데이터 뒤에 나중에 입력 실수했을때 잡아내기 위해 데이터의 해시값의 첫 몇바이트를 뒤에다 붙힌다. (이는 Base58Check에서 행한 과정과 목적이 비슷하다.)(이를 검사합이라 부른다.) 그리고 이를 11비트 단위로 나눈다. 그럼 각 11비트는 1에서 2048=2^11 사이의 숫자로 표현 가능한데 이를 미리 정해둔 기억하기 쉬운 영어단어와 매칭시킨다. 그럼 상황에 따라 12단어에서 24단어 사이의 영어단어가 나타나게 되는데 사용자는 이 12~24개의 단어만 기억하면 된다. 만약 잘못기억해도 맨뒤에 포함된 오류보정 데이터가 확인해주기 때문에 몇번 시행착오를 거듭하다보면된다. 이렇게 완성된 영어단어는 대략 다음과 같은 모습을 지닌다. 
 
 `scissors invite lock maple supreme raw rapid void congress muscle digital elegant little brisk hair mango congress clump`
 
 이걸 어떻게 왜울지는 각자의 재량에 달렸고, 개인적으로는 그냥 나온 영어단어를 외우기보다는 연상해서 외우기 쉬운 문자배치가 나올때까지 여러번 돌려보는걸 추천한다. 다만 아쉽게도 이 방법은 영어 이외에도 일본어, 스페인어, 중국어, 프랑스어, 이탈리아어 버전이 있지만 한국어는 현재 없는 상태이니 참고 바란다.
 
-#### BIP32
+#### HD지갑 BIP32
 
  일단 BIP란 Bitcoin Improvement Proposals 의 약자로 한국어로는 대략 "비트코인 개선을 위한 제안사항"정도 되는 존재이다. 일반적으로 비트코인 포럼에서 논의되고 결정된 사항이 BIP문서로 작성되고 각 제안에대해서는 순서대로 번호가 붙게된다. BIP32의 경우 32번째로 등록된 BIP정도의 의미를 가지며 구글에 검색해보면 그 원본문서를 쉽게 관람할 수 있다. 
 
- BIP32는 BIP로서는 처음으로 결정적인 지갑에 대한 제시와 그 구현방법에 대해 제시를 해준 문서이다. 자세히 들어가면 길고 복잡하며 위에서 해시함수를 예로들어 설명한 방법과 개념적으로 유사하기에 이에대한 설명은 넘어가도록 한다. ![](./img/4_4.png)
+ 이러한 비트코인에 대한 개선사항이 담겨있는 BIP32에는 결정적인 지갑의 표준화를 위해 HD지갑을 제시하였다. HD지갑은 Hierachical Deterministic Wallets의 약자로 한국어로 번역하면 "계층 결정적 지갑"정도의 의미를 가진다. 여기서 계층이란 HD지갑이 계층적인 구조로 사용자가 기억하는 비트열(정확히는 연상기호)로 각각의 개인키와 공개키를 유도해내는 상황을 빗대어 지어진 이름인데, 자세히 들어가면 길고 복잡하며 위에서 해시함수를 예로들어 설명한 방법과 개념적으로 유사하기에 이에대한 설명은 넘어가도록 한다. ![](./img/4_4.png)
 
-  다만 처음에 제안될때 그 방법이 꽤 느슨하고 열려있게 제안되어서 같은 문서를 보고 작성한 프로그램간에 서로 호환이 안될 여지가 보였기에 BIP43과 BIP44에서 추가적인 문서가 작성되었다는점을 참고해두자.
+  다만 처음에 제안될때 그 방법이 꽤 느슨하고 열려있게 제안되어서 같은 문서를 보고 작성한 프로그램간에 서로 호환이 안될 여지가 보였기에 BIP43과 BIP44에서 추가적인 문서가 작성되었고, 위에서 말한 연상기호법은 BIP39에서 추가되었다는점을 참고해두자.
 
- 현재 대부분의 비트코인 결정적 지갑은 BIP32에 따르거나 따를 예정이라고 하며 다음과 같은 지갑들은 서로 호환이 된다고 한다.
-
-- [Mycelium Bitcoin Wallet (Android)](https://play.google.com/store/apps/details?id=com.mycelium.wallet) ([source](https://github.com/mycelium-com/wallet))
-- [Copay](https://copay.io/) ([source](https://github.com/bitpay/copay))
-- [CoinVault](https://www.coinvault.io/) ([source](https://github.com/CoinVault/dotblock))
-- [Samourai Wallet](https://samouraiwallet.com/) ([source](https://github.com/Samourai-Wallet/samourai-wallet-android))
-- [TREZOR](https://trezor.io/) ([source](https://github.com/trezor/))
-- [KeepKey](https://www.keepkey.com/) ([source](https://github.com/keepkey/))
-- [Ledger Wallet](https://www.ledgerwallet.com/) ([source](https://github.com/LedgerHQ))
-- [21 Machine Wallet](https://21.co/learn/21-lib-wallet/) ([source](https://github.com/21dotco))
+ 현재 대부분의 비트코인 결정적 지갑은 BIP32에 따르거나 따를 예정이라고 하며 대다수의 주어진 12개에서 24개 사이의 단어를 외우라고 요구하는 지갑은 HD지갑일 확률이 높다. 만약 자신이 외운 단어가 정말 HD지갑을 따라 생겼는지, 자신이 외운 단어로부터 어떤 비트코인 주소가 생성될 수 있는지 확인해보고 싶다면 다음 주소에 들어가보자. https://github.com/iancoleman/bip39/releases 이 프로그램은 웹브라우저에서 작동하며 사용자가 기억한 단어로부터 생성가능한 비트코인 주소와 비밀키를 알려준다. 

+ 16 - 2
5_거래생성및전파.md

@@ -309,7 +309,7 @@ end
 
 ### SPV 노드
 
- 스마트폰에서 비트코인을 사용하는 경우를 생각해보자. 스마트폰 용량은 최근 128GB를 넘어가는 것도 있긴 하지만 일부에 불과하며 100GB를 넘어가는 블록체인을 넣기에는 블록체인의 크기가 너무 크다. 하지만 스마트폰을 사용해 비트코인을 거래정보를 생성하려면 자신의 주소로 출력되었지만 사용된적은 없는, 즉 UTXO에 대한 정보가 필요하고 이에대한 정보는 블록체인 속에있다. 해결방법은 간단하다. 블록체인을 가지고 있는 노드에게 자신의 주소로 출력된 값들좀 알려달라고 요청하면 된다.
+ 스마트폰에서 비트코인을 사용하는 경우를 생각해보자. 스마트폰 용량은 최근 128GB를 넘어가는 것도 있긴 하지만 일부에 불과하며 100GB를 넘어가는 블록체인을 넣기에는 블록체인의 크기가 너무 크다. 하지만 스마트폰을 사용해 비트코인을 거래정보를 생성하려면 자신의 주소로 출력되었지만 사용된적은 없는, 즉 UTXO에 대한 정보가 필요하고 이에대한 정보는 블록체인 속에있다. 이러한 전체 블록체인은 가지고 있지 않지만 거래를 하기위해 제안되어 만들어진 개념이 `SPV노드`이다. `SPV노드`의 앞서말한 문제에대한 해결방법은 간단하다. 블록체인을 가지고 있는 노드에게 자신의 주소로 출력된 값들좀 알려달라고 요청하면 된다.
 
  다만 여기서 또 문제가 발생한다. 첫째, 우리가 통신하는 전체 블록체인을 소유한 노드가 정직한지 모른다. 이 노드가 우리에게 실제 출력된 값보다 작은값이 출력되있다고 알려주어 우리가 더 많은 수수료를 지불하게 할수도 있다. 둘째, 우리가 통신하는 노드는 해당 비트코인 주소의 소유주가 누구의 디바이스인지 확인할 수 있다. 이는 익명성을 보장하려는 비트코인에게있어 환영할만한일은 아니다. 마지막으로 셋째, 만약 우리가 통신하는 노드가 정보를 주기를 거부한다면 우리는 거래를 생성할 수 없다.
 
@@ -325,7 +325,21 @@ OR  0011010110001
 
 ​       1011011110011
 
-이 필터를 받은 노드는 모든 주소에대해 비교를 행하게 되는데 그 원리는 예상했다싶이 어떤 주소의 x번째 비트가 1일때 필터의 x번째 비트도 1인가? 이다. 만약 아니라면 해당 주소는 필터를 통과하지못하고 맞다면 해당 주소는 필터를 통과하게 될것이다. 이렇게 필터를 통과한 주소들은 당연히 `SPV 노드`가 요구로 하는것보다 많은양의 주소가 존재할텐데 이 원리를 활용해 블룸필터는 블록체인을 소유한 노드로 하여끔 어떤 비트코인 주소의 주인이 어떤 디바이스에대한 추청을 어렵게 한다. 
+---------
+
+**1안**
+
+이 필터를 받은 노드는 모든 주소에대해 비교를 행하게 되는데 그 방법은 예상했다싶이 어떤 주소의 x번째 비트가 1일때 필터의 x번째 비트도 1인가? 이다. 만약 아니라면 해당 주소는 필터를 통과하지못하고 맞다면 해당 주소는 필터를 통과하게 될것이다. 이렇게 필터를 통과한 주소들은 당연히 `SPV 노드`가 요구로 하는것보다 많은양의 주소가 존재할텐데 이 원리를 활용해 블룸필터는 블록체인을 소유한 노드로 하여끔 어떤 비트코인 주소의 주인이 어떤 디바이스에대한 추청을 어렵게 한다. 
+
+----
+
+**2안**
+
+이 필터를 받은 노드는 모든 주수에대해 비교를 행하게 되는데 그 방법은 다음과 같다. 1. 필터와 비교해볼 어떤 주소와 OR연산을 해본다. 2. 그 결과값이 필터와 같은지 확인해 본다. 만약 같다면 해당 주소는 필터를 통과하게 될것이다. 이렇게 필터를 통과한 주소들은 당연히 `SPV 노드`가 요구로 하는것보다 많은양의 주소가 존재할텐데 이 원리를 활용해 블룸필터는 블록체인을 소유한 노드로 하여끔 어떤 비트코인 주소의 주인이 어떤 디바이스에대한 추청을 어렵게 한다. 
+
+-----
+
+
 
  실제 비트코인에서 블룸필터는 비트코인 주소를 그대로 사용하지 않고 `출력 스크립트`의 해시값을 이용하며, 단순한 작동원리를 가지고 있지만 그 단순함 덕분에 컴퓨터에서 연산속도가 매우 빨라 비트코인에 매우 적합한 방법이라 할 수 있다.
 

+ 37 - 0
6_블록체인.md

@@ -0,0 +1,37 @@
+# 블록체인
+
+## 개요
+
+ 블록체인은 가상화폐시장, 아니 컴퓨터 과학계에 비잔티움 장군 문제라는 오래된 난제에대해 명쾌한 해답을 제시하여 침체되있고 여태껏 해온대로만 해왔던 컴퓨터 과학계에 딥러닝과 함께 크나큰 혁명을 가져다준 존재이다. 다만 이런 혁명적인 성과를 가져온것 치고는 그 원리는 생각보다 간단한데, 데이터가 블록의 형태로 담겨져 첫번째 부터 N번째까지 배열되어 있는데 2에서 N사이의 임의의 숫자 K에 대해 생각할때 K번째 블록은 K-1번째의 데이터를 해시값, 혹은 그에 준하는 어떤 형태를 가지고 있어, K-1번째 블록의 무결정성을 보장해준다는 것이다. 하지만 아마 이 글만보고 그 가능성을 이해하는 사람도 있겠지만 대다수는 그 가치를 이해하지 못할것으로 생각한다.
+
+ 이 파트에서는 비트코인의 블록의 구조에 대해 설명한 뒤, 비트코인의 블록체인이 어떻게 작동하는지, 채굴이란 무엇인지, 비트코인에서 운영되는 블록체인 말고 다른 블록체인은 어떻게 비트코인형태의 블록체인의 단점을 극복하려 했는지 등을 설명할 예정이다.
+
+## 블록
+
+### 개요
+
+ 비트코인의 모든 거래데이터는 블록이란 형태로 저장된 뒤 블록체인에 포함된다. 이 블록은 크게 두가지 파트로 나뉘어 지는데 하나는 `블록 헤더`이고 나머지 하나는 `블록 바디`이다. 이름에서 예상할수 있는것 처럼 `블록헤더`에는 `블록` 그 자체에 대한 정보가 담겨있고 `블록 바디`에는 블록의 몸체, 즉 거래데이터가 담겨있다. 이번 파트에서는 이러한 거래데이터는 어떻게 담겨져 있는지로 시작해 `블록 헤더`는 어떤구조를 가져왔는지에 대해 자세히 알아보아 다음 파트에서 만날 블록체인을 이해하기 쉽게 도와줄 것이다.
+
+ 다만 읽을 때 주의해야할 점이 있다. 2017년 7월 기준 블록은 언제나 약 10분에 한개씩 생성되어 왔으며 각 블록은 항상 1MB이하의 크기를 가져왔다. 이는 약속된 내용이였다. 하지만, 이러한 약속은 2009년 첫 블록이 생성될때 정해진 것이고, 2009년의 비트코인 상황과 지금의 비트코인 상황은 엄청난 차이가 있며, 현재 비트코인은 10분에 생성되는 1MB짜리 블록만 가지고는 모든 거래를 감당하기 힘든 상황에 놓여있다. 좀 더 쉬운표현으로 말하자면 처음 약속을 정할때 현재와 같은 상황을 염두하고 약속을 한 것이 아니기에 그 구조가 한계에 달했다는 것이다. 
+
+ 이러한 상황속에서 비트코인 개발자들은 2017년 8월 1일부터 시작해 2017년 말까지, 어쩌면 더 오랜시간에 거쳐 대규모 업그레이드를 강행할것을 예고해 왔다. 물론 상세한 업그레이드 내용은 이미 공개되어있기 때문에 그에 맞추어 글을 쓰면 되지만 더 큰 문제는 최근 거대한 3개의 비트코인 진영이 각각의 업그레이드 방안을 내놓았고 3가지 버전중 어느것이 더 많은 지지를 얻을지 필자가 이 글을 쓰는 시점에서는 파악할 수 없다는 것이다. 그래서 이 파트에서는 현재 시점으로 사용되는 블록에 대해 설명을 하고 부록형식으로 앞으로 바뀔 형식에 대해 자세히 다뤄볼 예정이니 참고바란다.
+
+### 블록의 구조
+
+블록은 다음표와 같은 데이터 구조를 가진다.
+
+| 크기                                       | 이름                                       | 설명                                      |
+| ---------------------------------------- | ---------------------------------------- | --------------------------------------- |
+| 4Byte                                    | Magic no                                 | 언제나 0xD9B4BEF9 를 가지는것으로 정해져있다.          |
+| 4Byte                                    | Blocksize                                | 블록의 총 크기가 몇바이트인지에 대한 정보가 담겨있다.          |
+| 80Byte                                   | Blockheader                              | 블록헤더                                    |
+| Transaction counter                      | positive integer [VI = VarInt](https://en.bitcoin.it/wiki/Protocol_specification#Variable_length_integer) | 1 - 9 bytes                             |
+| [transactions](https://en.bitcoin.it/wiki/Transactions) | the (non empty) list of transactions     | <Transaction counter>-many transactions |
+
+
+
+### 머클트리
+
+ 필자가 처음 블록바디에 대해 알아보려 했을때는 C언어에서 흔히 쓰는 배열처럼 그냥 추가하려는 Tx들을 나열해 놓으면 되지 않을까?라는 생각을 했었다. 결론은 맞았다. 하지만 한가지 추가되는 내용이 있었는데 바로 머클트리의 존재였다.
+
+ 머클트리는 앞서 다뤘던 SPV노드에서 어떤 거래에 대하여 효율적으로 검증하기 위해