비트코인 거래와 UTXO Bitcoin Trading and UTXO


우리가 물건을 사기전 가진 돈의 금액이 물건을 구입하는데 충분한지 고려하게 된다.

예를들어 A가 B사람의 20달러짜리 운동화를 사야 할때, A의 지갑에 20달러 지폐 1개가 있으면 매우 간단하게 거래는 성사된다. 100달러 지폐 1장이 있을때는 100달러를 주고 80달러를 거스름돈으로 받으면 되고, 10달러 지폐 2개가 있을때는 지폐 2장의 조합으로 지불을 하면 된다. 

이것은 우리가 지금까지 해왔던 아주 평범한 거래이다.


비트코인 거래로 대상을 바꾸어 생각해도 표면적으로 보여지는 거래 자체는 위와 동일한 방식일 것으로 생각된다. 실제로 친구에게 비트코인을 보내면 내 지갑에는 그 금액을 제외한 나머지가 존재하는 것을 볼수 있기 때문이다.


비트코인 블록체인 내부에서는 과연 어떤 과정이 발생할까?

이를 알기 위해서는 UTXO 라는 개념을 알아야한다. 

UTXO 란 Unspent Transaction Output 의 약자로, 아직 쓰지않은 잔액 이라는 의미이다.
비트코인 네트워크에서는 '잔액'이라는 개념은 애초에 존재하지 않고, 트랜잭션에 의한 결과물들의 합을 우리는 잔액이라는 개념으로 사용하고있다. 그리고 이를 소유주만이 사용할수 있도록 공개키로 잠궈져 있으며, 소유주는 이를 풀기위해 자신의 개인키를 사용한다.


비트코인의 잔액
= SUM ( UTXO ( 소유주의 트랜잭션 ) )
= 내 지갑의 모든 트랜잭션 중 Output이 존재하는 UTXO의 합을 의미한다. 


비트코인의 잔액은 내가 발생시킨 모든 트랜잭션 중 Output이 존재하는 UTXO의 합 이라고 했었는데, 그렇다면 이렇게 많은 트랜잭션 중에 Output이 존재하는 UTXO는 얼마나 있을까?

먼저 182Neztu7T6V8vJpRu9VfBN2E6ssprXPmm 주소를 https://blockchain.info/ 에서 검색을 하여 트랜잭션이 얼마나 있는지 확인 해보자.  이에 대한 자세한 해석을 원한다면, 이전 포스팅 https://steemit.com/bitcoin/@niipoong/blockchain-info 을 참고하기 바란다.

그리고 Blockchain,info 에서 제공하는 API를 통해 위 주소에 대한 UTXO를 직접 소스로 조회해 보자.
글 하단에 간단한 UTXO조회 python 소스를 첨부했으니 참고바라며, 소스 address 변수에 주소를 넣고 한번 조회해보자.

아래 TX해쉬값 , TX색인번호 , TX값 satoshis  정보의 리스트를 볼수 있다.


총 16개의 UTXO값이 나온다.  이  satoshis값 들을 모두 더한것이, 우리가 흔히 알고있는 잔액이다.

이렇게 하나의 비트코인 주소가 가진 BTC잔액의 개념을 알게되었다.



자, 이제 거래를 해보자.

내가 좋아하는 농구선수들 이름으로 예를 들어보겠다.

먼저 어빙, 토마스, 제임스, 하든 네명이 각각 채굴작업을 통해 10BTC만큼을 보상 받았다고 가정하자. 그리고 모든 트랜잭션 수수료는 1BTC라고 가정한다.
초기에는 4명 모두 UTXO의 개수가 각각 1개이며, 채굴 보상을 통해 전달 받은 UTXO이다.










이후 어빙이 토마스에게 5BTC를 전달하는 상황을 가정해보자.

