2월, 2018의 게시물 표시

블록체인 노드와 역할

이미지
이번 포스팅에서는 비트코인 블록체인의 노드에 대해 자세히 알아볼 것이다. 공부를 하다보면 '노드' 라는 단어를 자주 접하게 된다. 노드의 의미를 검색해보면 편의상 지갑이라고 말하는 경우, 블록을 생성하는 주체 라고 정의하기도 한다.  나는 노드를 P2P네트워크를 유지하는 컴퓨팅파워를 사용하는 모든 주체 라고 정의를 할 것이다. 사실 지갑, 채굴 모두 맞는 표현이다. 블록체인의 노드의 종류는 다양하기 때문이다.  간단하게 블록체인이 어떻게 유지가 되는지 설명하겠다. 블록체인의 노드들은 p2p네트워크를 통해 동등한 포톨로지를 갖고 서로 유기적으로 연결된다. 각 노드들은 발생한 트랜잭션을 공유하고, 이들 중 채굴 경쟁에서 승리한 노드가 블록을 생성하며 새로 생성된 블록에 트랙잭션을 저장한다. 그리고 이 블록을 모든 노드에게 공유하고 노드들은 블록체인을 동기화 한다. 전반적인 블록체인의 프로세스를 설명하였다. 아마 전체적인 컨셉정도는 이해할 수 있을것이다.  조금 깊게 들어가보자. 위의 전반적인 설명에서는 노드의 역할을 단순하게 표현을 했으나 노드의 종류는 아래와 같이 7가지가 존재하며 역할은 다르다. 위 노드를 다 경험해 보기 위한 쉬운 방법은 https://bitcore.io/bitcoin 사이트 에 들어가서 Bitcore를 다운받고 실행을 해보는 것이다. 자신이 하나의 노드가 될 수있다. 여기서 지갑주소를 만들어 거래를 한다면 위 노드구성중 Wallet기능을 갖는것이고, 채굴작업을 하게되면 Miner기능을 경험할수 있다. Bitcore를 시작하게 되면 기본적으로 Peer를 찾고 연결을 하게되는데 찾는데 성공하여 연결이 된다면 Network기능을 할수 있고, 만약 전체 블럭을 다운받고 유지한다면 Block-chain 데이터베이스 기능또한 갖게된다.  비트코인 블록체인에 어떤 기능만을 담당할지는 본인의 자유다. 그렇다면 맨 위의 노드종류부터 알아보자. Full Nod

머클트리에 대해 알아보자 Let's take a look at Merkle Tree.

이미지
머클트리 (Merkle Tree) Ralph Merkle이라는 사람이 고안해 낸 자료구조이며, 쉽게 표현하면 Hash + Binary Tree 라고 생각하면 편하다. 만약 본인이 Tree 자료구조의 개념을 잘 숙지하지 못하고 있다면, 이 포스팅이 별로 도움이 안될지도 모르겠다. 트리 자료구조에 대해 먼저 숙지를 해야 될 것이다. Tree 자료구조란, 아래 그림과 같이 데이터를 나름의 규칙을 이용해 계층적으로 저장하는 형태를 의미한다. http://monsieursongsong.tistory.com/6 를 참조하면 되겠다. 그렇다면 Binary Tree 란?   모든 노드가 최대 두 개의 자식 노드를 가지는  트리   자료 구조 이다. 위의 일반 트리와 다르게 아래는 자식 노드가 모두 2개인것을 확인할 수 있다.  이 Binary Tree 에 Hash를 결합한 것이 바로 머클트리라고 한다. 해시를 사용하는 이유는 특정데이터를 일정한 길이의 데이터로 바꾸어 줄수 있기때문에 사용하게 되며, 블록체인을 공부하다보면 자주 볼수 있는 SHA256은 어떤 데이터가 오던지 256비트(32바이트) 데이터로 바꾸어 줄수있다.  비트코인 역시 SHA256해시를 사용하고 있다.   아래 머클트리 그림을 볼수 있는데 모든 노드가 왼쪽과 오른쪽 자식노드를 Hash한 값을 가지고 있다.   그렇다면 이 머클트리를 어떤식으로 사용될 수 있는지 궁금할 것이다. 일반 트리와 2진트리는 선형적 자료구조인 스택, 큐, 배열, 리스트와는 다른 비선형적 계층구조라고 했다. 그래서 얻을수 있는 장점은 데이터를 찾기위해 걸리는 시간은 트리의 높이 만큼의 시간이며, O(logN) 의 속도(증명 링크 참조  http://jwoop.tistory.com/9 )를 갖는다. 선형적 자료구조가 O(N) 의 속도를 갖는것보다 유리하기 때문에 데이터 검색 및 삽입, 삭제를 하는 데이터베이스에서 자주 쓰인다.  머클트리는 데이터 검

비트코인 거래와 UTXO Bitcoin Trading and UTXO

