[Bitcoin] - ch2. 비트코인의 작동원리

‍허진·2023년 2월 21일
0

Blockchain

목록 보기
2/19
post-thumbnail

본 글은 '비트코인, 공개 블록체인 프로그래밍(Andreas M. Antonopoulos 저, 최은실, 김도훈, 송주한 옮김, 2018)'을 바탕으로 작성되었습니다.

이번 장에서는 실제 비트코인 거래가 이루어지는 과정을 살펴보면서 블록, 채굴, 블록체인 등이 어떻게 쓰이는지를 알아보겠다.

가장 먼저, 비트코인은 키가 들어있는 지갑, 네트워크를 통해 전파되는 거래, 모든 거래 내역을 담고 있는 장부인 합의 블록체인과 그것을 생성하는 채굴자로 구성되어 있다.

이제 Alice가 Bob의 카페에서 비트코인으로 커피를 구매하는 과정을 통해 비트코인 거래에 대해 자세히 알아보자.

> 커피 한잔 구매하기

Alice에게는 현재 친구인 Joe로부터 얻은 0.10BTC가 있다고 가정하자. Alice는 Bob의 카페에서 커피 한잔을 비트코인을 통해 구매하려고 한다. 커피 한 잔의 가격은 0.015BTC이다.

Alice는 Bob의 POS 시스템에 생성된 QR코드를 스캔한다. 이 QR코드는 지불요청(payment request)가 들어있는 특수 QR코드이다.


[그림 - Bob의 Pos 시스템에 생성된 특수 QR코드]

이 QR코드에는 목적지 주소, 지불 금액, 소유자 정보 등과 같은 기본적인 설명을 담고 있다.
QR코드를 스캔한 Alice는 스마트폰에 나타난 화면에서 0.015BTC를 Bob의 카페에 지불한다는 내용을 읽고, 전송 버튼을 눌러 지불을 승인한다. 약 몇 초 후에 Bob은 계산대에서 거래가 완료되는 화면을 볼 수 있다.

이렇게 거래는 완료되었다. 하지만 뭔가 좀 아쉽다는 느낌이 든다. 그러므로 Alice의 지갑이 어떻게 거래를 성사시키는지, 해당 거래가 어떻게 네트워크상으로 전파되는지, 해당 거래가 어떤 방법으로 검증되는지, 마지막으로 밥이 전송받은 금액을 차후 거래들에서 어떻게 소비할 수 있는지에 대해 더 알아보자.

> 거래 입력값과 출력값

비트코인 거래에는 입력값(Input)과 출력값(Output)이 존재한다. 쉽게 생각해서 입력값은 Alice가 지불한 금액, 출력값은 Bob이 받게 되는 금액과 Alice에게 돌려줄 잔돈 등을 뜻한다고 볼 수 있다.

[그림 - 거래 장부]

출력값의 총합은 항상 입력값의 총합보다 약간 작아야 하며, 이는 거래 속에 포함된 거래 수수료 때문이다.
또한, 송금되는 비트코인 금액(입력값) 각각에 대한 소유권을 소유주의 디지털 서명을 통해 증명하는 과정이 거래에 포함되며 누구든지 독립적으로 거래를 검증할 수 있다. 비트코인 용어로 '소비(spending)'는 이전 거래에서 송금되었던 돈이 비트코인 주소에 의해 확인된 새로운 소유주에게로 전송되는 거래에 서명을 함으로써 이루어지는 작업을 말한다.

> 거래 체인

Alice가 Bob에게 커피 값을 지불할 때 이전 거래의 출력값(Joe와의 거래에서 생긴)을 입력값으로 사용했다. 따라서 이전 거래의 출력값으로 새로운 입력값을 만들고, 나머지 잔액을 돌려받는다는 것을 알 수 있다.
각 거래는 체인을 형성하는데, 가장 최근 거래에서 생성된 입력값이 그 이전 거래에서 발생한 출력값과 대응한다. 이전 거래에서 생성된 출력값의 암호를 풀 수 있도록 Alice가 보유하고 있는 키를 이용해서 서명한다. 이를 통해 비트코인 네트워크에 Alice가 돈을 가지고 있다는 사실을 증명할 수 있게 된다.

다음 그림은 Alice와 Bob의 비트코인 거래가 진행되는 과정을 나타낸 것이다.

[그림 - 한 거래의 출력값이 새로운 거래의 입력값이 되는 거래체인]

> 잔액 지불

비트코인 거래는 일반적인 화폐(지폐, 동전) 거래처럼 단위로 쪼갤 수 없다. 따라서 거래를 하다보면 출력값에서 잔액이 남는 상황이 발생할 수 있다. 이러한 잔액은 입력값에 대한 소유주(의 주소)에게로 다시 전송된다. 하지만 프라이버시를 이유로 종종 소유주의 지갑에서 입력값에 대한 주소와 다른 새로운 주소를 사용하기도 한다.

