안녕하세요. 어미새입니다.


오늘은 합의 알고리즘의 등장 배경과, 비트코인 네트워크에서 사용되는 합의 알고리즘인, 작업증명(Pow)방식에 대한 개념 정리를 해보도록 하겠습니다.

 

합의 알고리즘


네트워크에 연결된 사용자는 그 누구도 신뢰할 수 없는 사용자입니다. 분산 처리 시스템 및 탈중앙화 시스템은 중앙에서 관리하는 기구나 단체가 없기 때문에 시스템 내부에서 데이터를 검증하고 관리할 수 있는 수단이나 방법이 필요합니다.

비트코인에서도 마찬가지로 어떤 트랜잭션이 발생했을 경우 해당 트랜잭션이 유효한 트랜잭션인지에 대한 합의 방법이 필요하며, 새로운 블록이 진짜인지, 가자짜인지에 대한 검증이 필요합니다.

올바른 데이터의 검증은 네트워크의 신뢰도를 향상 시키며, 신뢰도가 높은 시스템일수록 시스템의 가치는 상승하게 됩니다. 합의 알고리즘에 대해 더 자세히 알고 싶으신분은 제가 이전에 작성한 합의 알고리즘편을 참조하시길 바랍니다.

 

비트코인 시스템에서는 비잔티움 장군의 문제점 및 네트워크의 신뢰도 향상을 위해 작업증명 방식(PoW)의 합의 알고리즘을 사용하고 있습니다. 지금부터 PoW가 무엇인지에 대해 상세히 알아보도록 하겠습니다.

 

PoW(Proof-of-Work)


PoW에 대한 개념을 정리하기 위해서는 비트코인 마이닝 원리에 대한 선행학습이 필요합니다. 

마이닝(채굴)이란 일종의 수학문제를 푸는것과 같습니다. 임이의 nonce 값을 대입하여 블록 해시 결과 값을 생성하고, 생성된 결과 값이 target 보다 작을 경우 새로운 블록으로 인정받을 수 있습니다. 새로운 블록을 생성한 채굴자는 블록을 생성한 댓가로 신규로 발행되는 비트코인의 수량 및 거래 수수로를 '보상'으로 받게됩니다.

현재 시점을 기준으로 '보상'받는 금액은 1억원이 넘는 아주 큰 금액입니다. 채굴자(마이너)는 이러한 보상을 받기 위해서 수학문제를 아주 열심히 풀 수 밖에 없겠죠?

 

 

해시함수의 특징때문에 어떤 nonce 값을 대입해야 target보다 작은 블록해시 정보를 찾을 수 있을지는 알 수 없습니다. 즉 올바른 결과 값을 찾기 위해서는 nonce의 값을 0부터 1식 증가 시키면서 target 보다 작은 결과 값이 나올때까지 무한 반복 작업을 수행해야합니다.

이러한 수학문제를 풀이하는 과정을 1초에 몇번이나 수행할 수 있는지에 대한 수치 정보를 해시파워라고 표현하며, 해시파워가 높은 사용자는 더 많은 문제를 풀어낼 수 있습니다. 그리고 문제를 더 많이 풀어낼 수 있는 능력을 보유한 채굴자가 새로운 블록을 찾을 확률이 높습니다!

즉 더 많은 연산을 수행한 채굴자는 더 많은 일을 했다는 의미이며, 확률적으로 많은 문제를 풀었을 경우 블록을 찾을 확률이 높아지며, 더 많은 '보상'을 받게되는거죠!

 

그렇기 때문에 PoW를 정의할때 더 많은 일을 한 사람에게 더 많은 보상이 주어지는 방식이라고 표현 합니다.

 

Pow 장단점.


 

무한 경쟁

채굴을 통해 받을 수 있는 '보상' 금액은 커지면, 채굴자는 자연스럽게 더 많은 보상을 위해서 더 빠른 연산력을 원하게 됩니다. 예를 들어 A라는 채굴자가 '해시 파워'를 높여서 더 많은 보상을 받게되면, 채굴자 B와 C 또한 덩달아서 '해시 파워'를 높이기 시작합니다. 

왜냐구요? 보상에서 뒤쳐질 수 없기 때문이죠! 채굴자들은 더 많은 보상을 받기 위해 주변에 있는 채굴자들 보다 더 많은 문제를 풀기 원하고 이러한 문제풀이에 대한 경쟁이 계속 가열화될 수 밖에 없습니다. 그래서 PoW 합의 알고리즘을 경쟁 방식이라고 표현합니다. 

 

 

여기서 또 한가지 재미있는 사실은 경쟁이 치열해지면서 비트코인 네트워크의 전체 해시파워가 상승하게 됩니다. 즉 문제 풀이 능력이 올라갔기 때문에 '난이도'또한 상향됩니다. (난이도가 상향되지 않으면 10분에 1~2블록을 찾아내야하는 규칙이 무너지기 때문이죠!)

난이도가 상승되면, 자연스럽게 문제풀이에 필요한 연산력이 올라가고, 연산력이 올라간 만큼 컴퓨터의 전력 소모 또한 증가합니다! 과도한 전력소모는 높은 유지비용으로 변환되어, 블록체인 네트워크의 장점중 하나인 저렴한 유지비용이 무색해는 현상이 발생합니다!

 

하지만 아이러니하게도 경쟁이 심화될수록 비트코인 네트워크의 보안은 강화됩니다..

 

높은 보안력


해시 함수의 특징, 그리고 전자 서명의 개념 때문에 블록을 조작하기란 사실상 불가능에 가깝습니다. 만약 블록을 조작했다고 하더라도 해당 블록의 트랜잭션 정보가 변경되면 머클 루트의 결과 값이 변경되고, 머클 루트의 결과 값이 변경되면, 블록 해시 정보 또한 변경됩니다.

블록 해시 정보가 만약 target 보다 작은 값이라면 상관 없겠지만, target 보다 큰 결과 값이라면 다시 target 보다 작은 블록 해시 정보를 얻기 위하여 무작위로 nonce 값을 대입하여 새로운 블록 해시 정보를 얻어야만합니다.

이러한 작업을 수행하는 도중 이미 비트코인의 메인 체인은 계속해서 이어져 나가고 있을것입니다. 메인 체인 보다 더 긴 체인을 형성해야지만 조작된 블록이 포함된 체인이 메인 체인으로 인정 받을 수 있음으로 현재 생성되고 있는 메인 체인 보다 더 빠르게 블록을 생성해 나가야합니다.

경쟁이 가속화 되어 조작된 블록이 아닌 정상적인 블록을 생성하기도 어려워지는 시점에는 사실상 블록을 조작하는것이 불가능 해짐으로 보안력이 높아질 수 밖에 없는것입니다.

한줄 요약 : PoW 알고리즘에 의해 사실상 비트코인 거래 정보 조작은 불가능하다!

 

하지만!


만약에 연산력이 엄청난 진짜! 말도 안되는 울트라 슈퍼캡짱 연산력을 가진 컴퓨터가 1초에도 몇개씩의 블록을 생성할 수 있다면.. 해킹이 가능해집니다.

현재의 암호체계는 결과값을 토대로 입력값을 알 수 는 없지만, 임이의 숫자를 계속 대입하면 언젠가는 입력 값, 즉 키 정보를 알아낼 수 있습니다. 현재의 연산력으로는 100년이 넘는 긴 시간이 필요합니다.

만약 양자학 컴퓨터가 상용화 되면 현재의 암호체계가 무너진다는 의미도 이와 같은 맥락입니다. 너무 연산력이 빨라서 100년은 연산해야된다고 이야기 했던 부분이 무색해지겠죠.. 불과 몇분, 몇시간안에 풀어낸다고합니다!

 

이상 긴 글 읽어주셔서 감사합니다!

