31- 블록체인 기술의 핵(核), ‘암호 해시’ 파헤치기

지난 칼럼에선 △블록체인은 수정이나 삭제가 불가능한 기록물 생성 소프트웨어이며 △블록체인에 저장되는 자료는 여러 곳에 공유돼 온전하면서도 안전하게 보관될 수 있단 얘길 주로 했다. 오늘은 블록체인을 기술적 관점에서 접근, 구체적 구현 방식을 살피고 기술적 한계와 기타 문제에 대해서도 가볍게 다루려 한다.
문서 요약해 ‘고유 값’ 자동으로 생성하는 기술

앞선 글에서도 설명했듯 블록체인을 구성하는 기본 기술은 ‘암호 해시(hash)’다. ‘문서를 요약해 고유 값을 자동으로 생성하는 기술’ 정도로 정의될 수 있겠다. 단, 여기서 요약은 ‘내용’ 요약이 아니다. 암호 해시 기술을 적용하면 내용과 무관하게 문서를 요약한 후 고유 값을 생성한다. 이때 고유 값은 문서 길이에 상관없이 256바이트, 한글로 치면 128자 정도의 문자열(SHA[1]-2 기준)이다. (이 칼럼에선 자동으로 생성된 고유 값을 ‘암호 해시’로, 암호 해시를 자동으로 생성하는 기술은 ‘암호 해시 기술’로 구분해 사용할 생각이다.)
암호 해시는 몇 가지 특징을 지닌다. 첫째, 암호 해시만으론 그 내용을 짐작할 수조차 없다(제1역상 저항성). 둘째, 문서 내용이 조금이라도 바뀌면 암호 해시 역시 완전히 바뀌어버린다(제2역상 저항성). 셋째, 우연이라도 동일한 암호 해시를 갖는 문서가 나타나선 안 된다(충돌 저항성). 세 특성을 간단히 요약, 정리하면 다음과 같다. “암호 해시로 문서를 찾을 순 없지만 일단 문서가 주어지면 고유의 암호 해시가 만들어진다.”

암호 해시를 이용하면 문서 전체를 갖고 있지 않아도 그 문서의 조작 여부를 쉽게 밝혀낼 수 있다. 예를 들어 친구와 하나의 문서를 작성하고 그 문서의 암호 해시를 만든 후 나눠 가졌다고 하자. 이렇게 하면 원본 문서를 복사해 갖고 있지 않아도 어렵잖게 원본 진위 여부를 판별할 수 있다. 문서의 암호 해시를 만들어 (보관 중인) 암호 해시와 비교하면 되기 때문이다. 즉 암호 해시만 있으면 원본 문서는 누가 갖고 있든 상관이 없다. 심지어 제3자의 손에 있어도 괜찮다. 아무리 긴 문서라 해도 256바이트 정도의 암호 해시만 있으면 진위 여부가 손쉽게 밝혀지는 것이다.

한 걸음 더 나아가 문서 암호 해시를 모아둔 문서가 있다고 생각해보자. 암호 해시도 문자열 형태인 만큼 그걸 모으면 문서가 만들어진다. 그렇게 되면 ‘암호 해시를 모아 만든 문서의 암호 해시’를 구할 수도 있을 것이다. 이를 ‘모듬 암호 해시’라고 하자. 이제 여러 문서 중 하나라도 변경되면 해당 암호 해시가 변하고, 그 변화는 다시 암호 해시를 모아둔 문서 내용을 바꿔 결국 제목 암호 해시도 변경된다. 다시 말해 누군가 모듬 암호 해시를 알고 있으면 여러 문서 내용의 진위 파악도 쉬워진다. 만약 이런 과정을 여러 차례 반복하면 어떻게 될까? 마지막 암호 해시만 갖고도 이전까지 만들어진 문서 일체의 진위를 판별할 수 있다(블록체인에도 같은 원리가 적용된다).
이전 블록 해시가 ‘체인’처럼 다음 블록에 저장

블록체인에서 ‘블록’은 ‘헤드(Head)’와 ‘보디(Body)’로 나뉜다. 블록 보디엔 여러 거래 기록이 머클트리(Merkel Tree)로 불리는 구조로 구성된 후 저장된다(머클트리에 관해선 다음에 자세히 설명할 기회가 있을 것이다). 이렇게 하면 블록 보디 전체를 대표하는 암호 해시(이 글에선 ‘보디 암호 해시’라고 부르겠다)가 만들어진다.
한편, 블록 헤드엔 블록 보디 암호 해시 등 여러 가지 정보가 기록된다. 반드시 기록돼야 하는 정보만 해도 △블록 생성 시간 △블록 보디 암호 해시 △이전 블록 헤드 암호 해시 △논스(NONCE, Number used ONCE)[2]등 하나둘이 아니다<아래 그림 참조>.

