[비트코인 트리 4-1] 블록의 생성에 대해 알아봅시다.

in #kr7 years ago (edited)

대문1.jpg
지난 글에 응원을 많이 해주셔서 힘이 많이 나네요.^^
아직 많이 부족한 글이고 저두 공부하는 입장이라 제대로 쓰고 있는 건지 잘 모를 때가 있습니다. 그럼에도 읽어주시고 보팅해주시고 댓글 달아주시는 분들 정말 감사드리고 같이 공부했으면 합니다!!
꼭 틀린 거 많이 지적해주시고 좋은 자료 있으면 같이 나눠요.ㅎㅎ

우선 어제 [블록이란 무엇인가] 글에서 잘못된 거부터 고치겠습니다.
바디에 저장되는 내용 중 머클트리 부분이 글마다 좀 달라서 고민이 됐었는데 @yellowboy1010님이 명쾌한 답을 주셨습니다.
바디에 머클트리를 따로 저장하진 않는다고 답변을 받았습니다. 그냥 바디에는 input, output같은 거래 그 자체만 들어가있다고 하네요. 또한 TXID로 거래내역을 추척하는 것은 이 머클트리와는 관계없는 다른 메커니즘이라고 합니다. 머클트리는 문제가 생겨서 검증(audit)할 때만 쓰이는 상징적인 것이라고 하시네요.ㅎㅎ

자 다시 시작해볼까요?^^
어제 블록에 대해 알아봤으니 오늘은 체인에 연결되기까지 블록을 만드는 과정을 알아보려고 합니다. 백서글(4)에 이 블록 생성에 관한 내용이 있어서 제목을 4-1로 달았습니다.
흔히들 채굴이라고 하는데 사실 오늘 알아볼 것은 비트코인에 관한 것이 아닐라 블록에 내용물을 넣고 각 노드들이 승인을 하고 체인에 연결하는 과정입니다. 채굴이라는 말은 왠지 비트코인을 만드는 과정이 더 부각되는 거 같아서 블록 생성이라고 말하고 싶네요. 물론 그 생성과정에 보상으로 꼭 붙어나오는 것이 비트코인이지만.ㅎ

글을 시작하기 앞서 저와 비슷한 주제로 글을 쓰시던 분을 발견해서 링크를 하나 올리겠습니다.
계속 쓰셨으면 많은 도움이 됐을 거 같은데.. 아쉽네요.ㅎ
@jayground8 아이디를 쓰시는 Jay님의 글입니다.

https://steemit.com/kr/@jayground8/2gjn9v

이렇게 따로 링크 주소를 올리는 건 꼭 읽어보셨음 해서 올리는 것이니 한 번 읽어보시기 바랍니다. @jayground8님의 글이 2개 있는데 이거랑 블록헤드/머클트리에 관한 글도 아주 좋은 글입니다. 시간되면 읽어보세요^^
위에 글이 좀 어렵게 느껴지시더라도 자세하게 설명되어 있으니 아마 제 글을 읽으실 필요가 없을지도 모릅니다.ㅋㅋ 그래두 정리하면서 공부해야겠죠?^^