채굴(마이닝)과 관련된 연재 포스팅입니다. 혹시 이전 포스팅을 읽지 않으셨다면 이전 포스팅을 먼저 읽어보시는것을 추천드립니다.

 ● 채굴(마이닝)이란 무엇인가? (1/3)





'새로운 블록 생성'


채굴자(마이너)가 새로운 블록을 생성하고, 검증하는 과정에 소모된 자원에 대한 '보상'으로 비트코인을 지급받는 행위를 '채굴'이라고 합니다. 마이너가 새로운 블록을 생성하기 위해서는 어떤 특정한 수학문제를 풀어내야하며, 이때 수학문제의 풀이과정을 이해하기 위해서는 반드시 블록 해시 연산 과정해시 함수의 특징에 대한 사전 학습이 반드시 필요합니다.



'수학 문제란?'


도대체 어떤 수학문제를 푸는것일까요? 비트코인 플랫폼에서 채굴자(마이너)는 블록에 담길 정보 중 nonce 정보를 제외한 모든 구성 요소 정보를 미리 알 수 있습니다. 즉, 채굴자는 새로운 블록으 ㄹ생성하기 위하여 새로운 블록에 접한한 nonce 정보를 찾아야 합니다. 임이의 nonce 정보를 대입하고 출력한 '블록해시' 결과 값이 난이도(target)보다 작은 결과 값을 찾아야 하며, target보다 작은 블록 해시 결과 값을 찾았을 경우 새로운 블록이 생성될 수 있습니다.






이해를 돕기 위해 'nonce'에 임이의 결과 값을 넣어서 '블록해시'를 만드는 과정이 어떻게 진행되는지 확인해보겠습니다. 아래의 Json 데이터는 블록체인 인포 사이트를 통해 1번 블록의 정보를 찾아온 결과 값입니다. 

