[비트코인 트리 1-1] 블록이란 무엇인가
@yellowboy10님 덕에 방송 탔네요.ㅎㅎ 앞으로 제가 가야할 길에 대해 방향 제시를 해주셔서 리스팀했습니다.
문제의식을 던지고 그것을 어떻게 해결해나가는지 알아보기에는 아직 제가 아는 게 너무 얕다는 생각을 했습니다.
이 글도 사실 저번주에 거의 다 작성했는데 생각해 볼 시간이 필요해서 오늘에야 올립니다.
기본적인 것부터 하나하나씩 들어가겠습니다.
비트코인은 블록체인 기술의 하나일 뿐이라고 하기엔 이미 너무 커버렸지만 그래도 블럭체인이 뭔지는 알아야 비트코인도 알 수 있다고 생각합니다.
그래서 "비트코인, 블록체인과 금융의 혁신 책" 과 검색한 자료들을 바탕으로 우선 블록이 뭔 지부터 알아보겠습니다.
대부분의 사람들이 아는 것처럼 블록은 쉽게 하나의 택배상자입니다.
여기에 자신이 보내고 싶은 물건들을 담아 보내는 하나의 도구이죠. 하지만 택배상자처럼 그냥 버려지는 종이박스가 아니고 중요한 기본 내용을 담고 있습니다.
그럼 하나씩 알아봅시다!
자 저희가 새로운 사람이나 물건을 만나게 되면 가장 먼저 하는 일이 뭘까요?^^
넵! 통성명을 하거나 상품의 이름이 뭔지를 알고싶어 하죠.ㅎ
블록에도 이름이 있습니다.
현재 가장 최근에 만들어진 블록의 이름은 #499202네요. 이 이름은 499202번 째 만들어진 블록이라는 것을 뜻합니다. 흔히들 번호로 말해서 Number가 될 것 같지만 블럭체인 인포나 영문 사이트에서는 Hight라는 말을 씁니다. 블록체인을 길게 이어진 수평선으로 보는 것이 아니라 한칸 한칸 쌓아나가는 탑으로 생각하기 때문에 높이라는 말을 쓰는 거죠.
하지만 이 Hight는 정확한 블록의 호칭이 아닙니다. 블록체인에 연결되어 다음 블록이 몇 개 붙은 경우(위 499202번 째 블록의 경우 그 위에 499203, 499204, 499205...) 확실한 호칭이 될 수 있겠지만, 최신 블록의 경우 거의 동시에 똑같은 높이의 블록이 다른 곳에서 생성된 경우가 있을 수 있기 때문입니다. 이것에 관한 설명은 제 백서설명글(5) 네트워크 부분에 있습니다. 이전 블록인 499201 블록의 해시를 가진 블록이 2개가 생성될 수 있고 그 2개의 높이도 우선 똑같이 #499202 블록이 됩니다. 이런 경우를 분기(fork)라고 하고, 이 분기는 낮은 확률로 다음 블록까지 연결될 수 있습니다.(분기(fork)는 간단히 체인이 포크모양처럼 갈라지는 것을 말합니다.) 결국에는 가장 긴 체인으로 통합되지만 이런 문제로 잠시 동안이나마 높이(Hight)는 적절한 이름이 될 수 없는 것입니다.
블록의 정확한 이름은 TXID라 불리는 블록의 해시값입니다. 블럭체인의 원리를 설명하면서 이 블록의 해시값이 다음 블럭에 포함되면서 블록체인을 연결시키는 중요한 고리가 된다고 말씀드린 적이 있습니다.
#499202 블록의 경우 0000000000000000009c5540e953869ad8c2845c3335f76cd892db550d5d9aa4 라는 해시값을 가지고 있네요. 이 블록의 해시값인 TXID는 거래에서 쓰이는 TXID와 다른 의미입니다.(이럴거면 걍 블록 해시값을 Block ID 라고 쓰면 좋겠네요.) 거래시 거래내역을 확인하는 TXID(transaction id)는 말 그래두 그 해당 거래를 해시한 값입니다.
예를 들어보면
12월 8일에 제가 BTC를 보낸 내용입니다.
(이미지 출처 : 블럭체인 인포)
빨간 박스 부분이 제가 만든 거래의 txid 이고 이것을 블럭체인 인포에서 검색하면
(이미지 출처 : 블럭체인 인포)
이렇게 제 거래에 대한 정보가 나오고 블록에 포함됨 에 있는 블록 번호를 클릭하면
(이미지 출처 : 블럭체인 인포)
이렇게 블럭에 대한 정보가 나옵니다. 빨간 박스 부분이 제가 말씀드린 블록의 해시값(TXID)입니다.
제가 저 두 가지가 좀 헷갈려서 자세히 적었습니다.
이름을 알았으면 이제 우찌 생겼나 봐야겠죠.
우선 몸집을 보면, 각 블록은 1MB 정도의 저장 용량을 가지고 있죠. 1MB 정도의 크기에 거래내역을 얼마나 담느냐에 따라 하나의 블록의 데이터량(weight)가 달라집니다. 요새같이 거래가 엄청난 때에는 거의 저 1MB를 다 채우고도 모자라겠죠.
좀 자세히 들어가보면, 블록은 크게 이 블록의 크기를 말해주는 블록 크기(4바이트), 블록 헤더(header, 80바이트), 바디에 들어가 있는 거래 내역의 수를 말하는 거래 카운터(1~9바이트) 그리고 바디(가변적) 이렇게 4 부분으로 구성되어있습니다. 위에 블럭체인 인포에 보시면 크기 와 거래수라는 항목에 블록 크기와 거래 카운터가 쓰여있습니다.
중요한 건 헤더하고 바디인데 헤더라고 하니 뭔가 머리를 쓰고 복잡한 일을 할 거 같고, 바디라고 하니 저의 더러운 몸뚱아리가 생각납니다. 이 헤더와 바디도 역시 비슷한 역할을 들을 하고 있습니다.
하나씩 살펴봅시다.
헤더는 80 바이트를 차지하고 다음의 6가지를 담고 있습니다.
1) 버전 version(4바이트)
말 그대로 이 블록헤더의 버전입니다(윈도우 7,8, 10과 같은). 현재 이 블록헤더를 만든 비트코인 프로그램의 버전 번호가 되겠지요.
2) 이전 블록해시 previousblockhash(32바이트)
블록체인이 검증 가능한 체인이 되는 중요한 이유입니다. 백서글(5)에서 설명했듯이 각 블록들은 이 이전 블록해시를 통해서 연결됩니다. 각 블록들이 이전 블록의 내용을 확인하고 저장하고 있으니 그 검증이 최초 블록(Genesis block)까지 이어지는 것이지요. 블록 중 중간에 하나를 고치려면 그 뒤에 모든 블록을 고쳐야하므로 각 블록의 거래내역들은 변경할 수 없는 영원한 기록이 되는 것입니다.
3) 머클 루트 merkle root(32바이트)
백서글(6)에서 설명한 머클트리의 루트부분입니다. 이 루트 부분이 SPV 노드를 가능하게 만들고 거래내역 검증을 쉽게 해준다고 설명드렸습니다. 비트코인 블록체인의 중요한 특징이니 이해가 안되시는 분은 저 글 안에 링크글이나 제가 리스팀한 글이라도 꼭 읽어보시길 바랍니다.
4) 타임스탬프 timestamp(4바이트)
자기 생일은 알아야죠. 블록의 대략적인 생성 시간을 말해줍니다. 특이한 것은 유닉스 기준일자 라는 것을 써서 1970년 1월 1일 자정부터 경과한 시간을 초 단위로 계산한 것이라네요. 이유가 뭔지....
5) 난이도(해시 목표값) bits(4바이트)
난이도는 블럭의 생성을 다루면서 좀더 자세하게 알아보려고 합니다.
백서글(4)에 이에 관한 설명이 있는데, 간단히 말씀드리면 블럭 생성은 약 10분에 하나씩 만들어지는 것으로 블럭체인 네트워크에 설정되어있습니다. 그러나 다른 중앙화된 시스템처럼 관리자 있는 것이 아니므로 네트워크 안에서 이 시간이 조정되게 만들어져있습니다. 그 시간을 조정하는 장치가 바로 이 bits라고 불리는 난이도(해시 목표값) 입니다.
6)난스 nonce(4바이트)
난스는 블럭을 만느는 과정에서 적절한 해시값을 찾는 재료입니다. 이것도 백서글(4) 설명되어 있듯이 0부터 1,2,3... 이런 식으로 1씩 올려가면서 적절한 해시값을 찾게 해주는 재료가 됩니다. 작업증명 방식의 유일한 변수가 되겠지요. 조금 더 자세한 내용은 역시 블럭생성에서 다루겠습니다.
이렇게 6가지가 블록헤더의 내용물입니다.(합쳐서 80바이트)
앞에서 말한 블록의 이름인 블록 해시값도 사실 이 블록 헤더를 해시한 것입니다.
다음으로 바디가 있습니다.
바디에는 어려운 게 없습니다. 우선 비트코인 블록체인은 비트코인 거래를 만드는 곳이니 많은 거래내역이 들어가겠죠. 그 거래내역의 크기에 따라 블록 하나에 들어가는 거래내역의 수는 달라질 것입니다. 그리고 그 용량에 따라 블록의 크기도 달라지겠죠.
이전 내용 수정하였습니다...이미 읽으신 분들 어쩌지..
바디에 머클트리를 따로 저장하진않는다고 답변을 받았습니다. 그냥 바디에는 input, output같은 거래 그 자체만 들어가있다고 하네요. 또한 TXID로 거래내역을 추척하는 것은 이 머클트리와는 관계없는 다른 메커니즘이라고 합니다. 머클트리는 검증(audit)할 때만 쓰이는 상징적인 것이라고 하시네요.ㅎㅎ
이 글에선 블록의 구성에 대해 알아봤습니다. 아무래도 제 백서글의 링크들이라도 읽어보셨거나 기본 지식이 조금 있어야(제 수준이 낮아 기본 지식의 수준도 낮습니다.ㅎㅎ) 이해가 되는 부분이 있으실 거라고 생각합니다.
저두 배워가는 과정이고 그것을 적는 것이라 쉽고 친절한 설명은 아닐 것 입니다. 또한 틀린 점이 분명 있을 수 있습니다. 제가 잘못 이해하고 있는 것은 지적해주셨으면 감사하겠습니다~ 좋은 자료 있으시면 댓글로 좀 나눠주시구요.ㅎ
백서글에서 가지를 뻗는 것이니 만큼 안 읽어보셨다면 제 전 글부터 읽어보심 좋을 거 같네요.ㅎㅎ(사실 안에 링크글을 쓰신 분들이 진국입니다.)
비트코인 백서부터 시작합니다
비트코인 백서부터 시작합니다(2)
비트코인 백서부터 시작합니다(3)
비트코인 백서부터 시작합니다(4)
비트코인 백서부터 시작합니다(5)
비트코인 백서부터 시작합니다(6)
비트코인 백서부터 시작합니다(7)
비트코인 백서부터 시작합니다(8)
참조 :
[개론]비트코인 블록체인 개론 - Introduction to Bitcoin Blockchain - 한승환 brunch(Dec 21.2016)
TwoGether, 비트코인의 블럭(block)에 대한 이해 1.(2014년 6월 18일)
HomoEfficio, Blockchain 기초 개념(jan 23, 2016 in BlockChain)
책 "비트코인, 블록체인과 금융의 혁신"(안드레아스 M. 안토노풀로스)
비트코인 시세 확인 - 코인바인
항상 좋은 글 많이 읽고있습니다!
글 하나하나에 노력이 많이 느껴지십니다!
저도 열심히 공부해서 좋은 글 많이 올리고 싶네요^^ㅎㅎ
감사합니다~~^^ 같이 공부해 나갔으면 좋겠네요.ㅎㅎ
많은 가르침 부탁드립니다!! 화이팅!
여기서 공부를 시작해야겠네요 !! 감사합니다!
여행 다니시는 분들 넘 부러워요.ㅎㅎ 저두 어디론가 떠나고 싶네요.ㅎ
댓글 감사합니다^^
오~좋은 포스팅입니다. 자주 보러 올께요
아공 감사합니다~~ 저두 자주 보러 갈게요.ㅎㅎ
시간이 최고의 선물이란 글 너무 좋네요.ㅎㅎ
안드로이드 앱은 잘 모르지만^^
성지가... 되지않을가... 싶습니다!
블록체인을 입문하는 누군가는 이글을 보고 시작하지않을가여? 응원합니다!
아공 지나친 과찬이십니다.ㅠㅠ 사실 저도 여기 훌륭하신 분들 글 보고 쓰는거라.ㅎㅎ
응원해주시니 더 열심히 해보겠습니다!!
감사합니다~~^^
유익한 글이네요! 나중에 시간내서 올리신 백서들도 전부 정독해봐야겠어요ㅎㅎㅎ
감사합니다~^^ 좀더 좋은 내용이 되도록 노력하겠습니다^^
일러스트 너무 이뻐욧!!!
블록체인에 대해 자세하게 설명해주셨네요, 감사합니다! 자주 보러오겠습니다ㅎㅎ
스팀잇에는 너무 좋은 글들이 많아서 부끄럽네요..ㅎㅎ
찾아주셔서 감사합니다~^^ 열심히 공부해서 또 글 올릴게요.ㅎㅎ
파이팅입니다.
응원해 주셔서 감사합니다~ 부족한 거 있으면 매몰차게 지적해주세요^^
열심히 해보겠습니다!
저도 밋업때의 열띤 토론 속에서 조금씩 관심을 가지게됐어요ㅋㅋ백서 쭉 읽어보겠습니닷:)
우선 일본부터 다녀오셔야죠! 마음의 준비를 단단히 해야 그 무섭다는 놀이기구를.ㅋㅋㅋㅋ
여행 건강히 잘 하고 오셔요.ㅎ 담에 만나면 무용담을 들려주시구.ㅎ
감사합니다~
글들이 너무 좋습니다 !!! 여기서 많은 걸 공부할 수가 있을 것 같아 팔로우 합니다. 제 보팅은 티도 안나겠지만 감사의 마음으로 보팅하고 갑니다 ^ ^
댓글만 달아주셔도 너무 감사합니다~^^
스팀잇에서 같이 공부해요 ㅎㅎ