[Bitcoin 2장] 비트코인의 작동원리

Mong22·2023년 3월 11일
0
post-thumbnail

[해당 글은 '비트코인, 공개블록체인 프로그래밍(안드레아스 M. 안토노풀로스 저, 최은실 김도훈 송주한 옮김, 코인플러그 기술 감수)'을 참고했다.]

[해당 글에 https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch02.asciidoc에 포함된 사진을 사용했다.]


들어가기 앞서서

 2장에서는 비트코인 시스탬 내에서 분산화된 합의라는 비트코인 메커니즘에 의해 '신뢰'를 얻고 승인을 받은 후 거래내역 전부가 블록체인에 최종적으로 기록되는 과정을 살펴볼 것이다.


비트코인 개요

  비트코인 시스템은 다음과 같은 요소로 구성되어 있다.

  • 키가 들어 있는 지갑
  • 네트워크를 통해 전파되는 거래
  • 합의 블록체인(모든 거래 내역을 담고 있는 장부)을 생산하는 채굴자

  블록체인 탐색기를 이용하면 비트코인 네트워크와 블록체인을 통해 거래를 추적하며 각 단계를 살펴볼 수 있다. 인기 있는 탐색기는 다음과 같다.

  • 비트코인 블록 이스플로러(Bitcoin Block Explorer)
  • 블록사이퍼 익스플로러(BlockCypher Explorer)
  • 블록체인 인포(blochain.info)
  • 비트페이 인사이트(BitPay Insight)

블록체인 탐색기는 비트코인 검색 엔진 역할을 하는 웹 어플리케이션이다. 이 서비스를 통해 비트코인 주소, 거래 내역, 블록 등을 살펴볼 수 있다.


커피 한 잔 구매하기

  1장에서 소개한 내용을 기반으로 앨리스가 조에게 0.10BTC를 받았다. 받은 코인으로 앨리스는 비트코인 결제가 가능한 카페에서 커피 한 잔을 구매하려고 한다. 앨리스는 커피를 주문하고 밥은 거래 내역을 계산대에 입력해 POS 시스템을 실행한다. POS 시스템은 지불요청이 들어있는 특수 QR 코드를 자동 생성한다.

지불 요청은 QR코드로 인코딩되어 있는 URL로 목적지 주소, 지불 금액, 판매처 등의 지불과 관련된 기본 정보를 담고 있다.

  앨리스는 스마트폰을 이용해 바코드를 스캔하고 코인을 전송한다. 약 몇 초 후, 밥은 계산대에서 거래 완료를 확인할 수 있다.

  이제 이 거래 과정에 대해 더 자세하게 알아볼 예정이다. 앨리스의 지갑이 어떻게 거래를 성사시키는지, 해당 거래가 어떻게 네트워크 상에 전파되는지, 해당 거래가 어떤 방법으로 검증되는지, 밥이 전송받은 금액을 차후 거래들에서 어떻게 소비하는지를 알아보고자 한다.


비트코인 거래와 입력값 및 출력값

  거래는 비트코인을 보유한 소유자가 비트코인 일부를 다른 소유주에게 전송하는 것을 승인한다고 네트워크에 이야기하는 것이다.

  거래는 복식부기 장부에 나오는 대변과 차변으로 구성된다. 거래는 하나 이상의 입력값(계좌에서 빠져나가는 차변)과 출력값(계좌로 들어오는 대변)으로 구성된다. 아래 그림을 통해 확인해보자.

[Figure 3. Transaction as double-entry bookkeeping]

  비트코인 거래에서 입력값은 항상 출력값보다 크거나 같아야 한다. 만약 입력이 출력값보다 크다면 이 차이 값은 거래 수수료가 되고, 거래 수수료는 채굴자에게 제공된다.

  송금되는 비트코인의 금액(입력값) 각각에 대한 소유권은 디지털 서명을 통해 증명하는 과정이 거래에 포함된다. 이 과정은 누구든 독립적으로 검증할 수 있다.

  따라서 비트코인에서의 소비는 이전 거래에서 송금된 돈이 새로운 소유주에게 전송되는 거래에 서명을 함으로써 이루어지는 작업을 뜻한다.


거래체인과 잔액 지불

  비트코인의 거래는 체인을 형성한다. 이 때, 가장 최근 거래에서 생성된 입력값이 그 이전 거래에서 발생한 출력값과 대응한다. 이전 거래에서 생성된 출력값의 암호를 풀 수 있도록 현재 거래 당사자는 보유 키를 이용해 서명한다. 이로써 비트코인 네트워크에 거래 당사자가 코인을 받았음을 증명할 수 있고 코인이라는 가치가 전송된다. 아래의 그림은 앞서 언급한 앨리스와 밥의 비트코인 거래를 그림으로 표현한 것이다.

