블록체인의 기초적인 이해

bero
TOMAK
Published in
15 min readJul 16, 2018

서태후

1. 암호화폐

여러 매체나 사람들이 블록체인에서 생겨나는 코인이나 토큰을 가상화폐, 암호화폐, 디지털 화폐 등 여러 가지 용어로 부르는 것을 볼 수 있다. 이 용어들이 어떤 차이점이 있는지 알겠는가? 블록체인 공부에 앞서 우리는 이 용어들의 차이를 명확히 인지하고 넘어갈 필요가 있다.

먼저 디지털 화폐는 디지털 정보로 이루어진 모든 종류의 화폐를 포함하는 총체적인 단어라고 생각할 수 있다. 이제 디지털 화폐는 가상화폐와 암호화폐로 갈라진다. 가상화폐는 우리가 보통 사용하는 마일리지, 게임 머니, 포인트 등으로 온라인 상에서 유통되는 화폐를 가리킨다. 그리고 우리가 지금부터 공부할 블록체인 기술에서 나온 비트코인, 이더리움과 같이 네트워크에서 안전한 거래를 위해 다양한 암호화 기술을 사용하는 전자화폐를 가리켜 암호화폐(crypto currency)라고 한다.

2. 블록체인의 목적

블록체인의 목적을 생각해 보기 전에 처음으로 블록체인 기술을 사용한 비트코인의 탄생 배경을 생각해 보는 것도 나쁘지 않을 것 같다.(비트코인은 블록체인 기술을 이용한 것이지 비트코인과 블록체인은 엄연히 다르다는 사실을 인지하자!) 2007년 미국에서 발생한 서브프라임 모기지 사태를 보자. 2000년대 초반 투자은행과 펀드사 등의 금융기관은 쓸만한 투자처를 찾고 있었다. 그 당시에는 하루가 다르게 부동산 가격이 치솟아 일반 사람들은 주택 구매에 열을 올리고 있었는데,(여기까지는 얼마전까지의 한국과 비슷하지 않은가?) 이를 금융기관들이 놓칠리가 없다. 금융기관들은 주택 구매 희망자들에게 대규모 대출을 해 주기 시작했고, 사람들은 부동산 가격의 상승을 믿고 대출을 받았다. 하지만 주택시장의 거품이 꺼지면서 사람들은 대출금을 갚지 못하는 상황이 발생했고, 이에 따라 대출금을 회수하지 못한 금융사들이 줄줄이 파산하게 된다. 이 중 가장 큰 충격은 4대 은행 중 하나였던 리만 브라더스가 파산했다는 것이다. 4대 은행 중 하나가 파산하는 마당에 사람들이 금융기관을 신뢰할 근거가 있겠는가? 비트코인은 이 중앙화된 금융 기관에 대해 불만을 가지고 만들어졌다.

다시 강조하지만 이는 ‘비트코인’에 국한된 내용이지 모든 블록체인 기술과 코인이 금융기관과 기존 화폐를 대체한다는 뜻이 아니다. 기존의 화폐를 대체하려는 목적으로 개발되는 코인들도 물론 있지만, 다른 방면으로도 사용되는 것이 훨씬 많다. ‘코인=돈’ 이라는 너무 일차원적인 사고에 갇히지 말자.

비트코인의 발생 배경이 신뢰할 수 없는 금융기관 때문에 만들어졌다는 사실만 인지하고 다시 블록체인으로 돌아와보자. 자 그럼, 신뢰할 수 없는 기관을 굳이 금융기관으로만 제한할 필요가 있을까? 세상에는 신뢰할 수 없는 단체는 매우 많다. 댓글 조작, 기사 순위 조작을 한다는 의심을 받고 있는 포털 그리고 부정선거로 말이 많았던 2012년 대선 등 특정 단체가 중앙 관리를 하고 있는 시스템에서는 수많은 의혹과 의심이 발생하고, 이 진실에 대해서 일반 사람들이 알 수 있는 정보는 매우 제한적이거나, 그 정보마저 잘못된 경우가 많다. 블록체인의 목적은 이러한 신뢰할 수 없는 시스템에 대해 이 기술을 사용해 투명하게 운영하자는 것이다.

3. 블록체인의 기본

비트코인에서 사용하는 블록체인 구조와 기존의 중앙화된 기관의 차이를 나타내면 아래 그림과 같다.

