CS_Developer
[Blockchain] #3 비트코인 생성과 절차 본문
이번 포스팅에서는 비트코인의 전반적인 실행 알고리즘에 대해 작성할 것이다.
비트코인에 대한 간단한 설명은 이전 포스팅에서 설명하였다.
그것을 바탕으로 이번에는 절차를 알아보도록 하겠다.
비트코인은 분산화된 형태를 기반으로 한다. 따라서 믿음의 판단이 어렵기 때문에 서로의 상호작용을 통해 믿음을 얻게 된다.
우리는 이번 글에서 tx를 추적하고, 합의가 어떤 식으로 이루어지며, 어떤식으로 블록체인에 기록되는지 알아보도록 하겠다.
위의 그림은 비트코인이 어떤식으로 동작하고, 그 안에 유저에는 누가 존재하는지 나타내 주는 그림이다. wallet을 가진 많은 사람들이 비트코인 네트워크에 참여하는 모습을 볼 수 있다. 그중, 아래를 보면 miner가 존재하는 miner는 full-node client로 모든 tx에 관여하게 된다.
일반 유저와, 환전소, 상인들이 존재하며 그들은 wallet과 address를 소유하고 있다. 물론 wallet에는 private key도 함께 존재한다.
miner는 tx들을 모아놓은 블록을 만든 후 일련의 PoW과정을 거친 후 블록체인에 추가하게 된다. 이때 miner는 보상으로 비트코인을 받게 된다. 복잡해 보일 수도 있지만, 하나하나 따져보면 쉽게 이해할 수 있는 그림이다.
비트코인 네트워크에는 수많은 블록과 tx가 존재하는데 이것을 검색할 수 있게 많든 web app이 존재한다. 이 web app에서는 address, tx, block으로 검색을 해볼 수 있다. 사이트의 예로는 www.blockchain.com/explorer 가 존재한다. 사이트에 잠깐 들어가 보겠다.
위에서 보이는 사이트에 검색을 진행하면 알 수 있다. 왜냐하면 네트워크에 tx가 공유되고 누구나 볼 수 있게 설계되었기 때문이다.
Transaction에 대해 조금 더 자세히 알아보도록 하겠다. 하나의 tx는 아래와 같은 여러 정보들을 가지고 있다.
- 하나 또는 여러 개의 inputs
- 하나 또는 여러개의 outputs
- Sum of inputs > Sum of outputs
- transaction fee: (sum of input) - (sum of output), 추후에 miner가 가져간다.
- input에 대한 소유권
비트코인을 사용하는 것은 이전 tx에서 주소로 확인된 새로운 owner에게 tx가 생성되는 것이다.
위의 그림은 비트코인을 이용하여 생성된 tx 하나의 내역을 나타낸다. input과 output이 존재하며, 아래에 total이 나타난다. 또한 total input이 total output보다 큰 것을 알 수 있다. 이것은 tx fee라는 부가세를 지불하기 때문이다. 이 fee는 추후에 miner들이 보상으로 얻게 된다. 따라서 input의 총합은 output의 총합보다 크다.
위의 그림은 Transaction Chain을 나타낸 것이다. 총 3개의 tx가 존재한다.
가장 위의 tx를 보면 Joe가 Alice의 address로 0.1 BTC을 전송한 것을 볼 수 있다.
중간 tx를 보면 Alice는 Bob의 address로 0.0150 BTC를 보냈고, Alice의 address로 잔돈이 전송되었다. 또한 tx fee가 존재하는데 이것은 위에서 설명한 부가세이다.
마지막 tx를 보면 Bob은 받은 0.0150 BTC를 Gopesh에게 0.0100 BTC를 전송하였고, 자신의 address로 잔돈이 전송되었다. 여기서도 fee는 존재한다.
output 영역을 보면 (spent)와 (unspent)로 적힌 것을 볼 수 있는데, 이것은 해당 output이 사용이 되었는지 안되었는지를 알려준다.
또한 output의 address는 소유자만 사용할 수 있도록 lock을 걸어두는데, 이 lock은 스크립트 기반 Key를 사용하게 된다.
잔돈(change)의 주소는 input으로 들어온 주소가 아닌 다른 주소를 사용한다. 그 이유는 보안성-익명성 때문이다.
tx는 input으로 들어온 것을 output으로 내보내며, 다시 output의 소유자는 그것을 input으로 사용하게 된다. 이것은 tx chain이다. 우리가 배우는 것이 블록체인인 것을 보면 어느 정도 납득이 된다. output은 주소로 연동이 된다.
비트코인의 tx에서 비트코인은 쪼개어지거나, 합쳐질 수 있다.
이것은 하나의 비트코인 조각이 지닌 가격보다 사용한 가격이 적을 경우 잔돈으로 들어오는 과정이다. 하나의 조각이 두 개의 조각으로 나누어지는 모습을 보여준다.
이것은 사용하고자 하는 금액이 내가 지닌 조각 하나의 금액보다 클 경우 여러 개의 조각을 모아서 사용하는 모습을 보여준다.
이것은 큰 하나의 조각을 여러 작은 조각들로 나누는 모습을 보여준다.
위의 그림들은 모두 output으로부터 온 비트코인 조각들을 다시 input으로 사용하는 것이다. 이미 사용된 output은 다시 재사용될 수 없다. 이것은 현실세계 돈에서도 똑같다.
Wallet은 사용되지 않은 output들을 모아서 보여주게 된다.
Wallet은 사용 가능한 모든 output을 추적할 수 있는데, 여기에는 두 가지 경우가 있다.
- Full-node client: 사용되지 않은 모든 output들을 블록체인의 tx에서 가져올 수 있다. 즉, 자신 혼자 다른 모든 tx를 탐색할 수 있다.
- Lightweight client: 사진이 가진 사용되지 않은 output을 볼 수 있다. 하지만 자신에게 없는 tx를 보려고 할 경우 full-node에게 요청하여 output을 알아내야 한다. 이때 API를 사용하게 된다.
추가적으로, 1억 satoshi = 1 BTC이다.
Output은 Script의 형태로 나타내게 된다. 즉, script의 답을 알아야 하는데, 이때 전자서명을 이용하여 자신이 정말 소유자가 맞는지 확인하는 과정을 거친다.
Transaction Fee는 앞서 설명했지만 부가적으로 설명하자면, output에 직접적으로 명시되지는 않는다. input과 output의 총합의 차를 구해보면 fee를 알 수 있다.
Transaction의 전달에 대해 알아보겠다.
A의 wallet이 새로운 tx를 생성하면 비트코인 노드들을 통해 전파되게 된다. 노드는 tx를 연결된 다른 노드들로 계속 전파하게 된다. 그럼 결국 A가 지불한 비트코인이 B에게 도달할 수 있게 되는 것이다.
B의 관점에서 바라보면, A의 wallet이 tx를 전달하고 노드를 통해 수초 안에 B가 tx를 받게 된다. B는 받은 tx를 검증하게 된다. 이때는 tx의 input이 가짜나 위조가 아닌 진짜인지, 중복 사용은 아닌지, 정상적인 소유자가 맞는지 검사하게 된다. 하지만 대부분의 경우 tx가 올바르게 생성되어 오류가 없을 것이라고 가정하며 받아들이게 된다. 이때 약간의 위험을 감수하는 것이다. 이 위험은 신용카드를 사용할 때의 위험도와 비슷하다고 한다. 즉, 위험도가 굉장히 낮다는 것이다.
Mining은 tx를 검증하고 새로운 블록을 만드는 과정이다.
일련의 비트코인 룰을 사용하여 tx들을 검증하고, 블럭을 생성하는데, 보상으로 나오는 비트코인도 이 블록이 추가하게 된다.
즉, 블록은 다양한 tx들의 묶음이다. miner들은 mining을 하기 위해 많은 비용을 소모하게 된다. 그렇기 때문에 보상으로 새로운 비트코인과 블록으로 모은 tx들의 fee를 주게 된다. miner들이 없다면 비트코인 네트워크가 흘러가지 않기 때문이다.
또한 mining은 연산을 기반으로 하는 믿음이다. (Proof of Work) 증명은 어렵지만 검증은 쉽게 만들어졌다. 다시 말하자면
- Prove: 수많은 연산을 동반한다.
- Verify: 적은 연산을 동반한다.
이다.
Mining은 마치 스도쿠와 비슷하다고 한다. 난이도를 조절하기 위해 10분 간격으로 mining에 성공하게 하고, miner들은 새로운 블록에 대한 증명을 하게 된다. 이 블럭에 포함된 tx들이 정확한 것이 맞는지. 또한, SHA-256이라는 해쉬 함수를 사용한다. 블록을 만드는데 성공한 승자는 블록체인에 블럭을 저장하게 된다. 다른 miner들은 이 블록이 정확한지 검증을 하게 된다. 그 후 새로운 게임을 시작하는 것이다.
이런 식으로 블록체인이 동작하게 되는 것이다.
Mining을 할 때 miner들은 최대한 tx fee가 높은 tx를 찾아 선택하여, 자신이 연산을 수행할 공간인 pool에 저장한다. 그리고 연산을 하며 다르 miner들과 경쟁하게 되는 것이다. 이때 수많은 연산을 필요로 하기 때문에 컴퓨팅 파워가 좋아야 할 것이다.
블록을 생성하게 되면 검증을 거쳐, 블록의 번호를 부여밭게 된다. 예를 들어 블럭의 번호가 #277316 이라면 277316번째 블럭이라는 뜻이다. #277316은 블럭의 높이라고 할 수 있다.
초기 블록, 즉 논리적으로 가장 아래에 있는 블럭은 Genesis Block이라고 부른다. #0이다. 또한 블록이 처음 쌓이게 되면 confirmation이 1이 된다. 해당 블럭 위에 또 다른 블럭이 쌓이게 될 경우 confirmation이 +1씩 증가하게 된다. 다시 말해서, 다른 블록들이 쌓일수록 신뢰도가 높고 안전해진다는 뜻이다.
confirmation이 6이 되면 비로소 안전하다고 할 수 있다. 왜냐하면 블록을 수정하기 위해서는 그 위에 쌓인 블럭 모두를 수정해야 하기 때문이다. 상당히 까다롭고 복잡한 작업이 될 것이다.
비로소 tx가 블록에 추가되고 그 블록이 쌓이게 되면, B는 output을 사용할 수 있게 되는 것이다.
위에서 설명한 내용들을 정리하는 그림은 아래와 같다.
input과 output이 서로 섞이는 것이다. 우리는 이것은 chain이라고 부른다.
이번 포스팅에서는 블록체인 비트코인의 과정에 대해 알아보았다.
여기까지 읽은 여러분은 비트코인의 실행 과정에 대해 조금 더 알게 되었다.
'Computer Science > Blockchain Flatform' 카테고리의 다른 글
[Blockchain] #2 비트코인이란 ? (0) | 2020.09.12 |
---|---|
[Blockchain] #1 블록체인이란 ? (0) | 2020.09.12 |