‘Mastering Bitcoin 2nd’ 세미나 3, 2장. How Bitcoin Works

이번 장에서는 사용자가 비트코인을 주고 받기 위해서 비트코인 네트워크가 어떻게 동작하는지를 개요 수준으로 설명합니다. 설명 중 세부적인 내용을 많이 포함한 것들도 있는데, 잘 이해되지 않는 세부적인 사항들은 체크해 두고 넘어가면 됩니다. 이 장 이후의 장들에서 다시 하나 씩 상세하게 다룹니다.

‘책에서 설명하는 내용만 가지고는 이해하기 어렵다’라고 할 부분은 거의 없는 것 같습니다. ‘비트코인이 이렇게 동작하는구나’ 를 개략적으로 설명할 수 있는 정도를 목표로 쭉 읽어 나갑니다. 전체적으로 한 번 읽으신 후, 아래 정리한 내용들만 주의를 기울여 다시 읽어봅니다.

Chapter 2. How Bitcoin Works

Transactions, Blocks, Mining, and the Blockchain

The bitcoin system, unlike traditional banking and payment systems, is based on decentralized trust. Instead of a central trusted authority, in bitcoin, trust is achieved as an emergent property from the interactions of different participants in the bitcoin system.

비트코인은 탈중앙화된 신뢰에 기반합니다. 탈중앙화된 신뢰를 어떻게 만들어내는가? 비트코인 시스템(네트워크)에 참여하는 서로 다른 노드들의 상호작용을 통해 창발되게 함으로서.

비트코인은 신뢰를 부여하는 방식을 바꾼 것입니다. 특정 대상에 신뢰를 부여하는 방식에서 시스템(네트워크)에 신뢰를 부여하는 방식으로 바꾼 것입니다. 신뢰가 특정 참여자에게 중앙화된 방식으로 직접적으로 주어지는 것이 아니라 서로 다른 다수의 참여자들의 상호작용에 의해 탈중앙화된 방식으로 창발되게 함으로서.

Bitcoin Overview

그림 2.1을 살펴봅니다.

사용자가 있습니다. 사용자는 비트코인 클라이언트를 설치하고 실행함으로 비트코인 네트워크에 참여합니다. 비트코인을 주고 받는 것이 목적인 보통의 사용자는 지갑 앱을 설치하고, 지갑 앱을 실행함으로 비트코인 네트워크에 참여합니다. 지갑은 경량형 비트코인 클라이언트입니다. 비트코인은 중앙화된 서버가 없다는 의미로 비트코인 소프트웨어를 클라이언트라고 부릅니다.

그림 2.1의 위쪽(User, Control, Wallet, Private Keys)은, 사용자가 여러 개의 키를 갖는 지갑을 사용하고 있음을 보여줍니다. 지갑 앱의 가장 중요한 역할은 키를 관리하는 것입니다.

보통의 지갑 앱은 처음 실행하면 지갑을 생성합니다. 지갑을 생성한다는 것은 비트코인의 경우 비트코인에 맞게 키를 생성하고 주소를 생성해 주는 것입니다. 이 주소를 사용해서 비트코인을 주고 받을 수 있습니다.

비트코인을 주고 받는 것을 트랜잭션(Transaction)이라고 합니다. 당연한 이야기지만, 다른 사람에게 비트코인을 보내려면 먼저 비트코인을 가지고 있어야 겠죠. 누군가가 여러분에게 비트코인을 보냈다면, 여러분의 주소를 수신자로 하는 트랜잭션이 비트코인 네트워크에 있다는 것입니다. 트랙잭션에는 입력과 출력이 있는데, 출력에 여러분의 주소로 전송한 내용이 작성됩니다. 이 트랜잭션 출력을 가지고  다른 사람의 주소로 비트코인을 전송할 수 있습니다. 그림 2.1 위쪽 지갑 옆에 트랜잭션은 이러한 내용을 언급하고 있습니다.