그림과 같이 중앙 기관을 이용하는 시스템을 장부를 기관에서만 관리하지만 블록체인의 경우는 장부를 개인이 각각 가지고 있다.

다음으로 넘어가기 전에 블록체인의 용어에 대해 생각해보자. 일반적인 기관에서의 장부 기록은 컴퓨터의 데이터 베이스에 저장이 된다. 블록체인도 이와 유사하게 사용자의 컴퓨터에 장부를 저장하는데 왜 ‘블록’과 ‘체인’이라는 용어를 사용할까? 먼저 블록체인 시스템에서는 발생하는 거래 기록(트랜잭션)들을 하나로 모으는 작업을 수행한다. 쉽게 말해서 거래 기록을 모아서 장부의 한 페이지를 작성을 할 것인데, 이 한 페이지를 ‘블록’이라고 정의하고 비트코인의 경우 이 블록은 10분에 1개씩 만들어진다.

하지만 이렇게 장부가 한 장씩 낱개로 흩어져 있는 것은 의미가 없지 않은가? 따라서 이를 하나로 연결하는 작업이 필요하다. 우리는 이 블록들을 ‘사슬’이라는 개념으로 연결하여 떨어진 장부를 하나로 합치는데, 이 형태를 보고 ‘블록체인’이라고 한다.

여기서 한 가지 의문이 들지 않는가? 기존 시스템에서는 중앙 기관이 위조와 중복사용을 감시하는 역할을 하지만 블록체인에서는 이를 감시할 기관이 없다는 것이다. 블록체인에서는 이것을 체인을 구성하는 구성원들 스스로가 이를 감시하고 검증한다. 그럼 아래 그림처럼 체인이 갈라졌을 때는 어떻게 해결하는지 살펴보자.

주목해야 할 점은 네 번째 블록 이후의 상황이다. 두 명의 구성원이 비슷한 시간에 블록을 제출하는 경우 등으로 네 번째 블록에서 분기가 발생했고, 그 이후 체인이 두 가닥으로 뻗어나간다. 이런 식으로 체인이 분기되었을 경우 어떤 체인을 메인 체인으로 선택해야 할까? 비트코인의 경우에는 긴 체인이 더 많은 일(하는 일에 대해서는 6장을 참조)을 했다고 생각하고 이를 메인 체인으로 인정한다. 즉 빨간색 블록 이후의 블록들은 실제 장부로 인정받지 못한다는 것이다.

이것을 두고 ‘51% rule’ 이라고 하는데, 쉽게 말해 한 블록이라도 긴 체인을 유효한 체인으로 인정한다는 것이다. 물론 51% rule에서 발생하는 취약점인 51% attack이라는 것이 있는데 이 문서에서는 간단하게 특정 집단이 51% 이상의 파워를 가지고 자신이 만든 조작된 블록들을 붙여 내용을 조작하는 행위라고만 이해하면 될 것 같다.

4. 해시

공대생이 아니라면 아마 이번 장이 첫 번째 난관이 아닐까 한다. 그래도 최대한 공학적인 내용을 배제하고 이해하기 쉽게 설명해 보겠다.

블록체인에서의 해시는 어떤 문자열을 ‘정해진 길이’의 16진법 숫자로 바꾸는 방법을 말한다. 여기서 중요한 것은 ‘정해진 길이’라는 표현이다. 아무리 짧거나 길어도 항상 정해진 길이로 나온다. 아래 예시를 보자.

위는 SHA-256이라는 해시 함수를 사용해서 문자열을 해시한 것을 보여준 예시인데, 주목해야할 점은 ‘가’ 라는 단어 하나를 해싱해도 64자리, 긴 문자열을 해싱해도 똑같이 64자리 결과값이 출력된다는 것이다.

참고 : 16진법이기 때문에, 0~9, A=10, B=11 … F=15 로 표현할 수 있다.

2를 이진수로 쓰면 0010, F(15)를 이진수로 나타내면 1111 로 쓸 수 있다. 즉, 여기서 숫자를 하나를 나타내려면 4자리가 필요하다. SHA-256에서 256이라는 숫자는 결과값인 64개의 숫자가 총 256개(64 x 4)의 0 또는 1의 조합으로 이루어져 있기 때문에 붙여졌다고 생각하면 된다. 그럼 SHA-512 함수는 512 / 4 = 128 즉, 우리는 16진법으로 보면 128개의 숫자로 이루어진 결과를 볼 수 있다는 것이다.

