어제 쓰다가 오지랖에 지워버린 글을 다시 쓰네요.ㅎ
스팀잇에 사람이 많아지고 스팀 가격도 올라가고 좋은 연말입니다.ㅎㅎ
스팀잇을 진심으로 아끼시고 애정과 고민을 담아 글을 쓰시는 분들이 좀더 즐기시구 행복해지셨으면 좋겠습니다.^^
오늘은 비트코인의 거래 방식에 대해 알아보려고 합니다.
비트코인 공부를 시작하면서 비트코인의 거래방식은 상당히 특이하다고 하는 말을 많이 들었습니다. 그 거래 방식이 비트코인을 다른 블록체인들 그리고 암호화폐들과 다르게 만들며 비트코인이 지금까지 별 문제없이 대장 코인의 자리를 유지하게 만든 이유라는 말들도 역시 많이 들었습니다. 이런 저런 이유가 없더라도 지금의 비트코인은 그냥 존재 자체만으로도 대단한 코인이긴 하죠.ㅎㅎ
자 그럼 오늘도 시작해볼까요?^^
거래방식을 다루려면 사실 스크립트라는 것을 다뤄야하는데 지금 여기까지 들어가는 게 맞는 건가 하는 생각이 들어서 우선 거래에 초점을 맞추려고 합니다.(사실 스크립트.. 저두 잘 몰라요...)
비트코인의 거래는 UTXO(Unspent Transaction Output)라는 개념부터 시작합니다. 이 UTXO는 제 백서글(7)과 그 안에 더 친절하게 설명되어 있는 링크글들에서 알아보실 수 있습니다. UTXO가 무엇이고 거래에서 UTXO가 어떻게 사용되는지 모르시는 분은 꼭 한번 읽어보시길 바랍니다. UTXO는 한마디로 쪼개지지 않는 비트코인 덩어리입니다. 정확히는 비트코인 덩어리를 나타내는 데이터가 맞겠죠. 위에 영어(Unspent Transaction Output)를 해석하면 '소비되지 않은 거래(트랜잭션) 출력값'이 됩니다. 해석 안에도 비트코인에 대한 언급이 없듯이 UTXO안에 실제 비트코인은 없습니다. 즉 우리가 비트코인을 개인끼리 주고 받고 또는 한 거래소에서 다른 거래소로 넘길 때 실제 비트코인이 넘어가는 것은 아니라는 것이죠. UTXO는 금(골드)을 대신하는 증서같은 것으로, 얼마치의 비트코인을 받거나 넘긴다는 소유권 이전 증서 같은 것으로 생각하시면 됩니다. 개인 지갑을 쓴다고 생각하면, 제 지갑안에 비트코인은 없습니다. 다만 이 UTXO가 내가 얼마를 가지고 있다는 것을 보증해줄 뿐이죠.
UTXO에 대해 어느 정도 개념이 잡혔다면 다음으로 알야할 게 입력값(input)과 출력값(output)입니다. 이 세 가지 개념이 안 잡혀있으면 자꾸 헷갈리게 됩니다. 여기 쓰이는 게 뭐였더라? 이게 출력? 입력?(제가 이랬습니다....) 저 같이 안되기 위해 하나씩 정리부터 하겠습니다.
간단한 대전제는 UTXO를 소비하는 것이 입력값, UTXO를 생성하는 것이 출력값 이라는 것입니다. 꼭 기억해두세요.
(인용 : 책 '비트코인, 블록체인과 금융의 혁신')
이전 글에서 바디에 들어간다고 말씀들인 거래(Transaction)의 구조 입니다.
이 구조를 먼저 쓴 이유는, 표에서 보시다시피, 모든 거래는 UTXO를 소비하는 입력값과 UTXO를 생성하는 출력값으로 구성되어있다는 것입니다. 물론 예외가 하나 있습니다. 저번 글에서 설명드린 블럭 생성으로 받는 보상에 관한 생성거래(코인베이스 거래)는 누구한테 받는 것이 아닌(UTXO를 소비하는 것 없이) 새로운 UTXO를 생성하는 것이니 만큼 출력값만 있습니다.
그 외 거래는 모두 입력값과 출력값으로 구성됩니다. 또한 거래에는 입력값과 출력값의 갯수가 적혀있습니다. 많은 입력값과 출력값을 가지는 거래(입력과 출력에 다수의 UTXO를 사용하는 거래)는 그 용량이 커지게 되겠죠. 그럼 수수료가 올라가게 됩니다.
버전과 잠금시간은 말 그대로 이 거래의 현재 버전이며, 잠금시간은 이 거래를 언제 실행시키냐는 것으로 거의 쓰이지 않습니다.
(인용 : 책 '비트코인, 블록체인과 금융의 혁신')
출력값의 구조입니다.
UTXO도 이름에 출력값이 있고 위에서 언급한 생성거래에서도 출력값부터 시작하니 출력값부터 알아보겠습니다.
출력값은 UTXO를 생성한다고 말씀드렸습니다. 이것도 한 가지 예외를 가지는데 OP_RETURN이라는 데이터 출력의 경우 입니다.(이 부분도 어~~~~~언젠가 설명드렸음 좋겠네요.. 우선 예외가 있다는 정도만 알아둡니다.)
이 표에서 봐야할 것은 출력값에는 비트코인의 총액이 들어있고 잠금 스크립트라는 것이 들어있다는 것입니다. 잠금 스크립트는 출력 스크립트라고도 하는데 우선 잘 모르는 스크립트에 신경쓰지 마시구 잠금이라는 말에 집중합니다. 표에 보시면 출력값을 소비하는데 필요한 조건을 규정한다고 되어있으니 조건에 안 맞으면 못쓰게 잠궈놓았다는 말이 됩니다. 우선 여기까지만 하고 입력값을 보겠습니다.
(인용 : 책 '비트코인, 블록체인과 금융의 혁신')
입력값의 구조입니다. 출력값과 좀 다른 게 보입니다. 일련번호는 현재 안 쓴다고 하니 제껴둡니다. 출력값에는 비트코인의 총액이 들어있었는데 입력값에는 '거래 해시' 와 출력값 인덱스가 있습니다. 거래해시는 쉽게 생각해서 이 입력값이 소비하는 UTXO를 생성한 거래(이전 거래)를 해시한 값이고 인덱스는 이 입력값이 소비할 UTXO의 색인번호(생성거래를 0으로 해서 거래수를 센 일련번호)입니다. 이 두 개는 거래 입력값이 소비할 특정 UTXO를 찾아서 지정하는데 사용됩니다. 출력값이 금액을 정확하게 명시했다면 입력값은 금액을 담고 있는 UTXO를 명시하는 것이죠. 입력값에는 해제 스크립트(입력 스크립트라고도 합니다)가 들어갑니다. 여기서도 해제라는 말에 집중합니다. 해제 스크립트는 UTXO 잠금 스크립트의 조건을 충족하는 스크립트 라고 되어있습니다.
위에 출력값의 잠금 스크립트는 조건을 설정하고 입력값의 해제 스크립트는 조건을 충족시킵니다.
그럼 그 필요한 조건이라는 것이 무엇일까요?(너무 어이없는 질문인가요.ㅎㅎ)
백서글(3)에서 공개키와 개인키, 서명에 대해 잠깐 맛본 적이 있습니다. 이 조건이라는 것이 바로 이 열쇠들과 서명에 관한 것입니다. 간단히 저희가 실제 하는 거래로 설명하면 출력값의 잠금스크립트가 말하는 "소비하는 데 필요한 조건"은 받는 사람의 비트코인 주소(공개키를 해싱해서 만든 주소)가 되고 입력값의 " UTXO 잠금 스크립트의 조건을 충족하는 스크립트"는 자신의 개인키로 만든 서명과 공개키가 됩니다.
말로만 쓰면 헷갈리니 예를 들어보죠.(제가 읽다가 잊어버리거든요.) 간단하게 3개의 연계된 거래로 위에 내용을 풀어보겠습니다.(그림을 첨 그려보니 조잡해도 이해를 부탁드립니다..)
인공은 채굴자입니다. 채굴자는 블록을 만들고 그 보상으로 12.5BTC를 받습니다.
위에서 말한듯이 생성거래(코인베이스 거래)의 비트코인은 무에서 창출되는 것입니다. UTXO를 소비하는 것이 없으니 입력값은 없고 출력값만 있습니다. 따라서 이 생성거래는 인공이 만든 블록 바디에 12.5BTC의 총액을 가진 UTXO가 출력값만 가진 거래로 담깁니다. 인공이 생성한 이 블록은 다른 노드들에게 전파되고 승인됩니다.
현재 인공의 12.5BTC를 가진 UTXO는 출력값의 상태 즉 잠금 스크립트로 잠겨 있습니다.
이 12.5BTC 중에 2BTC를 철수에게 보내려고 합니다.
인공이 철수에게 2BTC를 보내는 (1)번 거래입니다. 앞서 말씀드린 거 같이 보통의 거래(표준거래)에는 입력값과 출력값이 같이 들어갑니다. 인공은 지금 잠겨있는 출력값의 상태로 12.5BTC의 UTXO를 가지고 있으니 우선 이것을 소비하려면 잠겨있는 상태를 풀어야합니다. 즉, 인공이 가진 해제 스크립트(서명과 공개키)를 가지고 잠금 상태를 풀어 입력값으로 만드는 것입니다. 이 과정을 통해 인공에게 있던 12.5BTC의 UTXO는 소비되고, 그 UTXO는 사라지게 됩니다. 여기서 소비된다는 말이 12.5BTC를 써버린다는 말이 아닙니다. UTXO(소비되지 않은 출력값)이 소비된다는 말입니다.(소비 됐으니 사라지는 거구요.)
이 12.5BTC는 이제 출력값으로 철수와 인공 각각에게 2BTC와 10.45BTC를 나타내는 UTXO를 생성합니다.(거래 수수료 0.05BTC) 인공에게 돌아오는 UTXO는 위에 링크한 백서글에서 설명하였습니다.
이렇게 1번 거래가 생성되면 이 거래는 모든 노드들에게 전파되고 각 노드들에 거래풀에 저장됩니다. 그리고 그 노드 중 하나가 블럭을 생성하게 되면 블럭에 저장됩니다. 이것은 블록의 생성글에서 설명 드렸습니다.
위 그림 입력값에 "12.5를 가진 UTXO를 지정"한다는 말은 위에 입력값 설명에 있는 거래해시와 인덱스를 통해 소비할 UTXO를 지정한다는 의미입니다. 그림에서는 마치 인공이 UTXO 12.5BTC를 지갑에 들고 있는 거처럼 보일 수 있지만 UTXO는 개인의 계좌나 지갑에 들어가는 개념이 아닙니다. 거래는 거래풀에 저장되고 블록에 저장되는 것이지 개인의 지갑까지 연결되는 것이 아니기 때문입니다. 따라서 출력값이 생성한 UTXO는 모든 풀노드의 메모리에 있는 UTXO세트 혹은 UTXO풀이라고 부르는 데이터 베이스에 들어있습니다. 이 UTXO풀에 있는 인공의 12.5BTC UTXO를 지정하는게 입력값의 거래해시와 인덱스이고 출력값의 형태로 받는 사람의 공개키(주소)로 송금할 양의 UTXO를 등록하는 것입니다. 이렇게 등록을 하면 지갑이 지갑안에 UTXO 양만큼의 BTC가 있다고 보여주는 것이죠. (1)번 거래의 경우 철수가 다시 자신의 2BTC UTXO를 소비하려고 한다면 데이터 베이스에서 거래해시와 인덱스로 찾는 과정을 거칠 것입니다.
(2)번 거래도 원리는 똑같습니다. 하나의 UTXO를 소비하여 2개의 UTXO를 만드는 과정입니다.
(3)번 거래는 한 개의 UTXO로 출력값의 금액을 만들 수 없으니 2개의 UTXO를 소비합니다. 즉 입력값이 2개라는 거죠. 이 2개의 UTXO세트로 출력값의 금액을 만들고 (1)번 거래와 똑같이 2개의 출력값을 만듭니다.
(2), (3)번 거래는 (1)번 거래와 다른 경우를 보여드리기 위해 넣은 것입니다. 똑같은 원리이니 UTXO가 어떻게 소비되었는지 백서글(7)번의 내용으로 한번 생각해보시길 바랍니다.(사실 지치고 배고파서..ㅠㅠ)
이 비트코인의 거래방식이 헷갈리는 이유는 개인적으로 저희가 많이 쓰는 은행 송금 방식과 다르기 때문이라고 생각합니다. 은행에서 송금을 할 때는 저희가 금액을 송금하고 수취인이 받는 구조입니다. 전 왠지 송금이라고 하면 출력일 거 같고 받는게 입력이라는 생각이 들어서 많이 헷갈려 했습니다. 또 이렇게 헷갈리다 보니 거래의 시작이 출력이라는 생각이 많이 들더군요. 하지만 위에 그림에서도 봤듯이 비트코인 거래의 시작은 넣어 자신의 UTXO를 UTXO풀에서 찾고 잠금을 해제하여 입력값을 만드는 것입니다. 이런 이유로 제목에 특이한 거래 방식이라고 썼습니다.
이런 특이한 방식의 거래는 우선 독립적으로 움직이며 추척할 수 있는 UTXO를 통해 이중지불을 방지할 수 있게 합니다. 이렇게 하나하나씩 거슬러 올라가 사용되지 않은 출력값의 기록(UTXO)를 확인할 수 있기 때문입니다. 또한 이중지불을 막을 수 있다는 것은 현재의 금융시스템과 달리 중앙화된 신뢰할 수 있는 기관이 필요없다는 것도 의미합니다. 그 사람이 돈이 있는지 없는지는 그 사람이 돈을 받은 이전 거래를 확인해보면 되기 때문입니다.
개인적으로 또 다르다고 느낀 것은 현재 저희가 쓰는 송금과 거래의 끝이 다르다는 것입니다. 현재 금융권의 송금 시스템은 송금을 하고 수취인이 받는 것에서 끝나지만 비트코인의 거래는 출력값을 만들어 거래에 담는 것으로 끝납니다. 그 금액을 찾아서 사용하는 것은 다른 거래에 속하게 되죠.
아직 공부가 덜 되서 이 거래방식이 어떤 특이점을 가지고 어떤 장점을 가지는지 더 알지는 못하네요.ㅎㅎ
사실 테스트넷이라도 돌려서 직접 시연할 수 있는 실력이 있다면 더 쉽게 설명이 될텐데...죄송합니다!
이상으로 비트코인의 거래방식을 알아봤습니다.
스크립트에 대해서 더 알고 싶은 분은 밑에 링크글을 보시기 바랍니다.^^
언젠가 비트코인 스크립트에 대해서도 글을 쓰겠습니다.
https://git.iwanhae.ga/wan/introduction_of_bitcoin/src/84a369d30f219a06c108746b97dcf7ff25c055a8/5_%EA%B1%B0%EB%9E%98%EC%83%9D%EC%84%B1%EB%B0%8F%EC%A0%84%ED%8C%8C.md
(정확하게 출처를 밝힐 수가 없어서 링크를 걸어도 되나 싶네요.. wan님의 introduction of bitcoin 이란 글입니다.)
제 글 단골 선생님이신 @easyblockchain님의 쉽게 설명하는 블록체인, 스크립트란 뭔가요?(비트코인의 언어)글입니다.
긴 글 읽어주셔서 감사합니다!(사실 거래 수수료도 써야하는데 이건 다른 글에 짧게 쓰든가 하겠습니다...ㅎㅎ)
초보라 그림 그리는데 시간이 너무 많이 드네요..ㅠㅠ 노력한 만큼 이해가 쉽게 되시는지도 모르겠구..
개인적으로 이해했다고 생각하고 썼는데 잘못 이해한 게 있으면 꼭 지적해주십시오!!
궁금한 거 있으시면 댓글에 남겨주세요. 같이 공부해봐요.ㅎㅎ
비트코인 백서부터 시작합니다
[비트코인트리1-1] 블록이란 무엇인가
비트코인 백서부터 시작합니다(2)
비트코인 백서부터 시작합니다(3)
비트코인 백서부터 시작합니다(4)
[비트코인트리4-1] 블록의 생성에 대해 알아봅시다
비트코인 백서부터 시작합니다(5)
비트코인 백서부터 시작합니다(6)
비트코인 백서부터 시작합니다(7)
비트코인 백서부터 시작합니다(8)
참조 :
[개론]비트코인 블록체인 개론 - Introduction to Bitcoin Blockchain - 한승환 brunch(Dec 21.2016)
책 "비트코인, 블록체인과 금융의 혁신"(안드레아스 M. 안토노풀로스)
https://git.iwanhae.ga/wan/introduction_of_bitcoin/src/84a369d30f219a06c108746b97dcf7ff25c055a8/5_%EA%B1%B0%EB%9E%98%EC%83%9D%EC%84%B1%EB%B0%8F%EC%A0%84%ED%8C%8C.md
wan님의 introduction of bitcoin