위의 그림에서도 출력값의 잔액(change)이 Alice의 주소로 보내지는 것을 확인할 수 있다.

> 일반적인 거래 유형

거래의 유형으로는 대표적으로 3가지를 제시할 수 있다.

  1. 하나의 주소에서 다른 주소로 단일 거래가 이루어지는 형태
    : 이러한 경우는 원 소유주에게 돌려줘야 하는 '잔액'이 존재할 수 있으며, 이때 하나의 입력값과 두 개의 출력값이 발생한다.
  2. 여러개의 입력값을 하나의 출력값으로 합치는 거래 형태
    : 동전이나 단위가 작은 지폐가 많이 있는 경우 큰 단위의 지폐 한 장으로 교환하는 행위와 동일하다. 잔액으로 받은 작은 단위의 금액을 정리하기 위해 지갑 어플리케이션에서 때때로 이 유형의 거래가 실시되기도 한다.
  3. 하나의 입력값을 여러 출력값으로 배분하는 형태
    : 주로 기업체에서 다수의 직원들에게 급여를 지불하는 등 돈을 분배해야 할 경우에 사용된다.

> 올바른 입력값 얻기

Alice의 지갑 어플리케이션에서는 Bob에게 금액을 지불할 수 있도록 알맞은 입력값을 찾아야 할 것이다. 대부분의 지갑에서는 들어 있는 주소에 속해 있는 사용 가능한 출력값 전부를 기록하고 있다.

  • 풀 노드 클라이언트(full-node client)
    : 풀 노드 클라이언트를 사용하는 비트코인 지갑의 경우, 블록체인상에 있는 모든 거래에서 실제로 소비되지 않은 출력값의 복사본을 보유하고 있다. 이 덕분에 지갑에서 거래 입력값을 생성할 수 있을 뿐만 아니라 정확한 입력값을 가지고 향후 거래를 신속하게 검증할 수 있다. 하지만 디스크 공간을 많이 차지한다.
  • 라이트웨이트 클라이언트(light weight client)
    :사용자 본인의 소비되지 않은 출력값만 추적한다.
  • API 이용
    : 지갑 어플리케이션에 소비되지 않은 거래 출력값 복사본이 없는 경우, 다른 제공자들에 의해 사용 가능한 다양한 API를 이용하거나 API 호출을 이용하고 있는 풀 노드(full node)에 요청해서 해당 정보를 검색해 달라고 비트코인 네트워크에 요구할 수 있다. 이러한 API 요청은 특정 URL에 대한 HTTP GET 명령으로 진행된다.

> 출력값 생성하기

거래 출력값은 해당 가치에 대한 예상지출을 생성하는 스크립트의 형태로 만들어지며, 스크립트에 대한 솔루션이 제공되는 경우에만 사용할 수 있다.
쉽게 말하면 Alice의 거래 출력값에는 '이 출력값은 Bob의 공개키에 대응하는 키를 이용해 서명을 하는 누구에게나 지불 가능하다'라는 의미가 담겨 있는 스크립트가 포함되어 있을 것이다. Bob의 해당 비트코인 주소에 대응하는 키를 가진 지갑을 가진 사람은 Bob 뿐이기 때문에 Bob의 지갑에서만 출력값을 가치로 사용할 수 있는 서명을 제공할 수 있다. 따라서 Alice는 Bob의 서명을 요구하는 출력값에 대한 '지출을 예상할' 수 있다.

또한, Alice의 잔액에 대한 지불은 Bob에 대한 지불과 동일한 거래 내에서 이루어지며, Alice의 지갑에서 출력값으로 생성된다.

마침내 적절한 방식으로 비트코인 네트워크가 진행한 거래에 대해 Alice의 지갑 어플리케이션은 소액의 수수료를 추가시킨다. 산출되는 입력값과 출력값 간의 차이값이 거래 수수료(transaction fee)가 되는데, 이는 채굴자들이 해당 거래를 블록에 포함시키고 블록체인에 올리는 데에 대한 수수료 명목이다.
[그림 - Alice가 Bob에게 지불한 거래내역]

> 거래 내역을 장부에 추가하기

Alice의 지갑 어플리케이션이 생성된 거래는 258byte 크기로 돈의 소유권을 확인하고 새로운 소유주를 배정하는 데 필요한 모든 정보를 담고 있다. 이제 해당 거래는 블록체인의 일부가 되기 위해 비트코인 네트워크로 전송되어야 한다.
이제 한 건의 거래가 어떻게 새로운 블록의 일부가 되며 그 블록이 어떻게 '채굴'되는지에 대해 살펴보자. 그리고 블록들이 계속적으로 추가되는 상황에서 새로운 블록이 블록체인에 추가된 후 어떻게 신뢰 네트워크를 유지할 수 있느지에 대해 알아보자.

