‘Mastering Bitcoin 2nd’ 세미나 7, 6장. Transactions 1/2

이번 장은 비트코인 시스템의 핵심인 트랜잭션에 대해서 다룹니다. 중요한 것을 다루는 만큼 읽기에도 전략이 필요합니다.

먼저 제목 중심으로 쭉 훑어보면서 어떤 내용들로 구성되는지 살펴봅니다.  간략히 요약하면서 한 번 더 읽어 봅니다. 가볍게 읽어도 될 부분과 집중해서 읽어야 할 부분을 구분해 둡니다. 집중할 부분들을 하나씩 세부적으로 정리합니다. 이해가 잘 안 되는 부분은 표시해 둡니다. 아래 정리된 내용을 같이 읽으면서 본문을 한 번 더 읽습니다.

이번 장은 분량이 꽤 되고, 집중을 해야 할 부분들도 여러 곳 있기 때문에 두 번의 세미나로 나누어서 진행합니다. 이번 세미나에서는 Transaction Scripts and Script Language 전까지 진행합니다.

Chapter 6. Transactions

Introduction

Transactions are data structures that encode the transfer of value between participants in the bitcoin system. Transactions are the most important part of the bitcoin system. Everything else in bitcoin is designed to ensure that transactions can be created, propagated on the network, validated, and finally added to the global ledger of transactions (the blockchain).

트랜잭션은 대부분 거래라고 번역하는데 실제적인 의미는 ‘비트코인(가치)에 대한 소유권 이동’ 입니다. 프로그래밍 관점에서 보면 소유권 이동에 대한 정보를 담을 수 있는 데이터 구조입니다. 트랜잭션은 비트코인 시스템에서 가장 중요한 부분입니다. 트랜잭션 이외의 다룬 부분들은 트랜잭션을 생성하고 네트워크로 전파하고 검증하고, 최종적으로 네트워크 참여자들이 모두 같은 내용의 트랜잭션 이력을 공유하도록 하기 위한 것입니다.

Transactions in Detail

그림 1을 보고 블록탐색기가 제공하는 트랜잭션 정보를 읽고 그 의미를 하나 하나 설명해 봅니다. 

트랜잭션 정보는 블록탐색기에서 보여주는 정보와는 좀 많이 다릅니다. 블록탐색기는 실제 트랜잭션 정보를 가공해서 사용자 친화적(그렇게 친화적이지는 않은 것 같지만)으로 보여주는 서비스입니다. 

Transactions—Behind the Scenes

비트코인 코어 커맨드 라인 인터페이스에서 getrawtransaction와 decoderawtransaction를 실행해서 앨리스의 “raw” 트랜잭션 정보를 구해 봅니다. 블록탐색기에서는 이 트랜잭션 정보를 그림 1과 같이 제공한 것입니다.

그림 1과 raw 트랜잭션을 서로 비교해 보고, 어떤 차이가 있는지 이야기 해 봅니다.

어떻게 raw 트랜잭션으로 그림 1과 같이 정보를 제공할 수 있을지를 설명해 봅니다. 설명이 잘 안 되는 부분을 표시해 두고 이후의 내용들을 읽으면서 답을 찾아갑니다.

Transaction Outputs and Inputs

The fundamental building block of a bitcoin transaction is a transaction output. Transaction outputs are indivisible chunks of bitcoin currency, recorded on the blockchain, and recognized as valid by the entire network.

비트코인 트랜잭션에서 가장 핵심적인 부분은 ‘트랜잭션 출력’입니다. 비트코인 소유권은 사용되지 않은(다른 트랜잭션의 입력으로 사용되지 않은) 트랜잭션 출력으로 관리됩니다.

Bitcoin full nodes track all available and spendable outputs, known as unspent transaction outputs, or UTXO.

The collection of all UTXO is known as the UTXO set and currently numbers in the millions of UTXO. Every transaction represents a change (state transition) in the UTXO set.

A transaction consumes previously recorded unspent transaction outputs and creates new transaction outputs that can be consumed by a future transaction. This way, chunks of bitcoin value move forward from owner to owner in a chain of transactions consuming and creating UTXO.

사용되지 않은 트랜잭션 출력을 UTXO라고 하고, UTXO set으로 별도 관리됩니다. UTXO는 누가 얼마만큼의 비트코인을 사용할 수 있는 권한, 즉 소유권을 갖고 있는가를 나타냅니다. UTXO를 사용하려면 ‘소유권 있음’을 증명하면 됩니다. 트랜잭션이 실행되면 UTXO set의 변화를 가져오기 때문에 비트코인 시스템에서 트랜잭션은 더도 말고 덜도 말고 ‘소유권 이동’에 대한 것이라 할 수 있습니다.

비트코인 시스템은 계정별 잔고를 관리하지 않습니다. UTXO set만 관리합니다. 비트코인 시스템이 뭘 어떻게 하든, 사용자는 잔고를 알고 싶어합니다. 사용자와 직접적으로 맞닿아 있는 지갑은 싫던 좋든 잔고를 제공해야 합니다. 지갑은 사용자 주소에 해당하는 UTXO들의 구하고, 그 합을 구해 잔고를 제공합니다.

