해시가 가장 광범위하게 활용되고 있는 기술이 블록체인이다.
블록체인의 기본 구조, 작업증명에서 사용되는 해시기술에 대해 알아보자.
단어 그대로 블록이 서로 연결되어 있다고 생각하면 된다.
하나의 블록은 거래(Transaction) 기록을 담고 있는 장부의 한 페이지라고 보면 되고,
거래 당사자들은 모든 거래 내용을 담고 있으며 일정한 조건을 만족하면
하나의 블록을 완성시키고 다음 블록에 새로운 거래 내용을 기록한다.
여기서 말하는 일정한 조건이란 블록 생성을 위한 합의 알고리즘이다.
'블록'이라고 하는 거래 기록을 담고 있는 데이터들이 거래 참여자들의 합의로 생성된
체인 형태의 연결고리를 가진 형태로 구성되어 모든 거래 참여자들에 배포되며,
누구나 기록된 거래 내용의 결과를 열람할 수 있지만, 어느 누구도 임의로 수정할
수 없도록 만든 분산 컴퓨팅 기반의 데이터 위변조 방지 기술이다.
첫 번째 블록 1에서부터 거래를 기록하게 되며 특정한 조건인 합의 알고리즘을 통해
블록1에 더이상 거래를 기록할 수 없도록 블록을 동결하고 완성시킨다. 블록 1에 기록된
정보를 대표하는 해시값 Hash1을 생성하고 Hash1은 다음 블록인 블록 2에 기록한다.
블록 2도 특정한 조건을 만족하면 블록 1과 같은 과정을 거치고 그 다음 블록인 블록 3에
기록하는 방식으로 진행된다. 이렇게 형성된 체인은 거래에 참여하는 모든 당사자들에게
배포된다.
첫번째 블록을 제네시스 블록
이라고 부르고 이 정보가 거짓이면 전체 블록체인의 정보가
거짓이므로 제네시스 블록에는 반드시 참값을 기록해야 한다.
하나의 블록은 Block Header
와 Block Body
로 되어있다.
Body에는 거래를 기록하며 Header에는 이전 블록헤더의 해시값, 현재 블록에 기록되어 있는 전체 거래에 대한 해시값 및 기타 정보를 기록한다.
블록헤더에 기록되어 있는 해시값은 모두 SHA-256을 사용한다. 현재 블록의 전체 거래에
대한 해시값은 머클트리(Merkle Tree)라는 방법으로 계산되는데, 그림에서 볼 수 있듯이
피라미드 구조로, 2개의 거래에 대한 해시값을 짝지어 계산한 후 꼭대기에 있는 1개의
해시값으로 만드는 과정을 거친다. 꼭대기의 해시값을 머클루트(Merkle Root)라 부르며,
이 값이 블록헤더의 전체 트랜잭션 해시값이 된다.
머클루트는 블록이 완성되기 까지 거래가 추가될수록 계속해서 변하는 값이며, 다음 블록에
기록할 현재 블록헤더에 대한 해시값은 더 이상 거래를 기록할 수 없도록 한 상태에서
만들어지는 값이다.
Body에는 거래 정보와 부가 데이터를 저장할 수 있는 공간으로 되어 있다.
위에서 얘기한 합의 알고리즘이란, 하나의 블록체인의 네트워크에서 존재하는 수많은
신뢰할수 없는 정보들에 대해 수학적으로 계산된 값을 특정 절차에 따라 상호 검증하여
신뢰 가능하도록 보장하는 알고리즘이다.
쉽게 말하자면 중앙기관이 없이 분산된 네트워크에서 운영되는 블록체인은, 사람들이
"어떤 정보가 진짜인가?" 에 대해 서로 동의하고 검증하는 과정을 거쳐야 한다.
즉, 이러한 합의를 이루기 위한 알고리즘을 말한다.
대표적인 합의 알고리즘에는 작업증명(Proof of Work), 지분증명(Proof of Stake),
PBFT(Practical Byzantine Fault Tolerance), Raft 등이 있다.
이중에서 작업증명에 대해 살펴보겠다.
작업증명이란, 주어진 해시값보다 작아지도록 SHA-256에 입력되는 값을 찾아내는 것이다.
작업증명의 난이도는 주어진 해시값에 따라 달라진다.
SHA-256(value) <= 000c007...3c241241c321
위 문제를 만족하는 value를 찾아내는 것이 작업증명 메커니즘이다.
더 자세한 예시를 살펴보자.
SHA-256("Attack at 9PM!") = 해시값
Attack at 9PM
의 문자열이 주어지고, 이 문자열에 0을 추가하여 SHA-256으로 해시값을
구할 때, 추가되는 숫자를 1씩 증가하면서 구한 해시값이 00으로 시작되는 숫자를 찾는다.
위 문제에서 가장 최초로 나타나는 값을 정답이라고 할때 이는 240이 된다.
이러한 유형의 문제를 해시캐시라고 부르고 이러한 문제의 답을 구하려면 일반적으로
0, 1, 2, 3... 와 같이 값을 하나씩 대입하면서 확인해볼 수밖에 없다.
이렇게 값을 변화하면서 원래 메시지에 추가하는 값을 nonce라고 부른다.
즉, 해시캐시 문제는 주어진 해시값과 같아지는 nonce 값을 찾는 것이다.
위 문제에서 요구하는 0의 개수가 많아질수록 nonce 값의 크기는 더 커지게 되고,
결과적으로 문제의 난이도가 올라간다.
그렇다면 이러한 문제를 풀게하는 이유는 무엇인가?
일반적인 블록체인 네트워크에서는 네트워크에 참여하는 모든 노드의 컴퓨팅 파워를
총 동원하여 일정한 시간 동안 계산해야만 nonce를 구할 수 있도록 난이도를 설정한다.
비트코인의 경우 모든 노드의 컴퓨팅파워를 동원하여 10분정도 걸리는 난이도로 설정한다.
💡작업증명 메커니즘
거래 정보가 담긴 1번 블록의 정보를 이용해여 해시캐시 문제를 제시
제시된 해시캐시 문제는 블록체인에 참여한 모든 노드의 컴퓨팅 파워로 10분정도
걸리도록 난이도가 설정되어 있음
특정 노드에서 해시캐시 문제의 답을 구했다면 1번 블록에 정답을 기록하고
더 이상 거래 기록을 담지 못하게 동결 후 모든 노드에게 전달한다
해시캐시 문제의 정답은 구하는 과정이 어려우나, 정답을 검증하는 것은 매우 쉽다.
그렇기에 블록을 전달받은 후 정답을 검증하고 정답을 경우에만 블록을 수용한다.
새로운 2번 블록에 거래를 기록한다.
2번 이후 블록에 대해 1~5 과정을 반복한다.
100명이 동일한 컴퓨팅 파워를 가지고 있을 때,
10명이 거래를 위조한다고 가정해보자.
n번 블록까지는 정상적으로 만들어졌고, n+1번 부터 조작을 한다고 할때,
조작중인 10명은 100명이 10분간 풀어야할 문제를 10명이서 풀어서 답을 구한 후
블록에 첨부하고 배포해야 한다. 반대로 정상적인 그룹은 90명이서 문제를 풀어
답을 구한다.
확률적으로 정상적인 그룹이 n+1번째 블록에 대한 문제를 더 빨리 해결할 것이고
조작하는 그룹보다 더 빠르게 n+2번째 블록에 대한 문제를 해결하기 시작할 것이다.
한정된 자원의 차이로 악의적인 그룹은 위변조를 하는 것이 거의 불가능에 가깝게
되며, 그럼에도 불구하고 악의적인 그룹이 모두 문제를 해결하여 체인을 배포하여도
문제 해결에 있어 작업속도가 늦기에 결과적으로 얻은 체인은 정상 체인보다 짧다.
이러한 경우, 2개 이상의 블록체인이 배포될 때 길이가 긴 블록체인의 채택을
원칙으로 하는 블록체인 시스템에 의해 차단되게 된다.
위 예시에서 알 수 있듯이 작업 증명의 난이도로 인해 조작된 블록체인은 일반적으로
네트워크 전체의 계산 능력을 따라가지 못한다. 이로인해 체인의 길이가 짧아지고,
이것이 분산 네트워크에서 가장 긴 체인이 유효한 체인으로 간주되는 이유가 된다.
공격자가 블록체인을 조작하기 위해선 네트워크의 51% 이상의 해시 파워를 확보해야한다.
이를 51% 공격이라고 하나, 이러한 공격은 막대한 자원을 동원해야 하며, 실제로 자원을
동원했다고 해도 블록 생성은 확률적인 과정이므로 공격의 효율성이 떨어진다.
또한 공격자는 기존 체인보다 더 긴 체인을 생성하기 위해 이전 블록을 다시 계산해야
하기 때문에 결과적으로 더 느려지고, 공격자가 빠르게 체인을 생성하려고 할수록
자동으로 블록생성의 난이도가 조정되어 속도가 다시 느려질 가능성도 있다.