Blockchain 기술

채굴 2 - 채굴 상세 동작

채굴의 기술
토픽 내용을 시작하기 전에 먼저 다음과 같이 마음속으로 속삭여 보시라고 말씀드리고 싶네요.
"나는 내용이 아무리 어렵게 쓰여 있어도 아주 쉽게 받아 들일 수 있다!"
방금 학습에 있어서 매우 중요한 것을 알려드렸습니다. 어떤 것을 접하더라도 할 수 있다는 믿음이 있다면 그 학습 능력은 놀랄만치 올라간다는 것을요.
작업 증명이 실제로 어떻게 작동하는지 살펴보겠습니다. 아래 그림은 블락체인의 예를 보여 주고 있습니다. 이전 토픽에서 본 블락체인과 구성이 조금 다릅니다.
 [블락체인, 출처]
위 블락체인 그림에서 하나의 블락의 구성 요소가 나타나 있습니다. 실제의 블락 구성은 이것보다 좀 더 복잡하지만 간단히 주요 요소만 표시되어 있습니다. 하나의 블락은 크게 두 부분으로 나누어져 있습니다. 파란 박스로 되어 있는 블락헤더(Block Header)부분과 트랜잭션들의 정보입니다. 하나의 블락에는 여러 개의 트랜잭션들이 있습니다.
블락헤더부분의 구성요소는 크게 세 가지로 구성되어 있습니다. 
  • 이전 블락 해쉬값: 이전 블락헤더를 해슁한 값
  • 현재 블락의 트랜잭션 요약값: 트랜잭션 데이터를 요약한 값
  • nonce: 임의값

블락체인은 각 블락이 연결되는 구조인데, 그 연결은 현재 블락에 이전 블락의 해쉬값을 포함하는 방식으로 동작합니다. 블락을 생성한다는 것은 그 블락의 해쉬값을 정한다는 것입니다.

블락을 생성한다는 것은 블락의 해쉬값을 정한다는 것!

 

해쉬 함수의 특성을 다시 짚어 보겠습니다. 

[해쉬 함수의 특성, 출처]

Y=h(X)와 같은 함수식처럼 해쉬함수 h에 입력값 X를 넣으면 출력값 Y를 매우 쉽게 계산할 수 있습니다. 하지만 해쉬 함수의 특징은 출력값 Y로 입력값 X를 계산하기가 매우 어렵습니다. Y로 부터 X를 찾아내는 유일한 방법은 X를 대입해서 그것의 해쉬값 즉 h(X) 값이 Y와 같은지를 보는 것입니다. 해쉬 함수의 중요한 또하나의 특징은 입력값 X가 조금만 바뀌어도 전혀 다른 출력값 Y를 얻는다는 것입니다. 이 두 가지 특징을 생각해 두시고 아래 내용을 보시면 이해가 되실 것입니다.

해쉬 함수의 역방향 계산은 매우 어렵습니다.

 

블락의 구성요소 중에 nonce라는 것이 있습니다. 이것이 임의의 값이라고 되어 있습니다. nonce 이외의 값들은 임의가 아니라 정해져 있습니다. 즉 트랜잭션 정보라든지 이전 블락의 해쉬값이라던지 이것들은 변경되는 값들이 아닙니다. 오로지 nonce라고 되어 있는 값만 변경되는 미지수 같은 것입니다. 따라서 블락을 생성하는데 있어서, 즉 블락의 해쉬값을 정하는데 있어서 이 nonce값을 얼마로 하느냐에 따라 달라지게 됩니다.

감을 잡으신 분들도 있겠지만, 바로 블락을 생성하는 작업, 즉 채굴 노드들이 경쟁하는 것은 바로 이 nonce를 찾아내는 작업입니다. 어떤 nonce를 찾으면 될까요? 그건 블락체인이 정해줍니다. 예를 들어 새로 생성될 블락의 해쉬값은 아래와 같이 앞의 40비트가 0으로 되어야 한다는 제약을 둡니다. 그러면 채굴 노드는 nonce값을 바꿔가며 해쉬값을 계산하여 그것이 제약 조건을 만족하는지, 즉 해쉬값의 앞 40비트가 0으로 되는지를 검토하게 됩니다. 여기서 앞의 40비트 이외에 뒤에 오는 비트는 무슨 값이 오더라도 상관이 없습니다. 

  

블락을 생성하기 위해 제약 조건을 만족하는 nonce값을 찾아야 합니다.

 