비트코인 시스템 내에서 사용되는 단위는 비트코인이 아닌 사토시입니다. 1비트코인은 108사토시 입니다. 대부분의 지갑은 비트코인으로 잔고를 제공합니다.

The exception to the output and input chain is a special type of transaction called the coinbase transaction, which is the first transaction in each block. This transaction is placed there by the “winning” miner and creates brand-new bitcoin payable to that miner as a reward for mining. This special coinbase transaction does not consume UTXO; instead, it has a special type of input called the “coinbase.” This is how bitcoin’s money supply is created during the mining process.

비트코인 시스템은 채굴을 통해 비트코인을 신규 발행합니다. 새로 발행된 것이니 입력으로 UTXO를 사용하지 않습니다. 일반 트랜잭션과 구분하기 위해 이러한 트랜잭션을 ‘코인베이스 트랜잭션’이라고 합니다.

An unspent output can only be consumed in its entirety by a transaction.

UTXO는 전체적으로 하나의 트랜잭션에 의해서만 사용될 수 있다는 점에 주의합니다. UTXO가 10비트코인을 가지고 있다고 하더라도 5비트코인씩 쪼개서 두 개의 트랜잭션에 사용할 수 없다는 것입니다. 쉽게 말해서 5비트코인을 보내고 싶어도 10비트코인짜리 UTXO를 사용해야 한다는 것입니다. 여기서 나오는 개념이 거스름돈입니다. 10비트코인짜리 UTXO를 입력으로 5비트코인을 보내고 남는 것은 자신의 계정 주소로 보내도록 합니다. 하나의 UTXO를 입력으로 두 개의 UTXO 출력이 만들어진 것입니다.

 

Transaction Outputs

Transaction outputs consist of two parts:

  • An amount of bitcoin, denominated in satoshis, the smallest bitcoin unit
  • A cryptographic puzzle that determines the conditions required to spend the output

트랜잭션 출력은 수량과 암호학적 퍼즐로 구성되어 있습니다. 암호학적 퍼즐은 소유권 증명을 위한 부분으로 스크립트로 작성됩니다. 소유권 증명은 비트코인 시스템의 가장 기본적인 부분으로 이미 작성 방법이 정해져 있습니다. 트랜잭션 출력에서 소유권 증명을 위해 작성되는 스크립트를 scriptPubKey라고 합니다. scriptPubKey는 소유권 증명을 위해 공개키를 사용한다는 의미가 부여된 이름입니다. 비트코인 시스템은 초기에는 공개키를 사용해서 소유권 증명을 했지만 이후 다양한 방식으로 소유권을 증명하고 있기 때문에 scriptPubKey는 의미에 정확히 부합하는 이름은 아닙니다. 그래서 비트코인 전문가들은 소유권을 잠궈둔다는 의미로 locking script 또는 소유권에 대한 증인 역할을 한다는 의미로 witness script라고 부르기도 합니다. 이 책에서는 locking script라는 용어를 더 자주 사용합니다.

Transaction serialization—outputs

When transactions are transmitted over the network or exchanged between applications, they are serialized. as a byte stream.

트랜잭션은 네트워크를 통해 전송되기 때문에 직렬화가 요구됩니다.

트랜잭션 출력은 수량(amount)과 잠금 스크립트(scriptPubKey)로 구성되어 있다고 했습니다. 비트코인 시스템에서는 네트워크로 전송되는 데이터양을 최소화하려고 노력합니다. 그러다보니 가변길이를 많이 사용합니다. 가변길이를 사용하려면 당연히 길이를 명시해야 하기 때문에 직렬화하는데 잠금 스크립트 길이가 명시되어야 합니다. 재미있는 것은 길이를 명시하는데에도 가변길이를 사용한다는 것입니다. 

직렬화된 트랜잭션 출력에는 예제1과 같이 16진수 표현을 사용됩니다.

직렬화에서 주의할 점은 비트코인 시스템이 어디에서는 리틀엔디안을 사용하기도 하고 어디에서는 빅엔디안을 사용한다는 것입니다. 표 1을 보면 수량에는 리틀엔디안을 사용하고 있다는 것을 알 수 있습니다.

표 1을 보고 트랜잭션 출력이 어떻게 직렬화 되는지 설명해 봅니다. ‘수량은 8바이트(리틀엔디안), 잠금 스크립트 길이는 1에서 9바이트를 사용하는 가변 정수,  잠금 스크립트는 잠금 스크립트 길이로 명시한 길이만큼으로 직렬화한다’ 정도는 기억해 놓습니다. 

 

Transaction Inputs

The input contains four elements:

  • A transaction ID, referencing the transaction that contains the UTXO being spent
  • An output index (vout), identifying which UTXO from that transaction is referenced (first one is zero)
  • A scriptSig, which satisfies the conditions placed on the UTXO, unlocking it for spending
  • A sequence number (to be discussed later)

