Basin of Attraction

비트코인 규약이 작동하는 원리 본문

글쓰기-리뷰

비트코인 규약이 작동하는 원리

박정현PRO 2021. 9. 30. 17:16

비트 코인에 대한 수많은 글들이 인터넷에 있지만 비트코인의 기본이 되는 암호화 규약에 대한 설명은 

수박 겉핡기 식으로 대충 넘어가기 일쑤이다. 어느 정도 깊이있는 기사들 조차도 중요한 핵심원리를 간과하는 경우가 많고 분산원장과 같은 비유를 사용하여 두리뭉실하게 넘어가기 일쑤이다. 이 글의 목적은 비트코인 규약의 핵심 원리를 명쾌하고 포괄적으로 설명하기 위함이다. 

우리는 블록체인의 첫번째 원리로 부터 시작하여서 비트코인 거래의 원시 데이터를 조사하는 방식으로 이해의 폭을 넓혀보기로 한다. 


비트코인의 규약을 세부적으로 이해하는 일은 어려운 일이다. 대신 비트코인을 보유하여 부자가 되는법이라든지, 비트코인을 통해서 세금을 회피하는 법을 아는것이 더 낫다고 생각할 수 도 있다. 그런 것들은 흥미롭지만 비트코인에 대한 깊은 이해에 도움이 되지 않는다. 비트코인의 기본을 이해하는 일은 당신에게 기존에 없던 새로운 경험을 제공한다. 그것은 비트코인에 내재된 언어를 이해하는 것이며 그것은 스마트 계약과 같은 새로운 금융상품을 만들어 내는 일이다. 

새로운 금융상품은 새로운 시장을 만들어 내고 사용자들의 새로운 행동패턴을 유도해낸다. 

 

이 글은 비트코인 규약을 이루는 요소들을 설명하는데 집중할 것이다. 이를 이해하기 위해서는 공개키 암호화 기법과 디지털 서명에 대한 기본적인 지식을 필요로 한다. 나는 또한 당신이 암호화 해싱에 대해서 익숙한 것으로 가정하고 설명할 것이다. 이러 개념은 어렵지 않고 수학과 컴퓨터 공학의 대학 1학년 수준의 지식이면 충분하다. 위 개념에 대한 기본 이해를 하고 이 글을 읽어 주기를 바란다. 

 

비트코인의 기본이 암호학이라는 것은 어쩌면 놀라운 일이다. 비트코인은 화폐가 아니였나? 실제로 비트코인 기술의 핵심은 거래에 대한 보안문제를 푸는 것에 매우 관계가 깊다. 거래시에는 거래 내용이 분실되거나 거래내역이 누락되는 경우가 없어야한다. 실생활에서는 이를 위해서 금고를 사용하거나 서명을 통해서 보안을 유지한다. 반면 디지털 세상에서는 암호화를 통해서 이런 보안 문제를 해결한다. 암호화가 비트코인 규약의 핵심이 되는 이유이다. 

 

첫번째 단계 : 서명된 의향서

어떻게 디지털 화폐를 만들 수 있을까? 

복제가 쉽다는 점에서 디지털 화폐는 애초에 불가능해 보인다. 디지털 상의 화폐라고 하면 문자로 이루어진 문장을 이용할 수 있다.  만약 어떤 사람(앨리스라고 하자)이 디지털 화폐를 이용하여 지불한다고 하자. 디지털화된 특정 문자열을 화폐로 사용한다고 한다면(예를 들어서 3X345GPP6%%!) , 어떻게 그 문자열이 복사되어 재사용되는 것을 방지할 수 있을까? 혹은 누군가에 의해서 복사되거나 위조하여 사용하는 것을 방지할 수 있을까?  

 

이 두가지 문제는 정보신호를 화폐로 사용하기위해서 해결해야할 문제이다. 

 

앨리스가 원시적인 버전의 암호화폐로서 기본적인 위조 방지 기능이 있는 문자열을 화폐의 한 형태로 사용한다고 하자. 

앨리스는 밥에게 암호화폐를 지불하고 싶다. 이를 위해서는 앨리스는 "나, 앨리스는 밥에게 1암호화폐를 지불한다." 라는 문장을 쓰고 이를 암호키를 이용하여 서명한 후 모든사람들에게 공개한다. 

이것은 그다지 인상적인 디지털 화폐가 아니지만 나름의 가치가 있다. 밥을 포함하는 외부사람은 앨리스의 서명된 메시지를 통해서 메시지가 실제로 앨리스의 것임을 검증할 수 있다. 물론 앨리스가 메시지를 공개한 이후에는 다른 사람이 복제하는 것이 가능하므로 위조의 위험이 있지만, 최초로 서명된 메시지를 타인이 만드는 것은 불가능한다. 이와 같은 두가지 성질, 앨리스가 작성했다는 점을 보증할 수 있는 점과 완벽하지 않지만 제한된 위조 방지가 암호화폐의 특징이다. 

 