[Figure 4. A chain of transactions, where the output of one transaction is the input of the next transaction]

  추가적으로, 거래의 출력값은 현 소유주의 주소와 새로운 소유주의 주소를 포함할 수 있다. 마치 현금을 사용할 때 거스름돈이 발생하는 경우와 유사하다. 남은 잔액을 거래 이전의 현 소유주에게 전달하는 것이다.

  사용자가 요청한 지불 작업을 지갑마다 다르게 해결한다. 작은 입력값 여러개를 합쳐 마치 동전들 여러개를 합쳐 금액을 맞추는 것처럼 지불을 할 수도 있고, 큰 입력값 한 개를 지불해 마치 만원권 한 장을 사용하는 것처럼 지불을 할 수도 있다.


일반적인 거래 유형

  가장 흔한 거래 유형은 하나의 주소에서 다른 주소로 단일 거래가 이루어지는 형태다. 이 때, 흔히 거스름돈이라고 하는 잔액이 발생할 수 있다.

[Figure 5. Most common transaction]

  이 유형에선 하나의 입력값과 두 개의 출력값이 발생한다.


  다른 유형으로는 여러 개의 입력값을 하나의 출력값으로 합치는 형태다. 실제 동전들을 모아 큰 단위의 지폐 한 장으로 모으는 경우와 유사하다.

[Figure 6. Transaction aggregating funds]

  이 유형은 지불 과정에서 잔액으로 받은 작은 금액들을 처리하기 위해 종종 사용된다.


  마지막 유형으로는 하나의 입력값을 여러 개의 출력값으로 배분하는 형태다.

[Figure 7. Transaction distributing funds]

  이 유형은 기업체에서 다수의 직원에게 급여를 지불해야 할 때 종종 사용된다.

  거래가 실행될 때 네트워크로 전송하기만 한다면 오프라인에서도 자동적으로 거래가 진행된다.


거래의 구성

  거래의 구성을 파악하기 위해 앞선 커피 한 잔 구매하기 파트에서 앨리스와 밥의 거래를 상기시키자.

올바른 입력값 얻기

  앨리스는 밥에게 원하는 금액을 전송하기 위해 적절한 입력값을 찾아야 한다. 입력값을 얻는 방식은 지갑 어플리케이션에 따라 세 가지 정도로 구분된다.

  • 풀 노드 클라이언트: 소비되지 않은 거래 출력값의 복사본을 소유해 항상 정확한 입력값을 지니고 있다.
  • 라이트웨이트 클라이언트: 사용자 본인의 소비되지 않은 출력값만 추적한다.
  • 복사본을 보관하지 않는 경우: 다양한 API를 통해 풀 노드에 정보를 요청한다.

출력값 생성하기

  거래 출력값은 예상지출을 생성하는 스크립트의 형태로 만들어지며 스크립트에 대한 솔루션이 제공되는 경우에만 사용할 수 있다.

  앨리스와 밥의 상황을 통해 살펴보자. 앨리스는 커피값보다 큰 금액을 전송했기 때문에, 출력값이 두 개가 된다.

  • 첫 번째 출력값은 밥에게 금액을 전송하는 출력이다. 이 때 앨리스는 스크립트를 통해 밥에게 가치를 전송하게 된다.

  • 두 번째 출력값은 앨리스에 대한 출력값이다. 이른바 거스름돈이 생성되기 때문에 앨리스에 대한 출력값이 생성된다.

앨리스의 스크립트: 앨리스는 지불 대상을 밥의 비밀키로 서명할 수 있는 사람으로 지정하는 스크립트를 출력값에 포함하여 전송한다. 이 때, 밥의 비밀키는 밥의 지갑만 소유하고 있기 때문에 밥만 앨리스의 출력값을 가치로 사용할 수 있다.

  지갑 어플리케이션은 출력값을 생성할 때 소액의 수수료를 추가시켜 입력값보다 출력값이 작게 만든다. 이 때의 수수료를 거래 수수료라고 하며, 이는 채굴자들이 해당 거래를 블록에 포함시키고 체인에 올리는 데에 대한 수수료이다.


[Figure 8. Alice’s transaction to Bob’s Cafe]


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

  생성된 거래는 258바이트 크기이며, P2P 네트워크로 전송된다. 앨리스의 지갑 어플리케이션에서 네트워크에 연결만 되어 있다면 모든 비트코인 노드들에 새로운 거래를 전송할 수 있다. 비트코인 노드들은 새로운 거래를 받으면 바로 연결되어 있는 다른 노드들로 해당 거래를 전파한다. 이를 플러딩이라고 한다. 이렇게 P2P네트워크를 통해 거래는 비트코인 네트워크 내에 있는 노드 대부분에게 도달된다.


밥의 입장에서 거래 살펴보기

  밥은 앨리스의 지갑 어플리케이션에 직접 연결되어 있던 그렇지 않던 앞서 설명한 방식으로 거래를 전달받는다.

  밥의 지갑에는 밥이 보유하고 있는 키를 이용해서 사용 가능한 출력값이 들어 있기 때문에 앨리스의 거래가 전송되면 해당 거래를 통해 돈이 입금된다는 사실을 즉시 파악한다.

  밥의 지갑 어플리케이션은 이 거래가 잘 생성되었고 이전에 소비되지 않은 입력값을 사용했으며, 다음 블록에 포함된 거래 수수료를 충분히 보유하고 있는지 확인할 수 있다. 이 시점에서 밥은 별다른 위험 요소 없이 이 거래가 블록에 포함될 것이라 추정할 수 있다.