블락체인은 블락이 생성되는 속도를 조절해야 합니다. 비트코인의 경우는 약 10분마다 블락이 생성되도록 만들어 졌습니다. 따라서 블락체인 네트워크에서 블락이 10분마다 생성될수 있도록 난이도를 조절합니다. 난이도를 조절하는 방법은 앞에서 설명된 블락 생성의 제약 조건을 바꾸면 됩니다. 즉 블락 생성을 늦추고 싶다면 블락의 해쉬값의 앞 비트가 0이되는 비트수를 늘리면 되고, 빠르게 하고 싶다면 0이 되어야 하는 비트수를 줄이면 됩니다. 예를 들어 난이도를 높이고 싶으면 해쉬값의 앞 100개의 비트가 모두 0이어야 한다는 제약을 걸면 됩니다. 반대로 난이도를 낮추고 싶다면 앞 10개 비트만 모두 0이면 되게 제약 조건을 완화하면 됩니다.

블락체인은 일정한 블락 생성을 위해서 난이도를 조절합니다.

 

해쉬함수의 특징 중 입력값이 조금만 변경되어도 출력값이 전혀 달라진다는 것이 있습니다. 따라서 nonce값이 조금만 변경되어도 출력값은 전혀 달라지므로, 원하는 해쉬값을 찾기가 쉽지 않습니다. 이 때문에 채굴 노드는 nonce에 임의값을 넣어보고 그 결과가 제약 조건을 만족하는지 검토해 보는 것입니다. 블락체인 네트워크의 여러 채굴 노드들은 가장 먼저 제약 조건을 만족하는 nonce를 찾아내는 경쟁을 하는 것입니다. 이 경쟁에서 이기는 방법은 최대한 많은 계산을 하는 방법 뿐입니다. 즉 최대한 많은 그래픽 카드를 이용해서 단순 계산을 반복하는 방법입니다. 아래 실제로 채굴에 성공한 예를 보여주고 있습니다.

Nonce: 0x4d4176436d0e012b가 제약 조건을 만족하는 값입니다. 이걸 다른 채굴 노드보다 먼저 찾아낸 것이죠.
채굴 작업은 블락 해쉬값의 제약조건을 만족하는 Nonce값을 찾는 것입니다.
 
이번 토픽의 홈워크는 다음 질문에 대한 답을 댓글로 남기는 것입니다.
Q) 어떤 두 채굴 노드가 동시에 Nonce를 찾게 되면 어떻게 될까요?

블락체인 기반 블로그 Steemit에 Vote가 10개 이상되면 다음 타픽 진행하겠습니다.(희망사항)

Steemit 바로가기

https://steemit.com/blockchain/@etainclub/blockchain-8

댓글

댓글 본문
  1. 이타인
    네 저도 원리를 알아가니 점점 재밌어 지더라구요.

    nonce를 빨리 찾는 것은 거의 그래픽카드의 성능에 따라 달렸다고 보면 됩니다.
    그러나 nonce 찾는 방법이 마구잡이이므로, 운좋게 성능이 낮더라도 몇 번 시도해서 찾아질 수도 있겠지요.
    즉 '운빨'도 있어야 하겠지만 난이도가 점점 올라가는 상황에서는 '운빨'이 거의 없어지고 있습니다.

    고맙습니다~
    대화보기
    • yoniverse
      이번 강좌도 잘봤습니다. 점점 재밌어지네요.
      블록생성시간을 일정하게 유지하기 위해 난이도를 조절한다는 개념이 신기합니다.

      결국 nonce값을 빨리 찾아내는 것은 전적으로 그래픽카드의 성능에 달린 것인가요?
    • 이타인
      시작 시간은 관계가 없습니다. 동시에 nonce를 찾으면 서로 다른 블락이 생성되어 블락체인 분기하게 됩니다. 블락체인이 하나의 선으로 이어지다 갑자기 둘로 나뉜다는 말입니다. 블락체인 네트워크는 이와 같은 분기 문제를 해결하는 장치를 마련해뒀습니다. 자세한 것은 나중에 토픽에서 설명드릴께요.

      동영상은 시간나면 만들어 보려고 합니다.
      채굴 결과 사진은 단순히 채굴 명령을 실행하고 캡쳐한 것입니다.
      채굴하는 방법은 나중에 간단히 다루려고 합니다.

      그리고 프로그래밍에 관한 것은 블락체인 기술 모듈이 아니라 블락체인 개발 모듈에서 다룰 예정입니다.

      고맙습니다!
      대화보기
      • 폭스킴
        채굴 시작 시간도 체크가 되서 반영되는지 모르겠는데, 된다면 먼저 시작한 채굴에 우선순위가 있지 않을까 합니다. 아니면, 데이터의 크기를 비교해서 작은쪽이나 큰쪽에 우선순위를 주는 게 아닐까 추측해봅니다~ ^^
        개념적으로만 접근하다보니 약간 뜬구름 잡는 느낌이 없지 않네요~ 동영상 강좌는 찍으실 계획이 없으신가요? 위에 첨부하신 그림을 보니까 프로그래밍적으로 접근하는 거 같은데~ 실습 강좌도 있었으면 좋겠습니다~ 좋은 강좌 잘 봤습니다!
      버전 관리
      이타인
      현재 버전
      선택 버전
      graphittie 자세히 보기