이 해시에는 몇 가지 중요한 특징이 있다.

  1. 해시 함수를 사용하면 충돌이 발생한다.(다른 입력을 넣어도 같은 결과가 나올 수 있다.)
  2. 해시 결과만 가지고 원래 입력을 찾는 것은 불가능하다.
  3. 입력을 한 자리만 바꿔도 결과는 완전히 달라진다.
  4. 입력과 해싱된 결과를 모두 알고 있을 때 그것을 검증하는 것은 매우 쉽다.

다시 돌아가서 첫 번째 특징부터 살펴보자. 해시 함수를 사용하면 충돌이 발생한다고 했다. 여러분은 이미 이 의미를 알고 있다. 문자열이 아무리 짧거나 길어도 64개의 숫자 결과로 나온다는 것을 기억하는가? 모든 글자와 문장의 조합을 64자리의 숫자로 나타낸다는 것은 상식적으로 불가능하다. 더 간단하게 비둘기 집의 원리를 생각해보자 10개의 비둘기 집에 11마리의 비둘기를 넣는다고 했을 때, 무조건 하나의 집에는 두 마리 이상의 비둘기가 들어가게 된다. 해시도 이와 똑같은 특성을 지니고 있다. 여기서 필요한 것은 ‘안정성’인데 이 안정성이 높은 해시 함수일수록 고른 분포율을 가지기 때문에 충돌이 발생할 확률이 낮아진다. (충돌이 발생하지 않을 수는 없다.)

두 번째로 해시는 일반적인 암호화 기술인 전치(문자의 위치를 바꾸는 것), 치환(문자를 다른 문자로 바꾸는 것)과는 다른 특성을 가졌다. 일반적인 암호화 기술은 암호화할 문자가 길어지면 결과도 똑같이 길어진다. 하지만 해시는 어떠한가? 항상 똑같은 길이로 출력이 되기 때문에 원래 문자열의 길이를 알 수 없다. 운이 좋아 길이를 정확하게 알고 있더라도 첫 번째 특징과 이 다음에 나올 특징에 의해 해독은 불가능하다.

세 번째로 일반적인 암호화 기술은 일정한 패턴이 있다. 예를 들어 알파벳을 3칸씩 밀어 치환하는 경우를 생각해보자.(A=D, B=E, C=F 이런식으로) 이 방식에서 abcdefg, abcdefh, abcdefi 를 위 방식대로 암호화하면 defghij, defghik, defghil 이런식으로 일정한 패턴을 보이게 된다.(물론 이것은 가장 간단한 예를 든 것이고 실제로 이렇게 쉽게 사용하지는 않는다.) 그럼 해시를 사용했을 때의 결과를 보자.

위 결과들의 차이가 보이는가? 끝에 숫자 하나씩만 바꿨는데 결과는 완전히 다르게 나왔다. (결과값의 길이가 달라보일 수 있는데 모두 64자리로 똑같다. 이건 의심하지 않아도 된다.)

마지막 특징을 조금 더 쉽게 생각해보기 위해 10자리를 맞춰야하는 자물쇠를 생각해보자. 답을 알고 있는 상황이라면, 그냥 답을 입력하고 열리는지만 확인하면 된다.(매우 빠르고 쉽다) 하지만 답을 모르는 상황이라면 최악의 경우 100억가지의 경우의 수를 모두 대입해 보아야 한다. 해시는 ‘답을 알고 있을 때의 검증은 빠르지만 답을 모를 때는 순수 대입만으로 풀어야하기 때문에 시간이 오래 걸린다(심지어 대입으로 값을 찾았다고 하더라도 그 값이 맞는 값이라는 보장이 없다)’는 특징은 블록체인 기술에서의 핵심이다.

이 문서의 처음에 ‘다양한 암호화 기술을 사용하는 전자화폐를 가리켜 암호화폐라고 한다.’ 라는 구절이 생각나는가? 해시가 바로 이 암호화 기술 중 하나이다.

참고 : 해시 함수라고 무조건 암호화 기술인 것은 아니다. 해시 함수는 크게 암호학적 해시(SHA-256, SHA-512, Keccak 등), 비암호학적 해시(CRC32, FNV 등)로 구분되고 실제로 둘 모두 블록체인에서 사용되지만 여기에서는 암호학적인 특성을 지닌 해시에 중점을 두고 설명한다.

5. 전자서명

