블록체인에 대한 조금 더 자세한 설명

최근 가상 화폐와 블록체인에 대한 열기는 정말 핫하다. 관련된 세미나를 가 보면, 주제에 관계 없이 항상 만원 사례를 이루는 경우가 많다. 기술을 논하는 세미나에서 이더리엄의 가격 동향에 대한 질문이 나오거나 하는 일은 매우 흔해졌다.

또한 블록체인에 대해 설명하는 기사와 아티클들 역시 매우 많아졌다. 그런데 그런 기사들을 보거나, 관련되어 누군가와 이야기를 하다 보면 꽤 잘못 이해하고 있는 경우가 상당히 많이 보인다. 이런 현상은 많은 글들이 독자들이 가상화폐나 블록체인에 대해 잘 모른다는 가정 하에, 글을 매우 단순화시키기 때문이기도 하고, 글을 쓰시는 분들도 정확히 이해하지 못 하고 있기 때문으로 보이기도 한다. 그래서 현 시점에서 아는 한도 내에서 좀 더 정확하게 이야기 해 보고 싶어졌다.

일단 자주 보이는 오류 중 하나는 블록체인 = 비트코인 이라는 관점에서 쓰이는 글들이다. 대부분 신문 기사들에서 이런 경향이 보이는데, 기반 기술과 서비스가 혼용되면서 비트코인에만 해당하는 내용이 블록체인 전체에 관한 것으로 쓰이는 경우가 매우 많다.

최근 블록체인은 정말 급격한 속도로 새로운 개념들이 나타나고 있기 때문에, 모두 같은 방식으로 동작할 것이라고 믿는 것은 많은 오해를 낳는다. 그렇기 때문에 이 글에서는 각각의 오해에 대해 좀 더 구체적으로, 그리고 대상을 가급적 명확하게 적어보려 한다.

1. ’10분’마다 새로운 블록이 생성된다

이 이슈는 기사들에서 가장 많은 오류가 나타나는 경우 중 하나다. 블록의 생성 시간은 절대적으로 정해져 있는 것이 아니며, 통계적으로 어느 정도의 시간을 유지하도록 설계되어 있을 뿐이다. 이더리움의 경우 12초인데, 이 역시 정확히 12초마다 생성된다는 뜻이 아니다. 주로 퍼블릭 블록체인들 (가상화폐를 지향하는)에서 설정되는 것이며, 프라이빗 체인의 경우 아예 정해진 시간이 없는 경우들도 있다.

비트코인이나 이더리움과 같은 PoW(Proof of work) 기반의 블록체인들은 각각의 노드가 블록을 생성하기 위해서 일종의 문제를 풀어야 하는데, 문제의 난이도를 지속적으로 변화시키면서 전반적인 블록 생성 시간을 조정한다. 너무 빨리 블록들이 생성되면 난이도를 높이고, 너무 인터벌이 길어지면 난이도를 내리는 방식이다. 이를 통해 평균적으로, 최초에 설계된 생성 시간의 텀을 가지도록 유도한다.

이런 인터벌이 필요한 이유는, 체인이 둘로 나뉘어지는 경우를 최소화 하기 위함이다. 예를 들어 한 노드가 블럭을 ‘채굴’하고, 그 블럭을 전 세계에 흩어져 있는 노드에 전파하기 위해서는 어느 정도 시간이 필요하다. 이더리움의 경우 테스트를 통해 12초 정도면 모든 노드가 전달을 받을 수 있다고 판단하고 결정한 결과이다. 이 시간이 더 짧아지면, 미처 모든 블럭에 채굴 사실이 전파되기 전에 다른 노드가 채굴에 성공하여 체인이 나뉘고 경쟁 상태로 들어가는 일이 빈번해지게 된다.

PoS(Proof of stake)기반의 가상화폐의 경우, 난이도와 같은 개념은 없다. 카르다노SL (Settlement Layer)의 경우, 향후의 타임 슬롯에 어느 노드가 블록을 생성할 것인지를 동전 던지기와 같은 프로토콜을 이용해서 미리 결정해 둔다. 하지만 이 경우 해당하는 타임 슬롯에 해당 노드가 없을 수도 있기 때문에, 블록을 전파할 시간이 충분하지 않으면 역시 체인이 나뉘어질 가능성이 있다. 그렇기 때문에 블록 생성 시간이 필요하다.

