본문 바로가기
블록체인/[파공블]파이썬으로 공부하는 블록체인

1. 파이썬으로 공부하는 블록체인 - 채굴

by 일등박사 2022. 6. 24.
728x90

2022.05.29 - [일등박사의 생각/[파공블]파이썬으로 공부하는 블록체인] - [파공블]파이썬으로 공부하는 블록체인(목차)

 

[파공블]파이썬으로 공부하는 블록체인(목차)

2022.05.28 - [일등박사의 생각/파이썬으로 알아보는 블록체인] - [파공블]파이썬으로 공부하는 블록체인(Intro-1) 2022.05.29 - [일등박사의 생각/파이썬으로 알아보는 블록체인] - [파공블]파이썬으로 공

drfirst.tistory.com


여러분!! 채굴 하면 무엇이 떠오르시나요!?

 

얼마전까지만 하더라로 "채굴" 이라 함은

광산의 깊은 터널에 들어가 곡괭이를 들고 열심히 광석을 채굴하는것이라는 이미지가 강했는데요!!

 

블록체인기술, 특히 비트코인이 각광을 받으며

이 채굴이라는 이미지를 완전히 바꾸어 놓았습니다.

 

구글에서 채굴을 검색한 결과

이제는 채굴하면 여러대의 컴퓨터가 묶여 코인을 채굴한다는 생각을 먼저 떠올리게 되네요!!

오늘은 이 채굴에 대하여 알아봅시다!!^^

 

여러분의 계좌에 있는 돈은 핸드폰으로 혹은  ATM으로 언제든 그 잔액을 확인할 수 있습니다.

즉 은행 서버(중앙화된 서버)에 여러분의 잔고 데이터가 저장되어 있는것이겠지요??

그래서 그 서버를 운영하는 통신비용, 전기세 등을 은행이 부담하고 있을것이고,

그 비용은 대출과 예금의 차이 등 은행의 다양한 매출로 지불이 될것 입니다!!

 

그럼!! 메타마스크 등 여러분의 코인지갑에 있는 잔액은 어디에 저장된 데이터 일까요?

(업비트, 빗썸 등 거래소에 저장되어있는 잔액은 은행의 중앙화 방식과 같습니다!!

  거래소에서 전기세를 부담하고 저장중이며, 여러분의 거래수수료로 부터 그 비용을 지불합니다)

 

블록체인은 탈중앙화 기술로 한곳에 정보가 집중되지 않죠??

맞습니다! 여러분의 코인 잔액정보는 모든 채굴 컴퓨터가 보관하고있습니다!!

 

그렇기에 전기세, 통신비 등이 나올것이고

채굴자는 채굴로 얻는 코인으로 이러한 비용을 지불할 것입니다!!

 

즉!! 채굴하는 컴퓨터 = 코인정보를 저장하는 서버

라고 생각하시면 쉬워요!!

 

채굴하는 컴퓨터(노드)들이 댓가(코인)을 얻기 위해

체인시스템이 내는 문제를 풀어가고

그 문제를 푸는 노력들(리소스)를 활용하여 코인시스템의 데이터가 쌓이는 것이지요!!

 

 

이제 그 채굴의 원리를 조금 더 자세히 알아봅시다!!

지난시간 블록의 구성요소를 공부하며  헤더 부분의 Nounce가 채굴과 관계되었다고 했었는데요!!

 

Nounce 의 사전적 의미는 발표하다! 라는 뜻입니다.

 

채굴하는 컴퓨터(노드)들 중 가장 빨리 문제를 해결한 컴퓨터가(노드)

"내가 문제를 해결했어!! 이번 블록을 발표할게!!"  라고하며 그 내용을 입력해 둔 것이지요

 

여기서 생기는 2가지 의문을 해결해 보아요!!

1. 컴퓨터(노드)는 어떤 문제를 풀까?

2. 컴퓨터가 문제를 푸는것이 어떻게 내 코인 정보를 장한다는 뜻이지?


1. 컴퓨터(노드)는 어떤 문제를 풀까?

 체인 네트워크에 접속하여 채굴하는 컴퓨터(노드) 들은 어떤 문제를 풀까요?

 

채굴에 참여한느 컴퓨터의 과정

 

덧셈과 해시함수만을 반복하는 아주 간단한 문제를 풉니다.

 

예를  들면 해시함수로 첫자리 자리가 0 이 되는 무엇인가를 찾아라!!

와 같은 문제들이지요!

 파이썬으로 봐볼까요!?

0이 한번나오는 값을 찾기까지 17번 루프가 반복됩니다.

while 문을 돌며 해시함수가 계속 작동하고

최종적으로 제일 앞자리가 "0" 인 그 무언가를 찾으면 문제가 해결되는 것입니다!

## 첫번째 채굴
start_nounce = 49837
i = 0
while True:
    nounce_candidate =  hashlib.sha256(str(start_nounce * i).encode()).hexdigest()
    print(i,nounce_candidate)
    if nounce_candidate[0:1] == '0':
        nounce = nounce_candidate
        break
    i += 1

 

