JD의 블로그

이중 지불 문제 본문

블록체인

이중 지불 문제

GDong 2021. 10. 11. 14:50

이중 지불 문제는 단일 화폐 단위가 두 번 결제되어 발생하는 문제이다.

 

예를 들면 A라는 사람이 1,000원을 가지고 있는데 B와 C에게 동시에 요청했을 때 (웹에서는 B에게 보내도록, 모바일에서는 C에게 보내도록 동시에 클릭했을 때를 생각해보자), 보통의 경우에는 은행이라는 중앙제어 시스템이 있기 때문에 거래 요청이 발생한 순서대로 거래를 진행하여 이중 지불 문제를 해결하게 된다. 중앙 제어 시스템이 요청이 먼저 들어온 거래를 순차적으로 처리하는 것이다. 

 

그러면 중앙 관리 기구나 신뢰할 수 없는 단체 즉 제 3자가 없는 비트코인에서는 어떻게 이중 지불 문제를 해결했을까?

 

비트코인 네트워크에서는 작업 증명방식과 합의 알고리즘을 이용해 이중 지불 문제를 해결했다. 

비트코인을 거래하기 위해서는 기본적으로 비트코인이 있어야하며, 비트코인을 보유하고 있다는 의미는 누군가로부터 비트코인을 수신 받았다는 의미이다. 

 

'채굴'을 통해 신규 발행된 코인을 받거나, 원화로 비트코인 구매 진행을 하여 판매자로부터 비트코인을 받았다던지 코인을 받았던 기록이 있어야지 비트코인을 소유할 수 있다. 

 

블록체인에 기록된 거래 내역 중 받기만 하고 아직 소비되지 않은 거래 정보를 UTXO라고 한다. 


UTXO(Unspent transaction output)란?

비트코인을 입금 받기 위해서는 입금 받을 주소가 필요하며, 해당 주소에 입금된 모든 기록들은 해당 주소가 보유한 비트코인의 총합이 된다. 

반대로 내가 누군가에게 비트코인을 송금하고 싶다면 내가 입금 받았던 기록을 토대로 비트코인의 보유 수량을 입증 할 수 있고, 가지고 있는 수량 중 얼마를 송금할지를 기록하여 작성한다. 

 

위의 과정이 바로 새로운 UTXO의 생성과 소멸에 관한 과정이다.

 

UTXO는 소비되지 않은 거래 출력 값을 말한다. 즉 내가 입금만 받고 송금하지 않았다면 아직 소비하지 않은 거래가 되고 이러한 거래 정보를 UTXO라고 한다.

 

하나의 주소에는 송금받은 여러개의 UTXO가 논리적으로 연결되어 있다. 

 

1. UTXO는 소비되지 않은 거래 정보로, A라는 사용자가 B라는 사용자에게 BTC를 수령만 하고 소비하지 않았을 경우 A에 새로운 UTXO가 생성된다.

2. 주소에는 이러한 UTXO가 논리적으로 연결되어 있으며, 연결된 UTXO의 총합이 해당 주소의 비트코인의 보유 수량이 된다.

3. 비트코인 거래는 이러한 UTXO의 정보가 소멸되고, 새롭게 생성되는 과정이다.

 

 

이중 지불 문제는 단일 통화를 2번 사용하게 되서 발생하는 문제다. 따라서 소비되지 않은 UTXO 정보가 2번 사용되지 못하도록 제어할 수 있다면 이중 지불 문제를 해결할 수 있다. 

 

A가 B와 C에게 1BTC를 전송하는 트랜잭션을 생성 후에 동시에 각 노드에 전파한다. 그리고 각 노드는 A가 보낸 트랜잭션의 유효성을 검증 후 Mempool에 트랜잭션을 업데이트한다.

 

Mempool이란?

블록체인은 블록과 블록이 체인(Linked List) 형태로 연결된 자료구조이다. 블록체인의 원소 역할을 수행하는 '블록'은 크게 헤더와 바디 정보로 구성되어 있으며 블록의 바디 정보에는 다수의 거래 정보가 포함되어 있다.

 

즉 간단하게 얘기하면 비트코인에서 사용되는 블록체인은 비트코인의 최초 발행 시점부터 현재까지의 모든 거래 내역을 가지고 있는 거대한 분산 장부이다.

 

블록체인에 연결되는 새로운 블록은 약 10분마다 한 번씩 생성되며, 새로운 블록은 채굴자에 의해 생성된다.

 

블록에 포함된 다수의 거래는 채굴자가 새로운 블록을 생성하기 앞서, 거래 요청은 하였으나 아직 거래가 성립되지 않은 즉 대기중인 트랜잭션에 블록을 포함시킨다. 

 

채굴자는 대기중인 트랜잭션을 새롭게 생성할 블록에 포함시킨 후 임의의 nonce 값을 대입하여 일종의 수학 문제를 풀어내고 수학 문제의 답을 맞추었을 경우 검증 및 블록체인에 새로운 블록을 연결하기 위해 각 노드에 해당 블록을 전파한다. 

 

노드들은 전달 받은 블록의 유효성을 검증하고 '진짜' 블록, 검증된 블록일 경우 자신의 블록체인에 해당 블록을 업데이트한다.

 

비트코인 거래를 하기 위해서는 트랜잭션을 생성하고, 각 노드들에 해당 트랜잭션을 전파하게된다. 각 노드는 해당 트랜잭션이 유효한 거래인지 검증 후 검증된 트랜잭션을 Mempool에 업데이트하게 된다. Mempool이란 것은 아직 거래가 성립되지 않은, 즉 0 컨펌 사태의 트랜잭션들이 저장되는 공간이다!

 

즉 새로운 거래를 위해 트랜잭션을 생성했을 때 유효성 검사가 되어진 트랜잭션이 머무는 공간이 Mempool이다.

 

이 과정에서 채굴자는 새로운 블록의 생성 댓가로 신규 비트코인 발행량 + 거래 수수료를 받는다. Mempool에 대기중인 트랜잭션 중 수수료가 높은 거래는 더 빨리 이뤄진다.

 

 

채굴자는 Mempool에 대기중인 트랜잭션 정보를 블록에 담고 블록 해시 값을 생성한다. 이때 동일한 UTXO 정보를 사용한 트랜잭션을 한 블록에 담을 수 없게 만든다. 

 

만약 A라는 채굴자가 B에게 보낸 트랜잭션을 담아 블록을 생성했고, B 채굴자는 C에게 보낸 트랜잭션을 담아 블록을 생성했다고 가정해도, 두 거래 중 하나는 고아 블록으로 거래가 인정되지 않기 때문에 이중 지불 문제를 해결할 수 있다.