2. 전체 노드의 과반이 동의해야 블록에 저장된다

이 말은 반쯤 맞다고 보는게 옳을 것 같다. 트랜잭션을 생성하고, 컨센서스를 확보하고, 블록을 생성하는 과정은 적용된 알고리즘에 따라 달라진다. 또한 이러한 워딩은 마치 하나의 트랜잭션에 대해 노드간에 많은 대화와 확인 과정이 존재할 것처럼 들리기도 하는데, 이 역시 알고리즘에 따라 조금씩 다르다.

예를 들어보자. 이더리움의 경우 누군가 트랜잭션을 생성하면, 이 트랜잭션은 즉시 모든 노드에 전파되고 각 노드가 관리하고 있는 트랜잭션 풀에 들어간다. 모든 계정의 잔고는 월드 스테이트에 보관되어 있기 때문에, 각각의 노드는 해당 트랜잭션이 정상적인지 아닌지를 개별적으로 판단한다. 그리고 마이닝을 수행하는 노드들은 이렇게 쌓인 트랜잭션 중, 자신이 만드는 블럭에 집어 넣을 트랜잭션들을 정해 둔 상태에서 (수수료를 많이 주는 트랜잭션 우선으로) 자신이 문제를 풀 경우 해당 해시값을 블록에 포함시켜, 블록을 전파한다.

이렇게 전파된 블록은 각 노드에서 역시 유효한 것인지를 확인하게 되고, 유효하다면 체인에 저장하고, 해당 블록에 포함된 트랜잭션들을 자신의 트랜잭션 풀에서 삭제하고, 새로운 문제를 풀기 시작한다. 즉, 블록의 선언은 단 한 번 이루어지며 서로 이게 맞네 아니네 논의하지는 않는다. 각자 보관해 둔 정보를 기반으로 각자가 판단하는 것이다.

이더리움의 월렛을 보면 Confirmation이라는 부분이 있는데, 예를 들어 하나의 트랜잭션이 50개의 Confirmation을 받았다라는 식으로 표시된다. 이는 ’50개 노드가 이게 맞다고 응답했다’라고 해석될 소지가 큰데, 실제 의미는 이 트랜잭션이 블록에 포함된 이후 50개 블럭이 그 블럭 뒤에 추가되었다라는 의미일 뿐이다. 트랜잭션 자체가 유효하냐 아니냐는 월드 스테이트를 보고 각자 판단한다.

그렇다면 이 컨퍼메이션이 의미하는 것은 무엇인가? 앞서 언급했듯이 블록들은 형성 과정에서 분기가 이루어질 수 있다. 이 경우 좀 더 긴 블록을 가진 쪽이 이기게 되는데 (longest chain wins), 진 체인에 속한 트랜잭션은 다시 트랜잭션 풀로 돌아가게 되고, 유효성 검사를 거치게 된다. 즉 컨퍼메이션이 충분히 크다는 것은, ‘이 트랜잭션은 충분히 오랫동안 변동 없이 블럭에 보관되었기 때문에, 취소될 가능성이 적다’라는 것을 표시하는 것이다.

사실 악의적인 노드의 경우, 정당한 블록이 도착했음에도 불구하고 해당 블록을 기록하길 거부한 후 체인 길이 경쟁에 나설 수도 있다.

BFT알고리즘을 사용하는 경우는 이와는 다르다. 각각의 트랜잭션에 대해 노드들이 응답을 서로 주고 받으며, 확인하는 과정을 거친다.

3. 블록체인은 보안성이 높다

간혹 이야기를 하다 보면, 블록체인은 보안성이 높다라는 말이 오해를 불러 일으켜 마치 최강의 보안 솔루션처럼 생각하시는 분들도 보게 된다. 사실 이 부분은 지금도 계속 변화와 개선이 일어나고 있는 부분이라 쉽게 말하기는 어렵지만, 조금 과도한 신뢰가 부여되고 있지 않는가 하는 생각이 들기는 한다.