앞서 거래 기록(트랜잭션)을 모아 블록을 생성한다고 했다. 여기서 발생할 수 있는 문제가 예상되는가?

  1. 실제로 A는 송금을 하지 않았는데 송금을 했다는 기록을 임의로 만들어내는 문제
  2. A가 돈을 보낸 후 나중에 A는 그 돈을 보낸적이 없다고 주장하는 문제
  3. A가 B에게 실제로는 10만원을 송금했지만 기록으로 100만원을 송금했다고 기록을 위변조 하는 문제

위 예시는 ‘인증’이라는 것을 하지 않았을 때 발생할 수 있는 문제들이다. 오프라인에서는 이를 어떻게 하는가? 결제를 한 후 서명을 하면 영수증에 내 서명이 찍히게 된다. 온라인 상에서도 이러한 서명 시스템이 필요하다. 하지만 온라인에서는 0과 1로 나타나는 데이터를 자신의 서명으로 사용하게 되면 똑같이 복제해서 쉽게 도용할 수 있다는 문제가 발생하기 때문에 다른 방법을 사용해야 한다. 아마 이 문서에서 가장 불편한 부분이 될 것 같다.

개인키와 공개키라는 용어가 등장하는데 쉽게 이해하려면 전자서명에서 개인키는 자물쇠, 공개키는 이 자물쇠를 열 수 있는 열쇠로 생각하면 된다. 당연히 다른 열쇠(다른 공개키)를 사용하면 열리지 않는다. 여기서 개인키는 송신자만 가지고 있는 비밀스러운 키(이 부분 때문에 자물쇠랑은 조금 안 맞는 부분이 있긴 하지만 이정도는 괜찮다), 공개키는 누구나 사용할 수 있는 키이며, 이는 한 세트이다. 그리고 공개키만 가지고 개인키를 만들어내는 것은 수학적으로 불가능하다.(시간 비용이 매우 크다)

송신자는 ABC라는 거래 기록을 해시하여 D9AF라는 결과를 얻는다. 이 해시값과 개인키를 이용해 송신자의 서명을 만들어낸다. 이 과정은 해시 값을 개인키로 암호화하는 과정이다. 즉 공개키를 사용해 이 서명을 해독하면 D9AF라는 해시 값을 얻을 수 있다. 자물쇠에 비유하자면 어떤 문서를 내 자물쇠로 잠그는 일이다.

이제 송신자는 원래 거래 기록과 자신의 서명 그리고 그것을 해독할 공개키를 수신자에게 보낸다.

이제 마지막으로 할 일은 수신자 쪽에서 이를 검증하는 것이다. 아래 그림의 오른쪽 부분에서 수신자가 하는 일을 주목하자. 수신자는 전달받은 원래 데이터를 해시한다. 전송되던 중 원래 데이터가 조작되지 않았다면 똑같이 D9AF라는 결과를 얻게 될 것이다. 이어서 송신자에게 받은 공개키와 송신자의 서명을 공개키로 복호화한 값을 확인하고 이 값이 원래 거래 기록을 해시한 값과 같은지 확인하면 된다.

자 왜 이것이 가능한지 해시의 특징을 다시 떠올려보자. 해시 값은 원래 데이터가 아주 조금만 바뀌어도 전혀 다른 결과가 나온다는 것을 배웠다. 즉 전송되던 중 원래 거래 기록을 누군가 조작했다면 전혀 다른 값이 나올 것이다. 그 다음 개인키의 특성상 개인키와 공개키는 한 세트로 만들어져 있고, 개인키는 송신자만 가지고 있기 때문에 공개되어 있는 공개키만 가지고는 개인키를 만들어낼 수 없기 때문에 송신자의 sign을 조작하는 것은 불가능하다. 즉 송신자 sign은 송신자 본인만 만들어낼 수 있기 때문에 이 값을 해독해서 나오는 해시 값과 원래 기록을 해시한 값이 똑같으면 이것은 송신자가 만들어낸 거래 기록이라는 것이 증명되는 것이다.

6. PoW와 블록체인

해시도 알고, 거래 기록을 증명할 방법도 알았으니 이제 블록을 만드는 일만 남았다. 기관을 신뢰할 수 없어 만들어진 기술인데 누군지도 모를 구성원이 만들어내는 블록을 어떻게 신뢰할까? 라는 문제가 남아있다. 누군가 장부를 멋대로 만들어 체인에 연결하면 큰 문제이지 않은가!