그림 2.1의 중앙(Network Nodes, Exchage, Merchant, Miner)에는 전 세계적으로 퍼져 있는 비트코인 네트워크를 보여주고 있습니다. 비트코인 네트워크는 개개 노드들의 연결로 구성됩니다. 노드는 비트코인 클라이언트를 실행하는 컴퓨터라고 생각하면 됩니다. 비트코인 네트워크에 연결하는 노드들은 서로 다른 목적을 가지고 참여합니다. 지갑 사용자는 비트코인을 주고 받기 위해서, 거래소는 비트코인의 입출금을 위해서, 상인들은 지불결제를 위해서, 채굴자들은 채굴을 위해서. 비트코인 네트워크 참여자들은 각자 참여하는 목적은 달라도, 비트코인 네트워크가 부여한 노드의 책임을 수행함으로(Carry all network transmissions) 비트코인 네트워크를 유지합니다.

그림 2.1의 하단(Miner에서 시작해서 왼쪽 화살표를 따라)은 트랜잭션이 블록체인에 포함되는 과정을 보여줍니다. 채굴자는 아직 블록에 포함되지 않은 트랜잭션들(Unverified Transactions) 중에 자신이 생성할 블록에 포함할 트랜잭션들을 선택합니다. 블록은 이전 블록의 해시 값을 가지고 있어야 하기 때문에 이전 블록의 해시 값을 구합니다. 생성할 블록이 N번째 블록이라면 N-1 블록의 해시 값을 갖고 있어야 합니다.

블록은 메타정보 성격의 헤더(Block Header)를 갖고 있는데, 헤더 정보를 사용해 채굴자는 채굴을 시작합니다. 채굴은 Proof-of-Work(POW) 방식으로 진행됩니다. 비트코인의 POW는 누가 해시 계산 역량(Hashing power calculates)을 더 많이 보유하고 있느냐의 경쟁입니다. 해시 계산 역량이 높은 채굴자가 먼저 해시 계산 문제를 풀고, 블록 생성에 대한 권한을 인정받는 것입니다. 채굴된 블록은 네트워크에 전파됩니다(New Block Mined & Broadcast). 네트워크 참여자들은 규칙에 따라 블록을 검증하고 블록체인에 블록을 연결합니다. 이런 과정은 합의라는 관점에서 보면, 개별 노드의 인정을 받는 것입니다. 개별 노드들은 해당 블록체인을 포함한 현재 블록체인이 진실이라는 것에 한 표를 던진 것입니다(Network achieves concensus on current blockchain ). 블록체인은 분산화된 트랜잭션 로그라고 생각할 수도 있을 것 입니다(Decentralized Transaction Log).

Buying a Cup of Coffee

A blockchain explorer is a web application that operates as a bitcoin search engine, in that it allows you to search for addresses, transactions, and blocks and see the relationships and flows between them.

블록체인 탐색기는 이름 그대로 블록체인 네트워크의 정보를 탐색하는 웹 애플리케이션입니다. 블록체인 탐색기를 통해 비트코인 네트워크에서 일어나는 거래내역들을 볼 수 있습니다. 주소를 알면, 해당 주소의 거래내역을 모두 검색할 수 있습니다. 다음 링크된 사이트에서 책 내용을 따라해 봅니다. https://blockexplorer.com

Bitcoin Transactions

보통의 사용자의 입장에서 트랜잭션은 비트코인 보내기 받기에 해당합니다. 비트코인을 보내거나 받으려면 트랜잭션을 만들어 비트코인 네트워크에 전송해야 합니다. 지갑이 이런 역할을 해 줍니다.

Transaction Inputs and Outputs

In bitcoin terms, “spending” is signing a transaction that transfers value from a previous transaction over to a new owner identified by a bitcoin address.

