Mastering Bitcoin Ch2 내용정리
2장 비트코인의 작동원리
거래, 블록, 채굴, 블록체인
기존의 은행 업무 및 지불 체계와 달리 비트코인 시스템은 분산된 신뢰 네트워크를 기반으로 하고있다. 신뢰할 수 있는 중앙 통제 기관 대신 시스템 내의 다른 여러 참가자들의 상호작용을 통해 새롱누 속성이 생기면서 신뢰가 쌓이게 된다.
2장에서는 비트코인 시스템 내에서 진행되는 거래 과정에서 상위 단계이 있는 비트코인을 추적해서 거래 한 건이 분산화된 합의(Distributed consensus)라는 비트코인 메커니즘에 의해 '신뢰'를 얻고 승인을 받은 후 거래내역 전부가 담긴 분산 장부인 블록체인에 최종적으로 기록되는 과정을 살펴볼 것이다.
각 예시는 하나의 지갑에서 다른 지갑으로 송금 시 사용자들(Joe, Alice, Bob) 간의 상호 작용을 시뮬레이션하는 비트코인 네트워크 상에서 발생한 실제 거래를 기반으로 하고 있다.
블록탐색기는 비트코인 검색 엔진 역하을 하는 웹 어플리케이션으로, 이 서비스를 통해 비트코인 주소, 거래내역, 블록 등을 찾아볼 수 있고 이들 간의 관계 및 흐름을 볼 수 있다.
- 블록체인 인포(Blockchain info)
- 비트코인 블록 익스플로러(Bitcoin Block Explorer)
- 인사이트(insight)
- 블록아르 블록리더(blockr Block Reader)
비트코인 개요
그림에 나와있는 개괄 도표에서는 비트코인의 시스템의 구성 요소로 키가 들어있는 지갑을 보유한 사용자들, 네트워크에 전송되는 거래들, 거래내역 전부를 담고있는 권위 있는 장부인 동의 블록체인을(경쟁적 계산을 통해) 생산해 내는 채굴자들을 들 수 있다.
커피 한잔 구매하기
앨리스의 지갑에 0.1BTC가 송금되었다. 앨리스는 비트코인으로 첫 소매거래를 하기 위해 밥의 가게에서 커피 한 잔을 구매할 계획이다. 이는 판매시점 정보관리(POS) 시스템에 비트코인 옵션을 추가하면서 가능해졌다. POS 시스템은 달러로 나와있는 총 주문 가격을 일반적인 시세에 따라 비트코인으로 전환한 후 두가지 통화 단위에 대한 가격을 보여준다. 물론 이 거래에 대한 지불 요청(Payment request)이 들어있는 QR코드도 보여준다.
Total :
$ 1.50 USD
0.015 BTC
이 지불 요청 QR코드는 다음 URL을 인코딩한 것으로, 이는 BIP0021에 나와있다.
bitcoin:1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA? amount=0.015& label=Bob%27s%20Cafe& message=Purchase%20at%20Bob%27s%20Cafe Components of the URL A bitcoin address: "1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA" The payment amount: "0.015" A label for the recipient address: "Bob's Cafe" A description for the payment: "Purchase at Bob's Cafe"
송금할 비트코인의 목적지 주소만 담겨있는 QR코드와 달리 지불요청 QR 코드로 인코딩된 URL로서 목적지 주소, 지불 금액, 'Bob's Cafe등의 지불과 관련된 기본 내용을 담고있다. 지불요청을 통해 대금을 지불하는데 사용되는 정보를 미리 넣어 둘 수 있고, 동시에 사용자가 읽을 수 잇는 설명도 제공한다.
비트코인 거래
간단하게 설명하자면 거래는 비트코인을 많이 보유한 소유주가 비트코인 일부를 다른 사람에게 전송하는 것을 승인한다고 네트워크에 이야기해 주는 것과 같다. 소유권의 사슬 속에서 비트코인의 새로운 소유주는 또 다른 소유주에게로 비트코인이 전송되는 것을 승인하는 다른 거래를 만드는 과정을 반복함으로써 매수한 비트코인을 소비할 수 있다.
각 거래는 하나이상의 '입력 값(Input)' 즉 비트코인 계좌에서 빠져나가는 차변과, 거래의 또다른 구성요소로서 하나이상의 '출력값(Output)' 즉 비트코인 계좌로 들어오는 대변으로 구성된다. 입력값과 출력값의 합계가 반드시 동일할 필요는 없다. 대신 출력값의 총합은 입력값의 총합보다 약간 작아야하며, 이 차이 값은 거래속에 포함된 '거래 수수료'가 된다.
거래 수수료란 공개장부에 거래를 포함시킨 채굴자가 수거하는 소액의 지불금이다. 비트코인 거래는 그림에서 보는 바와 같이 복식부기장부의 항목과 유사하다.
또한 송금되는 비트코인의 금액(입력값) 각각에 대한 소유권을 소유주의 디지털 서명을 통해 증명하는 과정이 거래에 포함되며 누구든지 독립적으로 거래를 검증할 수 있다. '소비(Spending)'라 함은 이전 거래에서 송금되었던 돈이 비트코인 주소에 의해 확인된 새로운 소유주에게로 전송되는 거래에 서명을 함으로써 이루어지는 작업을 말한다.
거래를 통해 거래 입력값에서 거래 출력값으로 가치가 이동한다. 입력값은 비트코인의 가치가 발생하는 지점으로, 주로 이전 거래의 출력값이다. 거래 출력값은 키를 이용해서 새로운 소유주에게 비트코인의 가치를 넘겨준다.
예상지출(Encumbrance)이라고 불리는 목적지는 향후 거래에서 나온 출력값을 새로운 거래에서 입력값으로 사용될 수 있다. 한 거래에서 나온 출력값은새로운 거래에서 입력값으로 사용될 수 있다. 이와 같이 소유권 사슬을 생성함으로써 가치가 비트코인 주소들 간을 이동하게 된다.
(한 거래의 출력값이 새로운 거래의 입력값이 되는 거래체인)
일반적인 거래 유형
가장 흔흐게 볼 수 있는 거래 유형은 하나의 주소에서 다른 주소로 단일 거래가 이루어 지는 형태이다. 이 경우 종종 원 소유주에게 돌려줘야 하는 '잔액'이 존재하며, 이때 하나의 입력값과 두 개의 출력값이 발생한다.
(가장 일반적인 트랜잭션)
또 다른 일반 유형으로는 여러 개의 입력값을 하나의 출력값으로 합치는 거래다. 이 형태는 실제로 동전과 단위가 작은 지폐가 많이 있는 경우 큰 단위의 지폐 한장으로 교환하는 행위와 동일하다. 지불 과정에서 잔액으로 받은 작은 단위의 금액을 정리하기 위해 지갑 어플리케이션에서 때때로 이 유형의 거래가 시행되기도 한다.
(돈을 합산하는 거래)
마지막으로, 비트코인 장부에서 종종 나타나는 일반적인 거래 유형은 하나의 입력값을 여러 명의 수신인에게 줄 수 있는 여러 개의 출력값으로 배분하는 형태다. 이 거래 유형은 기업체에서 다수의 직원들에게 급여를 지불하는 등 돈을 분배해야 할 경우에 사용된다.
거래의 구성
앨리스의 지갑 어플리케이션에는 앨리스의 명세서대로 거래를 진행하기 위해 적절한 입력값과 출력값을 선택하는데 필요한 모든 논리(logic)가 들어잇다. 앨리스가 해야할 일은 송금 목적지와 금액을 명기하는 일 뿐이다. 나머지는 앨리스가 자세한 사항을 지켜보고 있지 않아도 지갑 어플리케이션 내에서 진행된다. 더욱 중요한 사항은 완전히 오프라인 상태일 때도 지갑 어플리케이션을 통해 거래가 진행될 수 있다는 점이다. 마치 집에서 수표를 먼저 발행하고 나중에 봉투에 넣어 은행으로 우편 발송하는 것과 마찬가지로, 비트코인 거래도 굳이 비트코인 네트워크가 온라인에 접속해 있을 때 진행해서 서명할 필요는 없다. 단지 거래가 실행되어야 할 때 네트워크로 전송하기만 하면 된다.
올바른 입력값 얻기
우선 앨리스의 지갑 어플리케이션에서 밥에게 전송하기를 원하는 금액을 지불할 수 있도록 알맞은 입력값을 찾아야 할 것이다. 지갑 어플리케이션 대부분은 지갑 소유주가 보유한 키로 잠겨있는(지출이 예상되는) 'Unspent Transaction Output'에 대한 소용량의 데이터베이스를 보유하고 있다. 따라서 앨리스의 지갑에는 현금과 비트코인을 교환했던 조와의 거래에서 생성된 거래 출력값 복사본이 포함되어 있을 것이다.
풀 클라이언트(full client)를 사용하는 비트코인 지갑 어플리케이션의 경우, 블록체인상에 있는 모든 거래에서 실제로 발생한 UTXO의 복사본을 가지고 있다. 덕분에 지갑에서 거래 입력값을 생성할 수 있을 뿐만 아니라 정확한 입력값을 가지고 향후 거래를 신속하게 검증할 수 있다.
대부분의 사용자 지급에서는 사용자 본인의 UTXO만 추적하는 '라이트웨이트' 클라이언트를 가동한다.
지갑 어플리케이션에 소비되지 않은 거래 출력값 복사본이 보관되어 있지 않은 경우, 다른 제공자들에 의해 사용가능한 다양한 API를 이용하고 있는 풀인덱스 노드(full-index node)에 요청해서 해당 정보를 검색해달라고 비트코인 네트워크에 요구할 수 있다.
(앨리스 비트코인 주소의 UTXO 전부를 조사)
$ curl https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
위의 예시는 RESTful API 요청으로, 특정 URL에 대한 HTTP GET 명령으로 작업을 진행한다. 이 URL의 경우 특정 비트코인 주소가 보유하고 있는 소비되지 않은 거래 출력값 전부를 돌려보내 주기 때문에 어플리케이션에서 소비를 위해 필요한 거래 입력값을 생성하도록 필요한 정보를 제공해 줄 수 있다. 우리는 응답을 받기 위해 단순 명령행인 HTTP 클라이언트 cURL을 사용한다.
(검색결과)
{ "unspent_outputs":[ { "tx_hash":"186f9f998a5...2836dd734d2804fe65fa35779", "tx_index":104810202, "tx_output_n": 0, "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", "value": 10000000, "value_hex": "00989680", "confirmations":0 } ] }
예시에 나와있는 결과를 통해 앨리스의 주소인 1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK가 소유권을 가지는 출력값 중에 UTXO가 한개 있다는 사실을 알 수 있다. 이 검색 결과에는 해당 거래에 대한 참조가 포함되며, UTXO가 들어있고 금액(1000만 사토시, 0.1 BTC)이 들어있다. 이 정보를 가지고 앨리스의 지갑 어플리케이션은 해당 가치를 새로운 소유주의 주소로 전송하기 위한 거래를 진행할 수 있다.
출력값 생성하기
거래 출력값은 해당 가치에 대한 예상 지출을 생성하는 스크립트의 형태로 만들어지며 스크립트에 대한 솔루션이 제공되는 경우에만 사용할 수 있다. 쉽게 말하면 앨리스의 거래 출력값에는 '이 출력값은 밥의 공개키에 대응하는 키를 이용해 서명을 하는 누구에게나 지불 가능하다' 라는 의미가 담겨있는 스크립트가 포함되어 있을 것이다.
밥의 해당 비트코인 주소에 대응하는 키를 가진 지갑을 가진 사람은 밥 뿐이기 때문에 밥의 지갑에서만 출력값을 가치로 사용할 수 있는 서명을 제공할 수 있다. 따라서 앨리스는 밥의 서명을 요구하는 출력값에 대한 '지출을 예상할' 수 있다.
이 거래에는 출력값이 하나 더 존재할 것이다. 왜냐하면 앨리스의 돈은 0.1BTC에 대한 출력값의 형태인데 커피 한잔가격은 0.015 BTC이기 때문이다. 따라서 앨리스는 0.085 BTC를 돌려받아야 한다. 앨리스의 잔액에 대한 지불은 밥에대한 지불과 동일한 거래 내에서 이루어지며 앨리스의 지갑에서 생성된다.
기본적으로 앨리스의 지갑에서는 그녀가 보유한 돈이 두가지 거래로 쪼개진다. 하나는 밥에게 송금하는 거래이고 하나는 그녀가 잔액을 수신하는 거래다.
이 거래에 명시되어 있지 않고, 입력값과 출력값 간 차이로 알 수 있게 되어 있다. 0.085를 잔액으로 받는 것 대신에 두번째 출력값으로 0.0845만 생성한다면 0.0005BTC(0.5 밀리코인)가 남게된다.
결과적으로 산출되는 입력값과 출력값 간의 차이값이 거래 수수료(Transaction fee)가 되는데, 이는 채굴자들이 해당 거래를 블록에 포함시키고 블록체인 장부에 올리는 데 대한 수수료 명목이다.
거래내역을 장부에 추가하기
앨리스의 지갑 어플리케이션에서 생성된 거래는 258바이트 크기로 돈의 소유권을 확인하고 새로운 소유주를 배정하는 데 필요한 모든 정보를 포함하고 있다. 한 건의 거래가 어떻게 새로운 블록의 부분이 되며 그 블록이 어떻게 '채굴' 되는지에 대해 살펴볼 것이다. 그리고 계속해서 추가되는 상황에서 새로운 블록이 블록체인에 추가된 후 어떻게 신뢰 네트워크를 유지할 수 잇는지에 대해 알아볼 것이다.
거래 전송하기
거래에 필요한 정보가 거래 자체에 모두 포함되어 있기 때문에 거래가 비트코인 네트워크로 전송되는 방법이나 장소는 중요하지 않다. 비트코인 네트워크는 P2P 네트워크로, 각각의 비트코인 고객이 여러 다른 비트코인 고객들에게 접속함으로써 네트워크에 참여하게 된다. 비트코인 네트워크이 목적은 거래내역과 블록을 참여자 전원에게 전파하는 것이다.
거래 전파하기
앨리스의 지갑 어플리케이션에서 유선, 와이파이 휴대폰 등 어떠한 종류의 인터넷이든 연결만 되어 있다면 여러 비트코인 고객들에게 새로운 거래를 전송할 수 있다. 비트코인 네트워크 노드(다른 고객들)가 이전에는 없던 유효한 거래를 전송받으면 즉시 연결되어있는 다른 노드로 해당 거래를 전달할 것이다. 이런 과정을 통해 거래는 .P2P 네트워크를 통해 급속도로 전파되고 몇 초 만에 비트코인 네트워크 내에 있는 노드 대부분에게 도달하게 된다.
밥의 입장에서 거래 살펴보기
비트코인 거래에 대해 가장 흔하게 하는 오해가 바로 새롭게 생성된 블록에 대해 10분을 기다리거나 위험요소를 최소화 하기 위해 필요한 6번의 승인을 위해 최대 60분을 기다려서 '승인'을 받아야 한다는 것이다. 물론 해당 거래를 전 네트워크가 수락했다는 사실을 확인하기 위해 승인 절차가 필요하기는 하지만 커피 한 잔 처럼 소액 결제에 대해서는 시간을 지연시킬 필요가 없다.
비트코인 채굴하기
이제 거래가 비트코인 네트워크상에 전파되었다. 하지만 이 거래가 검증되고 채굴(mining)이라는 과정을 거쳐 블록에 포함될 때 까지는 공유장부(블록체인)의 일부가 되지 못한다.(자세한 내용은 8장 참조)
비트코인 신뢰 시스템은 수학적 계산에 기반을 두고있다. 각 거래들은 블록 단위로 묶여있고, 입증해야 할 수학적 계산의 규모가 엄청나지만 입증된 후에는 검증을 위해서 그다지 많은 계산을 하지 않아도 된다. 채굴 과정은 비트코인 시스템 내에서 두가지 목적을 가지고 있다.
- 채굴 과정은 돈을 새로 발행하는 중앙은행처럼 각 블록 내에서 새 비트코인을 생성한다. 한 블록당 생성되는 비트코인의 양은 고정되어있고 시간이 지나면서 줄어든다.
- 채굴 과정은 거래를 담고 있는 블록이 충분한 연산력을 사용하여 승인되었다는 것이 확인 되었을 때만 신뢰가 생긴다.
이 게임은 누군가 솔루션을 찾아낼 때마다 리셋되고 솔루션을 찾는데 걸리는 시간이 10분정도가 되도록 난이도가 자동적으로 조절된다.
약 10분마다 거래가 담겨있는 블록에 대한 솔루션을 찾기 위해 전 세계적인 경쟁 속에서 수천명의 다른 채굴자들과 함께 채굴 작업을 하고 있다. 작업 증명이라고 불리는 이 솔루션을 찾는 작업을 위해서는 전 비트코인 네트워크에 걸쳐 1초당 수천 조 건의 해싱 작업이 필요하다.
작업 증명 알고리즘은 설정된 유형에 일치하는 솔루션이 나올 때까지 SHA256이라는 암호화 알고리즘을 이용해 블록의 헤더와 임의의 숫자를 반복적으로 해싱한다. 솔루션을 찾아낸 첫 번째 채굴자가 이 경쟁의 승자가 되고 채굴한 블록은 블록체인으로 올라간다.
비트코인 네트워크에 합류하는 채굴자들이 늘어나면서 문제의 난이도가 빠른속도로 높아졌다. 초기에는 CPU 연산 -> GPU -> ASIC(하나의 실리콘 칩위에 동시에 가동되는, 하드웨어상에 수백 개의 채굴 알고리즘이 새겨져 있는 주문형 반도체)을 사용할 때에만 수익성이 있었다.
블록에 담겨있는 거래 채굴하기
네트워크로 전송된 거래는 전 세계적으로 분산되어 있는 장부인 블록체인에 올라가기 전에는 검증되지 않는다. 평균적으로 10분마다 채굴자들은 지난 블록까지의 거래 전부가 포함된 새 블록을 생성한다. 새로운 거래들이 사용자 지갑과 여러 어플리케이션으로부터 네트워크로 끊임없이 들어온다. 비트코인 네트워크 노드들이 이 상황을 지켜보다가 각 노드가 유지하고 있는 임시 풀(temporary pool)로 이 새로운 거래들을 추가한다. 이 임시풀에는 미검증 거래들이 들어있다. 채굴자들이 새 블록을 만들면서 이 임시 풀에서 새 블록으로 미검증 거래들을 추가한 후 새 블록의 유효성을 입증하기 위해 매우 어려운 문제(작업인증)를 풀려고 노력한다.
거래들이 새 블록에 추가될 때 거래 수수료가 가장 높은 거래부터 우선 순위로 추가되고 몇몇 거래는 다른 기준을 바탕으로 추가된다. 각 채굴자는 네트워크로부터 이전 블록을 받게되면 이전 경쟁 라운드에서 채굴에 실패했다는 사실을 알게 되고 바로 새 블록을 채굴하는 과정을 시작한다. 즉시 새로운 블록을 생성하고 이전 블록의 지문을 채운 후 새로운 블록에 대한 작업증명 계산을 시작한다.
각 채굴자는 자신의 블록 안에 특별한 거래 하나를 포함하고 있는데, 이는 자신 소유의 비트코인 주소에 새롭게 생성된 비트코인을 보상(현재는 한 블록당 25 BTC)으로 받는 거래다.
앨리스의 거래가 네트워크에서 선택되어 미검증 거래들로 이루어진 채굴 풀에 포함되었다. 징의 채굴하는 블록에 담겨서 징이 채굴에 성공하여 블록 #277316으로 발행함으로써 블록체인에 등록된다.
몇 분 후, 새 블록인 #277317을 또 다른 채굴자가 채굴한다. 이 새 블록은 앨리스의 거래가 들어있는 이전 블록을 기반으로 하기 때문에 앨리스의 거래가 포함된 블록 위에 좀 더 많은 연산이 추가된다. 앨리스의 거래가 들어있는 블록은 해당 거래에 대해 한번의 '승인(Confirmation)'을 보유하고 있다고 간주된다. 새로운 블록이 추가되면 추가적인 승인을 받게된다. 각 블록이 거래를 담고있는 블록의 상부에 거래를 철회하기가 기하급수적으로 어려워진다. 따라서 해당 거래는 네트워크상에서 더욱더 신뢰도가 올라간다.
그림을 살펴보면 앨리스의 거래가 들어있는 블록을 볼 수 있다. 이 블록을 밑으로 277316개의 블록이 존재하며, 최초 블록 #0까지 체인으로 각자 연결되어 있다. 블록의 '높이(Height)'가 높아지면 각 블록과 체인의 계산 난이도도 전반적으로 올라간다. 앨리스의 거래가 들어있는 블록 이후에 채굴된 블록들은 더 강한 강도로 앨리스의 거래를 보증한다. 왜냐하면 체인의 길이가 길어질수록 수학적 계산의 수가 급격하게 불어나기 때문이다. 관례상 6회 이상의 승인이 이루어진 블록은 취소가 불가능하다(Six confirmation). 왜냐하면 여섯 개의 블록을 무효화해서 다시 계산하기 위해서는 엄청난 양의 계산이 필요하기 때문이다.
거래 소비하기
앨리스의 거래는 블록의 구성 요소로서 블록체인에 끼워져 있기 때문에 비트코인 분산 장부의 구성요소가 되며, 모든 비트코인 어플리케이션에서 확인할 수 있다. 풀 인덱스 클라이언트의 경우 비트코인이 블록 내에서 처음 발생하여 점차 이 거래에서 저 거래로 이동해서 최종적으로 밥의 비트코인 주소에 도달할 때까지 돈의 출처를 추적할 수 있다. 라이트웨이트 클라이언트의 경우 해당 거래가 블록체인 내에 존재하고 그 후 채굴된 블록이 여러 개 있다는 점을 승인함으로써 소위 말하는 단순지불검증(SPV)을 시행할 수 있다. 이를 통해 해당 네트워크가 해당 거래를 유효하다고 수락했음을 확증할 수 있다.
밥은 이렇게 생성된 출력값을 참조해서 입력값을 정한 후 새로운 소유권을 배정받고 나서 본인의 소유의 거래를 생성한다. 이 과정을 거치고 나면 밥은 이제 앨리스와의 거래 및 다른 거래로부터 나온 출력값을 소비할 수 있다.