이미지
우리가 물건을 사기전 가진 돈의 금액이 물건을 구입하는데 충분한지 고려하게 된다. 예를들어 A가 B사람의 20달러짜리 운동화를 사야 할때, A의 지갑에 20달러 지폐 1개가 있으면 매우 간단하게 거래는 성사된다. 100달러 지폐 1장이 있을때는 100달러를 주고 80달러를 거스름돈으로 받으면 되고, 10달러 지폐 2개가 있을때는 지폐 2장의 조합으로 지불을 하면 된다.  이것은 우리가 지금까지 해왔던 아주 평범한 거래이다. 비트코인 거래로 대상을 바꾸어 생각해도 표면적으로 보여지는 거래 자체는 위와 동일한 방식일 것으로 생각된다. 실제로 친구에게 비트코인을 보내면 내 지갑에는 그 금액을 제외한 나머지가 존재하는 것을 볼수 있기 때문이다. 비트코인 블록체인 내부에서는 과연 어떤 과정이 발생할까? 이를 알기 위해서는 UTXO 라는 개념을 알아야한다.  UTXO 란 Unspent Transaction Output 의 약자로, 아직 쓰지않은 잔액 이라는 의미이다. 비트코인 네트워크에서는 '잔액'이라는 개념은 애초에 존재하지 않고, 트랜잭션에 의한 결과물들의 합을 우리는 잔액이라는 개념으로 사용하고있다. 그리고 이를 소유주만이 사용할수 있도록 공개키로 잠궈져 있으며, 소유주는 이를 풀기위해 자신의 개인키를 사용한다. 비트코인의 잔액 = SUM ( UTXO ( 소유주의 트랜잭션 ) ) = 내 지갑의 모든 트랜잭션 중 Output이 존재하는 UTXO의 합을 의미한다.  비트코인의 잔액은 내가 발생시킨 모든 트랜잭션 중 Output이 존재하는 UTXO의 합 이라고 했었는데, 그렇다면 이렇게 많은 트랜잭션 중에 Output이 존재하는 UTXO는 얼마나 있을까? 먼저  182Neztu7T6V8vJpRu9VfBN2E6ssprXPmm  주소를 https://blockchain.info/ 에서 검색을 하여 트랜잭션이 얼마나 있는지 확인 해보자.  이에 대한 자세한 해석을 원한다면, 이전

비트코인 지갑주소를 잘못입력하여 전달하면 어떻게될까?

이미지
비트코인 지갑주소를 잘못입력하여 전달하면 어떻게될까? 결론은 아무런 일도 발생하지 않는다. 이를 자세히 알기위해서는 비트코인 지갑주소가 어떤식으로 구성되며, 어떻게 산출되는지를 알필요가 있다. 본인이 비트코인 지갑을 하나 만들려고 한다. 지갑을 만들기위해 예를들어 지갑생성! 을 누르면 과연 어떤 일이 일어날생하여 우리가 흔히 보는 큐알코드와 지갑주소가 생성될까? 발생하는 일은 매우 간단하다. 1. 개인키가 생성된다.(Private Key) 2. 개인키를 기반으로 공개키가 생성된다 (Public Key) 3. 공개키를 기반으로 비트코인 주소가 생성된다. (Bitcoin Address) 위 그림이 아주 잘 표현되어있다. 개인키 -> 비트코인 주소까지 산출되는 과정이며, 그 역방향은 성립하지 않는다. 그렇다면 각각의 과정을 자세히 알아보자. 1. 개인키 생성 * 이는 본인만 알고있어야 하는 비밀번호이기 때문에 최대한 겹칠일 없는 난수로 생성한다. 당연히 아무에게도 알려줘서는 안된다. 따라서 개인키를 도출할 프로젝트를 진행한다면 암호학적으로 안전한 난수생성기를 사용하기 바란다. - 개인키는 1~2^256 승 사이의 random number이다. - 이를 발생하기위해 운영체제인 난수생성기를 이용하여 256비트의 무작위성(엔트로피)를 만들어낸다. - 아래 같은 꼴의 개인키가 생성될 것다.    18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725 2. 공개키 생성 * 개인키를 바탕으로 공개키가 만들어진다. 타원곡선 암호법(https://steemit.com/kr/@icoreport/key-2-ecc)을 이용하며 공식은 K(공개키) = k(개인키) * G(생성포인트 상수) 이다. - 개인키 -> 공개키는 개인키*G를 통해 알수 있으나, 공개키/G 를 하면 개인키를 알수 있지 않느냐? 알수없다. 이를 이해하기 위해서는 타원곡선
이미지
비트코인 거래를 했을때 실제 트랜잭션값이나 블록번호, 지갑주소 등으로 잘 전달이 된건지, 확인하고 싶을 것이다. 그럴땐  https://blockchain.info/  에 접속을 하자  오른쪽 상단을 보면 Block, Hash, Transaction 등을 입력할수 있는 에디트텍스트박스가 보일것이다. 심심하니 0번 블록을 한번 찾아보자. 최초의 블록(genesis Block)이다. 타임스탬프를 확인해보니 2009-01-03 18:15:05 이때 블록이 생성이 되었다.  최초의 블록이니 당연히 거래에 대한 트랜잭션이 발생하지 않았을테니, 예상 거래량 0 BTC, 거래수수료(Transaction fee)는 존재하지 않는다. 오른쪽 보면 최초블록이기에 이전블록은 존재하지않고 다음블록의 해시값이 존재하고 있다는 것을 확인할 수있다. (000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd) 이는 블록번호 #1 이 되겠다. 난이도는 1이고 채굴자가 찾은 nonce값(해시난수) 은 2573394689 이며 총 486604799 비트의 데이터를 가지고 있다. 라고 해석하면 될것같다.  맨아래 '거래' 를 보자. 투입물없음(새로 생성 된 동전) ->  12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX  50BTC 12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX  지갑주소로 50BTC만큼의 보상을 받았다는 의미이다.  2009-01-03 일 비트코인 총개수는 50BTC이며 시가총액은 현재 달러가격으로 환산하면 549,110.50 달러이다.  저당시에는 무려 50BTC의 양을 채굴보상으로 줬네요 이번에는 트랜잭션 주소로 검색해보자.  입력텍스트박스에 아래 트랜잭션값을 입력해보자. 845412a15ae0ba5e117759f85a8ad529c288c0a50026458f09ac8a682fe071