블록체인 코어 시리즈: 지분증명(PoS) Part I

블록이 생성되자마자 그 거래 내역을 믿을 수 있으려면

Yoonjae Yoo
DNEXT
8 min readJul 24, 2019

--

블록체인 코어를 이해하는 것은 매우 중요합니다. 전세계적인 블록체인 엔지니어에 대한 높은 수요에도 불구하고 코어 레벨까지 이해하는 개발자 분들을 찾기가 어려웠습니다.

이에 보다 많은 분들이 코어 지식을 접할 수 있는 계기가 될 수 있도록 블록체인 코어 시리즈를 연재합니다. 많은 관심 부탁드립니다.

  1. 작업증명(PoW)
  2. 지분증명(PoS) Part I

지분증명

지분증명은 영어로 Proof of Stake이고 여기서 Stake란 지분을 의미합니다. 갑자기 지분이라니 의아하실 분들도 있을 것입니다. 여기서의 지분은 내가 가지고 있는 토큰의 비중을 의미합니다. 지분에는 ‘몫'이라는 뜻도 있으니까요.

작업증명 방식에서는 유효한 해시를 찾는 경쟁을 통해 블록을 채굴했습니다. 전세계의 채굴자들이 무한경쟁을 벌이고 있는 것이고 이를 통해 네트워크는 유지될 수 있습니다. 내가 하지 않더라도 누군가는 블록을 생성하고 있고 이에 따른 합당한 보상이 지급됩니다. 그렇다면 지분증명을 도입한 블록체인 네트워크가 유지되는 원리는 무엇일까요?

지분증명은 새로운 블록을 생성하는 데에 기여한 노드들에게 지분에 따라 보상을 지급하는 과정이다.

지분증명의 구현 방식에 따라 조금씩 차이가 있을 수 있겠지만 핵심은 위와 같이 정리할 수 있을 것 같습니다.

비동기화 P2P 네트워크

우선 지분증명을 이해하기 위해 블록체인 네트워크의 특성에 대해 알아보겠습니다. 블록체인은 P2P 네트워크이고 P2P 네트워크는 비동기성(asynchronousity)이라는 성질이 있습니다. 그 의미를 알아보기 위해 우선 동기적(synchronous) 네트워크의 의미를 알아보겠습니다.

노드가 메시지를 보내는 시간과 수신 노드가 메시지를 수신하는 시간 사이에 상한선이 존재하고 그 시간 안에 도착이 보장됨.

만약 블록체인이 동기적 네트워크에서만 작동한다면 (개발자들의 관점에서) 세상은 아름다울 것입니다. 노드들끼리 메시지를 보내면 응답할 것이 보장되어 있고, 이 말은 오프라인 상태인 노드가 존재하지 않는다는 의미입니다. 메시지가 중간에 유실되었는지, 상대 노드가 의도적으로 메시지를 무시하는 것이 아닌지 고려할 필요가 없습니다. 다시 말하면 아주 이상적인 상황이라고 할 수 있습니다. 외부의 계약에 의해 노드의 운영이 강제되어 있는 프라이빗 블록체인에서는 가능할 수도 있습니다.

하지만 퍼블릭 블록체인은 현실적으로 비동기적 P2P 네트워크에서 작동합니다. 비동기적(asynchronous) 네트워크의 의미는 아래와 같습니다.

노드가 메시지를 보내는 시간과 수신 노드가 메시지를 수신하는 시간 사이에 상한선이 없고 메시지의 도달이 보장되지 않음.

노드끼리 통신을 할 때 메시지를 보내더라도 상대방이 그 내용을 전달받을 수 있다는 것이 보장되어 있지 않습니다. 그리고 상대방이 선한 노드가 아니라서 의도적으로 메시지를 묵살해버릴 수도 있습니다. 그리고 상대 노드가 온라인 상태인지 오프라인 상태인지 알 수도 없습니다. 마치 장님이 코끼리를 부분적으로 만지면서 어떤 동물인지를 유추해야하는 상황과 비슷하다고 할 수 있네요.