트랜잭션 입력은 UTXO를 참조해야 합니다. 비트코인 시스템에서 주요 식별자가 해시 값이고, 트랜잭션 또한 식별자로 해시 값을 갖습니다. UTXO는 트랜잭션 출력으로 작성된 것이고, 트랜잭션 출력은 여러 개 있을 수 있으니, UTXO를 참조한다는 것은 ‘어떤 트랜잭션의 몇 번째 출력’을 명시하는 것입니다. 즉 트랜잭션 해시 값과 출력 인덱스를 작성해야 한다는 것입니다.

트랜잭션 입력으로 UTXO를 참조한다는 것은 UTXO에 대한 소유권 증명을 하겠다는 것을 의미합니다. 비트코인 시스템에서는 서명을 통해 소유권 있음을 증명하는데 이 또한 스크립트로 작성하는데 이를 scriptSig라고 합니다. 잠금 스크립트를 해제한다는 의미로 해제 스크립트라고 하기도 합니다.

비트코인 시스템에서는 트랜잭션 출력으로 작성했던 잠금 스크립트와 트랜잭션 입력으로 작성한 해제 스크립트를 결합해 소유권 증명을 합니다.

Transaction serialization—inputs

표 2를 보고 트랜잭션 입력에 대한 직렬화 방법을 설명해 봅니다. ‘트랜잭션 해시는 32바이트(256비트 해시 값), 출력 인덱스는 4바이트, 해제 스크립트는 잠금 스크립트와 마찬가지, 4바이트 시퀀스로 직렬화한다’ 정도는 기억해 놓습니다. 

 

Transaction Fees

수수료에 대해 많은 이야기를 하고 있는데, 가볍게 재미있게 읽습니다. 몇 가지 주의해야 할 것들만 정리하겠습니다.

Most transactions include transaction fees, which compensate the bitcoin miners for securing the network. Fees also serve as a security mechanism themselves, by making it economically infeasible for attackers to flood the network with transactions.

비트코인 시스템은 네트워크 안정성을 위해 수단으로 수수료를 도입했습니다.

Transaction fees are calculated based on the size of the transaction in kilobytes, not the value of the transaction in bitcoin.

트랜잭션 수수료는 트랜잭션 크기에 기반해서 계산됩니다.

Miners prioritize transactions based on many different criteria, including fees, and might even process transactions for free under certain circumstances.

채굴자들은 다양한 조건들을 고려해서 블록에 포함할 트랜잭션들을 선택합니다.

Dynamic fees can be implemented through a third-party fee estimation service or with a built-in fee estimation algorithm.

처리될 트랜잭션 수가 적다면 수수료가 적은 트랜잭션도 블록에 포함할 것입니다. 따라서 수수료는 고정된 값을 사용하기 보다 네트워크 상황에 따라 결정하는 것이 유리합니다. 대부분 거래소들은 시장 상황보다 높은 고정된 수수료를 책정하고 있습니다. 거래소가 수수료를 높이는 주범이다라고 말하는 이유입니다. 사용자를 배려한 좀 똑똑한 지갑들은 사용자의 상황과 시장 상황을 고려한 수수료를 제시합니다. 사용자는 천천히 보내도 되는 경우, 빠르게 보내야 하는 경우 등에 따라 수수료를 선택할 수 있어야 합니다. 대부분의 지갑들은 시장 상황에 따라 수수료를 제시하는 서드파트 서비스들을 사용합니다. 서드파티 서비스는 이전에 처리된 트랜잭션들의 수수료를 분석해서 전송 속도에 따른 수수료를 제시합니다. 보통은 느림, 빠름, 매우 빠름의 조건에 따라 ‘바이트당 사토시’로 수수료를 제시합니다.

One popular service is http://bitcoinfees.21.co, which provides an API and a visual chart showing the fee in satoshi/byte for different priorities.

다음 링크를 사용해서 전송 속도에 따른 수수료를 받아 봅니다. https://bitcoinfees.21.co/api/v1/fees/recommended

Adding Fees to Transactions

Fees are implied as the difference between the sum of inputs and the sum of outputs.

수수료는 별도의 필드로 관리되지 않습니다. 입력의 합에서 출력의 합을 뺀 결과가 수수료입니다.

지갑 개발자라면 이 점에 주의해야 합니다. 지갑은 보내는 수량과 수수료를 합한 것보다 크도록 UTXO들을 입력으로 선택합니다. 입력 값이 보내려는 수량과 수수료를 합한 것보다 크면, 남는 만큼 다시 자신의 주소로 잔돈의 형태로 보냅니다. 여기서 발생할 수 있는 문제는 그 차이가 매우 작을 때 입니다. 매우 작은 양을 갖는 UTXO를 갖게 되면 나중에 이것을 사용할 때 수수료와 관련된 문제가 생깁니다. 비트코인 수수료는 트랜잭션 크기로 계산되는데 하나의 입력이 추가되면 그 만큼 수수료가 올라가게 됩니다. 수수료로 반영되는 것보다 더 작은 UTXO를 사용하게 되는 것입니다. 좋은 지갑은 먼지 수준의 양이 잔돈으로 남는 경우, 잔돈으로 받기 보다 수수료를 늘려 처러해 줄 수도 있습니다.

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

Leave a Reply

*