코인을 구별하기위해서 일련번호를 이용하는 방법

문제는 앨리스의 암호화된 메시지가 여러번 전송될 수 있다는 점이다. 또는 앨리스가 밥을 속이기 위해서 여러 건의 같은 메시지를 보낼 수 도 있다. 메시지를 구분하기위한 방법은 무엇이 있을까? 메시지마다 일련번호를 부여하는 것이다. 

예를 들어서 "앨리스, 나는 밥에게 1 코인을 보낸다. 8740348". 

전통화폐에서 고유한 일련번호를 부여하는 기관을 은행이라고 한다. 앨리스는 은행에서 서명된 메시지를 보내되 해당 메시지의 일련번호를 부여받는다. 밥은 메시지를 받는 즉시 은행을 통해서 메시지가 앨리스로부터 왔는지, 일련번호가 유효한지 확인한 후에 코인을 부여받는다. 거래가 완료된후 은행은 전달된 코인이 더이상 앨리스의 소유가 아니라 밥의 소유라는 것을 보증한다. 

 

모든 참여자들을 은행으로 만들기

은행을 통하여 일련번호를 보증받는 것은 그럴듯 해 보인다. 여기서 은행의 배제할 수는 없을까? 

우리는 특정 규약을 이용한다면 이러한 거래 시스템에서 은행을 완전히 배제할 수 있다. 이것은 화폐의 개념을 완전히 바꾸게 된다. 여러분이 화폐를 공급하는 은행의 역할을 고려한다면 이러한 발상은 대단히 큰 변화를 의미한다. 

 

아이디어는 모든 사람들을 은행으로 만드는 일이다. 구체적으로 우리는 모든 거래내역을 기록한 장부를 각각 보유하고 있다고 가정할 것이다. 우리는 이러한 장부를 블록체인이라고 명할 것이다.

 

앨리스가 밥에게 암호화폐를 전송한다고 가정하자. 그녀는 "나, 앨리스는 밥에서 1암호화폐를 지불한다. 1234567" 라는 요청을 서명후 전송한다. 밥은 자신이 보유중인 블록체인으로 부터 실제 암호화폐가 앨리스 소유임을 확인할 수 있다.  검증 후에는 앨리스의 거래 요청과 자신의 수락내용을 넷트웍에 거래를 공개하고 넷트웍의 모든 구성원은 자신의 블록체인 복사본을 업데이트한다. 

 

우리는 (은행의 개입없이]) 1234567이 어디서 왔는가 하는데 의문을 가질 수 있다. 그러나 그 문제는 쉽게 해결가능한 문제이므로 당장은 다루지 않겠다. 더 중요한 문제는 앨리스가 이중지불을 통해서 넷트웍 구성원들을 속일 수 있다는데 있다. (앨리스가 1암호화폐만 보유중이라고 하자.)  그녀는 "앨리스, 나는 밥에서 1암호화폐를 지불한다. 1234567"을 보냄과 동시에 "앨리스 나는 찰리에게 1암호화폐를 지불한다. 1234567 (같은 시리얼 넘버)"라는 메시지를 각각 보낸다. 밥과 찰리는 두 메시지를 각각 수신하고 이 메시지가 앨리스에게서 온 유효한 메시지임을 검증한다. 만약 검증이 거의 동시에 이루어졌다고 하면(예를 들어 밥은 찰리에게도 같은 메시지가 갔다는 사실을 아직 알지 못한다.) 밥과 찰리는 1암호화폐가 모두 앨리스에게서 온 것으로 생각하고 거래를 받아들이고 넷트웍에 공개한다.  여기서 문제가 발생한다. 무슨 근거로 넷트웍의 다른 참여자들은 자신의 블록체인을 업데이트할 수 있을까? 이는 거래내역이 기록된 공유 장부를 유지하기 어려운 것처럼 보인다. 설령 모든 참여자가 장부를 업데이트 하는 일관된 방식에 동의하더라도 여전히 밥과 찰리는 속임수에 넘어갈 수 있는 문제가 있다. 

 

언듯 보기에 앨리스는 속임수를 부릴 수 없을것같다.  예를 들어서 앨리스가 밥에게 먼저 메시지를 전송했다고 하자. 밥은 메시지를 검증하고 참여자들에게(찰리를 포함) 해당 거래를 공표한다. 메시지를 받은 찰리는 앨리스에게서 온 메시지에 속을 수 없다(이미 앨리스는 1화폐를 지불한 후이므로). 따라서 앨리스가 찰리를 속일 수 있는 시간은 밥의 메시지를 받기전 동안의 매우 짦은 순간이다.  그러나 이러한 희박한 가능성조차도 일어나서는 안될 일이다. 더욱이 그 짧은 기간을 악의를 품고 이용할 수 있다. 예를 들어서, 앨리스는 밥과 찰리가 정보교환을 하지 못하게끔 넷트웍 지연을 일으킬 수 있다. 또는 앨리스는 교묘하게 통신을 두절시킬 수도 있다. 이렇듯 앨리스가 통신을 지연시킴으로써 이중 지불이 되도록 두 사람을 속일 수 있다. 

 

