블록체인의 합의 메커니즘인 작업증명과 작업증명을 이해하기 위해 필요한 개념(해시 등)을 설명합니다.
작업 증명은 완전한 기능을 갖춘 최초의 블록체인 합의 메커니즘으로 비트코인을 비롯한 다양한 블록체인에서 사용중입니다. 작업증명 메커니즘을 사용하는 블록체인에선 트랜잭션(trnasaction, 거래)이 담긴 블록을 검증해 보상을 받으려면 ‘채굴’을 해야 합니다. 이번 글에선 채굴 방식을 기술적인 측면에서 자세히 다루겠습니다.
블록체인 기술은 수년, 수십 년 전부터 존재했던 암호화 기법을 조합해 만든 기술입니다. 어떤 기술들을 조합해 탈중앙화된 안전한 데이터 교환 시스템을 만들었는지 알아봅시다.
해시
가장 기본적인 개념인 해시(hash)부터 시작합시다. 해시는 여러 데이터를 모아 특정 계산을 통해 만든 16진수 값입니다. 장기가 모여서 만들어진 사람을 지문으로 빠르게 식별하듯이 해시는 데이터를 빠르게 식별할 때 사용합니다.
해시값은 다양한 함수로 만들 수 있는데, 가장 일반적인 해시 함수론 비트코인에서 사용하는 SHA256이 있습니다. SHA256 알고리즘에 문자열을 입력하면 그 길이에 상관없이 64글자(256비트)로 구성된 16진수 값이 반환됩니다.
16진법(Hexadecimal)에선 0부터 9, A부터 F까지의 글자(0 1 2 3 4 5 6 7 8 9 A B C D E F, 총 16개의 글자)로 데이터를 표기합니다. 따라서 글자 하나를 나타내는데 4비트(2⁴)를 차지하는 표기법이라 할 수 있습니다. 해시함수에선 결괏값이 64자리로 구성되기 때문에 해시값은 4 * 64 , 즉 256비트를 차지하게 됩니다. SHA256에서 256은 이 해시값이 차지하는 비트 메모리를 나타냅니다.
링크를 클릭해 실제 여러 입력값을 넣어보고 어떤 hash 값이 반환되는지 살펴봅시다. http://www.blockchain-basics.com/HashFunctions.html
책 한 권에 있는 모든 글자를 추출해서 입력하든, 아무것도 입력하지 않든 상관없이 SHA256 해시 알고리즘에 값을 입력하면 64글자로 구성된 16진수 값이 반환됩니다. 그런데 해시함수에서 특이한 점은 입력값이 같으면 반환 값도 같다는 점입니다. 통계적으로 일어날 확률이 아주 희박한 경우를 제외하곤 입력값이 같으면 해시값은 같고, 입력값이 다르면 해시값은 달라집니다. 이런 해시 알고리즘의 특징을 이용하면 데이터가 수정된 지 아닌지를 빠르게 확인할 수 있습니다.
블록
블록은 다음 항목으로 구성됩니다.
- 몇 번째로 생성된 블록인지를 나타내는 블록 번호(number)
- 데이터
- 논스(Nonce)라 부르는 임의의 값
- 위의 항목들을 해시 함수에 넣어서 도출한 해시값
아래는 임의의 블록을 도식화한 예시입니다. 그림에서 주목할 점은 해시값이 d8ca로 시작한다는 점입니다.
이 블록은 아직 유효하지 않습니다(invalid). 블록의 유효성은 특정 규칙을 따르는지를 검증하여 판단하는데, 규칙은 블록체인의 종류에 따라 다릅니다.
몇몇 블록체인에선 작업 증명(Proof of Work, PoW)이라 부르는 규칙을 사용하여 블록의 유효성을 검증합니다. 작업 증명에선 해시 값이 000으로 시작해야 한다는 규칙이 있습니다. 따라서 작업증명을 사용하는 블록체인에선 블록 번호와 데이터, 논스값 자체를 해시함수에 넣어서 도출한 해시값이 000으로 시작해야 유효한 블록이라고 인정받습니다.
참고로 해시값에 대한 기준은 합의 메커니즘마다 다릅니다. 해시값이 123으로 시작해야 한다는 규칙이 있을 수 있습니다. 세부 규칙은 어떤 메커니즘을 쓰냐에 따라 다르겠지만 결국 블록체인에서 필요한 것은 유효성 검사를 통과했음을 증명하고, 이를 통과한 단 한 명의 검증자(채굴자, 유효한 논스값을 가장 먼저 찾은 사람)를 찾을 수 있는 규칙만 있으면 됩니다.
위 그림은 논스값을 1씩 올리며 000으로 시작하는 해시를 찾아 만든 유효한 블록을 나타냅니다. 조건에 맞는 해시값을 만들어 주는 논스값을 알아내는 데 걸리는 시간은 해시함수의 특성상 길 수도 있고 짧을 수도 있습니다. 아무도 그 시간을 알수 없습니다. 그림은 논스값이 이만 구천이백오십팔이 될 때까지 올려서 유효한 블록을 생성한 사례입니다.
블록체인
이제 블록체인이 무엇인지 이해하기 위한 지식은 모두 갖추었습니다. 블록체인은 각 블록을 ‘체인’으로 ‘연결’한 블록의 목록입니다. 각 블록엔 이전 블록에 대한 참조인 ‘해시’가 포함됩니다.
그림을 보면 2번 블록엔 위에서 언급한 블록에 포함되는 데이터(블록 번호, 데이터, 논스값)에 더하여 이전 블록(PREVious Hash)의 해시값을 나타내는 PREVH라는 값이 포함된걸 확인할 수 있습니다.
그리고 2번 블록을 유효한 블록으로 만드는(HASH 값이 000으로 시작) 논스값을 찾아 블록의 유효성을 검증하고, 새 해시값을 3번 블록에서 사용한 걸 확인할 수 있습니다.