지난 포스팅에 이어 이번엔 과연 기록을 저장하는 블록들을 어떻게 전 세계에 있는사람들이 짧은 시간안에 합의를 거쳐서 생성하는지 알아보도록 하겠다.
은행을 비롯한 금융기관들은 클라이언트들의 거래내용을 해당 은행에서 확인하고 기록한다. 그래서 거래를 할때 해당 금융기관에 대한 신뢰가 반드시 필요하다.
하지만 블록체인상에서의 장부 작성은 블록체인 네트워크에 참여하고 있는 사람들(이를 노드라고 함)이 그 기록이 참인지 거짓인지 과반수의 동의를 얻어야 장부에 기록이 된다.
이 노드들은 전 세계적으로 분산되어있고 전세계를 아우르는 하나의 거대한 장부를 형성한다. 따라서 신뢰가 필요가 없이 합의를 통해서 기록이 작성된다. 이때 우리는 투표를 생각 할 수 있다. 현행 선거제도를 보면 한명의 사람이 하나의 투표권을 가져서 가장 많은 지지를 얻은 사람이 대표로 선출 되는 방식이다.
그런데 블록 생성 합의과정은 하나의 노드가 하나의 투표권을 가지지 않는다. 가장 많고 가장 빨리 작업을 한 사람이 블록에 기록하고 블록을 생성할 수 있는 투표권을 더 많이 갖는다고 할 수 있다.
이것이 작업증명(proof of work)이라는 것인데
여기에서 작업이란 수학문제를 푸는 것을 말한다. 다시말해 가장 빠르고 많은 수학문제를 푸는 사람이 블록을 생성할 수 있는 권한을 더 많이 갖게된다. 그런데 이 수학문제는 사람의 머리로는 풀 수 없다. 고도의 연산능력을 갖춘 슈퍼컴퓨터가 계산할 수 있는 수학문제이다.
이 수학문제에 대해 알려면 해시(hash)라는 개념이 필요하다.
밑의 그림을 보자
그런데 '부자가 되고 싶다'에서 마침표만 한개 추가 한 값을 보면
어떤 문구를 대입해도 256bit의 길이의 hash값이 출력되고, 위의 두 해시값 역시 256bit로 길이는 같지만 전혀 다르다.
다시 말하자면 문구가 조금만 달라져도 해시값이 전혀 달라지게 된다.
이는 거래내용을 해시값으로 저장하게 되면서 블록체인 장부의 보안에 큰 역할을 한다.
거래내용인 입력값이 어떤길이라도 똑같은 길이의 해시값이 나오게 된다. 만약 누가 이 해시값을 조작하거나 만지게 된다면 다시 그 해시값을 해시함수에 넣어보면 전혀 다른 해시값이 나오기 때문에 데이터 손상여부도 확인이 가능하다.
이는 현재 블록체인 기술 뿐만 아니라 공인인증서 패스워드 암호화, 디지털 인증서, 서명 등 여러 곳에서 사용되고 있다.
hash에 대한 개념 설명을 하는 이유는 수학문제를 풀어서 이 해시값을 형성하게 되기 때문이다.
수학문제는 nonce값이라는 무작위의 숫자를 입력해 나오는 출력값이 특정 숫자보다 작을때 작업을 증명했다고 하고 이때의 해시값을 블록상에 기록한다.
이게 무슨 이야기인가....
그림처럼 Bob이 Alice에게 1BTC를 전송했다는 거래내역을 암호화 하려면 hash 함수 프로그램이 필요한데 이것이 SHA256이다.
블록내에서 임의로 대입되는 숫자(Nonce 값)에 대하여 나오는 출력값이 블록내에서 설정한 숫자(난이도)보다 적게 나오면 계산이 완료된 것이다.
그리고 이렇게 작업이 완료 된 것을 '작업증명'이라고 한다.
여기서 가장 중요한 것은 무작위의 Nonce값을 SHA256 함수에 입력해 설정된 값보다 작은 숫자를 계산해 내는 것이 굉장히 많은 에너지와 연산력이 필요하다.
이 연산력을 '해시파워'라 하는데 과반수의 해시파워가 블록을 업데이트할 수 있는 권한이 주어지고 이것이 블록이 생성되는 방식인 것이다.
현재 비트코인은 이렇게 PoW(작업증명)방식으로 블록이 합의되어 생성되는데 현재는 해시파워의 70%이상이 중국에 집중되어 있다.
분산화된 장부작성 방식이 블록체인인데 70% 이상을 중국이 독점해버리는 상황이라 분산화가 아니지 않냐는 의견도 있고 비트코인이 가치가 하락하면 중국의 어마어마한 채굴 공장과 기계들이 폐기처분 되기 때문에 중국이 절대 마음대로 하지 못할 거란 의견이 있어 분분한 상황.
그래서 PoS방식 PoC방식등 여러 시스템이 대안으로 나오고 있는 상황인데, 일단 현재로서 가장 안정적으로 운영되는 시스템이 작업증명 방식이고 비트코인은 이렇게 블록에 업데이트 되어 거래되고 있다.
최대한 쉽게 설명하려고 하지만 모르시는 분들을 위해 언제든지 댓글로 질문을 받습니다.
질문의 내용이 길 경우는 jsralphh@gmail.com으로 보내주시면 감사하겠습니다.