비트코인 관련 두 번째 포스팅은 트랜잭션과 마이닝에 대해서 알아 보겠습니다.
트랜잭션 Transaction
이전 포스팅에서 블록 내의 트랜잭션의 구조에 대해서 살펴 봤는데요, 실재로 주소 간의 트랜잭션이 어떻게 이루어지는지 살펴보죠.
"트랜잭션" 은 보통 바로 와 닫지 않는 용어인데요, 비트코인의 트랜잭션은 사실상 "지불" 이라는 용어로 해석할 수 있습니다.
즉 하나의 주소 (계좌) 에서 다른 주소로 특정 양의 비트코인을 이전시키는 작업이죠. 우리가 은행에서 흔히 하는 계좌이체와 동일한 개념입니다.
트랜잭션은 비트코인 지갑 프로그램 (wallet s/w) 에서 시작됩니다.
비트코인 지갑 프로그램은 비트코인 주소 - 개인키 쌍을 관리합니다. (개인키는 보통 보여지지 않으며 프로그램 내부에서 관리함)
사용자가 본인의 비트코인 주소에서 다른 주소로 특정 금액의 비트코인을 전송하면서 트랜잭션이 시작되는데요, 비트코인 지갑에서 수신인의 주소와 보낼 금액을 입력한 후 전송 버튼을 누르게 됩니다.
지갑 프로그램이 자체적으로 해당 트랜잭션의 유효성을 검증하고 나서 (수신자 주소 형식, 본인의 잔고 등) 문제가 없으면 전자적인 지불 지시서를 작성해서 비트코인 네트워크에 보냅니다. (전자지갑에 연결되어 있는 노드로 송신)
해당 지불 지시서에는 블록의 트랜잭션 부분에 들어가야 할 내용이 포함되어 있는데요, 보내는 비트코인 (해당 비트코인이 생성된 트랜잭션), 보내는 비트코인 양과 받는 사람의 주소 입니다.
지불 지시서를 수신한 노드는 모두 자체적으로 해당 지불 지시서가 유효한지 검증한 후, 유효한 경우에만 자기와 연결되어 있는 다른 노드에게 해당 지시서를 다시 보냅니다.
이 때 유효성 검증은 기술적 검증 (전문의 형식, 메시지 크기, 버전 번호 등) 과 비즈니스 로직 검증 (해당 비트코인이 이미 사용되지 않았는지, 비트코인의 양이 지불에 충분한지, 수신 주소는 유효한지 등) 으로 이루어 집니다.
유효한 지불 지시서는 노드를 거쳐가면서 이 단계를 반복하며 얼마 안 있어 비트코인 네트워크에 연결된 모든 지갑 소프트웨어가 해당 지불 지시서를 수신하게 됩니다.
이 단계를 미승인 거래 (unconfirmed transaction)라고 부르며 온라인에서도 확인이 가능합니다. (https://blockchain.info/unconfirmed-transactions)
마이닝 Mining
모든 노드가 지불 지시서의 유효성을 자체적으로 검증한다고 위에서 언급했는데, 비트코인 네트워크는 왜 검증된 트랜잭션을 미승인 거래로 취급할까요?
그 이유는 비트코인 네트워크가 유효한 데이터만을 블록체인에 저장하기 위한 방법으로 Pow, 마이닝을 도입했고 블록체인에 저장된 트랜잭션만이 승인된 거래로 취급되기 때문입니다.
그렇다면, 비트코인은 왜 '마이닝' 이라는 번거로운 절차를 도입했을까요?
어찌 보면 번거로운, 왜 존재하는지 이해하기 어렵지만 달리 생각하면 이것이 없었다면 지금의 비트코인도 존재하지 않았을, 신의 한수가 바로 마이닝인 것 같습니다. (사실 PoW는 비트코인에서 처음 도입된 개념은 아닙니다. Hashcash의 Proof-of-Work 펑션을 도입한 것이죠)
마이닝을 도입함으로써 비트코인은
- 모두가 공유하면서 별도의 중앙 관리체계가 없는 원장에 트랜잭션을 누가 기재하느냐 라는 문제를 해결하기 위해,
- 비용이 들어가는 "마이닝" 작업을 통해 원장을 기록하게 하고, 해당 노드에게 비트코인을 보상으로 주면서
- 추가적인 화폐의 발행과 확실한 원장의 기록을 모두 가능하게 했습니다.
일반적인 은행 시스템이라면, 트랜잭션이 서버에 도달하는 순서대로 검증하고 원장(데이터베이스)에 차례로 기입하면 되겠죠. 하지만 중앙에서 관리하는 시스템이 없는 비트코인 생태계에서는 그런 작업을 할 주체가 없습니다.
그렇다고 아무 노드나 트랜잭션을 원장에 기입할 수 있게 한다면, 모든 노드가 서로 다른 데이터를 가지게 되므로 비트코인 네트워크가 성립할 수 없게 됩니다.
따라서 하나의 블록 (이전 블록의 기입 이후에 생성된 트랜잭션을 포함하는) 은 하나의 노드에 의해서만 쓰여져야 하며, 블록을 쓰기는 적당히 어려워야 하고 다른 노드들은 매우 쉽게 해당 블록이 유효한지 확인할 수 있어야 합니다.
여기서 중요한 점은 블록을 쓰는데 적절한 난이도가 필요하다는 것 입니다. 만일 난이도가 너무 쉽다면, 부정한 의도를 가진 자가 거짓 정보를 포함한 블록을 작성해서 퍼뜨릴 수 있는 가능성이 높아집니다.
(물론 트랜잭션이 유효하기 위해서는 반드시 개인키 서명이 필요하며 개인키를 가지지 못한 제3자가 조작할 수 없습니다. 따라서 다른 사람의 비트코인을 자신의 계좌로 이체하는 등의 작업을 할 수는 없습니다.)
여기서 난이도는 "컴퓨팅 파워" 즉 컴퓨터를 이용한 계산능력을 뜻합니다. 컴퓨팅 파워에는 돈이 들어가므로 (전력, 하드웨어 구매비, 관리비 등) 블록을 쓰기 위해서는 실제로 돈이 필요하다는 것을 뜻하며, 비트코인 네트워크를 부정하게 조작하기 위해서는 역시 그 정도의 자금이 필요하게 되죠.
따라서 부정한 세력이 네트워크를 조작해서 얻는 이득이 조작에 필요한 금액보다 많아야 실제로 그러한 작업을 할 텐데, 실질적으로 들어가는 비용이 더 크게 함으로써 조작 세력의 동인(모티브)를 없게 하는 것이 마이닝의 핵심입니다.
마이닝 - Guessing Game
이전 포스팅에서 간략하게 언급한 것 처럼, 블록에 들어가는 내용은 하나의 항목만 제외하면 어떤 노드던지 쉽게 알 수 있는 내용들입니다. 그 하나의 항목이 "논스" 값이며 이 값을 처음 찾아내는 노드가 해당 블록을 블록체인에 쓸 수 있게 됩니다.
온라인에서 쉽게 확인할 수 있는 블록 익스플로러에서 하나의 블록을 예제로 들어 보겠습니다.
블록번호 473160번 블록입니다. 블록번호 바로 밑에 블록 전체의 해시값이 나와 있는데, 앞 18자리가 모두 0인것을 알 수 있습니다. 간단하게 설명하자면 마이닝에 필요한 컴퓨팅 파워는 블록의 해시값의 특정 앞 몇자리가 모두 0이 되는 논스값을 찾는데 사용됩니다. 논스값과 해시값의 관계는 랜덤하기 때문에 동일한 시간내에 보다 많은 논스값을 시도해 볼 수 있는 노드가 마이닝에서 더 유리한 위치를 차지하게 됩니다.
(보다 정확하게 말하자면, 특정 논스(여기서는 3250764492)와 계산 당시의 타임스탬프를 포함한 블록을 SHA-256 해시알고리즘을 통해 해시값을 계산하고, 그 해시값을 다시 SHA-256 알고리즘에 돌려 나온 해시값이 난이도 (여기서는 711697198173.7566) 보다 작기 때문에 유효한 블록으로 인정되는 것입니다)
온라인으로 마이닝 과정을 시뮬레이션 해 볼 수 있는 사이트도 있습니다.
위 사이트에 접속해 보면 논스값이 0에서부터 1씩 증가하고, 타임스탬프값이 바뀌면서 블록 해시값도 변경되는 것을 볼 수 있습니다.
그리고 블룸버그에서 인터랙티브하게 마이닝 과정을 시뮬레이션하는 페이지도 제공합니다.
https://www.bloomberg.com/graphics/2014-interactive-bitcoin-miner/
마우스를 논스 항목 위에 올려보면 각각의 논스값에 따라서 해시값이 다르게 나오는 것을 잘 볼 수 있습니다.