Input 값으로 어빙이 가지고있는 유일한 UTXO를 선택하게 되며 입력값에는 scriptPubKey를 포함하게 된다. 
이는 잠금스크립트라고 하는데 비트코인에서는 이 잠금스크립트로 상대방의 공개키를 이용하여 이와 매칭되는 개인키를 가지고있는 사람만이 사용할수 있도록 한다. 받는 사람은 자신의 해제스크립트인 개인키 (scriptSig)를 이용하여 잠금을 푼 후 UTXO를 사용할 수 있다.


Output은 총 3개가 생성되며 이는 각각의 UTXO를 말한다. 
첫번째는 블록을 생성해준 채굴자,
두번째는 토마스,
세번째는 어빙이 토마스에게 받게될 거스름돈이다.

이때도 생성된 UTXO에는 UTXO의 주인만이 유일하게 사용할수 있도록 잠금스크립트를 포함하게 되는데 이는 받을 사람의 공개키이자 비트코인 주소이기 때문에 scriptPubKey 라고 부른다. 


이 부분의 핵심은 어빙은 토마스에게 5BTC를 주기 위해 자신이 원래 가지고있던 UTXO를 쪼개서 사용할수 없다는 것이다.









위의 과정에 이어 이번에는 토마스와 어빙이 제임스에게 각각 5BTC, 3BTC씩 주는 상황을 가정해 보자.
Input으로 어빙의 경우 유일한 UTXO를 선택하게된다.
토마스는 본인이 가진 2개의 UTXO중 5BTC이상을 만족하는 첫번째 UTXO를 선택하게 되고 이는 10BTC이다.

결과로는 아래 표와같이 나오며, 어빙의 경우는 잔액이 존재하지 않으며 UTXO는 생성되지 않게된다.

제임스의 경우는 토마스와 어빙에게 받은 UTXO, 그리고 최초 채굴보상으로 받은 UTXO 까지 총 3개의 UTXO를 가지게 된다.





마지막으로 제임스가 Harden에게 18BTC를 전달하는 상황을 가정해보자.

Input을 선정하는데 있어서 제임스는 모든 UTXO가 필요로 한다. UTXO를 선택하는 데 사용되는 알고리즘은 Greedy algorithm 이다. 때문에 제임스가 더 많은 UTXO를 가지고 있다고 하여도 가장 최적의 UTXO들의 조합으로만 선택이 된다.

Greedy 알고리즘에 관해 자세히 알고싶은 분을 위해 링크 첨부한다.  (http://ujink.tistory.com/10)






정리해보자.

UTXO란 사용자의 트랜잭션을 통해 발생한 결과물이며, 이에 대한 조합을 통해 다른사람과 거래를 할수 있다.

UTXO를 주고받을 때 입력값 ( 금액 + 잠금스크립트 ) 에 대한 출력값이 (금액 + 잠금스크립트) 발생하게 되며, UTXO는 쪼갤수없고, 더 큰 금액을 위해 여러가지 UTXO를 조합하여 사용할수도 있다. 그리고 이 조합은 Greedy 알고리즘을 사용하기 때문에 최적의 UTXO조합을 만들수 있다.



혹시 이해가 안가는 부분이 있다면 댓글 부탁드립니다.

댓글은 더 나은 포스팅을 위한 큰 힘이 됩니다.

조만간 비트코인 스크립트에 관한 좀더 자세한 포스팅을 하도록 하겠다.







[출처 : 비트코인 블록체인과, 금융의 혁신]

[UTXO 조회 python source - 출처 : 비트코인 블록체인과, 금융의 혁신]

import json
import requests

address = '182Neztu7T6V8vJpRu9VfBN2E6ssprXPmm'

resp = requests.get('https://blockchain.info/unspent?active=%s' % address)
utxo_set = json.loads(resp.text)["unspent_outputs"]

for utxo in utxo_set:
print "%s:%d - %ld Satoshis" % ( utxo['tx_hash'], utxo['tx_output_n'], utxo['value'])

댓글

이 블로그의 인기 게시물

비트코인 스크립트 scriptSig, scriptPubKey

비트코인 트랜잭션 ID 만들기 Create Bitcoin TXID

비트코인 지갑주소를 잘못입력하여 전달하면 어떻게될까?