* 비유는 접근성을 높일지라도 본질을 흐리기 마련입니다.
이 포스트는 학습 과정에서 그 내용을 기록한 글이기에 부정확한 정보가 포함될 수 있습니다.
특히나 이번 블록체인의 경우 reference가 상대적으로 적어 더욱 미흡한 점이 있을 수 있습니다.
또한 너무 자세한 내용은 글의 길이를 위해 과감히 삭제한 부분도 존재합니다.
따라서 해당글은 참고용으로만 봐주시고 틀린 부분이 있다면 알려주시면 감사하겠습니다.
* 해당 글은 저술가이신 유튜버 김필산님의 채널 '김필산의 사이언스 비치' 내 동영상 일부를 참고하여 작성하였습니다. 개발 지식이 전무한 일반인이시면 아래 링크된 채널도 방문하여 영상을 시청하시는걸 추천합니다.
평소 블록체인에 대해 대략적인 개념만 알고 있던 차에 즐겨보던 유튜버인 김팔산님의 블록체인 관련 영상이 올라왔고 마침 시기도 시기인만큼 좀 더 자세히 알아보고 싶어 블록체인에 대해 조금 학습했고 그에 대한 기록을 하고자 합니다.
아무래도 해당 코인 급락 사건을 접하고 이 글을 보러오신 분들이 존재하실텐데 자신이 정보의 가치, 블록체인의 원리나 한계같은 것에는 관심이 없다 하시는 분들은 맨 아래 링크한 유튜버 슈카월드님의 영상을 보시는 걸 추천합니다. 위와 관련된 스테이블 코인이나 NFT에 관한 내용은 이 다음 포스트를 참고하시길 바랍니다.
Index
1 가치, 그리고 화폐
2 신용, 탈중앙화
3 정보의 가치, 블록체인
4 블록체인의 원리
5 블록체인의 특성
6 작업 증명, BFT(Byzantine Fault Tolerance)
7 취약점으로 인한 한계
우선 블록체인에 대해 다루기 전에 서론으로 정보에 대해 짧게 학습하고자 합니다. 일단 정보(Infomation)란 수집된 데이터를 바탕으로 해석, 정리되어 전자적 방식의 부호, 문자, 음성, 음향 및 영상 등으로 표현하는 모든 종류의 자료 또는 지식을 의미합니다. 그렇지만 사실 제가 말하고 싶은건 이런 정의보다는 정보가 유형의 재화와 대비되는 요소가 무엇인가입니다.
유형의 재화와 정보는 사람의 필요에 의해 다뤄진다는 공통점이 존재하는 것과 같이 서로에 대해 관련된 점을 얘기하자면 다룰 것이 더 많지만 이 글에선 그 중 '원본과 사본'에 대한 내용에 집중해보려 합니다. 일단 유형의 재화는 원본이 절대 유일하며 사본이라 칭할 수 있는 필사본, 모조품 등이 존재할 수야 있겠지만 근본적으로 그 하나하나의 개체마저 서로 구별됩니다. 하지만 정보는 원본이 생성될때 절대 유일하지만 그것이 복사되어 사본이 되면 두 정보는 구별할 수 없게됩니다. 따로 원본과 사본을 구분할 수 있는 장치를 심어둘 수는 있겠지만 근본적으로 유형의 재화가 분자 구조까지 똑같도록 조작이 불가능한 것과 달리 정보는 그 장치마저 조작이 가능합니다.
이 차이점을 소개한 이유는 이동과 복사에 대한 이야기를 하기 위함입니다. 유형의 재화를 모방하여 모조품을 만드는 행위를 복사라고 가정한다해도 유형의 재화가 누군가에게 이동하는 것은 그 자체로 소유권이 이전된다는 것이고 이를 개발로 따지면 더이상 쪼갤 수 없는 단위인 '이동'이란 쿼리 한 줄을 실행하는 것입니다. 하지만 정보의 복사와 이동은 그것과는 결이 조금 다릅니다. 원본이 복사되어 사본이 생성되면 별도의 장치가 없는한 둘은 구분되지 않습니다. 그렇기 때문에 정보의 이동이란 1 원본의 복사 2 사본의 전달 3 원본의 삭제 라는 한 사이클을 가지며 개발로 따지면 이동이란 한 트랜잭션 안에 1, 2, 3 쿼리가 존재하는 것이죠.
가치, 그리고 화폐
정보에 대해 말하는건 잠시 접어두고 이번엔 가치라는 것에 대해 말해보려 합니다. 가치의 정의는 간단하게 사물이 지닌 쓸모나 인간에 의해 지니게 되는 중요성입니다. 이 중 과거부터 통용되었던 가치의 정의는 사물이 지닌 쓸모겠네요. 그렇기에 이 정의에 따라 우리에게 금은 '가치를 가진 물건'이지만 당장의 생존에 급급했던 원시인들에게 금은 '반짝이는 돌' 그 이상 그 이하도 아니었을 것입니다.
하지만 오랜 기간 사물 자체의 쓸모라는 의미를 지니던 가치에 시간이 흘러 인간에 의해 지니게 되는 중요성이란 의미도 포함되었습니다. 당장에 우리가 사용하는 지폐는 인간이 부여한 화폐라는 가치를 없애는 순간 종이쪼가리에 불과할 뿐이니까요. 대부분이 알고계시겠지만 혹시 모르니 화폐의 역사에 대해 짧게 소개하고자 합니다.
수렵, 채집을 하던 인류의 초창기, 그 때 화폐란 존재하지 않았습니다. 쓸모있는 재화를 습득하는 순간 당장의 생존에 소모되던 그 시대에 교환을 위한 잉여 재화란 존재하기 힘들었으니까요. 하지만 인류는 농업이라는 혁명을 맞이하게되고 그것은 잉여 재화가 존재할 수 있게끔 했습니다. 대표적으로 생존에 필요한 식량이 농사를 통해 충분해지게 되었고 이제 인간은 생존이 아닌 활동을 할 여력이 생겼습니다. 그 잉여 생산물을 보관하고 자신이 살 집이 필요했고 그것을 지키거나 혹은 뺏기 위해 무기도 필요했습니다. 그 과정에서 부족이라는 사회 집단이 탄생했고 이제 사람들은 효율을 생각하여 누구는 농사를 누구는 부족을 지키는 싸움을, 또 누군가는 도구를 만드는 일 등으로 분업을 하기 시작했고 이제 식량만이 아닌 자재, 무기, 치장 등 도구를 부족 내에서 본인의 필요에 의해 교환하기 시작합니다.
물품을 거래하기 시작했고 기본적으로 농경 사회다보니 제일 가치 있고 접근성이 뛰어난 것은 쌀이었습니다. 그렇기에 모든 도구들을 거래할 때 그 도구에 값어치를 매기기 시작했고 그 값어치의 단위는 쌀이 되었습니다. 최초의 상품 화폐는 쌀과 같은 작물이었을 겁니다. 하지만 만들기 힘든 도구의 값어치에 해당하는 쌀은 너무 무거웠고 휴대 역시 불편했습니다. 그러자 사람들은 조개껍데기나 옥과 같은 보석 등 쌀을 대신할 교환의 매개수단을 찾기 시작했지만 조개껍데기같은 것은 너무 흔했고 옥과 같은 보석 등은 너무나 귀했습니다.
여기서 이런 비금속 상품 화폐를 대체할 금속 화폐가 등장합니다. 지역에 따라 다르지만 구리, 은, 금 등의 그 지역에서 수량이 제한적이지만 너무 희귀하지는 않은 금속을 금속 화폐로써 사용하게 됩니다. 하지만 이 금속 화폐도 조금 나아졌을 뿐이지 매번 무게를 달아야하고 순도 같은 것을 속일 수 있기에 화폐로써 한계가 존재했고 여기서 금속을 주조하여 규격화된 주화가 등장하게 됩니다.
주화의 등장으로 규격화된 거래가 가능해지긴 했으나 중세를 넘어가면서부터 주화로 값을 매기기에 너무 큰 상품들이 등장하게 되고 이런 상품의 거래에서 주화의 휴대성은 그다지 좋지 않았습니다. 그리하여 주화대신 어음 형태의 지폐가 등장하고 시간이 지나 어음 형태이던 지페가 태환 및 불환화폐로 발전하게 됩니다.
그런데 갑자기 제가 왜 화폐의 역사에 대해 언급했을까요? 그것은 화폐는 가치의 변천을 가장 잘 나타내는 수단 중 하나이기 때문입니다. 작물이나 보석 등의 상품 화폐까지는 그 화폐의 가치란 사물이 가진 쓸모에 비례했습니다. 하지만 주화를 거쳐 지폐로 화폐가 발달하며 그 가치는 사회적 합의가 부여한 액면이며 그것은 인간에 의해 지니게 되는 중요성입니다.
신용, 탈중앙화
현대에 이르러 화폐에 부여된 사회적 합의란 보통 국가가 법으로 통용을 보장하는 법화의 형태로 구현됩니다. 국가는 이 기능을 유지하기 위해 중앙 은행을 설립했으며 화폐는 쓸모 그 자체가 아닌 그 화폐를 발행하는 중앙 은행의 권위와 신뢰에 의해 가치가 부여됩니다. 그 중 가장 권위 있는 화폐는 기축 통화인 달러인 것이구요. 하지만 이 달러조차도 '중앙 은행의 권위와 신뢰'가 무너진다면 휴지조각으로 변모할 것입니다. 이렇게 지금의 화폐는 그 국가의 신용에 의해 가치가 변동됩니다.
신용(Credit)이란 신뢰(Trust)와 같은 의미이지만 '너를 믿는다'에서 출발하는 신뢰와 달리 신용은 '너를 믿지 않는다'에서 출발하는 믿음입니다. 그렇기에 국가의 신용을 불신한다는 경제적이며 정치적인 이념에서부터 비트코인이 대두됩니다. 아마도 국가의 경제 체제 유지를 위해 중앙 은행이 화폐의 가치를 임의로 조정하며 돈을 찍어 발생하는 인플레이션, 시뇨리지 등이 그 배경이 될 것입니다. 이에 대해 더 궁금하시다면 맨 아래 링크의 유튜브 영상을 참조하시길바랍니다.
지금껏 많은 비트코인 찬양론자들이 주장하는 '탈중앙화'에 대해 언급하기 위해 이렇게 긴 서론을 작성했습니다. 다른 많은 이유들이야 물론 존재하겠지만 제멋대로 화폐의 가치를 조정하고 자산의 불균형을 해결해주지 못하는 국가의 신용을 믿지 못하기에 탈중앙화라는 keyword에 많은 사람들이 반응한다고 생각합니다. 하지만 그 탈중앙화라는 정치적인 요소에만 집중하면 은행 등이 블록체인을 이용하는 등 알수없는 의문들이 많습니다. 그래서 저는 탈중앙화에 대해 다루기 전, 이렇게 대두된 비트코인이 과연 지금의 인기만큼이나 가치가 있는 것인지 정치적인 이념을 떠나서 그 근본 기술인 블록체인의 원리를 이해하는 것부터 천천히 알아보려고 합니다.
정보의 가치, 블록체인
김필산님의 영상 중에 경영 컨설턴트인 돈 탭스콧은 강연에서 블록체인 기술을 '가치의 인터넷(Internet of Value)'이라고 표현하였습니다. 이 문장이 블록체인 기술을 왜 만들었는지 가장 잘 나타내었다고 생각합니다. 그렇다면 지금까지 블록체인이 적용되지 않고 사용해오던 인터넷은 가치가 없다는 의미일까요? 그런 것은 당연히 아니겠죠. 그렇기에 이에 대해 얘기해보려합니다.
서두에서 정보의 복사와 이동과 가치의 정의에 대해 언급했었고 이 얘기를 다시 해보려합니다. 앞서 정보는 원본과 사본이 반드시 존재하지만 특별한 장치 없이는 원본과 사본을 구별할 수 없다고 했었습니다. 그렇다면 정보의 복사를 통해 사본은 무수히 많이 생성될 것이며 이 사본 자체가 원본과 동일합니다. 그렇다면 이렇게 무제한으로 자기 복제가 가능한 정보는 공개되었을때 어떤 가치를 가지나요? 아마 학술적인 의미를 제외한다면 우리가 생각하는 재화로써의 가치가 거의 없겠죠. 만약 그 정보가 비공개거나 이동이란 한 트랜잭션(사이클)을 거쳐 복사 후 삭제가 이루어져 유일성이 유지되는 경우가 아니라면 복사라는 행위는 큰 가치 하락을 일으킬겁니다.
여기서 이 공개된 정보에 재화로써 가치를 부여할 수 있도록 블록체인이 등장했습니다. 그렇기에 돈 탭스콧은 정보에 가치를 부여하는 블록체인 기술을 가치의 인터넷이라고 표현했습니다. 그러면 도대체 블록체인이 어떻게 정보에 가치를 부여할 수 있다는 것일까요?
블록체인의 원리
경제학자이자 사상가인 칼 마르크스는 노동가치론에서 상품의 가치란 노동'만'이 부여하며 가치의 크기는 노동 시간에 비례한다는 말을 합니다. 물론 매우 논란이 되는 이론이며 저 역시도 크게 동의하지는 않지만 '만'을 제외한다면 일리가 있다고 봅니다. 만약 당신이 바탕화면에서 폴더를 생성하는 일을 하고 있다고 가정해보죠. 폴더를 생성하는 행위 역시 노동입니다만 클릭 한 두번으로 이루어지는 매우 간단한 노동입니다. 그런데 당신이 생성하는 폴더 하나하나가 갑자기 만 원이 되는 일이 발생합니다. 그렇게 되면 누구나 폴더를 찍어내는 일을 할 것이고 초 인플레이션하여 원화가 휴지조각이 되는 일이 생길겁니다.
이 예시에서 인플레이션이 발생한 근본적인 원인이 무엇일까요? 당연히 누구나 쉽게 간단한 노동으로 생성할 수 있어 가치가 거의 없던 단순한 폴더에 만 원이라는 액면가를 부여한 것이 문제입니다. 그런데 이 말도 안되는 예시는 사실 따지고보면 국가에서 돈을 찍어내는 일과 같습니다. 따라서 누군가 멋대로 무언가에 가치를 부여하거나 복사가 가능하여 가치를 하락시키는 행위가 벌어지는 지금, 그것과 대비되는 의미를 내비치며 블록체인이 등장합니다.
블록체인(BlockChain)이란 말 그대로 블록(Block)이 체인(Chain)에 감겨있듯이 하나로 쭉 이어지는 특성을 갖는 분산 컴퓨팅을 기반으로 한 데이터 위변조 방지 기술입니다.
이 체인에서 block은 한 줄로 쭉 이어집니다. 또한 block은 하나씩 생성됩니다. 이 뻔해보이는 성질들은 블록체인의 중요한 특성 중 하나인 chain의 유일성을 보장합니다. 이 유일한 체인은 정격 체인이라 불리며 체인이 중간에 둘로 갈라지는 순간 체인의 유일성이 깨지기 때문에 이는 금지됩니다. 뒤에서 소개하겠지만 이런 경우 갈라진 분기에서 분리된 체인은 그 순간 개별의 개체가 됩니다. 예를 들어 깃의 Repo에 branch가 두개로 갈라지는 순간 각 branch는 각각의 Repo가 된다고 이해하면 편합니다.
이 분기가 나뉘는 현상에 대해선 뒤에서 또 언급하도록 하고, 체인의 유일성을 지켜 정격 체인이 하나 존재하고 이 체인에서 새로운 block을 생성하는 작업은 폴더를 생성할 때처럼 쉬운 일이 아니라 채굴을 통해 이루어집니다.
이 채굴이라는 행위는 퍼즐로 비유되곤 하지만 절대로 인간이 풀 수 없고 컴퓨터만이 가능한 노가다입니다. 이런 채굴 과정이 끝나고 block이 생성되어 체인이 이어진다는 것이 블록체인의 기본 원리입니다. 여기서 채굴이라는 노동의 대가로 블록이 생성되면 주어지는 보상이 비트코인이죠. 이처럼 비트코인은 블록체인 기술을 의존하고 있는 요소의 일부일 뿐이지만 일반적인 사람들은 이 블록체인보다는 비트코인에 더 큰 가치를 부여하곤 합니다.
block이 생성되고 기여자들에게 보상이 지급된 내역은 생성된 block에 기록됩니다. 블록은 크게 헤더와 바디로 되어 있습니다. 헤더는 SW 버전, 난이도, 이전 블록의 해시값 등 생성 정보를 포함하고 있는데 그 중 가장 중요한 것은 Nonce라는 임의 값입니다. 난스, 논스, 넌스 등 많은 표기법들이 있지만 넌스라 하겠습니다. 이 넌스는 중요하니 기억하고 게시길 바랍니다. 헤더 밑의 바디는 채굴에 대한 보상으로 비트코인을 송금한 트랜잭션(거래 내역)이 기록됩니다.
혹시나 해시함수와 해시값에 대해 잘 모를 수도 있기에 짧게 설명하면
해시 함수란 x에 어떤 임의의 값을 넣어도 y는 고정된 길이를 가지는 값이 나오는 비가역적인 단방향 함수를 의미하며
여기서 고정된 길이를 가지는 y값이 해시값이고 단방향이고 비가역적이기에 y를 통해 x를 유추하기 힘들뿐 아니라 x가 조금만 달라져도 y가 x의 변화량과 무관하게 급격히 변화하므로 대표적으로 보안에 있어 널리 사용됩니다.
위에서 블록의 헤더와 바디, 체인의 유지 방식들을 각각 간단히 소개했으니 이제 채굴의 과정을 이해할 수 있습니다.
1 채굴 과정을 통해 새로운 블럭을 생성하기 위해선 이전 블록의 해시값을 먼저 알아야 함
2 블럭의 헤더에는 SW 버전, 머클루트, 이전 블록의 해시값, 비츠&넌스, 타임스탬프가 기록됨
3 새로운 블록의 생성은 이전 블록을 해시함수에 넣어서 행해짐
4 바디에 트랜잭션이 기록되며 이후 블록의 생성시마다 보상 코인이 줄어들고 채굴 난이도가 증가함
1 채굴 과정을 통해 새로운 블럭을 생성하기 위해선 이전 블록의 해시값을 먼저 알아야 함
- 블록 체인에서 모든 블록은 한 방향으로 되어 있는 체인에 묶여 있어야 하기에 생성되는 블럭은 이전 블럭의 주소를 가리키는 포인터 역할을 할 이전 블럭의 해시값을 알고있어야 합니다.
2 블럭의 헤더에는 SW 버전, 머클루트, 이전 블록의 해시값, 비츠&넌스, 타임스탬프가 기록됨
- 이 요소들 중 알아야할 것은 머클루트(해시값), 이전 블록의 해시값, 비츠&넌스 세가지입니다.
$ 머클루트
- 머클루트란 쉽게 일종의 트랜잭션들의 해시값들을 이용해 트랜잭션이 변경될 경우 데이터를 보호하기 위한 장치입니다. 좀 더 자세히 설명하면 블록 하나에 들어있는 모든 트랜잭션마다 고유의 해시값이 존재할텐데 그 해시값들을 가까운 순서들끼리 둘씩 뭉쳐 그 그룹 자체를 해시화하고 이 과정을 하나의 해시값이 남을때까지 반복하여 얻는 해시값이 머클루트입니다. 둘씩 뭉쳐 해시화하는 과정에서 토너먼트 모양의 대진표가 만들어질텐데 이를 머클트리라하며 머클루트는 이 트리의 최상단에 존재합니다.
이 블록에서 한 트랜잭션이라도 임의로 변경되는 경우 머클루트가 변경되기 때문에 보안이 유지되며 헤더에 저장되는 머클루트 값은 고작 32byte에 불과하기에 참여자들은 모든 거래내역을 조회할 필요 없이 이 작은 값만 알면 필요한 정보를 블록에서 가져올 수 있기 때문에 접근성이 매우 높아집니다.
$ 이전 블록의 해시값, 비츠&넌스
- 체인은 한 방향으로 이어져야하기에 새로 생성되는 블록의 헤더에는 이전 블록의 헤더에 기록된 해시값을 가지며 이전 블록의 트랜잭션이 임의로 변경되면 해시값이 서로 달라지기때문에 데이터의 안전성을 보장할 수 있습니다. 이렇게 이전 블록의 해시값을 순차적으로 새로운 블록이 기록하는 특성을 가지기에 외부에서 특정 블록을 건드린다면 위조한 해시값이 나오도록 하는 입력값을 알아내야 하며 이 과정을 끝없이 되풀이 해야하기에 블록의 위변조는 불가능합니다.
비츠(Bits)&넌스(Nonce)는 예시를 통해 이해하는 것이 편할 것 같네요. 앞서 해시함수는 y의 자릿수가 정해진 단방향 함수라고 언급했었는데 만약 해시 함수에 초기에 1을 넣고 그 다음부터 하나씩 수를 올려가며 넣으면 y인 해시값은 규칙성이 없이 랜덤하게 변할 것입니다. 아래는 y의 자릿수가 6으로 정해진 해시함수를 나타낸 그림입니다
그런데 누군가 이 아무런 규칙성을 띠지 않는 y의 6자리 중 앞 4자리를 0으로 만드는 x값을 찾으면 상품을 준다고합니다. 예를 들어 '0000xx' 같은 값 말이죠. 인간은 이 문제를 혼자 힘으로 풀기 힘듭니다. 어떻게 사람의 머리로 랜덤으로 출력되는 y을 가지고 x를 찾을 수 있겠어요. 하지만 컴퓨터라면 충분히 가능합니다. 어떻게요? 나올때까지 노가다하면 됩니다.
이 예시에서 x에 더했던 1, 2, 3 ... 이 숫자들을 Nonce(임시값)이라 부르며 상품을 받기 위해 찾아야하는 정답 해시값의 앞자리 숫자 0000이 Bits의 역할을 합니다. 0000같은 이해하기 쉬운 예시를 사용했지만 실제 비츠는 408782234와 같은 임의의 특정 숫자값이고 저장 방식은 지수와 계수 등을 사용합니다. 따라서 이 블록체인을 만든 사람이 비츠를 조정하며 해당 체인의 채굴 난이도를 정합니다.
3 새로운 블록의 생성은 이전 블록을 해시함수에 넣어서 행해짐
- 채굴 과정이 끝난 한 블럭은 헤더와 바디가 존재하고 헤더에는 아까 말한 이전 블록의 해시값, 머클루트(해시값), 비츠&넌스 등이 기록되어 있고 바디에는 채굴에 기여한 사람들의 트랜잭션들이 기록되어 있습니다. 이제 헤더와 바디가 포함된 블록 자체를 해시로 변환한 뒤 x값이 되어 통째로 해시함수에 집어넣게 됩니다. 당연히 특정 비츠를 만족하도록 해시값이 나와야할테니 넌스를 변경해가며 말이죠. 만약 99번째 블록이 생성 된 후 채굴이 진행한다 해보죠.
넌스를 변경하다 비츠와 일치하는 해시값을 발견하게 되면 그때의 정답 넌스값과 정답 해시값이 새로 생기는 100번째 블럭의 헤더에 기록되며 체인이 이어지기 위해 이전 블록의 해시값 역시도 기록되게 됩니다.
4 바디에 트랜잭션이 기록되며 이후 블록의 생성시마다 보상 코인이 줄어들고 채굴 난이도가 증가함
- 이렇게 채굴이 끝나고 블록이 생성되면 기여자들에게 보상으로 비트코인이 지급되며 그 지급된 거래내역 트랜잭션들이 블록의 바디에 기록됩니다. 이후 트랜잭션들이 모두 승인되면 그 트랜잭션들의 값을 해시화하여 앞서 말한 머클루트 값을 얻은 뒤 헤더에 기록하며 블록의 생성 과정이 종료됩니다. 여기서 트랜잭션들이 승인되는 과정은 매우 중요하기에 이 내용은 바로 다음 다룰 것입니다.
한 블록의 생성이 끝나면 바로 다음 채굴이 바로 이어질텐데 여기서 문제가 하나 있습니다. 이렇게 채굴을 통해 매번 블록이 생성되는 과정이 동일하게 반복된다면 보상으로 받는 비트코인의 가치는 유지되는가 입니다. 채굴이라는 노동은 인간이 할 수 없고 컴퓨터만이 연산 가능한 문제이며 이 노가다 연산 능력이 가장 좋은 컴퓨터 연산 장치는 GPU(그래픽카드)입니다.
여기서 컴퓨터의 두뇌라 할 수 있는 CPU보다 GPU가 어떻게 더 성능이 좋을까란 의문이 들 수도 있는데 간단히 설명하면 GPU는 컴퓨터의 그래픽 연산을 수행하며 이 연산에서 주로 물체를 표현할 때 면들을 이루는 요소의 기본 단위를 폴리곤이라고 부릅니다. 따라서 정교한 그래픽이라는 것은 얼마나 폴리곤을 적절한 요소에 배치하여 텍스쳐를 표현하냐에 의해 결정되며 폴리곤 모델링은 CPU처럼 효율적인 논리 연산이 아닌 얼마나 많은 계산을 수행할 수 있냐가 중요합니다. 따라서 이처럼 단순한 계산 작업을 최대한 많이 할 수 있는 GPU가 채굴에 주로 이용됩니다.
채굴할 때 문제의 난이도가 늘 일정하다면 시간에 비례해서 비트코인의 개수가 끝없이 같은 속도로 증가하니 그것대로 문제가 아닐 수 없습니다. 그런데 채굴에 특화된 GPU를 사용한다면 거기서 더 그 속도가 증가할 것인데다 심지어 GPU의 성능은 시간이 흘러가며 계속 상승한다는 것을 생각하면 그 비트코인은 도저히 가치를 유지하기 어려울 것입니다.
그렇기 때문에 블록체인은 채굴을 진행함에 따라 새로운 블록을 채굴하는 난이도는 갈수록 상승하고 보상으로 주는 코인의 양은 점점 줄어들게 설계됩니다. 비트코인의 경우 사토시 나카모토가 최초의 블록인 제네시스 블록을 2009년에 채굴했을때의 보상은 50BTC였지만 2012년 11월에는 그 절반인 25BTC가 보상으로 지급되는 것처럼 반감기를 가지고 보상이 줄여들게 설계되었고 최후에는 2100만 BTC 이상으로는 채굴이 불가능하게 설계되어 있습니다.
하지만 GPU의 성능이 날이 갈수록 증가하기 때문에 보상만 줄인다고 능사는 아닙니다. 따라서 채굴 난이도 역시 증가하도록 설계되어 있습니다. 난이도 조정은 앞서 설명한 비츠값을 조절해서 이루어지며 비츠값을 16진수로 바꾸어 수를 쪼개 난이도 공식에 집어넣으면 채굴 난이도를 구할 수 있습니다. 비트코인의 경우 전세계에서 10분에 1블록이 생성되도록 채굴 난이도가 조정됩니다.
블록체인의 특성
블록체인은 중앙 서버가 존재하지 않는 P2P방식으로 참여자들이 각각의 노드가 되어 이 체인들의 내용을 모두 공유하며 서로를 감시할 수 있습니다. 이것이 블록체인에 사람들이 열광하는 탈중앙화와 투명성이라는 특성입니다. 또한 앞서 채굴의 원리에서 살펴봤듯이 블록체인을 이루는 정보들은 대부분 해시값으로 저장되기 때문에 해커가 임의로 해시값 하나를 수정한다면 앞서 연쇄된 모든 블록의 해시값을 변경해야하고 그를 다른 노드들이 가진 체인 정보와 대조할 수 있기에 정보의 조작 자체가 불가능합니다. 이것이 데이터 위변조 방지 기술인 블록체인의 보안성을 나타냅니다.
여기서 블록체인의 규모가 거대해지면 P2P 분산 시스템의 가장 큰 적인 DDOS 공격에 취약해지며 마이닝 풀이 거대해질수록 통신 속도는 점점 느려질겁니다. 따라서 블록체인에서 한 블록은 기본적으로 1MB 용량으로 제한됩니다. 이는 트랜잭션들을 일일이 텍스트로 기록하는 것이 아닌 저장 방식 대부분을 해시값으로 정했기에 가능합니다. 이런 블록 간의 적은 용량을 바탕으로 통신 속도의 저하와 시스템 부하를 통한 DDOS 공격을 최대한 방지할 수 있습니다. 너무 비대해지지만 않는다면 말이죠.
어쨋든 이처럼 블록체인은 중요한 특성들을 가진 혁신적인 기술임에는 틀림없어 보입니다. 실제로도 정보의 연쇄로 조작 자체가 불가능해 데이터 위변조를 방지하는 보안성은 훌륭하며 탈중앙화와 투명성이란 특성 역시 그 보안성을 강화해주기에 듣기만 해서는 완벽해보이기 마련입니다. 하지만 이 특성들이 존재한다고 블록체인이 마냥 완벽하지는 않으며 지금부터는 그에 대해 말해보겠습니다.
먼저 앞서 트랜잭션들이 승인되는 과정을 설명하지 않았고 이 과정에서 이해가 안되는 부분이 있습니다. 새로운 블록이 생성되는 과정이야 이해가 되지만 그 블록을 누가 만들었는지 확정하는 과정은 생각보다 쉬울 것 같진 같습니다.
예를 들어 git에서 협업을 하는 경우에도 reposiory의 일관성을 유지하기 위해서 커밋을 하기 전 push, pull, stash 등을 반드시 거쳐야하는데 그것을 지킨다고 해도 가끔 문제가 발생할만큼 여러 사람이 네트워크 안에서 하나의 파일을 관리한다는 것은 쉬운일이 아닙니다.
채굴 역시 하나의 체인을 P2P로 각 노드들(체인 참여자들)이 공유합니다. 그런데 채굴은 전세계에서 이루어지는데 지구 반대편에 있는 A, B가 동시에 100번째 블록을 채굴했을 때 과연 그 체인에는 어떤 블록이 기록되어야 정당한가요? 중앙 서버에 먼저 채굴했다는 통신이 도착한 쪽? 아니 근데 중앙 서버란게 없지 않나요?
이 문제를 해결하기 위해서는 P2P 네트워크에서 노드들간의 합의가 필연적이며 블록체인에는 고유한 합의 알고리즘이 도입되고 그것이 바로 작업증명(PoW, Proof of Work)입니다. 블록체인은 중앙에서 관리하는 서버란게 존재하지 않기때문에 새로운 블럭을 누가 생성했는지 판단하는 알고리즘을 정의해야합니다. 작업 증명은 기본적으로 앞서 말했듯 채굴이라는 행위를 통해 해당 블럭 소유권의 증명한다는 개념이지만 노드간 충돌되는 의견이 생길 때 누가 맞는지를 판단하는 절차를 진행해야하고 이 절차에서 작업 증명은 살짝 불합리해 보일 수 있는 로직을 보여줍니다.
작업 증명, BFT(Byzantine Fault Tolerance)
아까처럼 A와 B가 동시에 100번째 블록을 생성했다고 합시다. 체인이 두 개로 갈라질 수 없기에 두 사람을 모두 인정할 수 없으니 이 때 사람들의 의견은 100번째 블록을 생성한 사람이 A인지 B인지 둘로 갈립니다. 이 과정은 포크라 불리며 이 경우 아직 의견이 분리된 정도고 실제로 체인이 분리된 것은 아니기에 소프트 포크라 합니다. 소프트 포크가 된 두개의 체인은 그대로 채굴 과정을 이어갑니다. 이 때 일정 시간이 흘렀을때 A가 포함된 체인의 블록 수가 B가 포함된 체인보다 많다면 시스템은 과감하게 B가 포함된 체인의 유효성을 인정하지 않고 소프트 포크된 시점부터 채굴 과정이 전량 폐기됩니다.
이 작업 증명 알고리즘은 P2P 분산 시스템을 유지하기 위한 시스템 프로토콜이며 이를 통해 블록체인은 궁극적, 최종적 일관성이라고 불리는 Eventual Consistency가 유지 됩니다. 다음 포스트에서 또 다룰테니 Eventual Consistency는 체인이 소프트 포크되었을 때 일시적으로 참여자들의 DB에 누군가는 100번째 블록을 A가 캤다고, 누군가는 B가 캤다고 서로 다르게 업데이트되지만 정격 체인을 제외한 나머지의 탈락으로 결국 모든 DB에 A가 캤다는 최종 업데이트가 되어 일관성이 유지된다고 이해하고 넘어가시면 됩니다.
사실 이는 어떻게보면 B와 B를 지지하는 노드들의 입장에선 일견 불합리해보이지만 중앙 서버가 통제하지 않고 참여한 노드들에 의해서 체인의 유일성이 유지되어야 하기에 이런 방식을 유지해야만 하며 작업 증명에서 그 블록의 소유자가 누군지 노드들간에 합의하는 과정은 필수불가결하고 마치 선거와 비슷합니다.
선거에서 노드들이 투표권을 갖기 위해 각 블록이 본인들의 소유임을 증명하는 것이 작업 증명이라면 보상으로 주는 코인에 비례하여 투표권을 주는 지분 증명(PoS, Proof of Stake)이란 합의 알고리즘도 블록체인에 존재합니다. 이오스나 이더리움 캐스퍼같은 네트워크 등이 채택한 지분 증명은 어찌보면 투표인단을 선출하는 간접 민주주의와 비슷해보이지만 그 투표인단이 코인 같은 자산의 점유율로 뽑히는 방식이기 때문에 작업 증명보다는 비중이 적은 합의 알고리즘입니다.
이러한 합의 알고리즘들이 해결해야하는 요소가 존재합니다. 컴퓨터 공학에서는 과거부터 논의되오던 '비잔틴 장군 문제'란 난제가 존재합니다. 이 문제는 같은 편인 두 A, B 장군이 서로 멀리 떨어져 부대를 운용할 때 A장군이 B장군에게 다음날 같은 곳을 공격하자는 전령을 보냈을때 이 전령 제대로 도착할지 확신하지 못하며 제대로 도착하더라도 B가 배반할 여지가 존재한다고 생각하며 B 역시 전령에게 공격 의사를 들었다고해도 다시 A에게 답신을 했을때 그 답 역시 도착 확신이 서지 않고 A가 잘못된 정보를 준다고 생각할 수 있기에 두 장군은 다음날 공격을 할 수 없다는 두 장군의 문제에서 장군을 여러 명으로 확장한 문제입니다.
이 문제의 해결을 연구하여 나온 것이 비잔틴 장애 허용(BFT, Byzantine Fault Tolerance)라고 하는 합의 알고리즘이며 보통 2/3 이상의 노드(장군)들이 선량하다면 시스템은 정상 작동한다를 내포합니다. 대부분의 블록체인은 이런 BFT 요소를 갖고 있으며 블록체인은 P2P 시스템이기에 노드들간 네트워크 상호작용이 가능하고 트랜잭션 확정까지 유예를 두기 위해 타임스탬프가 내장했으므로 불량 노드를 적발할 수 있어 작업 증명이 이 BFT 요소를 접근하는데 있어 가장 효과적이라고 할 수 있습니다.
하지만 BFT를 통과하고 정격 체인의 유지를 통해 하나의 체인을 유지할 수 있다고 해도 노드들간의 의견 합의를 기반으로 하는 이 알고리즘은 허점이 존재할 수 밖에 없습니다. 이를 이용한 블록체인의 대표적인 두가지 취약점을 소개하고자 합니다.
처음 취약점은 51% 공격이라 불리는 데 이는 위의 작업증명 알고리즘의 특성에서 기인합니다. 작업 증명에서 소프트 포크가 진행되었을때 체인의 유일성을 보장하기 위해 유효성이 있다고 판단되는 가장 긴 체인을 제외한 나머지를 탈락시킵니다. 그런데 이를 이용해 참여자들(노드들)의 과반수 이상이 모여 가장 긴 체인을 만들고 나머지 노드들의 모든 채굴 과정을 폐기한다면 어떻게 될까요? 결국 그 체인은 과반수 이상의 노드들 소유가 되며 나머지 노드들은 그들이 데이터를 조작하든 뭐든 효력을 발휘할 방법이 전혀 없습니다.
물론 이 취약점은 규모가 일정 이상이 되면 현실적으로 공략하기 힘듭니다. 애초에 일정 규모 이상의 성숙한 체인 시스템의 51% 노드를 일정 이해집단이 소유한다는 것은 막대한 자금이 필요합니다. 만약 막대한 자금을 쏟아부어 그렇게 체인을 100% 독점했을때 그 체인이 발행한 코인은 가치를 잃게 되기에 정말 특수한 상황이 아니라면 절대 투자한 가치를 보상받지 못하며 전혀 합리적이지 않습니다. 따라서 이해집단이 이득이 없는 행동을 한다는 역설이 생기기에 성숙한 블록체인에서 이런 공격은 발생하기 힘듭니다. 물론 미성숙한 체인은 규모가 상대적으로 작아 이 공격이 충분히 가능하며 여러 사례가 존재하지만요.
나머지 하나의 취약점은 이중 지불(Double Spending)입니다. 작업 증명 알고리즘의 특성상 유효하지 않은 체인은 전량 폐기되며 이 취약점은 이 점을 이용합니다. 이 이중 지불은 두가지 종류가 있는데 이 중 피니 어택은 매우 이론적인 공격이므로 레이스 어택만 설명하겠습니다. 성숙한 블록체인 시스템 안에서 공격자 A,B와 피해자 C가 있다고 했을때 A가 물건을 받아서 C에게 1BTC를 줘야하는 상황을 가정하겠습니다. 이 때 A는 C에게 1BTC를 송금하는 트랜잭션과 함께 연이어 공범 B에게 1BTC를 주는 트랜잭션을 만듭니다. 그러면 이 과정에서 소프트 포크가 일어나게 되고 성숙한 블록체인이기 때문에 시스템이 어떤 체인을 선택할지는 동등하게 1/2일 것입니다. 이런 과정을 무수히 반복하면 C에게 가는 트랜잭션이 취소되는 경우가 생깁니다.
허나 이 이중 지불 역시 성숙한 블록체인이라면 현실적으로 충분히 예방은 가능합니다. 해당 트랜잭션에 대한 노드들의 컨펌이 충분히 이뤄지는지 확인하고 거래를 종료하면 문제가 발생하지 않습니다. 비트코인을 예로 들면 6 블록 정도의 컨펌이 진행되어야 트랜잭션이 확정되며 실제로 아직 이중 지불이 신고된 사레 자체는 존재하지 않습니다.
취약점으로 인한 한계
이제 블록체인에 대한 기본적인 배경 지식은 대부분 다룬 것 같습니다. 그런데 앞서 살펴봤던 블록체인은 이론적인 허점은 존재하지만 실제로는 문제가 없어보이고 그런 작은 위험성을 뛰어넘을 중요 특성을 가진 혁신적인 기술같은데 갑자기 한계라뇨? 맞습니다. 블록체인 자체는 정말 혁신적인 기술입니다. 하지만 이 블록체인을 이용하는 우리 인간들을 함께 생각해보면 블록체인의 한계는 분명합니다.
맨 처음 언급한 탈중앙화에 대한 한계는 다음 포스트에서 더 자세히 다룰 예정이지만 앞서 취약점을 언급했으니 그와 엮인 문제에 대해선 소개하고 넘어가겠습니다. 앞서 말했듯 블록체인의 취약점 자체는 그렇게 critical한 문제는 없고 실제로 저 자체만으로 문제가 발생한 적도 거의 없습니다. 하지만 블록체인의 보상으로 주는 코인에 사람들이 몰리면서 문제가 발생합니다.
스캠 코인처럼 다른 자산 관련 범죄와 결이 같은데 그 매개가 코인일 뿐인 문제는 당연히 이와는 다른 겁니다. 앞서 애기했듯 '성숙한' 블록체인이라면 문제가 발생하지 않겠습니다만 '성숙한'이라는 조건이 문제가 됩니다. 일반적인 사람들은 블록체인이라는 기술 자체보다는 그 보상인 코인에 더 관심이 많습니다. 이는 국가의 경제 정책에서 돈을 찍어내는 등 신뢰가 떨어지던 차에 탈중앙화라는 개념을 가진 비트코인에 돈이 몰리게 되어 비트코인 가격이 끝없이 올라간 현상과 자산의 불균형을 쉽게 해소할 수 없는 현실에서 계층을 이동할 욕망의 수단으로 코인에 관심이 커진 것이 주효할 것입니다.
이렇게 비트코인이 핫하니 블록체인 자체보다 이후 만들어지는 무수한 코인들이 화제가 되고 코인 자체의 가치보다는 투기 목적으로 코인에 돈이 몰리게 되고 여기서 그 돈이 몰리는 무수한 코인들이 모두 성숙한 시스템은 아닌 것이 문제가 됩니다. 말 그대로 성숙하지 않은 체인 시스템의 코인은 51% 공격에 취약하게 되며 이 취약점 자체는 심각하지 않으나 금융 기법(공매도 등)과 결합하면 충분히 큰 문제가 발생할 수 있습니다. 또한 이렇게 시스템이 무너진 코인은 이중 지불 문제에서 자유로울 수 없게 됩니다.
이러한 금융적인 문제점은 결국 화제를 탈중앙화라는 특성의 한계로 옮깁니다. 탈중앙화 그 자체는 분명 의미가 있는 개념이지만 현실적인 문제들과 엮인다면 어떻게 될지는 제가 바라봤을때 다소 부정적인 편입니다. 따라서 다음 포스트에서 이 한계에 대해 더 자세히 이야기 나눠보도록 하겠습니다.
이번 포스트에선 블록체인에 관해 전반적으로 소개했습니다. 포스트가 너무 길어지는 관계로 하드포크, 이더리움, NFT, 비트코인의 한계와 같은 내용은 다음 포스트에서 다루겠습니다.
refer
https://www.youtube.com/watch?v=rCMYh1TihJ8
http://contents.history.go.kr/front/km/view.do?levelId=km_008_0020
우리역사넷
돈은 오늘날 한자어로 화폐 또는 통화라 한다. money는 화폐로 번역하고 currency는 통화로 번역하는 것이 보통이다. 화폐는 형태와 상관없이 돈처럼 다양한 의미를 가질 수 있지만, 통화는 원래 지
contents.history.go.kr
[블록체인] 블록체인 구조
🔔 이 글은 비트코인을 바탕으로 블록체인을 설명합니다. 🔔 블록체인은 header, body로 이루어진 블록을 연결한 구조로 되어있다. 블록에 대한 전반적인 정보는 헤더가 담고 있으며, 바디는 여러
990427.tistory.com
http://wiki.hash.kr/index.php/%EB%A8%B8%ED%81%B4%EB%A3%A8%ED%8A%B8
머클루트 - 해시넷
머클루트(merkle root)란 머클트리의 뿌리 부분에 해당하는 것이고, 블록 헤더에 포함된다. 해당 블록에 저장되어 있는 모든 거래의 요약본으로 해당 블록에 포함된 거래로부터 생성된 머클트리의
wiki.hash.kr
https://www.youtube.com/watch?v=Ip7bKoaKSjI
'CS' 카테고리의 다른 글
배경학습_2_이더리움, NFT, 그리고 지금의 블록체인 (0) | 2022.05.24 |
---|---|
4_짧_프로토콜과 인터페이스 (0) | 2022.05.06 |
2_흐름정리_백엔드란? (0) | 2022.02.17 |
1_흐름정리_API (0) | 2022.02.12 |