기본적으로 비트코인, 이더리움과 같은 퍼블릭 체인이 제고하는 보안성은 단 한 가지이다. 기록의 변조가 거의 불가능하다라는 점이다. 그리고 오래된 기록일수록 변조는 더욱 어렵다. (추가적으로 비밀키/공개키만 사용되는 시스템이기 때문에, 개인 정보가 노출되지 않는다는 점도 추가하자면 할 수는 있겠다)

그리고 이 위변조 방지는, 집단의 힘에서 나온다. 즉 기술 자체가 무지무지하게 보안성이 높아서 위변조가 안 되는 것이 아니라, 같은 내용을 공유하는 ‘정상적인’ 참여자가 많기 때문에 이 것이 가능해지는 것이다. 사실 사용되는 기술 요소로 보면 PKI, HASH 정도인데, 이건 블록체인 아닌 어느 시스템에서도 쓸 수 있고, 많이 쓰이는 기술이다.

사실 그 외적인 면에서는 크게 다를 것이 없다. 모든 데이터가 공유되기 때문에, 특정 주소의 잔고나 거래내역 같은 것은 모두 확인된다. 어찌 보면 프라이버시가 좀 더 많이 노출되는 면도 없지 않겠다. (비트코인, 이더리움의 경우)

물론 이런 문제들을 HD (Hierarchically deterministic) Wallet을 도입한다거나, Dash나 PIVX처럼 마스터 노드를 통한 익명화를 제공한다거나, Zcash의 경우 영지식 증명을 도입한다거나 하는 식으로 가상화폐의 보안성을 높이고 있고, Corda의 경우 관계 없는 노드와는 아예 트랜잭션을 공유하지 않는 식도 도입되고 있다. 이런 노력들로 인해 보안성/프라이버시는 지속적으로 나아지고 있기는 하지만, ‘블록체인을 도입하면 데이터는 절대 안전하다’라는 식으로 생각해서는 곤란하다.

4. 블록체인은 ‘분산’ 시스템이다

이 부분은 사실 번역으로 인한 문제인 듯 한데, 흔히들 ‘distributed ledger’라고 부르고 ‘분산 장부’라고 번역을 해 버린다. 이 경우 번역은 문제가 없는데 ‘분산’이라는 의미가 기존에 흔히 이야기 되던 의미와 다르기 때문에 오해가 생기는 경우가 있었다.

블록체인에서의 ‘분산’은 각 참여 노드가 자신의 판단에 근거하여 컨센서스를 이루고 데이터를 기록하며, 동일한 데이터가 여러 노드에 저장된다라는 의미인데, 의외로 많은 분들은 이를 기존에 주로 사용하던 ‘로드의 분산’ 또는 데이터의 ‘분할 저장’으로 해석해 버린다.

한 예로 IoT 기업에 근무하시던 분인데, 수 많은 센서에서 기록되는 값을 블록체인이 ‘분산’하여 ‘위변조를 방지’해 줄 수 있을지를 문의하신 적이 있다. 음.. 조금 당혹스러웠다.

다양한 블록체인들이 나오고 있고, 스케일러빌리티 확보를 위한 샤딩 역시 중요한 토픽 중 하나이기 때문에, 조만간 전통적 의미의 ‘분산’ 시스템이 될 가능성은 존재한다. 하지만 일반적으로 이야기되는 퍼블릭 블록체인들은 전혀 다른 의미의 ‘분산’이라는 것을 기억해 두는 것이 좋을 것 같다.

 

생각나는 대로 몇 가지 적어 보았는데, 쓰고 보니 갑자기 몇 달 후면 이 글도 낡고 오류 투성이인 글이 될지도 모른다는 불안감이 급격히 들기는 한다. 정말 정신 없이 바뀌고 있으니. 그래도 현 시점에서는 도움이 될 지도 모른다는 기대를 가져 본다. =)