비트코인에서는 이를 PoW(Proof of Work, 작업 증명)이라는 방식을 사용한다. 쉽게 말해 ‘내가 이 블록을 만들기 위해 이 만큼의 노력을 했다’ 라는 것을 보여주는 것이다. 여기서 말하는 작업은 어떤 ‘입력 값’으로 해시를 했을 때, 문제로 주어진 값과 같거나 작은 경우를 찾아내는 것이다. 예를 들어, 문제로 주어진 해시 값이 10이라고 하면, 해시 했을때 10 이하의 결과가 나오는 ‘어떤 입력’을 찾아내서 제출하는 것이다. 해시의 특징은 다시 떠올려 보자. 입력 값을 조금만 바꿔도 해시 결과는 완전히 바뀐다고 했던 것이 기억나는가? 여기서 이 특징을 이용한다. 어떤 입력값을 해시해야 10보다 작을지는 전혀 예측이 불가능하기 때문에 전문용어로 노가다로 해보지 않고서는 알 수 없다는 것이다. 비트코인에서는 이런 행위를 약 10분 쯤하면 입력 값을 찾을 수 있게 설계되어 있다. 대신 찾은 입력에 대해 다른 구성원들이 이 입력이 맞는지 확인하는 것은 매우 쉽다. 그냥 전달받은 입력 값을 해시했을 때 문제에 제시된 값보다 작으면 참, 아니면 거짓으로 판단하면 되기 때문이다. 여기서 또 의문을 가질 수 있다. 입력 값을 열심히 찾아서 배포했는데 안에 있는 내용이 수정된 것인지 아닌지 어떻게 알 수 있나? 이 질문에 해답을 찾기 위해서는 블록에 어떤 내용이 들어가 있고 어떻게 연결되어 있는지 알아야한다.

블록체인의 구조를 간단하게 나타낸 모습이다. 실제 블록이 정확히 이렇게 구성된 것은 아니고 개념적인 정리를 위해 간편하게 그린 것이다.(참고로 여기서 nonce 값이 우리가 찾는 입력 값이다.) 머클 루트 해시는 간단하게 거래 기록들을 해시한 값이라고만 알고 있자.

현재 블록 해시가 만들어지는 과정을 보면 버전, 이전 블록 해시, 머클 루트 해시 등등 6가지의 정보를 합쳐서 해시한 것이 현재 블록 해시 값이 된다. 여기서 매우 매우 중요한 점은 이 현재 블록의 해시 값은 파란 색 선을 보면 다음 블록에 이전 블록 해시 값으로 들어간다는 것이다. 이런 식으로 다음 블록에서 이전 블록의 해시 값을 가지기 때문에 체인 형태를 만들어 낸다는 것이다. 이 과정이 왜 중요한지 감이 오는가? 역시나 해시의 특징 때문이다. 다시 또 얘기하지만 입력 값이 조금만 바뀌어도 해시 값이 완전히 바뀐다.

악의적인 사용자 입장에서 생각해보자. 첫 번째 블록의 거래 기록을 바꾸니 머클 루트 해시 값이 달려졌고, 그렇게 되면 현재 블록 해시 값도 완전히 바뀌어 버렸다. 즉, 두 번째 블록에 들어가는 이전 블록 해시가 달라져 버렸다. 방법은 다음 블록을 내가 새로 재빨리 만들어서 전파하는 것이다. 하지만 여기서 문제가 발생한다. 문제를 푸는데 10분 정도 걸리는데 내가 다음 블록을 새로 만들어서 전파하는 동안 다른 구성원들이 그 다음 블록을 만들어 낸다. 임의로 수정한 블록을 진짜 블록으로 만들어버리기 위해서는 남들보다 빠르게 블록을 만들어 내야 하는데 사실상 그게 불가능하다. 내가 최소한 전체 해시 파워의 51%를 가지고 있어야 하는데 이는 어마어마한 자본이 있지 않고서는 불가능하고, 또한 내가 이렇게 조작을 하다가 들키기라도 하는 순간 비트코인의 시장가치가 떨어져 버린다. 어마어마한 자본을 투입해 많은 비트코인을 얻었는데 휴지조각이 되면 의미가 없지 않은가?

이런 점들 때문에 장부를 조작, 해킹하는 것은 매우 어렵고 이에 따라 블록체인은 높은 신뢰성을 보여주게 된다.

--

--