비트코인캐시 지갑들로 알아보는 UTXO트랜잭션의 작동원리.
비트코인캐시만이 아니라 암호화폐들의 수수료는 기본적으로 트랜잭션데이터의 크기로 정해집니다.(네트워크 과부하로 인한 수수료상승을 제외한 기본적인 작동방식을 말합니다.)
극단적인 예를 들어 설사 1달러치의 코인을 전송하더라도 트랜잭션 데이터가 크기가 크다면 수수료가 10달러가 나올수도 있습니다.하지만 설사 백만달러치의 코인을 전송하라도 트랜잭션 데이터가 작다면 수수료는 1센트도 나오지 않습니다.
즉 금액과는 상관없이 트랜잭션 데이터의 크기로 인해서 수수료는 정해집니다.그리고 이 데이터 크기에 영향을 주는 것이 UTXO라는 부분입니다.저도 대충 이론은 알고 있었지만 이번에 실험을 해보면서 직접 실감을 했기에 한번 글을 적어 볼까 합니다.
일단 제가 1달러로 한 실험들입니다.
Bitcoin.com 지갑을 이용하여 1달러를 Edge 지갑으로 전송해봤습니다.수수료는 243사토시가 나왔습니다.트랜잭션 사이즈는 225바이트 이며 수수료 자체는 바이트당 1sat 가 청구되었습니다.최저값의 수수료라고 할수 있습니다.
Edge 지갑에서 Electron-cash 지갑으로 전송을 했습니다.수수료는 454사토시가 나왔습니다.좀 비싸게 나온셈이긴 한지만 크게 문제가 될것은 없는 금액입니다.
Electron-cash 지갑에서 Bitcoin.com 지갑으로 다시 전송을 했습니다.제가 UTXO라는 것의 작동방식을 실제로 느껴보게 된 순간입니다.보시다시피 수수료가 9254사토시가 나왔습니다.Bitcoin.com 지갑과 비교할떄 30배이상 차이나는 수수료입니다.
왜 이런 차이가 날까요?지갑의 문제일까요?아닙니다.스샷에서 나오다 시피 수수료 자체는 Bitcoin.com 지갑과 같은 바이트당 1사토시만이 청구되었습니다.그러면 차이는 어디서 나는걸까요?바로 트랜잭션의 데이터 크기입니다.스샷에서 보시다시피 트랜잭션데이터의 크기가 9220바이트입니다.왜 이런 차이가 나는걸까는 트랜잭션 정보를 보면 알수 있습니다.
트랜잭션 ID 링크
이 엄청난 목록의 인풋 트랜잭션이(62개) 바로 제 트랜잭션 데이터 사이즈의 정체입니다.그렇다면 왜 이렇게 많은 인풋트랜잭션이 생겨났을까요?그 이유는 저의 Electron-cash 지갑주소는 바로 Memo.cash의 지갑주소를 가져다가 쓰고 있는 중이기 떄문입니다.
암호화폐가 전송되는 방식들에 대해서 설명을 한번 해보겠습니다.
만약 내가 1BCH를 전송시켰을경우,내 지갑에서는 1BCH가 전송된것으로 표시됩니다.결과론적으로는 맞지만 그 과정은 나름 여러 절차를 거칩니다.
아웃풋 트랜잭션은 인풋트랜잭션을 조합하여 생성된다.
이 1BCH를 전송시키기 위해서는 지갑내에서 1BCH에 라는 액수를 만들어야 됩니다.그냥 현금처럼,지갑에서 만원짜리 하나 꺼내서 주는것이 아닙니다.그러면 이 1BCH를 어떻게 만드느냐,바로 UTXO를 사용하여 만듭니다.내가 전송받은 적 있는 트랜잭션들 중에서 사용되지 않은 트랜잭션들을 사용하여 만드는 것입니다.
- UTXO란 Unspent Transaction Output의 약자입니다.아웃풋 트랜잭션으로 사용되지 않은 데이터를 뜻합니다.
- 단어에 아웃풋 이라는 단어가 들어가기에 헷갈릴수도 있는데,풀어서 설명하자면 내 주소로 들어온 인풋트랜잭션중,사용되지 않은 인풋 트랜잭션을 뜻합니다.
1달러는 보낸다고 1달러가 전송되는것이 아니다.
내가 과거에 0.7BCH를 전송받은적 있고,그 다음으로 0.6BCH를 전송받은적이 있다.그러면 제 지갑에는 1.3BCH가 들어있죠.우리가 현금을 사용할떄 처럼 생각한다면 이 1.3BCH중에서 1BCH만 꺼내서(마치 13000중에 만원짜리 한장 꺼내서 주듯이)상대방에게 전송하면 되겠지라고 생각하기 쉽지만 그건 불가능합니다.
왜냐면 내 지갑에는 1BCH라는 인풋 트랜잭션 데이터가 들어있지 않으니까요.내 지갑에는 0.7BCH라는 데이터와 0.6BCH라는 인풋 데이터만이 들어있습니다.그렇기에 저는 이 2개의 데이터를 보낼수 밖에 없습니다.즉 상대방에게 1.3BCH를 보내야 합니다.
그러면 저는 0.3BCH를 손해보게 되죠.손해보는걸 떠나서 시스템적으로 말이 안됩니다.그렇기에 Change(거스름돈) 트랜잭션이라는것이 존재합니다.즉 저는 1BCH를 지불하기 위해서,1.3BCH를 전송시키고 0.3BCH를 거슬러 받는겁니다.
정리하자면 내가 보유한 인풋트랜잭션 데이터를 조합해서 아웃풋 트랜잭션 데이터를 만들어 내는것입니다.
Memo.cash는 BCH블럭체인 기반의 트위터입니다.이 플랫폼에서의 액션은 한번한번당 BCH를 수수료로 지불해야 됩니다.
윗스샷에서 보듯이 제 Memo 주소에는 정말 자잘한 인풋데이터들만이 존재합니다.금액으로 치면 10센트 이하의 인풋들이죠.이 자잘한 인풋들을 조합해서 1달러치의 아웃풋을 만들어 내다보니 62개의 인풋들이 동원된 것입니다.그리고 그로 인하여 데이터가 9220바이트까지 치솟고,거기에 따라서 수수료가 9254 사토시나 나오게 된것이죠.
UTXO청소
몇개월전 BCH블럭체인이 8메가이던 시절 크기가 꽉찬 블럭이 몇번 나온적 있습니다.그 와중에 크기는 8메가이지만 처리한 트랜잭션의 수는 소량인 블럭이 있었습니다.이건 왜 이러냐고 질문을 던졌을때 돌아온 답변은 “Xapo측에서 UTXO를 정리하다보니 나온 현상이다”였습니다.
즉 자잘한 인풋 데이터를 정리하는 차원의 트랜잭션이었기에 데이터 크기가 큰 트랜잭션들이 대량으로 발생한 것이죠.
저도 의도치 않게 이번에 인풋 데이터를 한번 정리해버린 셈이 되었네요.덕분에 다음 트랜잭션은 평범한 범위의 수수료,429사토시가 나왔습니다.
코인은 데이터 쪼가리
흔히 암호화폐를 좋아하지 않는 분들는 아무가치도 없는 데이터 쪼가리라고 말하곤 합니다.이게 그렇게 틀린말 만은 아닌셈이죠.내가 1BCH를 가지고 있다는 것은 정확히 말해 수많은 BCH인풋 트랜잭션들을,1BCH만큼의 수많은 데이터 쪼가리를 보유하고 있다는 뜻입니다.
우리 모두 각자가 가진 “가치있는” 데이터 쪼가리들을 안전하게 관리하도록 합시다.
날이 너무 덥습니다......덥다 ㅠ
지갑잔고가 utxo의 합이라서 어쩔수 없는 구조입니다. 인풋이 많은경우 각각의 서명들이 용량을 많이 차지합니다. 그래서 비트코인코어에서 서명을 분리한것도 해결책중에 하나입니다. 블록체인 중에서 계좌를 열어서 계좌개념으로 잔고관리만하는 은행시스템처럼 하는것도 있을지 모릅니다. pascal 이였던것 같은데 지금은 잘되는지 모릅니다.