SW/블록체인

블록체인 : 비트코인을 구성하는 데이터 모델 : 트랜잭션 구조 : 개념, 원리, 개요

얇은생각 2022. 1. 24. 07:30
반응형

비트코인의 트랜잭션

거래는 비트코인 시스템에서 가장 중요한 요소이며, 비트코인 시스템 내에 있는 참가자들 간 가치를 전송하는 행위를 인코딩한 데이터 구조입니다. 각 거래는 전 세계적인 장부에 들어있는 공개된 항목입니다. 거래의 생성부터 시작하는 거래 생명 주기에 대해서 설명하겠습니다.

첫째, 거래는 비트코인 시스템에 참여하는 모든 노드가 생성할 수 있습니다. 비트코인 거래의 경우는 이전에 발생한 거래의 출력을 자금원으로 참조합니다. 거래가 생성되었으면 자금원의 소유주가 자금원을 해당 거래의 입력 값으로 사용하기 위해 해당 거래에 서명해야 합니다.

둘째, 서명이 완료된 유효한 거래는 블록체인에 포함되기 위해 채굴자들에게 도달할 때까지 비트코인 네트워크상에 전파되어야 합니다. 우선 비트코인 네트워크에서 생성한 거래를 자신과 연결된 거래를 전파하게 될 첫 번째 노드에게 전달합니다. 거래는 서명을 받았고 개인 정보를 포함하고 있지 않기 때문에 가능한 어떠한 네트워크를 통해서 공개적으로 전송될 수 있습니다.

셋째, 비트코인 거래가 비트코인 네트워크에 연결된 한 노드로 전송되면 해당 노드에 의해 거래가 유효화됩니다. 거래가 유효화되고 나면 해당 노드와 연결된 다른 노드로 이 거래를 전파하고 동시에 성공 메시지가 생성자에게 전달될 것입니다. 만약 거래가 유효화되지 못한 경우라면 해당 노드는 승인을 거부하고 동시에 거절 메시지가 생성자에게 돌아갑니다.

거래와 블록 등의 메시지들은 각 노드로부터 자신과 연결된 다른 이웃 노드로 전파됩니다. 네트워크상에 있는 노드에 새롭게 추가된 유효화 거래는 주변에 있는 3~4개의 노드로 전송되고 전송된 각각의 거래는 또다시 3~4개의 주변 노드로 전송되며 이 과정이 반복됩니다. 이런 방식을 이용해 유효 거래는 몇 초 만에 기하급수적으로 전파의 물결을 일으켜 결국 연결된 노드 전체가 해당 거래를 전송 받게 됩니다.

 

블록체인 : 비트코인을 구성하는 데이터 모델 : 트랜잭션 구조 : 개념, 원리, 개요 1

 

이러한 메커니즘을 그림으로 나타낸 것입니다. 우선 B라는 사용자가 Wallet 애플리케이션을 이용해서 A라는 사용자에게 세 개의 비트코인(3BTC)을 전송한다는 거래를 생성하여 연결된 노드로 전달합니다. 연결되어 있는 노드1이 이 거래를 받게 되고, 수신한 거래가 유효한 거래인지를 확인하는 유효성 검증을 수행합니다. 거래가 검증을 성공적으로 통과했다면, 노드1은 검증된 거래를 메모리 풀(Memory pool)에 추가합니다.

메모리 풀은 마이닝 하기 전에 블록에 포함될 수 있는 거래를 모아 두는 곳입니다. 이렇게 검증된 거래를 추가함과 동시에, b 자신과 연결된 노드들에게 해당 거래를 전파합니다. 거래를 수신한 노드2와 노드3은 노드1에서와 동일한 프로세스를 진행하게 되고, 결국 이 거래는 블록체인 네트워크 전체에 전파되는 것입니다.

 

 

 

거래 구조

거래는 입력 값이라고 불리는 자금원에서부터 출력 값으로 불리는 목적지까지 가치의 전송을 인코딩하는 데이터 구조입니다. 비트코인에서 거래의 입력 값과 출력 값은 계좌(계정)와는 관계가 없다는 것을 명심해야 합니다. 또한, 입력 값과 출력 값을 소유주나 비밀키를 알고 있는 사람만이 풀 수 있는 특수 비밀키로 잠겨있는 비트코인 덩어리로 간주해야 합니다.

 

블록체인 : 비트코인을 구성하는 데이터 모델 : 트랜잭션 구조 : 개념, 원리, 개요 2

 

표를 보면 거래는 여러 개의 필드를 포함하고 있습니다. 하나의 거래에는 다수의 입력 값과 출력 값이 존재할 수 있습니다. 그 때문에 얼마나 많은 입력 값이 거래에 포함되었나를 알려주는 Input Counter 필드가 있고, counter에 해당하는 만큼의 입력값에 대한 정보를 위한 Inputs 필드가 있으며 이는 크기가 가변적입니다. 입력값과 같은 역할로서 Output Counter와 Outputs 필드가 바로 아래 나옵니다.