(https://blockchain.info/block-height/1?format=json)


{

"blocks": [

{

"hash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048",

"ver": 1,

"prev_block": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",

"mrkl_root": "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",

"time": 1231469665,

"bits": 486604799,

"fee": 0,

"nonce": 2573394689,

"n_tx": 1,

"size": 215,

"block_index": 14850,

"main_chain": true,

"height": 1,

"tx": [

{

"lock_time": 0,

"ver": 1,

"size": 134,

"inputs": [{

"sequence": 4294967295,

"witness": "",

"script": "04ffff001d0104"

}],

"weight": 536,

"time": 1231469665,

"tx_index": 14854,

"vin_sz": 1,

"hash": "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",

"vout_sz": 1,

"relayed_by": "0.0.0.0",

"out": [{

"spent": false,

"tx_index": 14854,

"type": 0,

"addr": "12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX",

"value": 5000000000,

"n": 0,

"script": "410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac"

}]

}

]

}

]


위의 데이터를 토대로 nonce 정보를 제외하고 블록 헤더 결과 값을 채워 넣었을 경우 아래의 그림과 같은 형태로 데이터가 구성됩니다.



블록 해시편에서 언급한 블록 해시 연산 과정을 통해 nonce 정보에 0을 대입하여 블록 해시 결과 값을 출력해보고 이러한 과정을 총 5번 반복하여 블록 해시 결과 값이 어떻게 출력되는지 확인해보도록 하겠습니다.



위의 예제 소스를 실행 결과는 아래와 같습니다.



결과 화면을 보시면 아시겠지만, 해시 함수의 특징으로 인하여 nonce 정보가 변경될 때 마다 블록 해시 결과 값은 전혀 다른 결과 값을 가지는것을 확인할 수 있습니다.  즉, nonce 정보에 어떤 값을 입력해야 target 보다 작은 블록 해시 결과 값을 얻을 수 있을지 채굴자는 미리 예측할 수 없으며, nonce 값을 1식 증가시키면서 target보다 작은 블록 해시 결과 값을 찾아내는 연산과정을 반복해야만합니다.


수학 문제를 연산하는 과정은 생각보다 단순합니다. nonce를 0부터 대입하여 target보다 작은 블록 해시 결과 값이 도출될때까지 nonce 값을 무한정 증가 시키는 작업이며, 이러한 과정을 더 빠르게 연산할 수 있도록 CPU 채굴에서 GPU를 활용한 채굴 나아가 asis라는 채굴 전용 칩까지 등장하게 된것입니다.


어느 정도 이해가 되셨나요? 심플하게 다시 정리를 해보자면


● '채굴'은 일종의 보상의 개념이다.

● 보상을 받기 위해서는 새로운 블록을 생성하기 위하여 일종의 수학문제를 풀어야한다.

● 수학문제의 정답이 되기 위한 조건은 'target'보다 작은 블록 해시 결과 값을 가지는 블록을 찾아야한다.

● 해시함수의 특징으로 인해 'target'보다 작은 '블록해시'를 만들어내기 위한 'nonce'의 값은 절대 유추할 수 없다.


그렇다면 난이도(target)은 무엇이고, 왜 필요했을까요? 다음 포스팅에서는 난이도(target)이 무엇이고 어떻게 값을 구하는지에 대한 포스팅을 이어가도록 하겠습니다.


[참고 자료]

https://jayground8.github.io/what_is_hash_and_mining/https://bitcoinwisdom.com/bitcoin/difficultyhttp://d2.naver.com/helloworld/8237898http://coinnews.tistory.com/14http://bithumb.cafe/archives/5214https://cafe.coinbang.co.kr/bbs_detail.php?bbs_num=63&tb=board_coininfor&b_category=https://steemit.com/kr/@twinbraid/2b3hcu

'비트코인 > 마이닝 원리' 카테고리의 다른 글

채굴(마이닝)이란 무엇인가? (1/3)  (1) 2018.04.13



마이닝에 대한 이해를 하기 위해서는 블록체인의 블록 구조에 대한 개념정리가 먼저 필요합니다. 채굴에 대한 설명을 하기 앞서 비트코인의 블록체인 구조에 관한 내용을 조금 설명하고 넘어가겠습니다.



Remind


'블록'은 크게 헤더와 바디정보로 구성되어있으며, 다음 그림과 같이 버전, 이전 블록 해시, 머클 루트, 타임, 난이도 목표, 논스 정보로 구성됩니다.






1. 버전 : 해당 블록이 생성된 시점의 비트코인 소프트웨어 버전 정보입니다.

2. 이전 블록 해시 : 새로운 블록이 생성된 시점의 이전 블록 해시 정보를 참조하는 정보입니다(이 요소 정보로 인하여 블록이 체인형태로 연결될 수 있었습니다).

3. 머클 루트 : 트랜잭션의 무결성 및 블로 해시의 무결성을 검증하는 역할을 수행하며, 블록 바디에 저장된 TXID 정보를 머클 트리한 결과 값입니다.

4. 타임 : 해당 블록의 대략적인 생성 시간을 의미합니다.

5. bits : 난이도 해시 목표 값을 의미하는 지표입니다.

6. nonce : 블록을 만드는 과정에서 해시 값을 구하기 위한 재료 역할을 수행합니다.





개념만 잡자! 그래서 채굴이 뭔대?





가상화폐 열풍이 불면서 '채굴'에 대한 이야기를 많이 접하셨을거라고 생각합니다. 비트코인뿐만 아니라 암호화폐에서의 채굴(인센티브) 시스템은 아주 중요한 역할을 수행합니다. 그렇다면 도대체  '채굴'은 무엇일까요? 먼저 아래의 질문에 대한 답을 여러분들은 하실 수 있으신가요?


1.중앙에서 관리 감독하는 기관이 없는 탈 중앙화된 비트코인 네트워크에서는 도대체 누가 화폐, 즉 비트코인을 어떻게 발행할까요?

2. 블록체인 기술은 분산되고 독립적인 공통장부 관리기술입니다. 그렇다는 이야기는 누군가는 거래 기록을 기록하고, 관리해야한다는 의미이며, 도대체 누가 거래기록을 기록할까요?

3. 블록은 크게 헤더와 바디정보로 구성됩니다. 블록의 바디정보에는 다수의 거래정보가 담겨져있습니다. 그렇다면 이 블록은 누가 생성할까요?


위의 질문에 대한 답을하기 앞서 먼저 '채굴'에 대한 개념을 이해하기 아주 좋은 동영상을 찾았습니다. 대략 1분 55초 분량의 아주 짧은 영상이니 꼭 시청해 보시면 좋겠습니다. (한글 자막을 지원하니, 아래의 그림과 같이 하단에 있는 자막을 설정하시고 보시면됩니다.)






채굴이란 무엇인가?









영상을 보시고나니 어느 정도 채굴에 대한 감이 잡히셨나요? 그렇다면 채굴(마이닝)이 필요했던 이유가 무엇일까요?





채굴(마이닝)이 왜 필요했을까요?


탈 중앙화된 금융거래 시스템인 비트코인 네트워크에서는 어떤 거래가 발생하고, 발생된 거래 내역이 투명하게 네트워크를 통해 공유되어야합니다. 그렇다면 누군가는 이 거래 내역을 기록하고, 기록된 거래내역을 블록에 담아 사용자들에게 전파하는 역할을 수행해야합니다. 또한, 악의 적인 사용자에 의해 잘못된 거래 기록이 전파되는것을 방지하기 위해 작성된 블록의 유효성을 검증하는 과정이 필요합니다.


앞서 이야기한 작업들을 수행하기 위해서는 서버 자원 및 전력자원이 낭비됩니다. 그렇다면 아무런 보상 없이 이러한 일을 수행하기엔 무리가 있지 않을까요?



이러한 작업들을 참여자가 자발적으로 수행할 수 있도록 별도의 인센티브 제도가 필요했으며, 이러한 작업을 수행한 참여자에게 보상의 개념으로 비트코인을 지급함으로써 네트워크에 기여도를 높일 수 있도록 하였습니다. 그리고 이러한 보상을 우리는 '채굴'이라고 표현하고 있습니다.



이제 왜 '채굴'이 필요했는지에 대하여 이해가 되셨나요? 여기까지 설명을 들으셨다면 아래와 같은 의문점이 생기실겁니다.

1. '블록'은 수학문제를 풀어서 생성이된다. 그렇다면 수학 문제는 도대체 무엇이고 어떻게 풀어야하는가?
2. 생성된 '블록'이 진짜인지 가짜인지 누가 어떻게 판단하는가?

다음 포스팅에서 위의 질문에 대한 답과 더불어 본격적으로 블록체인 기술에 대해서 파헤쳐보는 포스팅을 이어가도록 하겠습니다.



[참고자료]


https://organicmedialab.com/2014/01/11/virtuous-cycle-of-bitcoin-mining/
https://brunch.co.kr/@bumgeunsong/41
http://www.leejungmin.org/post/2017/05/30/mastering-bitcoin/


'비트코인 > 마이닝 원리' 카테고리의 다른 글

채굴(마이닝)이란 무엇인가? (2/3)  (0) 2018.04.13

안녕하세요. 어미새입니다.


이전 포스팅에서는 머클루트는 무엇이고 어떻게 머클루트 값을 구하는지, 그리고 실제 그렇게 값이 구해지는지 검증까지 해봤습니다. 혹시 이전 글을 읽지 않으신 분은 한 번 읽어보고 오셨으면 좋겠습니다.


오늘은 비트코인의 블록 정보 중 블록의 식별자 역할을 수행하는 블록 해시에 관한 정의와, 블록 해시 값을 구하는 과정에 대해 학습하도록 하겠습니다.

블록 해시(Hash of the block)


블록 해시(Block Hash)는 블록의 식별자 역할을 수행하며, 쉽게 블록의 이름 정보라고 생각하시면 될 것 같습니다. 블록 해시는 블록 헤더 정보인 버전, 이전 블록 해시, 머클루트, 타임, bits, Nonce 정보를 모두 합산한 후 SHA256 함수를 통해 해시한 결과 값입니다. 먼저 블록의 구조를 살펴보도록 하겠습니다.






위의 그림과 같이 블록 헤더 정보는 크게 6가지로 구성되며, 블록 해시는 블록의 헤더 정보를 통해 구할 수 있습니다. 우선 블록의 상세 정보를 확인해보기 위해 이전 포스팅에서 소개해드린 '블록체인 인포' 사이트에 접속하여 가장 최근에 생성된 블록 정보를 확인해보겠습니다. (https://blockchain.info/ko)

이 글을 작성하기 시작한 시점에서 가장 최근에 생성된 블록의 높이는 #508217번째 블록입니다. 해당 블록을 선택하여 블록의 상세 정보를 확인해보겠습니다.



위의 정보를 살펴보면 타임 스탬프, Bits, 해시 난수, 이전 차단, Merkle Root 정보를 확인할 수 있습니다. 앞서 설명한 블록 해시를 구하는 공식에는 6가지 요소가 필요하나 여기에는 버전 정보가 누락되어 있습니다. 그리고 타임 스탬프 정보 또한 우리가 보기 편한 형식으로 변형되어 있습니다. 실습을 위해서는 조금더 디테일한 형태의 데이터가 필요하기때문에 블록의 모든 정보를 JSON 형태로 제공 받을 수 있는 형태로 요청해보도록 하겠습니다. 요청하는 방식은 아래의 링크와 같습니다.

(https://blockchain.info/block-height/508217?format=json)

참고로 위의 URL의 /508217? 이 부분에 숫자 부분이 블록 높이 정보입니다. 다른 블록 정보의 Json을 요청하고 싶다면 이 숫자 정보를 해당 블록의 높이 정보로 변경하여 호출하시면 되겠습니다.


Json 데이터로 확인해보니 보다 상세하게 블록 정보를 확인할 수 있었습니다.(개발자라서 그런지 Json 데이터가 더 보기 편하네요..) Json 데이터를 보시면 버전(ver), 이전 블록 해시(prev_block), 머클루트(mrkl_root), 타임(time), bits, 논스(nonce) 정보가 정확하게 출력되어 있습니다.


"ver":536870912

"prev_block":"00000000000000000060e66690d8a6646b7f8bb4aeb3fa7be258ae4011e362b5"

"mrkl_root":"98f0bb94fc154733f22ac54994e9637981900fcee8a0db7d5880b5b79ca3853d"

"time":1518070436

"bits":392292856

"nonce":2699712111



위의 정보를 이용하여 아래의 블록해시 값을 구할 수 있습니다. 그럼 바로 PHP를 활용하여 소스를 작성해보고 실행해보겠습니다.



저번 시간에도 이런 오류가 발생하였습니다.. 당황하지 않고 저번 시간에 해결했던 방법 처럼 엔디안 형태로 변행해 보았습니다. (오랜 시간 끝에 찾아낸 코드는 아래와 같습니다.)


<?
 
function SwapOrder($in){
 $Split = str_split(strrev($in));
 $x='';
 for ($i = 0; $i < count($Split); $i+=2) {
     $x .= $Split[$i+1].$Split[$i];
}
 return $x;
}

function littleEndian($value){
 return implode (unpack('H*',pack("V*",$value)));
}

function hextobin($hexstr)
{
   $n = strlen($hexstr);
   $sbin="";  
   $i=0;
   while($i<$n)
  {      
       $a =substr($hexstr,$i,2);          
       $c = pack("H*",$a);
       if ($i==0){$sbin=$c;}
       else {$sbin.=$c;}
       $i+=2;
  }
   return $sbin;
}

$ver            = 536870912;
$prev_b         = '00000000000000000060e66690d8a6646b7f8bb4aeb3fa7be258ae4011e362b5';
$mrkl_r         = '98f0bb94fc154733f22ac54994e9637981900fcee8a0db7d5880b5b79ca3853d';
$time           = 1518070436;
$bits           = 392292856;
$nonce          = 2699712111;

//1. 버전, 타임, bits, nonce 정보를 리틀 엔디안 형태로 변형.
$ver            = littleEndian($ver);
$time           = littleEndian($time);
$bits           = littleEndian($bits);
$nonce          = littleEndian($nonce);

//2. 이전 블록 해시, 머클루트 결과 값을 모두 반대 순서로 변형
$prev_b         = SwapOrder($prev_b);
$mrkl_r         = SwapOrder($mrkl_r);

//3. 블록 헤더 정보를 모두 합산(순서가 꼭 맞아야합니다.)
$header         = $ver . $prev_b . $mrkl_r . $time . $bits . $nonce;

//4. 바이너리 형태로 변형
$header_bin     = hextobin($header);

//5. SHA 형태로 변형 후 바이너리 형태로 변형
$hasing_1       = hextobin(hash('sha256', $header_bin ));

//6. SHA 형태로 변형
$hasing_2       = hash('sha256', $hasing_1);

//7. 결과를 모두 반대 순서로 변형.
$block_hash     = SwapOrder($hasing_2);

echo $block_hash;

?>



위의 코드 처럼 블록해시 정보는 블록헤더의 정보를 단순히 합산하여 해싱하는 것이 아닙니다. 버전, 타임, bits, 논스정보는 리틀 엔디안 형태로 변형 해야 하며, 이미 해싱된 머클루트와 이전 블록 해시 정보는 반대로 뒤집어 주어야합니다. 다시 정리해보면 아래의 7가지 변환 과정을 거쳐서 블록 해시 정보를 구할 수 있습니다!

  1. 버전, 타임, bits, 논스 정보는 리틀 엔디안 형태로 데이터를 변형해야 한다.

  2. 이전 블록 해시, 머클루트는 결과 값을 모두 반대 순서로 바꿔주어야 한다.

  3. 헤더 정보들을 모두 합산합니다.(이어붙이기)

  4. 합산한 헤더 정보를 바이너리 형태로 변형합니다.

  5. 다시 SHA 형태로 변형 후 바이너리 형태로 또 변형합니다.

  6. 변형한 값을 다시 SHA 형태로 변형합니다. (5~6번 과정은 합산한 정보를 2중 해싱한다고 생각하시면 됩니다.)

  7. 이렇게 얻은 결과 값을 다시 뒤집어 놓습니다.



추가적으로 저는 숫자를 문자열로 입력하는 멍청한 실수를 해서 2시간을 허비했습니다.. 개발자로써 자괴감이..

자 그럼 결과가 정상적으로 출력되는지 확인해보겠습니다.



드디어 블록해시 정보를 구할 수 있었습니다. 아래의 링크는 비트코인 블록 해싱 알고리즘에 대한 자세한 설명을 해주고 있는 사이트입니다. 꼭 접속하셔서 해당 내용 확인해보셨으면 좋겠습니다!

(https://en.bitcoin.it/wiki/Block_hashing_algorithm)


자 그럼 오늘 배운내용을 간략하게 정리를 해보겠습니다.

  1. 블록해시는 블록의 이름정보를 의미하면 해당 블록의 식별자 역할을 수행한다.

  2. 블록해시는 블록 헤더 정보를 7단계의 복잡한 과정을 통하여 구할 수 있다. (아마 인터넷상에서는 자세하게 설명할 경우 오히려 이해하기 어려울 것 같아 7가지 과정을 누락하신 것 같습니다..)


이상으로 블록 헤더의 구성요소인 머클루트를 구하는 과정, 그리고 블록의 이름정보인 블록해시를 구하는 과정까지 학습하였습니다. 아마도 이 글을 읽으시는 분들 중에서는 왜 이렇게 까지 과정에 대해서 집착하지? 라는 생각을 하실 수 있을 것 같습니다. 하지만 이 과정이 반드시 학습하는데에 큰 도움이 될것이라고 믿습니다!

이상 긴 글 읽어주셔서 감사합니다!


[참고자료]https://en.bitcoin.it/wiki/Block_hashing_algorithmhttps://steemit.com/kr/@loum/how-to-calculate-the-block-hash-in-bitcoinhttps://homoefficio.github.io/2016/01/23/BlockChain-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90/http://hanaloum.blogspot.kr/2014/06/block-1_9584.html

본 포스팅 자료는 Keepit 저널의 콘텐츠이며, 직접 저자로 참여하여 작성된 콘텐츠 자료입니다. 해당 콘텐츠는 비트코인의 전반적인 내용을 담을 예정이며, 이전의 작성했던 비트코인 관련 콘텐츠를 보강해줄 수 있다고 생각하며, 블로거 여러분들에게 공유를 하기 위한 목적으로 옮겨왔습니다.

원본 게시글




KEEP!T Column


안녕하세요! KEEP!T입니다. 지난 '비트코인 뽀개기 1편'에 이어서 비트코인에서 데이터를 저장하기 위한 수단으로 왜 블록체인 기술을 활용했는지에 관한 관점으로 포스팅을 진행하도록 하겠습니다. 혹시 비트코인 뽀개기 시리즈 읽지 않으셨다면 아래의 링크를 통해 읽어보시면 좋을것 같습니다.



데이터 베이스


데이터 베이이스는 체계화된 데이터를 저장, 조작 관리하는 방법을 의미하며 사용하는 방법에 따라, 계층형, 관계형, NoSQL 데이터 베이스등이 있습니다. 비트코인에서는 데이터를 저장하기 위한 수단으로 기존에 사용되어왔던 데이터 베이스 기술 방식이 아닌 블록체인 기술을 활용하였습니다.

중앙 집중형 시스템에서 자주 사용되어왔던 데이터베이스는 수정, 삭제하기 매우 쉬웠기 때문에 일부 권한을 가지고 있는 사용자들만이 데이터를 관리해야했습니다. 하지만 탈 중앙화된 금융 시스템을 만들기 위해서는 누구나 네트워크에 참여할 수 있으며, 모든 참여자가 데이터 베이스에 접근할 수 있고 데이터를 기록할 권한을 가지고 있어야 합니다. 그렇기때문에 기존의 중앙 집중형 시스템에서 자주 사용되어왔던 데이터 베이스의 형태가 아닌 새로운 데이터 베이스가 필요했습니다.

관계형 데이터 베이스 : 키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 매우 간단한 언칙의 전산 정보 데이터베이스다. 1970년 에드거 F. 커드가 제안한 관계형 모델에 기초하는 디지털 데이터베이스이다.

NoSQL 데이터 베이스 : 전통적인 관계형 데이터베이스 보다 덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 메커니즘을 제공하며, 단순 검색 및 추가 작업을 위한 매우 최적화된 키 값 저장 공간으로 높은 성능 이익을 내는 것이 목적이다. NoSQL 데이터베이스는 빅데이터와 실시간 웹 애플리케이션의 상업적 이용에 널리 쓰이고 있다.


블록체인


블록체인 기술은 분산 컴퓨팅 기술 기반의 데이터 위변조 방지 기술로써, 데이터를 '블록' 단위로 관리하며, 시간의 흐름순으로 블록을 체인(링크드 리스트)형태로 연결한 분산되고, 독립적인 공통 장부(원장, Ledger) 관리 기술입니다. 블록체인은 별도의 중앙 서버 없이 P2P 네트워크 환경에서의 비가역적 공유 데이터 베이스 역할을 수행합니다.

블록체인 기술은 분산되고, 독립적인 데이터 관리를 가능하도록 도와주며, 네트워크에 연결된 모든 사용자들이 블록체인 데이터의 변경 결과를 열람할수 있으며, 합의 알고리즘에 의해 새롭게 추가되는 블록의 검증이 이루어지고, 검증된 블록만을 기존의 블록체인에 연결하여 데이터 위변조를 방지할수 있게됩니다. 이러한 블록체인 기술을 통해 중앙권력 없이 순수하게 사용자들로만 이루어진, 그러나 조작이나 통제가 불가능한 금융 시스템을 만들수 있게되었습니다.

비가역성 : 변화를 일으킨 물질이 본디의 상태로 돌아오지 아니하는 성질, 즉 블록체인에서 비가역적 공유 데이터베이스의 의미는 이미 저장된 데이터를 수정하거나, 삭제할 수 없는 상태를 의미함.


비트코인의 블록체인


탈 중앙화된 금융시스템을 꿈꾸던 비트코인은 앞서 언급한 기존의 데이터 베이스 시스템이 아닌 블록체인 기술을 도입하여 탈 중앙화된 금융 시스템을 만들수 있게 되었습니다. 비트코인 시스템에 적용된 블록체인의 '블록'은 평균 10분에 한번식 생성될 수 있도록 설게되었으며, 블록의 크기는 1MB로 약 1800 - 4200건의 거래내역을 담을 수 있습니다. 비트코인의 블록체인에 저장되는 '블록'은 크게 블록 헤더정보와, 블록 바디정보로 구분할수있습니다.

블록 헤더 : 블록 헤더는 전반적인 블록의 상태 정보를 나타내며, 버전(Version), 이전 블록 해시(Previous block hash), 머클 루트(Merkle Root), 타임(Time), 난이도 목표(bits), 논스(Nonce) 정보로 구성됩니다.

블록 바디 : 블록 바디에는 다수의 거래 정보(트랜잭션)로 구성됩니다.





비트코인에 적용된 블록체인 기술에 대한 이해와, 블록 구성요소의 역할에 대한 명확한 이해를 위해서는 먼저 '해시 함수'에 대한 개념정리가 필요합니다.


해시함수


해시함수는 메시지의 오류나 변조를 쉽고 빠르게 탐지할 수 있습니다. 또한, 데이터의 무결성을 제공하기 위해 사용되며, 매우 빠른 데이터 검색을 위한 소프트웨어에서도 널리 사용됩니다. 비트코인에서는 SHA-256 방식의 해시 함수를 사용하고 있습니다. 해시함수는 아래와 같은 특징을 가지고 있습니다.


  1. 어떤 입력 값에도 항상 고정된 길이의 해시 값을 출력한다.

  2. 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.(눈사태 효과)

  3. 출력된 결과 값을 토대로 입력 값을 유추할 수 없다.

  4. 입력 값은 항상 동일한 해시 값을 출력한다.


1번의 특징인 어떤 입력 값에도 항상 고정된 길이의 해시값을 출력하는 특징에 대해서 먼저 살펴보겠습니다. 어떠한 데이터를 입력하여도 항상 고정된 256bit의 결과 값을 출력한다는 의미이며, 이는 방대한 데이터를 256bit로 축약할 수 있다는 의미가됩니다. 2번의 특징인 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다는 특징을 활용하여 입력값의 위변조를 쉽고 빠르게 확인할 수 있습니다.

SHA 256 해시 함수는 입력 값의 데이터가 아무리 길어도 항상 고정된 길이의 256bit의 결과 값으로 변환해주며, 입력된 결과 값 중 일부만 변경되어도 전혀 다른 결과 값을 출력하기 때문에 256bit의 데이터 비교만을 통해 데이터의 위변조 사실을 알아낼 수 있습니다. 즉 메시지의 오류나 변조를 아주 빠르게 탐지할 수 있는 무결성을 제공할 수 있다는 의미입니다.

만약 책 한 권의 데이터를 한 글자씩 비교하여 변조되었는지 확인한다면 아주 오랜 시간이 소요될 것입니다, 하지만 해시함수의 2가지 특징으로 인하여 방대한 데이터를 256bit로 축약하고, 축약된 데이터가 서로 같은지 비교할 경우 아주 빠르게 원본 데이터의 변조 사실을 탐지할 수 있게 됩니다.


대다수의 웹사이트에서는 데이터 저장 시 보안의 요소로 해시함수를 많이 사용하고 있습니다. 그 이유는 해시 함수의 3번째 특징인 출력된 결과 값을 토대로 입력 값을 유추할 수 없다는 점, 4번째 특징인 입력 값은 항상 동일한 해시 값을 출력한다는 점을 활용하여 데이터 암호화에 많이 사용되고 있습니다.

예를 들어 우리가 어떤 특정 사이트에 회원 가입을 했다고 가정해보겠습니다. 가입 시 입력한 패스워드가 데이터 베이스에 그대로 저장된다면 관리자들은 사용자의 패스워드 정보를 확인할 수 있고, 해킹을 당했을 경우에는 모든 패스워드 정보를 분실할 수 있습니다. 그렇기 때문에 패스워드는 반드시 암호화되어 데이터 베이스에 저장되어야 합니다. 또한 암호화 방식에 규칙이 있고 관리자가 알 수 있다면 해커 또한 해킹을 통해 암호화 방식을 탈취하여 데이터 베이스에 저장된 암호화된 패스워드를 해독할 수 있다는 의미가 됩니다. 그렇기 때문에 암호화 방식은 그 누구도 알 수 없는 방식으로 데이터 베이스에 저장되어야 합니다.

웹 사이트 가입 시 패스워드를 abc라고 입력했고, 입력 값을 해시함수를 통해 해시 결과 값으로 0xfx...와 같은 256bit의 해시 결과 값을 데이터 베이스의 패스워드로 저장하게된다면, 해시함수의 특징중 하나인 결과 값을 토대로 입력 값을 유추할 수 없다는 특징으로인하여 관리자는 저장된 패스워드 0xfx...을 토대로 사용자가 어떤 입력 값을 넣었는지 알 방법이 없으며, 해커 또한 탈취한 패스워드의 해시 결과 값을 토대로 사용자가 입력한 원본 패스워드를 알 수 없게 됩니다.

또한, 동일한 입력값엔 항상 같은 결과 값을 출력하는 해시 함수의 특징을 활용하여 사용자는 웹사이트 로그인 시 로그인 창에 자신의 패스워드를 입력하고, 로그인을 요청하게됩니다.

사용자가 로그인을 위해 로그인 창에 자신의 원본 패스워드 데이터를 입력하고, 로그인을 요청하게 되면 시스템 내부에서는 입력한 패스워드를 해시 함수를 통해 해시 결과 값으로 변경 후 데이터 베이스에 저장된 패스워드와 해시 결과 값이 같은지 비교하여 같을 경우 로그인을 정상적으로 처리하게 됩니다. (동일한 입력 값엔 항상 같은 해시 결과 값을 출력하는 특징때문에 사용자가 동일한 패스워드를 입력하게되면 항상 같은 해시 결과 값이 출력됩니다.)


요약 정리


탈 중앙화된 금융 시스템을 유지하기 위해서는 모든 네트워크 구성원들에게 분산되고, 독립적인, 데이터 저장 기술이 필요했으며, 비트코인 네트워크는 블록체인 기술을 활용하여 분산되고, 독립적인 데이터 관리가 가능해졌습니다.

해시 함수의 특징을 활용하여 블록의 위변조를 쉽고 빠르게 확인할 수 있었으며, 다양한 암호학 알고리즘, 작업 증명 방식의 합의 알고리즘 등을 통하여 네트워크의 신뢰도를 향상시킬 수 있었습니다. 다음 비트코인 뽀개기 시간에는 이러한 블록체인의 구성요소에 대하여 자세히 알아보도록 하겠습니다.


yahweh87


참고자료


https://ko.wikipedia.org/wiki/NoSQL

https://ko.wikipedia.org/wiki/%EA%B4%80%EA%B3%84%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4




이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.


'비트코인(keepit)' 카테고리의 다른 글

KEEP!T Column 비트코인 뽀개기(1편)  (0) 2018.04.05


안녕하세요. 어미새입니다.



이번 포스팅에서는 지난 시간에 이어서 블록헤더 정보인 '머클 루트'에 대해 알아보도록하겠습니다. 머클 루트의 값은 어떻게 생성되는지, 예제를 통해서 검증하는 시간을 갖도록 하겠습니다.

이번 포스팅을 이해하기 위해서는 반드시 해시 함수에 대한 개념이 필요하며, 해시 함수에 대해서 잘 모르시는 분은 아래의 링크를 통해 먼저 해시 함수에 관한 내용을 읽어보시길 바랍니다.



'머클트리(Merkle Tree)' 와 '머클루트(Merkle Root)'


'머클트리(Merkle Tree)' 혹은 '해시트리(Hash Tree)'라는 데이터 구조는 Ralph Merkle이라는 사람이 1979년에 특허를 낸 개념입니다. 머클 트리의 목적은 어떤 블록의 데이터가 분리돼서 전달 될 수 있도록 하는것이며, 블록의 용량을 효율적으로 활용하수 있는 데이터 구조를 가지고 있습니다. 해시 함수의 특징으로 머클 트리 하위 노드들의 해시 값은 상위 노드에 영향을 주며, 어떤 악의적인 유저가 머클 트리 최하위에 있는 트랜잭션 정보를 가짜로 바꿔치기 하면 상위 부모들의 해시 값이 변경되고, 머클 루트 값 또한 변경됩니다. 머클 루트 정보가 변경될 경우 블록 해시 정보 또한 변경되어 해당 블록은 기존의 블록과 전혀 다른 블록으로 인식됩니다.


즉, 머클트리의 목적은 데이터의 간편하고 확실한 인증을 위해 사용합니다.


'머클루트(Merkle Root)'란 블록체인의 원소역할을 수행하는 블록의 바디부분에 저장된 트랜잭션들을 머클 트리한 최종 결과 값입니다.



블록의 구조는 크게 블록 헤더와, 블록 바디 정보로 구성되며, 블록의 바디 정보는 트랜잭션, 즉 거래 정보로 구성된다고 설명해드렸습니다. 블록의 바디 정보에 저장된 트랜잭션의 정보들이 유효한지 머클 트리를 통해 검사할 수 있습니다. 그럼 머클 트리는 어떻게 구성되고 최종적으로 머클 루트는 어떻게 만들어질까요?


머클 루트 연산 원리.


  1. 최초 데이터를 SHA256 형태의 해시값으로 변환한다.

  2. 가장 가까운 노드 2개를 한쌍으로 묶어 합친 후 해시값으로 변환한다.

  3. 계속해서 해시값으로 변환하여 마지막 하나가 남을때까지 이 과정을 반복한다.


<br/>

위의 그림처럼 각 해시된 결과값 TXID의 노드를 2개씩 짝지어 합친 후 다시 SHA256 함수를 통해 해시 값으로 변환하고 최종적으로 하나의 결과 값이 나올때 까지 이 과정을 계속해서 반복합니다. 최종적으로 남은 하나의 노드 값이 '머클루트' 결과 값이 되는겁니다!


다시 한번 정리해보면 아래와 같습니다.


  1. 블록헤더의 머클루트 값은 블록바디의 거래내역 정보인 TXID의 해시트리 결과 값이다.

  2. 머클루트의 역할은 각 거래 정보의(TXID)의 정보들이 변경되었는지에 대한 유효성을 검사하는 역할을 수행한다.

  3. 머클루트의 결과 값을 통해 블록 해시의 정보가 구성됨으로 그 블록의 유효성 또한 검사할 수 있다.

<

머클 루트 연산 과정


비트코인의 블록정보를 쉽게 볼 수 있도록 제공해주는 사이트인 '블록체인 인포' (https://blockchain.info/ko) 라는 사이트를 통해 블록 정보를 확인해보겠습니다. 제가 보고 있는 현 시점에서 블록체인 인포 사이트의 최신블록의 정보는 아래의 그림과 같이 #508186 입니다.



최신 블록인 #508186을 선택(클릭)하여 해당 블록의 정보를 자세히 살펴보겠습니다.



비트코인의 블록 정보를 확인해 볼 수 가 있습니다. 각 해당 요소들에 대한 설명에 대해서는 추후 계속적인 포스팅에 대해서 설명해 드리겠습니다. 이번 시간은 머클 루트 값을 구하는 과정을 테스트할 예정이기 때문에 다수의 거래정보가 있는 거래 리스트를 확인해 보겠습니다.



최신 블록은 위의 그림과 같이 정말 많은 거래 내역이 있기때문에, 테스트에 적합하지 않습니다. 거래 내역이 2건 내지 4건인 블록이 적당한 수치인것 같습니다. 마침 #99997번째 블록의 거래내역이 2건이기 때문에 해당 블록으로 테스트를 진행해보겠습니다. 해당 블록의 머클 루트와 거래정보는 아래의 그림과 같습니다.




블록#99997의 머클 루트는 5140e5972f672bf8e81bc189894c55a410723b095716eaeec845490aed785f0e 이며, 거래 내역은 아래의 그림과 같습니다.



그럼 이제 거래 내역의 TXID 정보를 합산한 후 SHA256으로 변환하는 코드를 짜고 그 결과 값을 확인해 보겠습니다.




결과는 위의 그림처럼.. 이상한 결과가 나오고 있습니다... 여러분은 알고 계셨나요?? 머클루트는 이렇게 구하는게 아니라는걸요??


머클루트의 결과 값을 정확하게 구하기 위해서는 엔디안이라는 개념이 필요합니다, 컴퓨터에서 어떤 크기의 데이터를 메모리에 저장할 때 바이트 단위로 나누어 저장하며, CPU 아키텍처에 따라 바이트 저장 순서가 달라질 수 있기 때문에 리틀-엔디안빅-엔디안 방식으로 나누어 질 수 있습니다.


쉽게 생각해서 앞선 TXID를 컴퓨터가 이해하기 쉬운 형태로 변환한 후, 합산해야합니다. 우선 정확하게 머클 루트를 구하는 예제 코드를 보여드리겠습니다.



위의 예제 코드의 1번의 과정처럼 문자열을 스왑해주고, 2번의 과정으로 스왑된 데이터를 바이너리로 형태로 변경해야합니다. 그리고 이렇게 만들어진 데이터 TXID 1번과, TXID 2번의 문자열을 합산하는것이 아니라 이어 붙여준 후 해시 함수를 2번 연산해 주어야합니다. 이렇게 해시 함수를 통해 얻은 결과 값을 4번과정과 같이 다시 역으로 꺼내주면 정확한 머클 루트 값을 구할 수 있습니다.


위의 예제 소스의 결과는 아래와 같습니다.



이렇게 해서 블록의 바디 정보인 TXID 정보를 토대로 머클 루트 결과 값을 만드는 과정을 확인해볼 수 있었습니다. 다음 포스팅에서는 비트코인의 블록헤더 정보는 무엇이고, 어떻게 값을 구하는지에 대해 알아보도록 하겠습니다.


추가로 머클 루트 구하는 방법을 테스트해보고 싶으신분은 아래의 링크를 통해 풀 코드를 확인해보시면 좋겠습니다. 해당 코드는 TXID의 양이 많더라도, 루프 문을 통하여 값을 구할 수 있도록 짜여진 코드입니다.


지금까지 긴 글 읽어주셔서 감사합니다!


[참고자료]


https://steemit.com/kr/@jayground8/hashmerkleroothttps://steemit.com/kr/@jsralph/merkle-treeshttps://steemit.com/kr/@twinbraid/5uzvbu-02http://twinbraid.blogspot.kr/2017/11/blog-post.htmlhttps://blockchain.info/ko/block/

안녕하세요. 어미새입니다.



비트코인의 블록체인 구조를 이해하기 위해서는 해시 함수에 대한 개념정리가 먼저 필요합니다.


해시함수

  1. 해시함수는 임이의 길이를 갖는 메시지를 입력받아 고정된 길이의 해시값을 출력하는 함수이다.

  2. 해시 함수를 사용하는 목적은 메시지의 오류나 변조를 탐기 위해, 즉 데이터의 무결성을 제공하기 위해 사용한다.


해시함수의 특징

  1. 어떤 입력 값에도 항상 고정된 길이의 해시 값을 출력한다.

  2. 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.(눈사태 효과)

  3. 출력된 결과 값을 토대로 입력 값을 유추할 수 없다.

  4. 입력 값은 항상 동일한 해시 값을 출력한다.


해시 함수에 대한 보다 자세한 내용을 원하시는 분은 이전에 작선 포스팅을 참조하시면 좋을것 같습니다. (http://withbabybird.tistory.com/6)


본 포스팅에서는 비트코인의 블록체인 구성 요서에 대한 간략한 개요정도만 설명할 예정이며, 추후 각 구성요서에 대한 개별 포스팅을 진해하여 자세한 내용을 다루도록하겠습니다.


블록체인(Block-chain)


블록체인 기술은 블록과 블록을 체인형태(링크드 리스트)로 연결한 자료구조를 사용합니다. 블록체인 기술은 분산 컴퓨팅 기반의 데이터 위변조 방지 기술로써, 데이터를 '블록' 단위로 관리합니다. 블록체인 기술은 분산되고, 독립적인 데이터 관리를 가능하도록 도와주며, 네트워크에 연결된 모든 사용자들이 블록체인 데이터의 변경 결과를 열람할 수 있으며, 합이 알고리즘에 의해 새롭게 추가되는 블록의 검증이 이루어지고, 검증된 블록만들 기존의 블록체인에 연결하여 데이터 위변조를 방지할 수 있게됩니다. 즉 블록체인 기술은 분산되고 독립적인 공통 장부(원장, Ledger) 관리 기술이라고 할 수 있습니다.


비트코인 시스템은 블록체인 기술을 통해 순수하게 사용자들로만 이루어진, 그리고 조작이나 통제가 불가능한 금융 시스템을 만들 수 있게 되었습니다.


'블록(Block)'


블록은 블록체인의 원소 개념으로, 다수의 트랜잭션(거래 정보)를 가지고 있으며, 데이터 베이스(블록 체인)에 저장하기 위한 데이터 묶음(트랜잭션 묶음)이라고 생각하시면 좋을것 같습니다. 블록의 이름은 Height(높이)라는 용어로 불리며, 블록체인을 길게 이어진 수평선으로 보는 것이 아니라 한 칸 한 칸 쌓아나가 탑의 형태로 구성된다고 생각하여 Height(높이)라는 말을 쓴다고 합니다. 하지만 이 이름은 정확한 블록의 이름이 아니며, 블록의 정확한 이름은 블록의 식별자 역할을 수행하는 블록의 해시 값입니다.

비트코인 시스템에 적용된 블록체인의 '블록'은 평균 10분에 한번식 생성될 수 있도록 설게되었으며, 블록의 크기는 1MB로 약 1800 - 4200건의 거래내역을 담을 수 있습니다. 비트코인의 블록체인에 저장되는 '블록'은 크게 블록 헤더정보와, 블록 바디정보로 구분할수있습니다.

블록 헤더 : 블록 헤더는 전반적인 블록의 상태 정보를 나타내며, 버전(Version), 이전 블록 해시(Previous block hash), 머클 루트(Merkle Root), 타임(Time), 난이도 목표(bits), 논스(Nonce) 정보로 구성됩니다.

블록 바디 : 블록 바디에는 다수의 거래 정보(트랜잭션)로 구성됩니다.



'블록 해시(Hash of the block)'


블록 해시는 블록의 식별자 역할을 수행하며, 블록 헤더 정보인 버전, 이전 블록 해시, 머클 루트, 타임, bits, 논스정보를 각 표현식에 맞게 변경한 후 합산하여 SHA256 해시함수를 통해 출력된 결과 값입니다,



'버전'


비트코인 네트워크의 버전 정보를 의미합니다. 해당 블록이 생성되는 시점에서 네트워크에서 사용되었던 버전 정보를 기록합니다.


'이전 블록 해시(Previousblockhash)'


블록체인의 자료구조는 링크트 리스트 형태로 구성됩니다. 블록이 생성되는 시점에서 이전 블록의 정보를 참조하여 블록이 체인 형태로 연결될 수 있도록 도와주는 역할을 수행합니다.



위의 그림처럼 각 블록의 헤더 정보에는 이전 블록의 해시정보를 가지고 있습니다. 각 블록이 이전 블록의 해시 정보를 가지고 있기 때문에 각 블록이 서로 서로 연결되어 있는 구조가 될 수 있습니다.


'머클 루트(Merkle Root)'


'머클 루트'는 블록의 바디 부분에 저장된 트랜잭션(거래 정보) 들의 해시 트리라고 생각하시면 되겠습니다. 각 트랜잭션과 가까운 노드 끼리 쌍을 지어 해시 값을 구하여 최종적으로 구해진 해시 값이 머클루트 해시 값이 되겠습니다.

머클루트의 역할은 아래와 같습니다.

  1. '머클루트'(머클해시)값을 통해 단일 블록 내에 존재하는 트랜잭션의 무결성을 검증할 수 있다.

  2. '머클루트'(머클해시)값을 이용하여 블록의 해시 값을 생성하였기 때문에 블록의 해시의 무결성도 함께 검증할 수 있다.

쉽게 말해 해당 블록이 유효한지에 대한 무결성을 검증하기 위한 요소가 머클루트 혹은 머클해시라는 구성요소입니다.


'타임(Time)'


해당 블록의 대략적인 생성 시간을 의미합니다. 타임 스탬프는 유닉스 기준일 자로 표시되며 1970년 1월 1일 자정부터 경과한 시간을 초 단위로 계산한 값입니다.


'bits'


bits는 난이도 해시 목표 값을 의미하는 지표입니다. 이 부분에 대해서는 마이닝 즉 채굴이 어떻게 이루어지는지에 대한 포스팅에서 자세히 다루도록 하겠습니다.


'Nonce'


난스는 블록을 만드는 과정에서 해시 값을 구할 때 필요한 재료 역할을 수행합니다. 이 부분에 대해서도 채굴과 관련된 포스팅에서 자세히 다루도록 하겠습니다.


이것으로 비트코인의 블록체인 기술 및 구성요소에 대한 시간을 마치도록 하겠습니다. 각 구성요소에 대한 자세한 내용은 추후 개별 포스팅을 통해 심도있게 다루겠습니다.

긴글 읽어주셔서 정말 감사합니다!


[참고 사이트]


https://steemit.com/kr/@jsralph/merkle-trees

https://steemit.com/kr/@feyee95/1-1

https://commons.wikimedia.org/wiki/File:Bitcoin_block_structure.svghttp://hanaloum.blogspot.kr/2014/06/block-1_9584.htmlhttps://www.slideshare.net/YechanAn/blockchain-77203988http://blog.naver.com/PostView.nhn?blogId=renucs&logNo=220958282185&parentCategoryNo=&categoryNo=36&viewDate=&isShowPopularPosts=false&from=postViewhttps://homoefficio.github.io/2016/01/23/BlockChain-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90/http://privacy.jiransoft.co.kr/%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8%EA%B3%BC-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EA%B8%B0%EC%88%A0/https://brunch.co.kr/@ppineapple17/1

아래의 자료는 Keepit 저널에서 게시된 콘텐츠이며, 제가 저자로 참여하여 작성된 콘텐츠입니다. 
비트코인의 전반적인 내용을 담을 예정이기에 게시물을 따로 분류하여 블로거 여러분들에게 공유하기 위한 목적으로 옮겨왔습니다. 

[ 원본 게시글 ]

KEEP!T Column

안녕하세요! KEEP!T입니다. 최초의 암호화폐인 비트코인을 누구나 쉽게 이해할 수 있도록 '비트코인 뽀개기'라는 주제로 새로운 콘텐츠를 제작하게 되었습니다. 다소 부족한 부분이 있다면 지금까지 그래왔던 것처럼 독자분들께서 적극적인 코멘트 해주셨으면 좋겠습니다, 앞으로 많은 관심 부탁드립니다.

탈 중앙화된 금융 시스템의 필요성

서브프라임 모기지 사태 : 2000년대 초반 IT 버블이 붕괴되고 911 테러, 아프간/이라크 전쟁 등으로, 미국 경기가 악화되자 미국 정부는 경기부양책으로 저금리 정책을 펼쳤습니다. 주택융자 금리가 인하되자, 많은 사람들은 대출을 받아 주택을 구매하였고, 부동산 가격은 상승하기 시작했습니다.
경기가 좋아지자 미국 정부는 2004년 저금리 정책을 종료하였고, 주택융자 금리 또한 인상되었습니다. 금리가 인상되자 저 소득층 대출자들은 원리금을 갚지 못하는 상황이 발생하였고 담보로 잡혀있던 주택 가격들은 하락 하기 시작하였습니다. 서브 프라임 모기지론을 구매한 금융기관들은 대출금을 회수할 수 없는 상태에 빠졌고, 이 과정에서 여러 기업들이 부실화되면서 미국의 대형 금융사 및 증권회사들의 파산으로 이어졌으며, 결국 2008년 세계 금융 위기까지 이어지게 됩니다.
세계 금융위기가 발생하자 주요 국가의 중앙은행에서는 양적 완화를 통해 위기를 극복하고자 하였고, 무분별한 화폐의 발행으로 화폐의 가치가 하락하자 모든 경제 구성원들에게 피해가 이어졌습니다. 일부 기업의 실패로 시작된 금융위기를 양적 완화를 통해 극복하는 모습에 많은 사람들이 글로벌 금융 시스템에 대한 불신이 생겼으며 누구나 신뢰할 수 있는 탈 중앙화된 금융 시스템의 필요성이 부각되기 시작하였습니다.
양적 완화 :  중앙은행이 발권력을 동원해 화폐를 발행한 후, 그 화폐로 국채나 민간이 가지고 있는 일정 신용등급 이상의 채권을 매입하여 통화량을 늘리는 정책입니다.


탈 중앙화된 금융 시스템 도입의 어려움
전자화폐

전자화폐는 전자적으로만 교환되는 돈이나 증서를 뜻하며, 컴퓨터 네트워크, 인터넷, 디지털 선불 카드시스템에서 통용되어 사용되고 있습니다. 페이팔(PayPal), 웹머니 등과 같은 중앙 집권적 체계의 전자화폐 시스템은 오래전부터 개발되어 상용화되었지만, 개인과 개인이 거래를 할 수 있는 탈 집권적 체계의 전자 화폐 상용화에는 기술적, 제도적 문제점들이 있었습니다.

'기술적' 문제

디지털 데이터는 무한대로 복제 가능하고, 원본과 복사본의 구별이 어렵기 때문에 이중 지불이라는 문제를 내적으로 안고 있었으며, 분산 컴퓨팅 분야의 오래된 난제 중 하나인 비잔틴 장군 문제와 같은 기술적 어려움이 있었습니다.
이중 지불(Double Spent): 단일 통화 단위가 두번 결제되어 발생하는 문제다. 디지털 데이터는 무한대로 복제가 가능하고 원본과 복사본의 구별이 어렵기 때문에, 디지털 화폐는 이중 지불이란 문제를 내재적으로 안고 있다. 디지털 데이터가 검증받지 못한다면, 그 데이터를 복사해서 동시에 여러 곳에 사용할 수 있는 것이다.
비잔틴 장군 문제(Byzantine General's Problem): 1984년 레슬리 램포트와 쇼스탁, 피스가 공저한 논문 에서 처음 언급된 문제이며, 분산 컴퓨팅 분야에서 오랫동안 풀지 못했던 난제다. 서로를 신뢰할 수 없는 사람들이 참여하는 분산 P2P 네트워크에서 어떻게 합의를 이뤄낼 것인가에 관한 문제이다.

'보상'의 필요성

탈 중앙화된 금융 시스템이 유지되기 위해서는 개인의 '희생'이 필요합니다. 예를 들어 P2P 네트워크 중 하나인 토렌트 프로그램을 생각해보겠습니다. 토렌트에 접속하는 대다수의 구성원들은 자신이 원하는 파일을 다운로드 받기 위해 접속하며, 다운로드가 완료될 경우 해당 프로그램을 종료합니다. 다른 구성원들을 위해 업로드 기능을 활성화하여 자신의 컴퓨터 자원을 '희생'하는 구성원은 극히 소수일 수밖에 없습니다.
탈 중앙화된 금융 시스템이 정상적으로 동작하기 위해서는 시스템을 유지시켜야 하는 '이유'와 '목적'을 구성원들에게 제공해야 합니다.

비트코인

비트코인은 블록체인 기술을 기반으로 만들어진 암호 화폐이며, 중앙은행 없이 P2P 네트워크를 통해 개인들 간에 자유로운 금융 거래를 할 수 있도록 설계된 암호 화폐입니다. 2008년 10월 사토시 나가모토라는 가명을 사용한 프로그래머가 "Bitcoin : A Peer-to-Peer Electronic Cash System"이라는 제목의 9쪽짜리 논문을 공개했고, 3개월 만인 2009년 1월 프로그램 소스를 배포함으로써 세상에 알려지기 시작하였습니다.


비트코인의 화폐 단위는 BTC로 표기하며, 1 BTC 미만의 단위는 비트코인의 창시자 사토시 나가모토의 이름에서 따온 사토시(satoshi)라 부릅니다. 비트코인의 총 발행량은 2140년까지 총 2100만 개로 정해져있으며, 무분별하게 발행될 수 있는 종이화폐와 달리 제한된 양의 화폐를 발행함으로써 더 큰 가치를 얻을 수 있었습니다.
기존의 탈 중앙화 시스템의 기술적 문제점인 이중 지불 및 비잔티움 장군 문제를 합의 알고리즘인 작업 증명(Proof-of-Work)알고리즘을 통해 해결하였으며, 네트워크에 더욱더 많은 기여를한 구성원에게 더 큰 '보상'을 줌으로써 선의의 경쟁을 통해 더 많은 사용자들이 네트워크에 기여하고 일할 수 있는 환경을 제공하였습니다.

비트코인의 등장 이후 이더리움, 스팀과 같은 다양한 암호 화폐와 플랫폼들이 개발되기 시작하였고, 현재에는 많은 기업들이 블록체인 기술을 활용한 서비스 개발에 집중하고 있습니다. 비트코인은 단순히 암호 화폐의 기능만을 제공하는 것이 아니라 새로운 패러다임의 시작을 알린 암호 화폐라고 생각합니다.


yahweh87


[참고자료]


'비트코인(keepit)' 카테고리의 다른 글

KEEP!T Column 비트코인 뽀개기(2편)  (0) 2018.04.12

+ Recent posts