비트코인을 다른 누군가에게 보낸다는 것은 내가 가지고 있는 비트코인을 쓰는 것(spending) 입니다. 비트코인을 쓰려면 먼저 그것이 정말 내것인지를 증명해야 합니다. 서명을 통해 소유권을 주장할 수 있습니다. 비트코인은 별도로 존재하는 것이 아니라 트랜잭션 출력 정보로 작성되어 있습니다. 데이터베이스로 생각해 보면, 내가 갖고 있는 잔고가 얼마인지를 관리하는 테이블이 없다는 것입니다. 트랜잭션 테이블만 있는 것입니다.  이런 상황이기 때문에 비트코인을 보내려면 먼저 이전 트랜잭션들 중에서 나를 수신자로 하는 출력이 있는 트랜잭션들을 찾아야 합니다.

비트코인 이전에는 소유권 증명은 은행과 같은 중앙화된 기관 만이 할 수 있었습니다. 비트코인은 중앙화된 소유권 증명을 시스템(네트워크) 참여자들의 합의로 탈중앙화된 소유권 증명이 가능하도록 합니다. 

Transactions are like lines in a double-entry bookkeeping ledger.

트랜잭션을 복식부기에 비유하는 데 개인적으로 마음에 들지 않습니다. 복식부기에 대해서 모른다면 이걸 먼저 알아야 하니까요. 뭐 복잡하게 생각할 필요 없습니다. ‘비트코인에서는 입력과 출력을 구분하고 입력의 합과 출력의 합이 같아야 한다‘는 정도만 짚고 넘어가면 됩니다.

내가 가지고 있는 비트코인 정보가 여러 트랜잭션들로 나누어져 있기 때문에, 비트코인을 보내려면 먼저 어떤 것에서 보낼 것인지를 정해야 합니다. 보낼 비트코인의 양에 따라 여러 개의 트랜잭션들에서 여러 개의 출력들을 사용해야 할 수도 있습니다. 이것이 입력입니다. 받는 사람도 여럿 일 수 있을 것입니다. 누구에게 얼마의 비트코인을 보낼 것인지가 출력입니다. 하나의 트랜잭션은 다수의 출력들과 입력들로 작성될 수 있습니다.

다수의 트랜잭션들에서 다수의 출력들을 선택해서 입력을 구성하기 때문에 출력에 맞게 딱 떨어지지 않을 수 있습니다. 예를 들어 0.1 BTC, 0.2 BTC인 두 개의 출력만 가지고 있는데 0.15 BTC를 보내야 할 경우가 있을 수 있습니다. 0.15 BTC를 보내기 위해서는 0.2 BTC를 선택해야 할 것입니다. 트랜잭션의 출력은 쪼갤 수 없기 때문에 0.15 BTC를 보내려면 0.2 BTC를 보내야 합니다. 비트코인 네크워크에서는 입력과 출력을 맞춰야 하기 때문에 입력과 출력의 차이(0.2 – 0.15 = 0.05)를 보정해 줘야 합니다. 입력과 출력의 차이는 수수료라는 항목으로 잡힙니다. 출력의 합은 출력들과 수수료를 합해 구합니다.

Transaction Chains

어떤 트랜잭션의 출력이 다른 트랜잭션의 입력으로 사용되기 때문에 트랜잭션들 사이에 연결이 만들어 집니다. 그림 2.4는 트랜잭션들 사이의 연결 예시를 보여줍니다.

Making Change

This is because transaction inputs, like currency notes, cannot be divided.

보낼 비트코인 양에 비해 차이가 큰 출력들만 가지고 있다면 너무 많은 수수료를 내게 됩니다. 이런 경우 남은 양을 돌려 받아야 합니다. 수수료로 지불할 양을 정하고, 입력에서 출력들과 수수료를 더한 값을 뺀 나머지를 자신의 주소로 보내는 출력을 추가적으로 작성하면 됩니다. 예를 들어 사용할 수 있는 출력으로 0.2 BTC가 있고, 0.15 BTC를 보내야 하는데 수수료로 0.05 BTC는 너무 많고 0.001 정도가 적당하고 생각한다면, 자신의 주소로 0.049 BTC(0.2 – 0.15 – 0.001 = 0.049) 를 보내도록 트랜잭션 출력을 작성하면 됩니다.