Locktime은 거래한 것이 블록체인에 추가되는 가장 빠른 시간을 의미하며, 바로 실행이 가능한 상태임을 알려 주기 위해서 Locktime은 대부분 0으로 설정되어 있습니다. 만약 해당 필드가 0이 아니거나 5억 미만이라면 블록의 높이로 해석해야 합니다. 앞서 언급했듯이 하나의 거래에는 다수의 입력 값과 출력 값이 존재할 수 있기 때문에 여러 개의 거래 유형이 생길 수 있습니다.

 

블록체인 : 비트코인을 구성하는 데이터 모델 : 트랜잭션 구조 : 개념, 원리, 개요 3

 

아래의 3가지 그림은 거래의 유형을 나타내는 그림입니다. ① 이 가장 일반적인 거래를 나타내는 형식입니다. 하나의 A로부터 입력 값 1이 출력 값 1로 B에게 그리고 출력 값 2로 다시 자신(A)에게 전송됩니다. 블록체인은 Input과 Output으로만 이루어졌고, Input-Output으로 나머지 코인이 발생한다면 이것은 자신에게 자동으로 돌아가지 않도록 설계되었습니다.

그래서 코인을 보내고 싶은 사람에게 일정 금액을 보내고 잔돈이 생긴다면, 꼭 나머지 금액을 출력값 2로 하여 자신의 주소로 보내야 합니다. ② 는 입력 값이 여러 개가 올 수 있다는 것을 나타내는 Aggregating transaction입니다. 블록체인에서 코인들을 여러 개의 입력 값을 합쳐서 하나의 출력 값 1로 보낼 수 있습니다.

③ 는 Distributing transaction이라 하여 출력 값이 여러 개가 올 수 있다는 것입니다. 블록체인에서 하나의 입력 값 1을 쪼개서 여러 개의 출력 값으로 분배할 수 있는 거래를 말합니다. 사실 ①도 어찌 보면 ③에 포함된다고 볼 수 있습니다. 비트코인의 잔액에 대해서 사람들이 착각을 많이 합니다.

많은 사람들은 비트코인 지갑에서 표시되는 잔액을 보고, 비트코인 시스템에서 자신의 주소를 갖는 계정에 그만큼 잔액이 저장되어 있다는 착각을 많이 합니다. 하지만 비트코인에는 우리가 익히 알고 있는 계정이나 주소에 저장된 잔액이 없습니다.

 

 

 

사용되지 않은 거래 출력

오직 블록체인에 흩어져서 산재해있는 소비되지 않은 거래 출력(UTXO)만 있고, 이것이 특정한 소유자들에게 잠겨 있을 뿐입니다. 우선적으로 사용자의 비트코인 잔액의 개념은 지갑 애플리케이션에서 생겨서 파생된 것이기 때문에, 비트코인에서는 사용자의 계정 별로 잔액이 저장되지 않는다는 것을 이해해야 합니다.

이 지갑 소프트웨어는 블록체인을 처음부터 끝까지 스캐닝하고, 해당하는 사용자에 속한 모든 UTXO를 다 더해서 사용자의 잔액을 계산하는 것입니다. 그래서 여기서 알 수 있는 것은 사용자의 비트코인은 결국 자신에게 잠겨있는 UTXO들이라는 것입니다. UTXO는 아직 소비되지 않은 거래의 출력 값을 말하며, UTXO는 특정 소유주에 대해 암호로 잠겨 있습니다.

블록체인상에 기록되어 있으며, 전체 네트워크에 의해 통화 단위로 인정받은 불가분의 비트코인 덩어리입니다. 실제 비트코인 네트워크는 수백만 개에 달하는 UTXO 중에서 이용 가능한(소비되지 않은) UTXO 전부를 추적해서 UTXO들을 메모리에 저장합니다.

방금 UTXO는 불가분의 비트코인 덩어리라고 말했는데, UTXO는 쪼개져서 사용될 수 없습니다. 그래서 UTXO가 거래의 입력으로 사용될 때는 부분만 사용하는 것이 아니라 전부를 사용해야 합니다. 이때 보낼 금액이 입력 값의 UTXO보다 더 적다면 자신의 주소로 잔액을 보내야 합니다. 그래서 비트코인 거래에서는 잔액이 빈번하게 발생합니다. 그 때문에 실제 비트코인 지갑에서는 비트코인을 보낼 때, 보낼 금액에 맞도록 UTXO를 선택하는 몇 가지 알고리즘을 사용하고 있습니다.

 

 

 

거래 입력 값/출력 값과 UTXO의 관계

거래 입력 값(Transaction input)은 하나의 거래에 의해서 소비되는 UTXO를 의미합니다. 이때 거래에서 UTXO가 소비될 때, 현재 소유자의 서명을 가지고 잠금을 해제해야 소비할 수 있습니다. 거래 출력 값은 하나의 거래에 의해서 출력 값으로 새롭게 생성되는 UTXO를 의미합니다.