이때 주의 깊게 볼 항목은 ‘이전 블록 헤드 암호 해시’다. 일단 블록 헤드 또한 하나의 문서와 같은 만큼 여기서 암호 해시를 구할 수 있다. 이 블록 헤드 암호 해시는 다음에 만들어지는 블록에 전달되는데, 다음 블록 입장에서 보면 이는 앞서 주의 깊게 봐둔 이전 블록 헤드 암호 해시다. 즉, 다음 블록 입장에서 보면 내 블록 헤드의 암호 해시가 다음 블록 헤드에 저장되는 이전 블록 헤드 암호 해시가 되는 것이다. 블록체인이란 명칭은 이처럼 “이전 블록 헤드 암호 해시가 다음 블록에 저장되는 행태의 반복”이란 뜻에서 붙여졌다.

악용 위험 낮추려 PoW 등 다양한 ‘합의’ 도입
우선 사슬(chain) 구조에만 집중해보자. 위 그림에 따르면 블록 보디 암호 해시는 블록 헤드에 들어있다. 자연히 각 블록 내 블록 보디에 변화가 생기면 블록 보디 암호 해시도 바뀐다. 이 경우, 블록 헤드에 기록되는 정보가 변한 것이므로 블록 헤드 암호 해시 역시 바뀐다. 블록 헤드 암호 해시 하나가 바뀌면 다음 블록 헤드에 기록되는 이전 블록 헤드 암호 해시도 함께 바뀐다. 그로 인해 다음 블록 헤드 암호 해시 역시 달라진다. 동일한 이유로 뒤따르는 블록 헤드 암호 해시 일체가 바뀐다. 이 때문에 블록체인이 한 번 형성된 후엔 그 내용을 변경할 수 없다. 하나의 변화를 위해 뒤따르는 정보를 전부 수정해야 하고, 그렇게 하지 않으려면 흔적이 남기 때문이다.

암호 해시 체인을 활용, 일단 기록된 내용을 수정하지 못하게 하는 구조는 이 정도면 이해가 될 것이다. 하지만 문제는 여전히 남는다. 만약 블록체인이 ‘한 사람이 만들어 복사한 후 사용하는’ 거라면 블록체인 만드는 사람을 확실히 믿을 수 있어야 할 것이다. 하지만 블록체인 만드는 사람이 나쁜 맘이라도 먹는다면? 문제는 일파만파 커질 수밖에 없다. 이 때문에 블록체인 기술 개발진은 △여럿이 동시에 블록체인을 만들면서도 △자신이 만든 블록을 보여주지 않고도 남과 똑같은 블록을 만들었단 사실을 증명할 방법을 고안했다. 블록체인 분야에선 이를 일명 ‘합의(consensus)’라고 한다.
시중엔 이미 다양한 합의 방식이 나와있다. 이 글에선 그중에서도 가장 기본이 되는 ‘PoW(Proof of Work)’에 대해 살펴보려 한다. 쉽게 말해 다수결의 원칙을 활용하는 것이며 그 과정에서 앞서 언급한 논스가 쓰인다.

앞서 암호 해시의 성질을 설명하며 “문서 내용이 조금이라도 달라지면 암호 해시 값이 완전히 바뀌어버린다”고 했었다. 논스는 블록 헤드에 기록되는 정보로 블록 헤드 암호 해시를 만드는 데 사용된다. 그리고 블록을 만들려는 사람이라면 누구나 블록을 만들기 전 미리 블록 헤드 암호 해시가 지녀야 하는 특징을 전달 받는다(이를테면 ‘0으로 시작하는 암호 해시’ 등등).
물론 처음 만들어진 블록 헤드 암호 해시가 그 특징을 갖고 있진 않다. 하지만 이때를 시작으로 논스를 1부터 차례로 변화시키며 암호 해시를 계속 만들어가면 특징을 만족시키는 게 나타난다(특징을 어떻게 만드는지에 관해 여기서 다루긴 적절치 않다). 이처럼 특징이 나타나는 최초의 논스 값을 공개하고 “그 수가 맞는다”는 과반의 동의를 받으면 그건 곧 (동의한) 과반의 사람들도 동일한 블록을 만들었단 걸 의미한다. 또한 그들은 해당 논스 포함 블록 헤드를 가진 블록을 등록, 배포하게 된다.
돈 많이 드는 기술… 충분한 타당성 검토 ‘필수’

블록체인에선 암호 해시 기술과 함께 공개키(public key) 암호 기술도 사용된다(이와 관련된 내용 역시 지면 관계상 다음 기회에 설명하겠다). 암호 해시 기술과 공개키 암호 기술은 전자서명 같은 디지털 보안의 근간이 된다. 앞에서 살펴본 것처럼 블록 체인을 만들고 유지하려면 엄청난 컴퓨팅 자원이 필요하다. 여럿이 동시에 작업을 해야 하는 만큼 많은 컴퓨터가 필요하고 자료를 분산, 저장해야 하므로 대규모 저장소 확보도 필수다. 더 나아가 합의 알고리즘을 수행하는 과정에서 네트워크 트래픽도 상당히 발생한다. 따라서 블록 체인 기술을 도입하기에 앞서 (기술 도입으로 얻을 수 있는) 장점이나 비용에 관한 고려가 반드시 선행돼야 한다.