336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

https://blockexplorer.com/tx/89c05b4ea989a19e529b93a6fd883c5089aaacfd83350d8fce28d0822259ce2f


비트코인 트랜잭션을 볼 수 있는 BlockExplorer에서 트랜잭션을 보다 보면 "Unparsed Address"를 자주 발견 할 수 있습니다. 이번 포스팅과 다음 주에 이어지는 포스팅을 통해 비트코인 트랜잭션에 표시되는 주소가 어떤 원리에 의해 표현되는지 이해함으로써 비트코인의 내부 동작을 이해해 보도록 하겠습니다.


- UTXO 모델

- Script (2월 3일 작성 예정)


UTXO (Unspent Transaction Outputs)

비트코인 트랜잭션을 생각할 때 흔히 할 수 있는 착각 중 하나는 블록체인 상에 증여자(giver)와 수증자(receiver)의 비트코인 주소가 기록될 것이라는 점입니다. 여러 사람의 거래 내역을 적는 원장(ledger)의 개념으로 비트코인을 처음 접하거나 어카운트(account) 기반인 이더리움을 먼저 공부하셨다면 이런 선입견을 가지기 쉽습니다. 그러나 비트코인은 그런 방식으로 동작하지 않습니다.


비트코인의 레퍼런스 구현인 Bitcoin Core 구현의 트랜잭션 자료구조를 살펴보겠습니다. 트랜잭션은 보내는 사람에 해당하는 CTxIn과 받는 사람에 해당하는 CTxOut 클래스가 있습니다.


https://github.com/bitcoin/bitcoin/blob/9cf6393a4f82b9c81d3b4b468a17a89db10531a2/src/primitives/transaction.h#L61

https://github.com/bitcoin/bitcoin/blob/9cf6393a4f82b9c81d3b4b468a17a89db10531a2/src/primitives/transaction.h#L131





A(증여자)가 B(수증자)에게 10 BTC를 주는 트랜잭션 작성하는 것으로 예로 들어보겠습니다.

A는 B의 주소를 알고 있으며 아래와 같이 트랜잭션을 만들 수 있습니다.


CTxIn prevout - A의 공개키로 받은 CTxOut에 대한 포인터

CTxIn scriptSig - A의 서명 (비밀키)


CTxOut nValue - 비트코인의 양 (10 BTC)

CTxOut scriptPubKey - B의 공개키

 

위의 트랜잭션이 블록에 포함되면 B는 미래에 이 CTxOut을 포인팅해서 10 BTC를 쓸 수 있게 됩니다.


CTxIn은 가리킬 수만 있고 비트코인의 양을 지정할 수 없습니다. 즉, CTxOut은 무조건 한 번에 소비됩니다. 만약 B가 C에게 3 BTC만 주고 싶다면, (10 BTC의 CTxIn) -> (3 BTC의 CTxOut), (7 BTC의 CTxOut)의 트랜잭션을 만들어 3 짜리는 C에게 주고, 7 짜리를 다시 자기 자신에게 돌려주면 됩니다.


B의 입장에서 7 짜리 거스름돈을 받을 때 공개키를 재사용할 이유가 없습니다. B는 새로운 키쌍을 생성해 해당 키에 돌려 받습니다. 이 과정에서 이 거래와 상관없는 D가 블록체인에 기록된 거래내역을 봤을 때 무엇이 거스름돈인지 알 수가 없습니다. 심지어 거스름돈이 없이 수증자가 2명인 가능성도 배제할 수 없습니다. 이 모델은 프라이버시 측면에서 장점이 있습니다.


이 글 처음에 있는 스크린샷을 다시 보겠습니다. 1개 CTxIn과 2개의 CTxOut이 있는 경우입니다. 



위의 경우는 추측컨데 0.099 BTC를 누군가에게 주는 트랜잭션일 것입니다. 남은 돈(5.92.. BTC)은 자신의 공개키로 다시 CTxOut을 만든 것을 볼 수 있습니다.


CTxOut의 오른 쪽에 초록색 폰트로 (U)가 있는데, 이는 해당 CTxOut이 아직 쓰이지 않았다는 것(Unspent)을 의미합니다. 이를 UTXO(Unspent Transaction Outputs)라 합니다. 미래에 이 CTxOut을 포인팅하는 트랜잭션이 일어나면 (S)로 표시됩니다.



비트코인 지갑이나 BlockExplorer에서 보여주는 잔고(balance)는 하나 이상의 UTXO의 합이라 할 수 있습니다. 이로 인해서 비트코인 트랜잭션을 만들 때 여러 옵션이 존재할 수 있습니다.


A가 10 BTC, 5 BTC, 3 BTC의 UTXO를 가지고 있고 B에게 6 BTC를 줘야 하는 상황을 가정해보면 아래와 같습니다.


- 10 을 쓴다. -> 잔고: 4 + 5 + 3

- 5 + 3 을 쓴다. -> 잔고: 10 + 2

- 10 + 5 + 3 을 쓴다 -> 잔고: 12


조합에 따라 트랜잭션 바이트 크기가 달라지고, 바이트 크기가 작을수록 마이너에게 지불하는 수수료를 낮출 수 있기 때문에 위의 조합 문제를 풀어야 하는 요구사항이 있습니다.


결론

비트코인을 보유하는 사람은 공개키를 여러 개 소유할 수 있고, 각 공개키는 하나 이상의 UTXO와 연결될 수 있지만, 프라이버시 측면에서 하나의 공개키 당 하나의 UTXO만 연결되는 것이 바람직합니다. 보유자는 이 UTXO를 조합하여 지불할 수 있습니다.


사용자 입장에서 UTXO 모델은 이해하기 더 어렵고, 위에서 설명한 조합 문제나 UTXO set을 관리하는 문제 등 기술적인 문제들도 있습니다. 하지만 트랜잭션의 병렬 처리나 프라이버시 측면에서 이더리움의 어카운트(Account)처럼 주소가 재사용되는 구조에 비해 장점이 분명히 존재합니다.


앞서 CTxOut의 scriptPubKey를 설명할 때 이를 공개키라고 표현했지만, 실제로는 공개키해시를 포함하는 실행 가능한 스크립트이고, 엄밀히 말하면 공개키 해시를 포함하지 않을 수도 있습니다. 다음 포스팅에서는 비트코인 스크립트의 실행과 표준 스크립트에 대해 설명하겠습니다. 표준 스크립트는 비트코인 주소와 직접적으로 연관되어 있습니다.


+ Recent posts