이러한 이중 지불문제를 어떻게 방지할 수 있을까? 명쾌한 해결책은 앨리스가 밥에게 코인을 전송할때 밥 혼자서 검증하지 않는 것이다. 대신 밥은 넷트웍에 해당 거래를 공개하고 해당거래의 유효성에 대한 검증 요청을 하는 것이다. 요청을 받은 넷트웍 참여자들의 집단 동의를 얻어내는 경우에만 밥은 거래를 수락하고 거래내역을 확정하고 넷트웍 참여자들은 비로소 장부를 업데이트한다. 만약 앨리스가 이중 지불을 시도한다면 넷트웍 참여자들은 잘못된 거래임을 알려주게 되어 더이상의 거래가 진행되지 않도록 막을 수 있다. 

 

좀더 구체적으로 앨리스가 밥에게 1코인을 전송한다고 하자. 그녀는 서명된 메시지 " 나 앨리스는 밥에게 1코인을 지불한다. 시리얼 넘버 1234567" 이라는 메시지를 밥에게 전송한다. 밥은 코인이 앨리스의 소유임을 자신이 가지고 있는 검증이 완료된 블록체인을 통하여 확인한다.  밥은 여기서  거래를 승낙하는 대신 앨리스의 메시지를 넷트웍의 특정 참여자에게 먼저 공개한다. 넷트웍의 참여자(이들을 Miner라고 부를것이다) 들은 앨리스가 코인의 소유자임을 확인한 후 "그렇다 앨리스가 코인 1234567을 소유중이고, 밥에게 지불될 것이다"라는 메시지를 공표한다. 충분히 많은 참여자가 그 메시지를 확인해주면 나머지 모든 넷트웍 참여자들은 해당 사실을 자신의 블록체인에 업데이트가 되면서 거래가 완료된다. 

 

이 규약은 현재 불명확한 점들이 많다. 예를 들어서 "충분히 많은 참여자가 공표한다"란 무엇을 의미할까? 여기서 "
충분히"란 얼마나 충분해야하나? 와 같은 물음들이다. 충분한 인원이란, 물론 넷트웍의 모든 사람을 의미하지 않는다. 왜냐하면 우리는 넷트웍참여자들에 대해서 선험적으로 알지 못한다. 같은 이유로 넷트웍의 참여자들의 특정 비율만큼을 의미하지도 않는다. 우리는 이 아이디어를 지금 명확히 하지는 않을 것이다. 대신 다음 섹션에서 우리는 전술한 접근방법이 가지는 심각한 문제를 지적할 것이다. 그 문제점을 해결하는 것이 블록체인 규약의 아이디어를 명확히 하는 효과가 있을 것이다. 

 

작업 증명

앨리스가 이중 지불을 하려고 한다고 하자. 그녀는 넷트웍을 지배함으로써 이를 실현할 수 있다. 그녀는 자동화된 많은 수(예를 들어 10억개)의 넷트웍 참여자를 보유하고 있다고 하자. 이전과 같이 앨리스는 밥과 찰리에게 이중 지불을 시도한다. 그러나 밥과 찰리가 넷트웍에 해당 거래의 검증을 요청할때 넷트웍을 장악한 앨리스의 참여자들이 밥과 찰리에게 지불되는 거래내역이 모두 맞다는 것에 대한 검증 메시지를 각각 보냄으로써 한명 또는 두 명 모두 속일 수 있다. 

 

여기서 이러한 헛점을 피해갈 수 있는 작업증명이라고 불리우는 영리한 방법이 있다. 아이디어는 직관적이지 않고 2가지 아이디어의 조합으로 이루어져 있다. (1) 검증을 위해서 인위적으로 계산 비용을 발생시키는 일과 (2)검증하는데 보상을 주는 일이다. 보상을 주는 것은 계산 비용이 발생함에도 불구하고 시장 구성원들의 검증 참여를 유도하기 위함이다. 

계산비용을 발생시키는 이유는 단순히 구성원의 개수에 의해서 검증이 되는 것이 아니라 총 계산량에 의해서 검증이 가능하도록 하는데 있다. 이런 방식을 이용하는 경우, 엄청한 계산 능력이 수반되지 않고서는 부정거래가 불가능하다는 것을 보여줄 것이다. 

 

