- 이전 블락 해쉬값: 이전 블락헤더를 해슁한 값
- 현재 블락의 트랜잭션 요약값: 트랜잭션 데이터를 요약한 값
- 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를 찾아내는 경쟁을 하는 것입니다. 이 경쟁에서 이기는 방법은 최대한 많은 계산을 하는 방법 뿐입니다. 즉 최대한 많은 그래픽 카드를 이용해서 단순 계산을 반복하는 방법입니다. 아래 실제로 채굴에 성공한 예를 보여주고 있습니다.
블락체인 기반 블로그 Steemit에 Vote가 10개 이상되면 다음 타픽 진행하겠습니다.(희망사항)
Steemit 바로가기