Bitcoin and Blockchain(1)
들어가며
미래의 핵심은 데이터이다. 데이터를 어떻게 확보하고 다룰 것인지, 또 어떻게 더 효율적으로 커뮤니케이션할 것인가는 단연 거의 모든 분야에서 핵심주제로 다루어질 것이다. 블록체인은 여기서 중요한 해결도구로 작용할 것이다. 데이터의 신뢰성과 정합성 모두를 충족시켜줄 기술이기 때문이다. 블록체인을 알고 다룰 수 있는 사람들은 어떤 분야든 혁신을 이끌 인재가 될 것이다.
Bitcoin and Blockchain
이번 포스팅에서 다룰 내용은 비트코인과 블록체인이다.
블록체인은 비트코인과 함께 세상에 존재를 드러냈다. 즉 비트코인은 화폐로 블록체인을 처음으로 응용한 사례이다.
블록체인과 암호화폐는 우리가 생각하는 것 이상으로 밀접한 관계이다. 단순히 블록체인만 따로 놓고 볼 것이 아니라 암호화폐와의 결합상태에 따라 다양한 혁신을 주도할 수 있다. 특히 퍼블릭 블록체인의 경우는 암호화폐가 필요하다.
블록체인을 공부하기 앞서 먼저 비트코인을 알아보자. 비트코인은 나온 지 9년이 넘었기 때문에 상대적으로 자료도 풍부한 편이라 찾아보기도 용이하다. 그래도 컴퓨터공학에 상당한 지식을 겸비한 사람이 아니라면 처음에 이해하기 난해한 부분이 많을 것이다. 필자도 그러했고 대부분의 사람들도 마찬가지였을 것이다. 하지만 어렵더라도 천천히 보면서 그 의미를 이해한다면 그리 어렵지는 않을 것이다.
비트코인의 탄생
비트코인은 2008년 사토시 나카모토에 의해 논문의 형태로 공개되었다. 이 논문을 백서(White paper)라고 한다.
그리고 2009년 1월 3일 사토시에 의해 최초의 블록인 Genesis Block이 생성되었다.
- 사토시 나카모토는 예명이며 단일인물인지 복수인물인지도 아직까지 밝혀지지 않았다. 단지 영국식 영어를 잘 구사하는 인물이고 당시 일본에 거주했다는 사실을 알 뿐이다.
사토시 나카모토는 2007년부터 서브프라임모기지사태로 인해 발생한 미국 최대 금융위기를 목격하면서 은행의 중앙집권적인 시스템의 폐해를 지적하며 제네시스 블록에 “The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”라는 문구를 삽입했다. 이 문구는 2009년 1월 3일 타임지에 소개된 은행의 구제 금융 관련기사를 첫 블록에 남긴 것이다.
또한 사토시는 이 비트코인의 소스코드를 오픈소스로 공개하고 누구나 가져가서 쓰고 더 발전된 형태로 개발하게끔 세상에 내놓았다.
비트코인은 가상화폐의 문제점이었던 이중지불문제, 거래데이터(디지털)의 위조와 변조의 우려, 분산된 네트워크에서의 의사결정의 문제, 비잔틴 장군의 딜레마 등 분산된 환경에서 디지털 화폐로 이용하는데 걸림돌이었던 문제들의 솔루션을 제시했다.
비트코인의 화폐
비트코인코어프로그램(시스템)의 화폐는 비트코인이다.
비트코인은 제3자의 관리, 감독 없이 특정 암호화 프로토콜을 따르는 분산화된 컴퓨터네트워크에 의해 발행, 유통되고 그 거래가 검증되며 전반적인 시스템의 안정성이 확보된다.(프로토콜(protocol) : 통신규약)
비트코인은 P2P네트워크, 암호화기법, 해시함수, PoW(작업증명) 합의알고리즘 등 여러 가지 기술을 종합한 프로그램이다. 그리고 비트코인은 암호화기술을 적용한 가상화폐라는 점에서 암호화폐(Cryptocurrency)라고 불린다.
비트코인은 블록체인을 기반으로 하고 다른 제3자(금융기관)의 개입 없이 참여자 간의 송금, 결제, 검증 등이 이루어지며 마이닝(채굴)을 통해 새로운 비트코인이 발행된다. 발행권은 누구나 가질 수 있으며 정해진 알고리즘에 따라 발행된다.
발행은 중앙은행이 발행권한을 독점하는 현재의 중앙집권적 시스템으로부터 완전히 탈중앙화된 것이다. 여기서 참여자들은 각각의 개인(노드)이며 탈중앙화된 P2P네트워크 방식으로, 누구나 코어클라이언트를 다운받아 노드가 될 수 있다.
무슨 말인지는 천천히 알아보자.
비트코인의 원리
- 블록
블록에는 거래내역들이 들어간다. 실제로는 거래기록들의 해시값이다. 거래내역이 한 번 블록에 들어가서 검증받은 후 체인에 연결되면 되돌릴 수 없다. 즉 취소할 수 없는 비가역성의 성질을 가진다.(technical하게 이야기하면 이론상 취소될 수 있기는 하다.)
블록은 채굴을 통해 생성(발행)되고 10분주기를 갖는다. 네트워크의 전파속도와 해커공격에 대한 보안성 때문에 10분으로 채택되었다. 블록의 용량은 평균 1MB이다(현재 평균 1.04MB). 블록에는 블록헤더와 블록바디가 있는데 헤더에는 비트코인 버전, 거래정보 해시값, 이전블록의 해시값, 타임스탬프, 난이도, 논스(nonce)가 포함되고 바디에는 현재 거래내역들이 포함된다.
한 블록은 항상 그 이전블록을 참조하고 있는데 여기서 참조하는 것은 이전 블록의 해시값이다.
[해시는 어떤 문자열을 일정 길이의 16진수 문자열로 변환하는 기능을 한다. [밥을 먹는다.]와 [밥을 먹는대.]는 원본상에서는 ‘다’와 ‘대’의 차이에 불과하지만 해시를 하면 처음부터 끝까지 완전히 다른 문자열로 나온다. 같은 원본이면 같은 해시가 나오고 조금이라도 다르다면 완전히 다른 해시가 나온다. 이는 규칙성이 없어 어떤 해시를 보고 원본을 계산할 수 없다는 뜻이다(역방향 계산 불가). 즉, 데이터의 보호하고 진위여부를 판단할 때 유용하다. 이는 비단 블록체인뿐만이 아니라 공인인증서와 같은 일상생활에서 흔히 보는 보안에서도 쓰인다.]
이렇게 각 블록이 이전블록을 참조해서 시간 순으로 계속해서 이어지기 때문에 블록체인이라고 부른다.
- 난이도
채굴자들은 블록을 채굴할 때 어떤 수학문제를 풀게 되는데 평균 10분간 풀 수 있는 난이도로 만들어 놓았다.
블록은 2016개의 블록(약 2주)마다 한번씩 난이도 조정을 하게 된다. 따라서 2주마다 한번씩 난이도 조정을 한다. 난이도 조정이 무슨 말인가? 10분동안 채굴자들이 열심히 컴퓨터를 돌려서 목표값(target value)을 찾아내는 게임을 하는데 돈을 많이 가지고 있는 사람은 당연히 게임에서 이기기 위해 더 좋은 컴퓨터를 많이 사서 돌릴 것이다. 그렇게 되면 다른 사람들도 경쟁을 위해서 같은 행동을 할 것이다. 결국 프로그램이 그 블록에 정해놓은 목표값을 어떤 돈 많은 사람이 더 빨리 찾아내서 1분만에 찾았다고 해보자. 그러면 그 다음블록도 1분, 계속해서 1분만에 찾으면 2016블록을 2주가 아닌 1.4일만에 다 완성할 것이다. 그러면 애초에 2140년까지 발행량을 정해놓은 것이 훨씬 더 빨리 끝나게 되므로 매번 2016블록이 될 때마다 난이도를 조정해서 목표값을 초과하거나 그에 못미칠 경우 그만큼 난이도가 어려워지거나 쉬워진다.
- 채굴(Mining)과 PoW 작업증명
위에서 언급한 바와 같이 비트코인은 어떤 중앙관리자의 통제 없이 각 개인에 의해 발행된다. 이러한 발행과정을 마이닝(채굴)이라고 부른다. 기술적으로 컴퓨터가(채굴기가) 반복된 해싱작업을 통해 목표값(target) 해시값을 찾는 것으로 표현할 수 있다. 이것이 작업증명(PoW : Proof of Work)인데, 쉽게 말해 내가 가지고 있는 컴퓨터가 24시간동안 끊임없이 어떤 작업을 수행해서 얻어낸 결과값이 프로그램이 원하는 어떤 정답과 일치한다면 나를 제외한 나머지 네트워크가 내가 힘들게 작업을 해서 정답을 얻어냈음을 모두가 인정할 것이고 증명이 된 것이라고 볼 수 있다. 그래서 작업증명이라고 부른다.
채굴에 참여하는 모든 유저(이하 채굴자)가 이 목표값을 찾기 위해 경쟁을 벌이며, 자본주의의 특성상 돈 많은 사람들이 더 성능 좋은 컴퓨터를 더 많이 사들여 채굴에 쓰는 상황도 벌어진다. 비트코인의 경우 대부분 Bitmain(중국최대채굴연합)에서 개발한 ASIC이라는 채굴전용장비를 이용해 채굴하고 있다.(ASIC이 아닌 GPU채굴을 하면 성능이 그만큼 안나와 채산량이 떨어지기 때문.)
채굴자 중 한명이 목표값에 해당하는 해시값을 찾아내는데 성공하면 블록을 발행할 권한이 주어진다. 블록해시값을 찾아내면 동시에 네트워크에 전파한다. 여기서 블록을 발행한 대가로 비트코인과 블록안에 있던 거래들의 이체수수료도 보상으로 얻는다. 그리고 다수의 노드가 블록이 정당한 블록임을 검증하면(검증예 : 해시값이 맞는지, 조작된 거래는 아닌지, UTXO가 정당한지 등) 기존 블록체인에 연결하게 된다. 이렇게 한 번 블록이 발행되는 시간은 10분정도 된다.
채굴을 하는 데에는 컴퓨터를 계속 돌려야 하므로 상당히 많은 전기를 소모해야 한다. 한마디로 전기세가 많이 나오게 된다.
결국 보상으로 얻는 비트코인과 거래수수료가 전기세를 소모하고 장비값, 유지비를 모두 충당하고도 남아야 채굴자들은 계속해서 경쟁하며 블록을 발행하려 할 것이다. 이를 비트코인이 채굴하는 동기, 즉 인센티브가 된다고 이야기한다.
해싱작업은 상당히 고난이도가 된다. 따라서 해싱작업을 해내기 오래 걸리는데 이를 해낸다면 나머지 노드가 검증하는 시간은 짧고 쉬워야 한다. 선생님이 정답지를 들고 열심히 푼 학생의 정답을 채점하는 것으로 비유할 수 있다.
채굴과정은 끊임없이 반복된 해싱작업이라고 했다. 이 작업이 무엇인지 자세히 보자.
해싱이란 어떤 데이터를 일정 길이의 정해진 길이의 16진수 문자열로 변환하는 것이다. 비트코인은 이 해싱작업을 하는데 SHA-256이라는 암호화기법을 사용한다.(SHA는 Secure Hash Algorithm으로 미국 국가안보국인 NSA에서 93년 처음 설계해서 지금까지 널리 쓰이고 있다. SHA-1에서 더 진화된 SHA-2를 사용하고 있고 SHA-2 안에 SHA-256도 포함되어 있다. SHA-256을 사용해 해싱하면 어떠한 데이터든 64자리 길이의 결과값(32바이트)으로 변환된다.)
해싱작업을 통한 목표값 찾기는 무식한 노동이다. 어려운 수학문제가 아니며 단순히 목표값을 맞추도록 블록 내의 ‘일정한 값’(논스-nonce)을 0, 1, 2, ... 씩 계속 증가시키면서 해시하여 목표값과 일치하는 값을 얻어내는 것이 목적이다. 이런 해를 찾는 과정 속에는 공식이 없으며 어떤 노하우도 없다. 반복해서 값을 대입하는 수밖에 없고 채굴기는 이렇게 초당 수 십억번 이상의 대입과 비교를 통한 문제풀이를 반복한다. 논스(nonce)는 이렇게 해싱작업을 위한 의미 없는 숫자로써 쓰인다.
- 발행(조폐)
현재는 중앙은행이 발행권을 갖고 조폐공사에서 찍어내는 방식이다. 하지만 비트코인은 발행권한이 전적으로 개인에게 분산되어있다. 비트코인의 발행량은 총 2100만개로 정해져있으며 설계상 2009년부터 시작해 2140년즈음에 채굴이 모두 완료되도록 설정되어있다. 이로써 하이퍼인플레이션을 방지한다. 채굴량은 약 4년(21만블록)마다 반감되며 첫 4년간은 10분간 50BTC로 시작해 2018년 1월 현재는 12.5BTC가 신규 발행된다. 그리고 발행이 끝난다면 채굴자들의 인센티브는 거래수수료만이 될 것이다.
- 거래
유저들이 비트코인을 거래한다고 하자. 서로 비트코인을 보내면 그 거래내역들은 mempool이라는 곳에 보관되고 각 채굴자들은 각자 자신의 블록(후보블록)에 mempool에 있던 거래내역(정확하게는 해시값)들을 추가시킨다. 이 때 거래내역에는 수수료가 존재한다고 했는데 채굴자는 수수료가 높은 순서대로 선택할 수 있다.(수수료가 낮거나 없는 것들은 블록에 포함이 늦게 되거나 안될 수가 있다.) 그리고 선택한 거래내역들을 담은 블록을 채굴하기 시작한다. 채굴자들은 목표값을 찾기 위해 열심히 작업할 것이다. 누구보다 빨리 목표값 찾기에 성공하면 블록을 발행하고 보상으로 비트코인과 거래수수료를 모두 얻는다. 그렇게 거래는 블록에 포함되어 1컨펌(confirmation)을 받는다. 즉 당신의 거래가 네트워크에서 1번의 확인을 받았다는 것이다. 내 거래가 들어간 블록 위로 시간이 지나면서 블록이 계속 쌓이면 그 블록들이 내 거래가 담긴 블록에 대한 정보도 가지고 있기 때문에 추가로 내 거래가 들어간 블록이 확인(컨펌)받게 된다. 코어프로그램에서는 6번의 컨펌(이체확인)을 받아야 받은 비트코인을 사용할 수 있게 되는데 6컨펌은 6*10=60분이다. 그래서 커피를 구매할 때 비트코인을 사용하기에는 느리다. 따라서 각 사업자(거래소 등)들은 1컨펌만으로 비트코인을 사용할 수 있게끔 해주는 경우도 있다. 비트코인을 보내면 그 즉시 Txid라는 것이 생성되는데(Txid : 거래고유번호라고 생각하자) Txid만 확인하고 사용을 허가하는 경우도 있다.
그러면 왜 6컨펌을 받아야 재사용을 가능하도록 하게 했을까? 바로 포크(분기)가능성 때문이다. 포크란 블록체인에서 두 개의 체인으로 나뉘는 것을 의미한다. 이런 단순포크는 몇 블록이 채 안가서(길어야 6블록이내) 다시 하나의 주체인으로 통합되기 때문에 6컨펌을 기준으로 삼은 것이다. 블록체인에서 10분간 채굴하는 채굴자들이 블록을 전파할 때 여러 명이 동시에 채굴에 성공하는 경우가 생기고 세계 각 노드들의 컴퓨터속도가 다르기 때문에 각 노드들은 각기 다른 시간에 다른 블록을 받을 확률이 있다.(실제로 빈번하다.) 그 때 다수의 합의에 의해 인정을 받은 블록만이 주체인에 연결되면 동시에 포크(분기)되었던 다른 블록들은 버려지게 되고 그 안에 있던 다른 거래내역들은 다시 mempool로 들어가게 된다. 그러면 블록에 추가된 것을 확인하고 바로 재사용한 사용자는 이중지불공격의 위험 등 문제가 될 수 있다. 이러한 포크가능성이 있어서 최소 6번의 블록이 더 추가되어야 사용해도 문제가 없을 것이기 떄문에 그렇게 설정되었다. 내가 보낸 거래들은 100% 완결(finality)되지 않는다. 내가 보낸 거래들이 포함된 거래 위로 블록이 쌓일수록 100%에 가깝게 확인받을 뿐이다.
- Coinbase Transaction
채굴자는 블록을 발행하여 보상으로 비트코인을 얻는다. 현재는 10분당 12.5BTC이고 이렇게 새로 발행된 코인은 이전 사람에게 받은 것이 아니라 완전히 새로 찍어낸 것이다. 하지만 이 비트코인을 즉시 다른 사람에게 이체할 수 있을까?(사용할 수 있을까?) 채굴자가 처음으로 보상으로 얻은 비트코인은 바로 사용할 수 없다. 100블록(10분 * 100 = 1000분)이 지나야 사용할 수 있다. 이는 포크(분기)가 상당히 빈번하게 일어나기 때문에 더욱 안전한 거래를 하게 하려는 조치이다. 포크가 일어나 두 개의 블록에서 나온 보상을 두 채굴자가 바로 사용할 수 있게 되면 시간이 지나 어느 한 블록에서 나온 보상만이 정당성을 얻게 되는데 그러면 미리 써버린 다른 보상은 정당성을 잃어버려 네트워크의 거래안정성을 훼손하게 될 수 있기 때문이다. 이렇게 처음 발행한 비트코인을 자신에게 보내는 거래를 코인베이스 거래(Coinbase transaction)이라고 한다. (일부 구형 비트코인클라이언트는 120블록이 지나야 사용할 수 있게 되어있었다.)
----- 다음 편에 계속