비트코인 채굴하기

  비록 앨리스와 밥의 거래가 네트워크상에 전파되었다고 해도, 거래가 검증되고 채굴 과정에 거쳐 블록에 포함될 때까지는 블록체인의 일부가 되지 못한다.

  비트코인 신뢰 시스템은 수학적 계산에 기반한다. 각 거래들은 블록 단위로 묶여 있고, 입증해야 할 수학적 계산이 엄청나지만 입증된 후 검증에는 그다지 많은 계산이 필요하지 않다.

  채굴 과정은 비트코인 시스템 내에서 두 가지 목적을 가지고 있다.

  • 채굴 노드는 비트코인의 합의 규칙을 참조해서 모든 거래를 입증한다. 채굴 과정에서 유효하지 않거나 형식이 잘못된 거래가 거부됨으로써 비트코인 거래에 대한 신뢰도가 생긴다.
  • 채굴과정을 통해 새 비트코인이 생성된다. 한 블록당 생성되는 비트코인의 양은 정해져 있고 시간이 지날수록 줄어든다.

  채굴 과정에서 수학 문제를 풀기 위해 전기를 사용한다. 채굴에 성공하면 새로운 비트코인과 거래 수수료를 보상으로 받는다. 보상은 합의 규칙에 따라 모든 거래를 올바르게 입증한 경우에만 주어진다. 따라서 비트코인 보안은 비용과 보상이 균형을 이루며 중앙 권력 없이 유지될 수 있다.

  채굴의 경우 작업증명이라고 불리는 솔루션을 찾는 작업을 통해 이루어진 다. 작업증명 알고리즘은 설정된 유형에 일치하는 솔루션이 나올 때까지 SHA256 알고리즘을 이용해 블록의 헤더와 임의의 숫자를 반복적으로 해싱한다. 솔루션을 찾아낸 첫 번째 채굴자가 경쟁의 승자가 되고 채굴한 블록은 블록체인으로 올라간다.


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

  비트코인 네트워크 노드들은 새로운 거래들은 각 노드가 유지하고 있는 임시 풀로 추가한다. 채굴자들은 새 블록을 만들면서 임시 풀에서 미검증 거래들을 추가해 작업증명을 하려고 노력한다.

임시 풀은 미검증 거래들을 담아 놓는 공간이다.

  거래들은 수수료가 높은 순서로 새 블록에 추가되고 몇몇 블록은 특정 기준으로 추가된다. 채굴자들은 네트워크로부터 이전 블록을 받게 되면 이전 경쟁 라운드에서 채굴에 실패했다는 사실을 알게 되고 새로운 블록을 채굴하는 과정을 시작한다.

  각 채굴자들은 자신의 블록 안에 특별한 거래를 하나 포함한다. 이는 자신 소유의 비트코인 주소에 새롭게 생성된 비트코인을 보상을 지불하는 것이다. 만약 작업증명에 성공해 블록이 전 세계의 블록체인에 더해지면 블록에 포함된 보상 거래를 소비할 수 있기 때문이다. 즉, 작업증명에 성공했을 때, 보상들의 전송 주소를 남겨놓는 것이다.

  이제 앨리스의 상황으로 살펴보자. 앨리스의 거래는 네트워크에서 선택되어 채굴 풀에 포함된다. 채굴 소프트웨어로 거래가 입증되면 징이라는 채굴자의 채굴 풀이 생성한 후보 블록이라는 이름의 새로운 블록에 게시된다. 해당 채굴에 참여하고 있던 모든 채굴기들은 즉시 이 후보 블록에 대한 작업증명 계산을 시작한다. 거래 전송 5분후 징이 채굴에 성공하면 솔루션을 네트워크에 전송하고 입증되면 새 블록 생성을 위한 경쟁을 시작한다.

  징의 승리 블록은 앨리스의 거래를 포함해 420개가 담겨 있는 블록으로 완성되어 블록체인의 일부가 된다.

  징의 블록 이후의 새 블록은 앨리스의 거래가 포함된 블록 위에 세워져서 블록체인에 좀 더 많은 연산이 추가된다.


거래 검증하기

  앨리스의 거래는 블록의 구성 요소로서 블록체인에 끼워져 비트코인 분산 장부의 구성요소가 되며 모든 비트코인 어플리케이션에서 확인할 수 있다. 각 비트코인 클라이언트들은 거래가 유효하고 사용 가능한지 독립적으로 검증할 수 있다. 검증은 지갑의 종류에 따라 다르게 이루어진다.

  • 풀 노드 클라이언트: 비트코인이 블록 내에서 처음 발생하여 밥의 비트코인 주소에 도달할 때까지 돈의 출처를 추적한다.
  • 라이트웨이트 클라이언트: 해당 거래가 블록체인 내에 존재하고 그 후 채굴된 블록이 여러개 있다는 점을 승인한다.

  이 장에서는 거래가 소유자에서 다른 소유자로 가치를 이동시키는 체인을 어떻게 구축하는지 살펴봤다. 다음 장에선 참조구현을 해볼 예정이다.

profile
Wah!

0개의 댓글