화폐가 사용되어지기 위한 조건은 여러가지가 있겠지만 그 중 하나는 개인재산으로 인정이 되어야 한다는 것이다. 현대의 국가가 법으로, 그리고 공권력으로 이를 보장해주고 있기 때문에 우리는 돈을 벌어 저장하는 것에 두려움을 느낄 필요가 없다. 우리가 돈을 버는 데 무슨 눈치를 볼 필요가 있을까?
만약 원시시대 때 생존에 필수적인 식량을 저장해둔다고 생각해보자. 누가 나를 해치고 식량을 뺏어간다고 해도 어떤 제재도 받지 않는다. 개인의 재산이 인정된 것은, 공동체라는 개념이 생기고 난 이후이기 때문에 그 이전까지는 재산을 축적한다는 생각조차도 못 했을 것이다.
화폐가 디지털 상에서 거래되기 위해서는 커다란 문제가 존재했다. 복제가 손쉽다는 것이다. 현실의 화폐, 특히 종이 화폐도 위조 문제로 한동안 골머리를 앓았다. 당장 영화 "캐치 미 이프 유 캔"에서도 주인공이 위조된 화폐를 대량으로 찍어내어 부자처럼 지내는 모습이 나온다. 디지털 상에서는 존재에 대한 소유권을 증명하기가 어려웠다. 존재는 하나가 아니라 똑같은 형태로 여러 곳에 존재했기 때문이다.
블록체인은 원장을 통해 화폐의 소유권 이전 기록을 저장했고, 비대칭키 암호화를 통해서 소유권을 증명했다. 그리고 이번에는 비트코인에서 화폐의 소유권을 증명하고, 화폐의 소유권을 이전하는 거래 데이터를 만들기까지의 과정을 다뤄본다.
비트코인은 UTXO 라는 개념이 있다. UTXO는 "Unspent Transaction Output"을 줄인 말이다. 말그래도 "아직 소비되지 않은 잠재적인 거래 출력"이라는 뜻을 갖는다. 비트코인에서 작성되는 트랜잭션들은 UTXO로 시작해서 UTXO로 끝난다고 생각해도 과언이 아니다. 현실에서 UTXO 는 아직 서명되지 않은 수표의 느낌이라 생각하면 되겠다. 수표의 주인이 서명을 하면 지불이 완료되는 것이다.
비트코인의 스크립트는 일종의 컴퓨터에 처리를 명령하기 위한 타 프로그래미 언어라고 봐도 무방하다. 하지만 비트코인 거래를 위해서 사용하기 때문에 범용적으로 사용하기는 힘들다. 스크립트를 짧게 설명하자면, 역폴란드 표기법을 사용한 튜링 불완전 언어
라고 얘기한다. 필자도 어려우니까 자세한 설명은 넘어가도록 하자.
스크립트를 이루는 요소는 두 가지고, 스크립트가 작동되는 방식은 다음과 같다.
UTXO에는 해제 키를 갖고 있는scriptSig
와 잠금을 정의하는 scriptPubkey
데이터 구조를 가지고 있다. 쉽게 풀어보자면, scriptPubkey 로 잠근 것은 scriptSig 로만 풀 수 있다는 것이다.
지불하려는 사람 입장에서는 UTXO가 이미 자신의 주소와 관련이 있는 sciprtPubkey 로 잠겨있을 것이다. 그리고 이 주소는 소유자를 식별할 수 있는 유일값이 되기 때문에, 해당 비트코인이 이 주소를 갖고 있는 사람의 것이라는 것을 공공연하게 증명하게 된다.
이렇게 소유권이 증명되었다면, 지불을 해야한다. 이는 scriptSig 데이터와 스크립트의 콜라보로 이루어진다. scriptPubkey로 내 소유를 주장하기 위해 잠가놓은 비트코인을 개인키와 관련된 오직 해당 주소의 소유자만 갖는 열쇠로 푸는 것이다. 그리고 풀린 비트코인을 지불 대상의 scriptPubkey로 다시 잠가 놓으면 해당 비트코인 소유권이 이전된다.
결과적으로 이 두 데이터와 OP_CHECKSIG
라는 Opcode의 연산 결과가 1이 되어 스택의 마지막 데이터로 남는다면, 해당 UTXO를 소비(사용)할 수 있게 된다.
위는 이미 위에서 설명했던 작동 원리의 기본적인 사용 방식이다. 하지만 publick key
를 그대로 노출하여 프라이버시의 문제가 생겨 현재는 사용을 잘 안 하고 있다.
지불 대상자의 주소를 ScriptSig 데이터로 옮겨왔다. 그리고 해당 주소값의 해시값을 scriptPubkey 를 구성하는 요소로 놓는다. 이후 스크립트를 실행하면, ScriptSig에 있는 주소값을 복사, 해싱하여 scriptPubkey의 해시값과 일치하는지 확인 뒤 일치하면 두 데이터 모두 소모 해버린다. 최종적으로 스크립트에 남는 연산은 P2PK가 된다.
가상에서 구현된 화폐가 어떻게 소유권이 인정되고 지불되어지는지 알아볼 수 있는 중요한 방식이다. 연산하기가 거의 힘들어 노출되지만 않으면 본인임을 인증할 수 있는 개인키. 그리고 본인을 식별할 수 있는 이름이 되는 공개키. 이 개인키와 공개키를 사용하는 비대칭 암호화 방식이 블록체인의 근간을 이룬다.