이것이 작업증명의 요지이다. 그러나 작업증명을 제대로 이해하기 위해서 우리는 더 자세히 알아볼 필요가 있다. 

앨리스가 넷트웍에 "나 앨리스는 밥에게 1코인을 지불한다. 시리얼 넘버 1234567" 이라는 메지시를 공표했다고 하자. 

넷트웍의 다른 사람들이 그 메시지를 접하면 해당 거래를 자신이 소유중인 블록체인에 승인되기전 보류거래로 기록한다.  예를 들어서 넷트웍 사용자 David는 아래와 같은 보류거래를 기존 장부에 추가한다. 

1. 톰은 Sue에게 1코인을 지불한다. 1201174

2. 시드니는 신디아 에게 1코인을 지불한다. 1294221

3. 앨리스는 밥에게 1코인을 지불한다. 1234567

 

David는 각 거래가 유효한 거래임을 자신이 현재 보유중인 블록체인에서 확인한다. 그는 그가 확인한 거래 내역이 맞다는 것을 넷트웍에 공표할 수 있다. 

 

그러나 David가 검증한 결과를 공표하기 위해서는 퀴즈(이를 작업증명이라 부른다) 를 풀어야한다. 퀴즈의 정답을 모르면 넷트웍은 거래의 유효성 검증을 수락하지 않는다. 

David가 풀어야할 퀴즈는 무엇인가? 이를 설명하기 위해서는,  넷트웍 참여자들에게 모두 주어진 특별한 함수인 해쉬함수라는게 있다. 이것은 비트코인의 규약내에 정의되어있다. 비트코인은 SHA-256이라는 해쉬함수를 사용한다. 

David의 보류거래 목록을 l이라고 표시한자. David는 l과 어떤수 x를 조합한 메시지를 해쉬함수에 입력해본다. 

예를 들어서 l="Hello world"라고 하고 x=0 이라고 한다면 그 결과는 아래와 같을 것이다. 

 

            SHA256("Hello world;0")=131sskldfjsldfjlsdfoasdflasdflsdf  

 

David가 풀어야할 퀴즈는 예를 들어 해쉬함수의 결과에서 처음 4개가 0으로 끝나게 하는 x 를 찾는 것이다. 

위의 예에서는 x=0인 경우 해쉬함수 결과의 처음 4개의 문자가 131s이므로 퀴즈의 정답이 아니다. 

David는 x를 바꿔가면서 처음 4개가 0이 나오는 x를 찾아내야한다. 

퀴즈가 어려운 이유는 해쉬함수는 마치 난수를 만들어내는 것처럼 입력문자와 출력문자의 관계를 알기 어렵다는데 있다. 입력문자가 조금만 바뀌어도 출력문자는 전혀 다른 문자가 나온다. 

 

자, David가 x를 찾아내어 문제를 풀었다고 하자. 그는 넷트웍으로부터 일정량의 보상을 받게되고 그가 검증한 거래내역과 퀴즈의 정답 x를 넷트웍에 공표할 수 있다. 다른 참여자들은 x가 맞는 답임을 즉각 확인할 수 있고 그들의 블록체인을 방금 승인된 거래블록을 포함하여 업데이트한다. 

 

비트코인 규약에서 이러한 검증 과정을 마이닝이라고 한다. 각 거래 블록이 검증되기 위해서는 마이너가 비트코인 보상을 받는다. 초창기에는 보상이 50비트코인이였다. 그러나 210000 블록마다 보상은 절반으로 줄어든다. 한번 절반으로 줄어들어서 현재는 25코인을 보상으로 받는다. 비트코인의 반감기는 4년마다 일어나면 2140년가지 지속된다. 

 

당신은 작업증명이 거래를 검증하기위한 경연이라고 생각할 수도 있다. 경연의 참가자는 계산 능력을 소모한다. 한 마이너의 경연 승리확률은 그 마이너의 계산능력에 대하여 전체 넷트웍의 참여자들의 계산능력에 대한 비율이라고 할 수 있다. 예를 들어서 한 마이너가 전체 마이너의 1% 계산능력을 보유하고 있다면 그 마이너는 경연에서 1등할 확률은 1%이다. 따라서 경연에 많은 참여자가 있을 경우, 정직하지 못한 마이너의 계산 능력은 전체 참여자에 비하면 상대적으로 작을 것이므로 검증 프로세스를 망가뜨릴 수 없다. 

 

물론 부정한 마이너가 블록체인을 망가뜨릴 위험이 작다라는 것은 고무적인 일이나 그것만으로는 넷트웍에 대한 신뢰를 쌓기에는 충분하지 않다. 특히 우리는 이중지불에 대한 이슈를 완전히 다루지 못한 상태이다.  

 

 

 

반응형
Comments