Different wallets may use different strategies when aggregating inputs to make a payment requested by the user.

채굴자들이 어떤 트랜잭션을 블록에 포함할지를 결정할 때 수수료가 영향을 미칩니다. 입력과 출력이 많으면 그 만큼 처리해야할 데이터 양이 늘기 때문에 입력 개수와 출력 개수 또한 채굴자가 블록에 포함할 트랜잭션을 선택할 때 영향을 미칩니다. 수수료는 적고 입력 개수와 출력 개수가 많은 트랜잭션이라면 채굴자의 선택에서 배제될 수 있습니다.

입력으로 사용될 트랜잭션 출력 선택은 지갑이 하는데, 지갑들 마다 여러가지 이유로 서로 다른 전략을 사용합니다. 사용자 입장에서는 채굴자에 의해 잘 선택되면서도 수수료가 저렴하도록 해 주는 전략을 제공하는 지갑을 선호할 것입니다. 물론 대부분의 사용자들은 이런 부분까지는 잘 모르기 때문에 이런 부분을 고려해서 지갑을 선택하지는 않습니다.

Common Transaction Forms

그림 2.5는 출력보다 큰 하나의 입력을 선택하고, 잔액은 돌려 받는 유형입니다. 가장 일반적인 유형입니다.

그림 2.6는 다수의 입력들을 모아서 하나의 출력을 작성하는 유형입니다. 작은 단위의 금액을 정리하기 위해 지갑 앱에서 때때로 이 유형이 사용됩니다.

그림 2.7은 하나의 입력으로 다수의 출력을 작성하는 유형입니다. 기업체에서 직원들에게 급여를 지불하는 경우를 생각할 수 있습니다.

Constructing a Transaction

사용자는 지갑의 보내기 기능을 사용해서 비트코인을 보냅니다. 사용자는 누구에게 얼마 만큼의 비트코인을 보낼 지를 작성하면, 지갑은 그 정보를 가지고 트랜잭션을 생성합니다.

트랜잭션 생성은 심지어 오프라인으로도 가능합니다. 대부분의 지갑 앱들은 이렇게 하지는 않지만, 사실 이렇게 하는 방법이 안전합니다. 트랜잭션을 생성하는 과정에서 키를 가지고 서명을 해야 하는데, 네트워크에 연결되어 있다면 이 과정에서 가능성은 낮겠지만 키 탈취와 같은 문제가 생길 수도 있습니다.

Getting the Right Inputs

If the wallet application does not maintain a copy of unspent transaction outputs, it can query the bitcoin network to retrieve this information using a variety of APIs available by different providers or by asking a full-node using an application programming interface (API) call.

입력으로 사용할 트랜잭션 출력을 찾기 위해 모든 트랜잭션을 뒤지는 것은 아닙니다. 효율성을 위해 비트코인 네트워크는 사용하지 않은 트랜잭션 출력(UTXO; Unspent Transaction Output)을 별도로 관리합니다.

대부분의 지갑 앱들은 경량 클라이언트이고 직접 UTXO를 관리하지 않습니다. 대부분의 지갑 앱들은 풀노드를 운영하면서 UTXO를 제공하는 업체의 API를 사용합니다. 대다수의 블록탐색기 사이트는 API 또한 제공합니다. 책에서는 https://blockchain.info의 API를 사용하고 있는데, 저는 SoChain을 추천합니다.

Creating the Outputs

A transaction output is created in the form of a script that creates an encumbrance on the value and can only be redeemed by the introduction of a solution to the script.

트랜잭션 출력이 스크립트 형태로 만들어 진다는 정도만 짚고 넘어갑니다. 스크립트로 작성되었다는 것은 프로그래밍 가능하고, 프로그래밍 된 대로 실행할 수 있다는 것을 의미합니다. 이렇게 이야기하면 일반적인 프로그래밍 언어를 생각할 수 있는데 그렇지는 않습니다. 비트코인 스크립트 언어는 비트코인이 달성하고자 하는 목적에 초점을 맞춘 매우 단순한 스택기반 언어입니다.