> 거래 전송/전파하기

비트코인 네트워크는 P2P 네트워크로, 각각의 비트코인 고객이 여러 다른 비트코인 고객들에게 접속함으로써 네트워크에 참여하게 된다. 비트코인 네트워크의 목적은 거래내역과 블록을 참여자 전원에게 전파하는 것이다.

비트코인 프로토콜을 이용해서 비트코인 네트워크에 참여하는 서버, 데스크톱 어플리케이션, 지갑 등의 모든 시스템을 비트코인 노드라고 한다. Alice의 지갑 어플리케이션에서 유선, 와이파이, 휴대폰 등 어떠한 종류의 연결만 되어 있다면 모든 비트코인 노드들에게 새로운 거래를 전송할 수 있다. 비트코인 노드가 이전에는 없던 유효한 거래를 전송받으면 즉시 연결되어 있는 다른 노드로 해당 거래를 전달할 것인데, 이것이 바로 플러딩(flooding)이라고 알려진 전파 기술이다.
이런 과정을 통해 거래는 P2P 네트워크를 통해 급속도로 전파되고 몇 초 만에 비트코인 네트워크 내에 있는 노드 대부분에게 도달하게 된다.

> Bob의 입장에서 거래 살펴보기

Bob의 입장에서 Alice와의 거래를 살펴보자.

먼저, Bob의 비트코인 지갑 어플리케이션이 Alice의 지갑 어플리케이션에 직접 연결되어 있는 경우, Bob의 지갑 어플리케이션은 Alice의 거래를 전송받은 첫 번째 노드가 될 수도 있다. Alice의 지갑이 다른 노드를 통해 거래를 전송하게 되는 경우라도 Bob의 지갑으로는 몇 초 안에 거래가 도달하게 될 것이다.

Bob의 지갑에는 Bob이 보유하고 있는 키를 이용해서 사용 가능한 출력값이 들어 있기 때문에 Bob의 지갑은 Alice의 거래가 전송되면 해당 거래를 통해 돈이 입금된다는 사실을 즉시 파악한다. 또한, Bob의 지갑 어플은 이 거래가 잘 생성되었고, 이전에 소비되지 않은 입력값을 사용했으며 다음 블록에 포함된 거래 수수료를 충분히 보유하고 있는지 스스로 확인할 수 있다. 이 시점에서 Bob은 별다른 위험 요소 없이 이 거래가 즉시 블록에 포함되어 승인될 것이라고 추정할 수 있다.

> 비트코인 채굴하기

Alice의 거래가 비트코인 네트워크상에 전파되었지만, 이 거래가 검증되고 채굴(mining)이라는 과정을 거쳐 블록에 포함될 때까지는 블록체인의 일부가 되지 못한다. 채굴 과정은 비트코인 시스템 내에서 두 가지 목적을 가진다.

  • 채굴 노드는 비트코인의 합의 규칙(consensus rule)을 참조해서 모든 거래를 입증한다. 따라서 채굴 과정에서 유효하지 않거나 형식이 잘못된 거래가 거부됨으로써 비트코인 거래에 대한 신뢰도가 생긴다.
  • 채굴 과정은 돈을 새로 발행하는 중앙은행처럼 각 블록 내에서 새 비트코인을 생성한다. 한 블록당 생성되는 비트코인의 양은 제한되어 있고 시간이 지나면 줄어든다.

채굴 과정에서는 수학 문제를 푸는데, 이때 누군가가 솔루션을 찾아낼 때마다 리셋되고 솔루션을 찾는 데 걸리는 시간이 10분 정도가 되도록 난이도가 자동적으로 조절된다. 이때 솔루션을 찾는 작업을 작업증명(Proof-of-Work,PoW)이라고 부르며, 전 비트코인 네트워크에 걸쳐 1초당 수천 조 건의 해싱 작업이 필요하다. 작업증명 알고리즘은 설정된 유형에 일치하는 솔루션이 나올 때까지 SHA256이라는 암호화 알고리즘을 이용해 블록의 헤더와 임의의 숫자를 반복적으로 해싱한다. 솔루션을 찾아낸 첫 번째 채굴자가 이 경쟁의 승자가 되고 채굴한 블록은 블록체인으로 올라간다.

> 블록에 담겨 있는 거래 채굴하기

> 거래 소비하기

*그림 출처 - https://github.com/bitcoinbook/bitcoinbook/commit/1fbacfabff79b2760f112654f09803133ca06550\ *

profile
매일 공부하기 목표 👨‍💻 

0개의 댓글