이때 새로운 소유자의 비트코인 주소로 UTXO를 잠가 놓습니다. 나중에 해당 소유자만 소비할 수 있도록 말입니다. 결국 UTXO를 생성하고 소비하는 거래는 체인에서 비트코인의 덩어리들이 이전 소유자에서 다음 소유자로 넘겨지는 형태로 이루어집니다.

 

 

 

거래 출력 값

모든 비트코인 거래는 비트코인 장부(블록체인)에 기록되는 출력 값을 생성합니다. Data Output을 제외하고, 거의 모든 출력 값들은 소비가 가능한 비트코인 덩어리들을 만들고, 이것을 UTXO라고 부릅니다. 이미 언급했지만, UTXO는 블록체인에 저장됨으로써 전체 비트코인 네트워크에 의해서 인정되고, 소유자가 미래의 거래에서 소비하는 것이 가능한 것입니다. 또한, 일정량의 비트코인을 보낸다는 것은 사실 받는 사람의 주소로 등록되고 그들이 소비 가능한 UTXO를 만드는 것입니다.

 

블록체인 : 비트코인을 구성하는 데이터 모델 : 트랜잭션 구조 : 개념, 원리, 개요 3

 

표를 보면 거래 출력 값의 구조가 표로 나타나 있습니다. 거래 출력 값은 두 가지 부분으로 구성되어 있습니다. 하나는 비트코인의 양, 다른 하나는 출력 값을 소비할 때 충족시켜야 하는 조건을 명시하여 앞의 금액을 잠그는 잠금 스크립트(Locking script)입니다.

 

 

거래 입력 값

거래 입력 값은 블록체인에 저장되어 있는 하나의 특정한 UTXO를 가리킵니다. 이때 거래 해시 값과 시퀀스 넘버가 참조됩니다. 거래 해시 값은 하나의 특정한 거래를 식별하고, 그 거래의 출력 값으로 생긴 UTXO들 중에서 시퀀스 넘버를 인덱스로 하여 특정한 UTXO를 참조할 수 있습니다.

누군가 거래를 생성할 때 입력 값으로 UTXO를 소비하려고 한다면, 입력 값에 해당 UTXO에 설정된 소비 조건을 만족하는 잠금 해제 스크립트를 포함해야 합니다. 잠금 해제 스크립트는 잠금 스크립트에 있는 비트코인 주소의 소유권을 증명하는 전자서명입니다.

각 거래는 하나 이상의 입력 값(비트코인 계좌에서 빠져나가는 쪽)과 거래의 또 다른 구성요소로서 하나 이상의 출력 값(비트코인 계좌로 들어오는 쪽)으로 구성됩니다.

 

블록체인 : 비트코인을 구성하는 데이터 모델 : 트랜잭션 구조 : 개념, 원리, 개요 4

 

거래를 통해 거래 입력 값에서 거래 출력 값으로 가치가 이동됩니다. 이때, 거래 입력 값은 비트코인의 가치가 발생하는 지점으로, 주로 이전 거래의 출력 값이고, 거래 출력 값은 키를 이용해서 새로운 소유주에게 비트코인의 가치를 넘겨주는 역할을 합니다. 한 거래의 출력 값은 다음 거래의 입력 값이기 때문에, 거래들도 체인처럼 연결되어 있다고 할 수 있습니다.

처음 거래의 거래 해시와 출력 값의 번호(index)가 다음 거래의 입력 값으로 나오는 것을 확인할 수 있습니다. 한 거래에서 나온 출력 값은 새로운 거래에서 입력 값으로 사용될 수 있기 때문에, 이와 같이 소유권 사슬을 생성함으로써 가치가 비트코인 주소들 간에 이동하게 됩니다.

또한, 비트코인 용어로 ‘소비’(spent)라 함은 이전 거래에서 송금되었던 돈이 비트코인 주소에 의해 확인된 새로운 소유주에게로 전송되는 거래에 서명을 함으로써 이루어지는 작업을 말합니다. 소비되지 않은 (unspent) 비트코인은 거래에서 새로 생긴 출력 값이고 이것을 비트코인에서는 UTXO (Unspent Transaction Output)이라고 부릅니다.

추가적으로 거래에서 입력 값과 출력 값의 합계가 반드시 동일할 필요는 없습니다. 보통 출력 값의 총합은 입력 값의 총합보다 약간 작은데 그 차이는 거래수수료 (transaction fee)입니다.

 

 

참조

http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about 

 

블록체인 입문

블록체인과 암호화폐 기술을 깊이 배우기에 앞서, 비 전공자들도 이해를 할 수 있는 수준으로 블록체인과 암화화폐에 대한 high-level 설명 및 응용 예시를 제공하고 실제 상황에 적용할 수 있다.

www.kmooc.kr

 

반응형