그림 2.8을 보고 트랜잭션 정보들을 추출해 봅니다. 입력은 어떻고, 출력은 어떻고, 수수료는 어떻고. 트랜잭션 크기는 얼마고, 어디에서 어디로 얼마나를 보냈고 잔액은 어떻게 되는지. 여기서 주의할 점은 트랜잭션 정보가 실제로는 이렇게 작성되지는 않는 다는 것 입니다. 사용자가 편리하게 볼 수 있도록 블록탐색기 개발 업체가 가공한 것입니다.

Adding the Transaction to the Ledger

A common misconception about bitcoin transactions is that they must be “confirmed” by waiting 10 minutes for a new block, or up to 60 minutes for a full six confirmations.

신규 블록이 생성되는데 걸리는 시간은 10분입니다. 트랜잭션이 블록에 포함되고 해당 블록이 블록체인에 연결되면 거래가 confirmed되었다고 합니다. 특별한 경우가 아니면 사용자가 전송한 트랜잭션은 10분 정도 후에 confirmed 됩니다.  10분 후에는 다른 블록이 해당 블록 뒤에 연결됩니다. 블록이 추가될 때 마다 confirmed 수가 증가합니다. 트랜잭션이 포함된 블록의 confirmed 수는 1입니다. 블록이 블록체인에 포함되었다고 해도 여러 가지 변수가 발생할 수 있습니다. 보통 confirmed 수가 6이 되면 트랜잭션에 변수가 발생할 확률은 거의 없다라고 봅니다.

탈중앙화된 방식으로 트랜잭션(거래)을 처리하는 비트코인에서 가장 중요하게 해결해야 하는 문제는 이중지불의 문제입니다. 이중지불 문제는 트랜잭션 순서만 정할 수 있으면 됩니다. 순서가 앞선 것을 먼저 처리하면 됩니다. 잔고가 1000원이 있는데 1000원 인출에 대한 트랜잭션이 연속 두 번 날라왔다고 했을 때, 첫 번째 트랜잭션이 처리되고 나면 잔고가 0이 되니 두 번째 트랜잭션 처리는 거부 됩니다. 중앙화된 방식에서는 너무 단순한 문제가 탈중앙화된 p2p 환경에서는 해결하기 매우 어려운 문제가 됩니다. 탈중앙화된 p2p 환경이 갖는 본질적인 특징 중 하나가 ‘차이’이기 때문입니다. p2p 환경에서는 노드가 위치한 지역이나 전달 경로 또는 전달 속도에 따라 노드 마다 트랜잭션 순서가 다를 수 있습니다.

비트코인은 블록과 블록체인이란 개념으로 트랜잭션 순서를 정하고 이중 지불 문제를 해결합니다. 블록체인에서 confirm되었다는 것은 트랜잭션 순서가 확정되었다는 것을 의미합니다. 확정이면 확정이지 첫 번째 confirm, 두 번째 confirm, 세 번째 confirm은 뭐야?라고 의문이 들 수 있습니다. 이 또한 탈중앙화를 달성하는 방식으로 p2p 네트워크를 선택했기 때문에 필요한 것으로, p2p 네트워크의 본질적 특징인 ‘차이’ 때문에 발생하는 것입니다. 여기에서는 ‘차이’라는 인사이트를 얻으면 됩니다. 좀 더 자세한 내용은 블록을 다룰 때 하도록 하겠습니다.

Bitcoin Mining

Mining achieves a fine balance between cost and reward. Mining uses electricity to solve a mathematical problem. A successful miner will collect a reward in the form of new bitcoin and transaction fees. However, the reward will only be collected if the miner has correctly validated all the transactions, to the satisfaction of the rules of consensus. This delicate balance provides security for bitcoin without a central authority.