세상 각지에서 비트코인 거래가 마구마구 일어납니다. 그럼 그것들을 블록에 담아서 승인을 하고 송금, 입금과 같은 처리를 해야겠죠. 아마 제도권 은행같으면 은행이 다 알아서 해 줄 것입니다. 저흰 그냥 계좌번호 넣고 공인인증서 처리하고 otp넣고 확인 누르면 끝이겠죠. 하지만 블록체인 세상에서 은행이 없으니 블록체인이 알아서 해야합니다.
블록을 만들어 노드들에 의해 검증된 수많은 거래들을 담고 다른 블록을 이어서 승인(confirm)하는 작업을 통해 은행이 하는 일을 대체하는 것이죠.
이 과정에서 검증된 거래의 처리를 담당하는 사람이 채굴자, 혹은 채굴노드입니다. 채굴노드는 채굴에 최적화되어 있는 노드입니다. 왠지 채굴이라고 하면 모든 블록체인을 알아야하고 뭔가 기본이 되어야할 거 같은데 [백서글(2)] (https://steemit.com/kr/@feyee95/2)에서 봤던 것처럼 모든 채굴노드가 풀 노드일 필요는 없습니다. 채굴노드는 채굴에 적절한 시스템을 갖추고 그것을 풀노드에 연결시켜 전파만 하면 되니까요.

1.채굴노드가 우선 해야할 일은 무엇일까요?

비트코인은 화폐이고 화폐의 본질는 거래를 위한 것이니만큼 가장 먼저 해야할 일은 거래들을 모아서 담는 것입니다. 비트코인 네트워크의 노드들은 새로 생성된 거래내역들을 검증합니다. 이 검증은 백서글(7)에서 설명한 UTXO의 개념부터 시작합니다. 노드들은 이 UTXO들이 이중지불 된 것은 아닌지, 제대로된 입력값과 출력값을 가졌는지 등을 검증하여 검증된 UTXO를 메모리 풀(memory pool)혹은 거래 풀이라는 곳에 추가합니다. 하지만 이런 노드들 중에 채굴을 하는 노드 즉 블럭을 생성하는 노드들은 후보 블록(candidate block)에 추가하게 됩니다.

이 후보 블록에 거래들을 담는 데도 순서가 있습니다.
우선 생성거래(generation transaction)혹은 코인베이스 거래라고 해서 블록을 생성하게 될 경우 받는 보상 비트코인에 관한 거래내역입니다. 블록 생성에 대한 보상은 현재 12.5BTC와 거래 수수료입니다.

블록 생성.jpg

계속 보게 될테니 우선 하나씩 보면서 갈까요? 생전 안가보던 블럭체인 인포를 공부하면서 많이 보게 되네요.ㅎㅎ
마지막 두 개의 내용이 이 생성거래에 관한 내용입니다. 자 그럼 제일 중요한 지꺼 챙겼으니 남의 걸 넣어야하는데 여기부턴 우리나라와 비슷하게 여기서 나이랑 돈이 깡패입니다.ㅎㅎ
UTXO의 나이랑 거래 수수료가 높을 수록 우선 순위에 들게 됩니다. 나이는 그 UTXO가 블록체인에 기록된 이후 지나간 시간을 말하고 거래 수수료는 거래의 용량에 비례하여 책정한 수수료입니다(똑같은 수수료라도 크기가 작은 놈이 선호 되겠죠). 요새 보면 나이보다도 역시 돈이 제일 쎈 거 같더군요. 수수료를 낮게 설정하면 전송이 안된다는 말 들어보셨는지요?ㅎ(거래 수수료에 관한 이야기는 나중에 거래에 대해 쓰게 될 때 다시 설명하겠습니다.)
이 거래 내역들과 함께 헤더에 들어갈 머클 루트를 만들기 위해 머클 트리를 만들어 넣게 됩니다.

2. 내용물이 뭔지 알았으니 어디든 보낼라면 송장을 써야겠죠.

이렇게 몸뚱아리에 든든히 거래내역들을 채우게 되면 이제 블럭헤더를 구성합니다. 블럭헤더는 앞 글 블록이란 무엇인가에서 설명 드렸습니다.

헤드 표.jpg

간단하게 표로 적었습니다. 블록헤더의 구성은 위 표와 같은 순서로 채워집니다.
이렇게 블록헤더를 채우고 나면 이제 본격적으로 수학문제를 풀게됩니다. 흐음 수학문제라기 보다는 귀찮은 계산을 한다는 게 더 맞겠네요.ㅎ

3. 작업증명 알고리즘으로 채굴하기

블록에 들어갈 내용이 다 채워졌으니 이제 포장을 해야합니다. 즉 후보블록을 블록으로 완성시키는 것이죠.
비트코인은 이 블록을 완성시키는 방법으로 SHA256이라는 해시함수를 사용한 작업증명방식(POW)를 사용합니다. . SHA256은 제 백서글을 읽어보신 분이라면 많이 보신 단어일 것입니다. SHA256이 뭐고 어떻게 구동하고 어떤 원리이고 뭘 하려는 것인지는 잠시 접어둡시다.
암호화 해시 함수는 어~~~~~~~~언제인가 다룰 수 있겠죠.ㅎㅎ

채굴은 블록 헤더를 반복적으로 해싱해서 해시 결과값이 특정 목표치와 일치할 때까지 하나의 매개변수를 변화시키는 과정이다.

이것보다 더 쉬운 표현을 하기 힘들어서 "비트코인, 블록체인과 금융의 혁신"의 표현을 그대로 인용했습니다. 좀더 자세한 내용은 제가 이 글 처음에 링크한 글에 자세히 나와있습니다.(꼭 읽어보세요~^^)

저두 나름대로 정리를 해보겠습니다.
블록을 생성한다는 말은 해시 함수를 돌리고 돌려 특정 목표치를 찾는다는 말입니다. 이 특정 목표치가 뭐냐? 바로 정해진 해시값보다 더 작은 해시값을 찾는다는 것이지요. 어떤 특정한 숫자가 아니라 그냥 작기만 하면 됩니다.
여기서 정해진 해시값이 바로 블럭헤더에 들어가있는 난이도 목표(bits)입니다. 이 난이도 목표를 해시한 값보다 블록을 해시한 값이 작으면 블럭 생성에성공한 것입니다. 위 링크 글에서도 봤듯이 30이라는 숫자 중 20보다 작은 숫자중 하나를 찾는것보다 10보다 작은 숫자를 찾는게 어렵습니다. 따라서 이 난이도 목표가 작아질 수록 블록 생성이 어려워지게 됩니다.
이런 난이도 목표를 만든 이유는 블록 생성 시간을 대략 10분에 하나로 유지하기 위함입니다. 사토시 나카모토가 블록체인을 만든 2009년에 비교하면 지금의 컴퓨터는 너무 좋아졌고 비트코인 채굴에 최적화된 그래픽 카드도 만들어졌는데 지금도 10분의 하나를 유지하고 있는 이유가 바로 저 난이도 목표 라는 시스템 때문입니다.
10분이라는 시간은 길게도 느껴지지만 사토시 나카모토에게는 거래내역들을 취합하고 분기(포크)가 일어나도 다시 취합되는 과정에 적당한 시간이라고 생각한 듯 합니다.
난이도 목표는 매 2016번째 블록이 생성될 때마다 변합니다.(왜 2016번째인지는 잘 모르겠네요..이것도 아시는 분이 어딘가 계시겠죠?ㅎ) 시간으로 하면 약 2주가 되고 2016개의 블록이 2주보다 빨리 만들어졌으면 난이도가 올라갑니다.(목표값이 작아짐)

난이도.jpg(이미지 출처 : fork.lol)

그림에서 보듯이 11월 24일 조금 낮아졌다가 2주가 안되 2016개가 생성되어 난이도가 올라가고 19일이 되기 전에 또 난이도가 올라간 것을 볼 수 있습니다.

이제 하나의 매개변수 난스(nonce)가 남았네요. 난스는 저 목표치보다 낮은 값을 찾기 위해 대입하는 숫자입니다. 0부터 1,2,3,4.... 이렇게 해시 함수에 넣게 됩니다. 블록헤드의 나머지 값들은 고정이고 이 난스만 1씩 증가하면서 다른 해시값을 찾는 것입니다. 첨에 블록체인의 원리를 접할 때 어려운 수학문제를 풀어서 블록을 생성한다는 이야기를 많이 들었습니다. 하지만...현실은 어려운 수학문제가 아니라 귀찮은 수학문제더군요. 물론 저 해시함수는 어려운 수학문제가 맞겠죠. 하지만 정작 하는 일은 1씩 더해서 계속 넣어보는 것입니다.(작업증명이라고 하는 이유를 아시겠죠.ㅎ)
이 난스를 대입하는 것도 컴퓨터가 발전함에 따라 문제점이 생겼는데 처리속도가 너무 빨라져서 쓸 난스의 숫자가 부족하다는 겁니다. 난스는 42억번 정도 넣을 수 있는데 현재 컴퓨터 처리속도로는 금방 다 써버리고 저걸 다 써도 못 발견할 수가 있다네요. 그래서 처음에는 블록헤드의 타임스탬프를 조정하는 방식으로 하다가 이제 그것도 안되서 위에 코인베이스 거래에 남는 공간을 추가 난스 공간으로 사용한다고 합니다.(그냥 우선은 참고로만 알아두세요.)
이렇게 어마어마한 숫자를 돌려가면서 목표치 미만의 해시값을 발견하면 블록완성!

4. 블록 완성!!! 끝?

이러면 수학문제 열심히 풀고 답안지에 안 적는 꼴이겠죠. 위에서 잠깐 분기에 대한 내용이 나왔듯이 그 다음에 할 일은 각 노드에 전파하는 것입니다. 네트워크의 노드들이 자신이 만든 블록을 검증하고 체인에 연결시킨뒤 그 뒤 블록을 만들게 해야하는 것이죠. 또한 다른 노드가 자신과 동일한 높이의 블록을 동시에 생성했을 수도 있으니 자신이 만든 블록이 가장 긴 체인에 붙을 수 있도록 가능한 한 많은 노드에 전파되어 그 뒤에 새로운 블록이 붙어야합니다. 만약 이렇게 안되고 동시에 생성된 블록 중 다른 블록이 더 긴 체인을 만든다? 그럼 실컷 만들고 꽝입니다. 이 블록은 잠시 저장되었다가 더 긴 체인이 확정되는 순간 버려지게 되죠.
이렇게 가장 긴 체인에 연결된 블록임이 확정되면 한 개 블록의 생성은 끝나게됩니다.

자 블럭체인 인포에서 저희가 살표 봤던 내용들을 한번 보죠.

블록 생성.jpg

높이에 500067(mainchain)이라고 붙어있으니 이 블록은 가장 긴 체인에 연결된 블록입니다.
2번째 항목 '해시'가 'Bits'라고 쓰여있는 난이도 목표를 해시한 값보다 작으니 블록이 생성되었을 것입니다.(저거 해시해서 보여드리면 참 좋을텐데..죄송하네요.ㅎ)
해시 난수(nonce)는 2866633224로 이 숫자를 넣어서 목표값을 만들었나보네요.
하나하나 보시면 저희가 공부한 타임스탬프(시각)도 있고 머클루트도 있고 블록에 들어가는 목록이 다 있습니다.
한번 찬찬히 보시고 생각해보세요^^

이상으로 블록의 생성에 대해서 알아봤습니다. 비트코인을 채굴하는 것에 대해서도 다른 이야기들이 있는데 간단하게라도 따로 글을 쓰겠습니다. 넘 길어지는 거 같아서...(사실 잘 몰라서..ㅠㅠ)

잃어보시구 잘못된 점 있으면 꼭 지적해 주세요~^^
긴 글 읽어주셔서 감사드립니다!!

비트코인 백서부터 시작합니다
[비트코인트리1-1] 블록이란 무엇인가
비트코인 백서부터 시작합니다(2)
비트코인 백서부터 시작합니다(3)
비트코인 백서부터 시작합니다(4)
비트코인 백서부터 시작합니다(5)
비트코인 백서부터 시작합니다(6)
비트코인 백서부터 시작합니다(7)
비트코인 백서부터 시작합니다(8)

참조 :
[개론]비트코인 블록체인 개론 - Introduction to Bitcoin Blockchain - 한승환 brunch(Dec 21.2016)
책 "비트코인, 블록체인과 금융의 혁신"(안드레아스 M. 안토노풀로스)
비트코인 채굴은 프로그래밍적으로 어떻게 되는 것인가? - @jayground8

Sort:  

이걸 다 공부하신 건가요? ㅇ_ㅇ tip!

대단하세요. 제게는 알면 알 수록 어려운게 암호화폐라서. ㅠ

저두 태생이 문과생이라 차근차근하고있어요 ㅎ 전 문과생인데 왜 초코렛님 김치글처럼 글을 못쓰는걸까요 흑흑
글 남겨주셔서 감사합니다^^

아 문과생이셨군요. 저는 예대 나왔거든요. ㅎㅎㅎ

@feyee95님은 문과생이신데 코인에 대해 잘 아시고, 예대 나와서 글 쓰고 있는 저를 보면 그런 거 다 부질 없나봐요. :)

그냥 언제 열심히 했나 차이겠죠 뭐.ㅎㅎ
좋은 밤 되세요^^

Coin Marketplace

STEEM 0.16
TRX 0.15
JST 0.027
BTC 60256.67
ETH 2327.64
USDT 1.00
SBD 2.46