퍼블릭 블록체인을 설계하기가 어려운 이유는 위와 같은 극한의 비동기적 네트워크에서도 문제없이 잘 작동하는 시스템이어야 하기 때문입니다. 그렇다면 여기서 블록체인이 문제없이 잘 작동한다는 의미는 무엇일까요?

안전성(safety)와 생존성(liveness)

블록체인은 일종의 분산 시스템이고 분산 시스템의 연구는 80년대부터 이어져 왔습니다. 그리고 학자들은 분산 시스템에서 중요한 두 가지 특성을 다음과 안전성(safety)생존성(liveness)이라는 이름으로 정리해두었습니다.

우선 안전성은 나쁜 일이 일어나지 않을 것을 의미하는데, 블록체인에서는 “블록 생성 과정에서 노드끼리의 합의가 이루어질 것"으로 생각하면 됩니다. 만약 어떤 블록체인이 100% 안전성을 보장한다면 같은 높이를 갖는 두 개 이상의 블록이 생성되는 일은 절대 없을 것입니다. 노드들은 매 블록이 생성될 때마다 100% 합의에 이르게 되고 사실 이는 매우 바람직하지만 이상적인 경우입니다.

생존성은 좋은 일은 언제나 일어날 것을 의미하며, 블록체인에서는 "블록 생성 과정에서 노드끼리의 합의가 끊임없이 일어날 것"을 의미합니다. 예를 들어 참여하는 노드의 수가 0이 되어서 아무도 블록 생성 과정에 참여하지 않으면 생존성은 0으로 수렴하는 것이 됩니다. 반대로 블록 생성 주기(예: 10분)마다 끊임없이 블록이 생성된다면 이는 생존성을 100% 만족하는 시스템입니다.

만약 어떤 블록체인이 안전성과 생존성을 100% 만족시킬 수 있다면 이는 완벽한 시스템일 것입니다. 노드들의 합의에 실패하는 경우도 없고 주기적으로 블록이 생성되는 것이 보장되는 것이니까요. 하지만 비동기적 네트워크에서는 안전성과 생존성을 완벽히 만족하는 합의 알고리즘을 설계하는 것이 불가능하다는 것이 1985년에 출판된 <Impossibility of Distributed Consensus with One Faulty Process>라는 논문에 의해 증명되어 있습니다. 이는 FLP 불가능성(impossibility)로 불립니다.

안전성이 보장되는 지분증명, 하지만 생존성은?

지난번 작업증명 글에서 작업 증명의 한가지 문제는 확률적 안정성이라는 언급을 했습니다. 여기서 확률적 안전성이란, 안전성이 100%로 보장되는 것은 아니지만 그래도 꽤 높은 수준으로 보장된다는 의미입니다. 즉, 블록 생성 과정에서 노드끼리의 합의가 100% 보장되는 것은 아니지만 그래도 1시간(비트코인 기준 6블록)을 기다리면 6블록 모두 합의가 이루어지지 않았을 가능성은 0에 수렴한다는 것입니다. 6블록 이상의 확정을 받은 블록의 거래 내역은 우리가 믿고 사용할 수 있는데, 스타벅스에서 비트코인으로 커피를 사기 위해 1시간을 기다려야한다는 것은 실용성이 떨어집니다.

작업증명에 비해서 지분증명이 갖는 커다란 장점은 안전성을 거의 100% 보장한다는 것입니다. 지분증명에서는 블록이 생성되자마자 확정이 됩니다. 6블록을 기다릴 필요가 없이 그 즉시 거래 내역을 믿어도 됩니다. 따라서 굉장히 높은 실용성을 가집니다. 지분증명을 도입하려는 이더리움은 2–3초의 짧은 블록 생성 시간을 목표로 하고 있습니다. 결제를 위해 거래를 발생시키고 2–3초만 기다리면 확정이 된다는 의미입니다. 일상 생활에서 사용하기에 훨씬 편리하겠죠.