채굴에는 비용이 듭니다. 이 비용은 비트코인의 원가로 작용합니다. 비트코인 가격이 계속 떨어질 때 ‘이 가격 이하로는 떨어지지 않을거야’라고 말 할 때, ‘원가’를 근거로 드는 경우가 자주 있습니다.

A good way to describe mining is like a giant competitive game of sudoku that resets every time someone finds a solution and whose difficulty automatically adjusts so that it takes approximately 10 minutes to find a solution.

채굴을 스도쿠에 비유해서 설명하는 것은 채굴에 대한 직관적 이해를 제공합니다. 채굴을 스도쿠에 비유하는 부분을 직관적인 이해를 얻을 때 까지 여러 번 읽어봅니다.

비트코인 채굴은 경쟁 방식이고, 채굴에 대한 보상이 만만치 않기 때문에 채굴자들은 무한 경쟁을 펼칩니다. 채굴자들의 머릿속에는 ‘어떻게 하면 경쟁에서 이길 수 있을까’라는 생각으로 가득차 있을 것입니다. 경쟁에서 이기기 위해 하드웨어를 개조하고 소프트웨어를 개발하는 것은 당연한 일이겠죠.

Mining Transactions in Blocks

Once validated by the mining software it was included in a new block, called a candidate block. Once other miners validated the winning block they started the race to generate the next block.

채굴자가 유효한 블록을 생성했다고 해서 그것이 바로 블록체인에 연결되는 것은 아닙니다. 채굴은 경쟁방식으로 이루어지고, P2P 네트워크에는 승리자를 결정해 줄 중앙 서버가 없기 때문에 서로 다른 채굴자들에 의해 생성한 다수의 블록들이 네트워크에 전파될 것입니다. 누가 승리자인지는 노드들의 합의에 의해 결정됩니다. 노드들은 자신의 블록체인에 전파된 블록을 연결하는 것으로 ‘이 블록을 생성한 마이너가 승리자이다’ 라고 투표(합의)하는 것입니다. 의미가 그렇다는 것이지 실제 투표를 하지는 않습니다. 비트코인 클라이언트 소프트웨어로 작성된 코드에 의해서 규칙으로 처리됩니다. P2P 네트워크에서 발생할 수 있는 다양한 변수에 따라 합의에 이르는 과정은  다양한 양상을 띱니다. 

그림 2.9에서 블록의 height가 뭔지, depth는 뭔지, difficulty는 어떤 의미 인지를 설명할 수 있어야 합니다.

Spending the Transaction

Lightweight clients can do what is called a simplified payment verification (see “Simplified Payment Verification (SPV) Nodes”) by confirming that the transaction is in the blockchain and has several blocks mined after it, thus providing assurance that the miners accepted it as valid.

지갑과 같은 경량 클라이언트의 경우는 SPV(Simplified Payment Verification)라 불리는 방식으로 검증합니다. 해당 트랜잭션이 블록체인 내에 있고, 트랜잭션을 포함한 블록 이후에 다수의 블록이 채굴되어 있으면 유효한 것으로 판단합니다.

스마트폰을 사용하는 사용자들은 앱 형태의 지갑을 사용합니다. 스마트폰 사양이 데스크탑 수준으로 올라오긴 했지만, 비트코인을 주고 받기만 하면 되는 사용자는 자신의 스마트폰에 블록체인을 모두 다운로드 받고, 매번 블록이 생성될 때마다 블록을 검증하기를 원하지는 않을 것입니다. SPV는 이러한 환경을 지원하기 위한 것으로 블록체인을 모두 다운로드 받지 않고도 해당 트랜잭션의 유효성을 검증할 수 있는 방법입니다.

About the Author
(주)뉴테크프라임 대표 김현남입니다. 저에 대해 좀 더 알기를 원하시는 분은 아래 링크를 참조하세요. http://www.umlcert.com/kimhn/

Leave a Reply

*