그리고!!

채굴난이도를 높이고자 한다면

 

"첫자리 자리가 0 이 되도록하는" 에서

"첫번쨰부터 다섯번쨰자리가 모두 0이되도록 하는" 으로 문제를 바꾸어 준다면

채굴에 참가한 컴퓨터(노드)들이 답을 구하는데 더욱 시간이 걸리게 됩니다!!

 

00이 나오는 값을 찾기까지, 874번이 루프가 반복됩니다

 

여기서!! 우리는 왜 채굴할때는 CPU(중앙처리장치) 보다 GPU (그래픽카드)가

활용되는지 그 원인을 알 수 있습니다!.

 

 단순한 덧샘과 해시함수로 이루어진 이 채굴문제를 빠르게 풀기위하여

여러분들은 CPU와 GPU 중 어떤 친구를 고르실 것인가요?^^

 

2. 컴퓨터(노드)가 문제를 풀면 어떻게 코인 정보가 저장될까??

 은행계좌에서 돈을 송금하면 그 순간!!

내 송금내역이 은행의 서버에 저장이 됩니다!!

 

메타마스크에서 타인의 코인지갑으로 비트코인을 송금하면???

그순간 바로 송금이 완료될까요??

아닙니다!! 네트워크의 상태에 따라 짧게는 5분에서 1시간까지 시간이 소요됩니다!

왜냐하면, 채굴하는 컴퓨터(노드) 들이 한편으로는 송금내역을 모으면서

채굴을 성공했을때! 그동안 모아두었던 송금내역을 Nounce 값과 함께 블록을 만들며

이때 송금내역이 서버(블록체인)에 저장되는것 입니다!!!

 

중앙화서버와 탈중앙화서버의 송금방식 비교

송금을 위한 대기시간은 컴퓨터가 문제를 풀어 블록이 형성될 때까지의 시간입니다!!

 

정리해보면 채굴에 참가한 모든 컴퓨터(노드)들은

Nounce값을 찾아 블록을 완성시키고자 노력합니다!!

그리고 그렇게 블록완성을 성공시키면 그 대가로 코인을 받습니다!!

 

한편 코인 사용자들이 코인을 송금을 요청하면

1. 처음에는 블록 대기리스트에 저장되고

2. 어떤 채굴컴퓨터(노드)가 채굴을 성공하면! 

3. 그 채굴결과(Nounce)가 포함된 블록에 송금내역이 저장

4. 송금완료 됩니다!!

 

 

이제 정리해보겠습니다!!

 

채굴 중인 컴퓨터는

A. 해당 블록체인 네트워크에서 데이터를 저장하는 서버 역할을하며

B. 블록 Header의 구성요소인 "알맞은 Nounce값"을 찾는 문제를 풀며

C. 문제를 푼 뒤 문제를 푸는동안 발생했던 거래내역(transaction)을 Body에 넣은 블록을 생성합니다!!!

 

해당 과정에서 탈중앙화된 거래이기에

Nounce 를 제일 먼저 찾은 컴퓨터(노드)가 다른 도전자 컴퓨터(노드)들에게

문제가 풀어졌서 블록을 생성한다는 것을 전파하는 작업이 발생하고,

 

다른 컴퓨터(노드)들은

1. Nounce 값이 정말 맞는 값인지, 

2. 블록 생성시 previous hash 값이 바뀐것은 없는지,

3. 해당 블록의 body hash도 검증한 뒤 

 

이상이 없다면 전달받은 정보로 refresh 한뒤

새로운 문제를 풀어나갑니다!!

 

블록이 생성되는 주기는 nounce 값을 푸는 시간으로 결정이 됩니다~!^^

 

 

※더 알아보기!! : 비트코인의 블록생성주기

비트코인의 블록생성주기는 어떻게 될까요??
채굴하는 컴퓨터(노드)가 많아질 수록 컴퓨팅 연산능력이 좋아지니
블록생성주기가 감소하고,
채굴하는 컴퓨터(노드)가 적어질 수록 컴퓨팅 연산능력이 감소하니
블록생성주기가 증가하겠지요!?

하지만!!!, 조금만 조사해본다면
비트코인의 블록생성 주기는 10분이라는 것을 확인할 수 있습니다!!



왜 그럴까요!?

그 비결은 바로 문제의 난이도에 있습니다!!

비트코인 네트워크의 채굴 문제 난이도는 일정하지가 않습니다!!!

채굴에 참여한 컴퓨터(노드)가 많을경우에는 난이도를 올리고,
채굴에 참여한 컴퓨터(노드)가 적을경우에는 난이도를 낮추어

항상 일정하게 블록의 생성주기를 만들지요!!

사토시 나가모토!! 정말 대단하지 않나요~!?^^

 

728x90

댓글