물론 장점만 있는 것은 아닙니다. FLP 불가능성에 의해, 분산 시스템의 안전성을 높이면 자연스레 생존성은 하락하게 됩니다. 즉, 블록 생성이 꾸준히 이어지지 않을 가능성이 늘어난다는 것입니다. 지분 증명의 원리를 간단하게 설명하자면 2/3 이상의 득표를 받은 블록이 나타날 때까지 투표가 진행됩니다. 만약 2/3 이상의 득표를 받은 블록이 나타나지 않는다면? 다음 라운드로 넘어가서 다시 투표를 진행하게 되어 있습니다. 이 과정이 계속 반복될 수도 있습니다. 어디까지나 투표를 통한 합의이기 때문에 발생하는 문제점인 것입니다.

이와 반대로 작업증명 알고리즘은 생존성을 거의 100% 보장하고 있습니다. 설령 비트코인의 인기가 떨어져서 대다수의 채굴자들이 이탈했다고 가정해봅시다. 그래도 비트코인의 블록은 10분에 한번씩 꾸준히 채굴될 것입니다. 전세계에 단 한명의 채굴자만 존재하더라도 블록은 계속 생성됩니다. 실제로 2009년 비트코인 탄생 초창기에는 사토시 나카모토가 유일한 채굴자였습니다.

정리하자면 작업증명은 안전성은 확률적으로 보장하지만 생존성은 거의 완전히 보장하고, 반대로 지분증명은 안전성은 거의 완전히 보장하지만 생존성은 보장하지 않습니다.

합의 알고리즘

지난번 글에서 살펴본 작업증명 및 이번 글의 주제인 지분증명은 모두 합의 알고리즘입니다. 관리자가 존재하지 않는 비동기적 P2P 네트워크에서 어떻게 하면 하나의 공통된 진실을 주기적으로 만들어낼 수 있을지에 대한 방법론인 것입니다.

합의 알고리즘을 구성하는 구성원은 크게 아래와 같이 세 부류로 나눌 수 있습니다.

  1. 제안자(Proposers) : 리더(leader) 혹은 조율자(coordinator)라고도 불리운다. 합의에 이르러야할 문제를 제안 하는 노드이다.
  2. 수용자(Acceptors) : 결정에 기여하는 역할로, 제안자가 제안하는 문제를 청취하고 있다가 특정 값으로 응답한 다.
  3. 학습자(Learners) : 나머지 구성원들은 제안자와 수용자에 의해 결정되는 값을 배워서 이를 이용한다.

그리고 합의 알고리즘은 대체로 다음과 같은 합의 과정을 거치게 됩니다.

  1. 선출 : 결정을 내리기 위한 한 노드(제안자/리더)를 뽑는다(주로 랜덤 알고 리즘에 의해 선택). 제안자는 유효한 결과값의 후보(블록 해시)들을 제시한다.
  2. 투표 : 일반 노드들은 제안자에 의해 제안된 값들을 청취하고 있다가 이를 검증하고 이들 중 하나에 투표한다.
  3. 결정 : 일반 노드들은 하나의 올바른 값으로 합의에 이르러야 하는데, 보통 최소 필요 득표수가 정해져 있다.
  4. 재시작 : 결정이 이루어지지 않으면 다시 1번부터 모든 과정을 반복한다.

아직까지는 지분 증명의 구체적인 모습이 그려지지 않을 것입니다. 다음 글에서는 이러한 합의 알고리즘의 개념이 구체적으로 지분증명에 어떻게 대응되는지 살펴보도록 하겠습니다. 지금까지 가장 활발하게 연구가 된 지분증명 알고리즘인 이더리움의 캐스퍼(casper)를 토대로 살펴볼 예정입니다.

연재 내용은 블록체인 전문 교육 기관인 DNext Campus에서 제공하는 커리큘럼의 일부를 정리한 것입니다.

DNext Campus에서는 블록체인 코어 엔지니어 교육 과정을 제공하고 있습니다. 블록체인 코어 기술에 대해 심층적으로 공부하고 싶으신 분들은 지금 웹사이트를 방문해주세요!

블록체인 코어 엔지니어 교육 알아보기

--

--