합의 알고리즘은 블록체인 시스템과 생태계의 운영의 근간으로 블록체인을 공부할 때 꽤 자주 만나게 되는 개념입니다.
합의: 합의란 다수의 사람이 특정 문제에 관해 서로 의견의 일치하는 것을 말한다
블록체인은 탈중앙화를 추구하며 전 세계의 다양한 참여자가 P2P(Peer-To-Peer) 네트워크 방식으로 생태계를 유지하고 있기 때문에 그 무엇보다 참여자의 의견 일치(합의)가 중요합니다.
합의 알고리즘은 블록체인 생태계를 구성하는데 꼭 필요한 요소이며 다양한 블록체인 프로젝트가 다양한 합의 알고리즘을 통해 운영되고 있습니다.
먼저 블록체인에 합의 알고리즘이 필요한 이유를 알아볼까요?
블록체인은 기본적으로 탈중앙화(Decentralized)를 추구하는 시스템입니다. 기존의 중앙화 된 시스템에서는 중앙이 각 거래 시 발생하는 트랜잭션(거래)의 이상 유무를 확인하고 보장해 줍니다. 그러나 블록체인은 거래가
P2P 네트워크를 통해 전달 또는 승인되기 때문에 정보 도달에 시차가 발생할 수 있고, 이로 인해 정보 지연이나 미도달 사태 등의 문제가 발생할 수 있습니다. 이럴 경우 이중 송수신에 따른 중복처리 또는 오작동이 발생할 수 있습니다. 바로 이런 문제를 해결하기 위해 합의 알고리즘이 필요한 것이죠.
간단한 예를 한번 들어 볼까요? 만약 제대로 된 합의 알고리즘이 없는 탈중앙화 시스템을 통해 프로야구 티켓을 예매했다고 가정해 보겠습니다. 이경우 내가 정당한 지불을 통해 구매한 좌석을 다른 사람 역시 정당한 구매를 통해 구매하는 일이 발생할 수도 있습니다. 한 좌석에 두 명의 결제가 발생한 것이죠. 합의 알고리즘은 이런 중복거래(이중 지불)를 방지할 수 있습니다.
합의 알고리즘은 비잔틴 장군 문제(Byzantine General Problem)를 해결하는 역할을 하기도 합니다. 비잔틴 장군 문제란 악의적인 노드(참여자)가 부정적인 행위를 하는 것으로 합의 알고리즘을 통해 이런 악의적인 행동을 극복하고 전체 시스템을 정상적으로 운영할 수 있습니다. 비잔틴 장군 문제에 관한 자세한 설명은 다음에 자세히 이야기하도록 하겠습니다.
대표적인 합의 알고리즘
현재 다양한 합의 알고리즘이 존재하고 있지만 가장 대표적인 합의 알고리즘으로는 작업 증명(Proof-of-Work/工作量证明), 지분 증명(Proof-of-Stake/权益证明), 위임 지분 증명(Delegated-Proof-of-Stake, 委托权益证明) 그리고 프랙티컬 비잔틴 장애 허용(Practical Byzantine Fault Tolerance,实用拜占庭容错算法)이 있습니다.
작업 증명(Proof-of-Work/工作量证明)
작업 증명은 블록체인의 시초라 할 수 있는 비트코인 시스템에서 사용되고 있는 합의 알고리즘입니다. 비트코인의 노드는 수학적 난제를 푸는 것으로 거래 승인과 블록을 생성 권한을 얻습니다. 컴퓨터 연산 능력을 이용해 수학 난제를 푸는 행위를 마이닝(채굴)이라 부르며 이를 전문적으로 하는 노드를 마이너(채굴자)라고 부릅니다. 마이너(채굴자)는 블록을 생성하는 대가로 비트코인을 받습니다.
작업 증명의 탈중앙화로 인해 거래의 위변조가 거의 불가능하다는 장점을 가지고 있지만 과도한 전력 소모라는 단점도 가지고 있습니다. 많은 마이너가 채굴 경쟁을 벌이고 있지만 채굴 보상은 단 한 명의 마이너가 독점을 하기 때문에 나머지가 사용한 전력은 모두 낭비된 전력이 되어버립니다.
만약 특정 채굴 집단이 전체 연산 능력의 51%를 초과하는 채굴 능력(연산능력)을 가지고 있을 경우 이론적으로는 악의적인 거래 위변조 역시 가능해집니다. 또한, 작업 증명은 완전히 분산화된 P2P 네트워크를 통해 거래가 승인되고 저장되기 때문에 거래의 신뢰를 담보로 할 수 있는 충분한 시간이 필요합니다. 비트코인의 단일 블록 생성(거래 승인) 시간은 10분으로 전통적인 금융 거래와 비교하면 충분히 빠른 시간이라 보기 힘듭니다.
지분 증명 (Poof-of-Stake, 权益证明)
지분 증명은 PeerCoin이 처음 제안한 합의 알고리즘입니다. 지분 증명은 노드의 채굴 능력(연산능력)이 아닌 보유 지분(Stake) 또는 시간을 기준으로 블록 생성 권한을 부여받게 됩니다. 지분을 많이, 오래 보유학 수록 유리한 알고리즘입니다. 또한, '무작위 시스템'을 통해 자본이 많은 특정 노드의 블록 생성 독점을 방지하고 있습니다. 즉, 지분 증명(PoS) 방식은 작업 증명(PoW)에서 발생하던 과도한 전력 소모를 방지해 시스템 운영의 효율성(경제성)을 높입니다.
지분 증명은 노드가 지분 확보를 위해 자산을 과도하게 묶어 둘 경우 시중의 통화량이 급격하게 줄어든다는 단점을 가지고 있습니다. 자본력이 있는 노드가 블록 생성 권한을 얻고 블록 생성으로 또다시 자본을 증식시킬 수 있기 때문에 부인부 빈익빈 상태가 반복될 가능성이 있습니다.
위임 지분 증명(Delegated-Proof-of-Stake, 委托权益证明)
위임 지분 증명은 네트워크 노드의 투표를 얻은 대표 노드가 거래를 승인하고 블록을 생성하는 합의 알고리즘입니다. 자신이 투표한 노드가 대표 노드가 될 경우 투표자는 대표 노드가 얻는 보상을 함께 나눠 받게 됩니다. 지분 증명(Pos)의 경우 일정량 이상의 지분을 소유한 모든 노드에게 블록 생성 권한이 주어지기 때문에 블록 생성에 일정 시간이 필요합니다. 물론 작업 증명(PoW)과 비교해서 꽤 빠른 속도지만요. 그에 반해 위임 지분 증명(Pos)의 경우 이미 투표로 선출된 소수의 대표 노드(BP) 돌아가면서 블록을 생성하기 때문에 블록을 생성하는 속도와 비용이 확연히 감소합니다. 각 대표 노드는 라운드 별로 랜덤 한 순서로 블록을 생성합니다. 한 라운드가 종료되면 블록 생선 순서는 초기화됩니다.
위임 지분 증명은 빠른 블록 생성이라는 장점을 가지고 있지만 대표로 선출된 소수가 전체 생태계를 좌우한다는 점에서 블록체인의 탈중앙화 정신에 위배된다는 비난을 받기도 합니다. 게다가 대표 노드(BP)로 선출되기 위해선 노드가 자신의 신분을 밝혀야 하기 때문에 익명성이 보장되지 않으며 해커들의 공격에 노출될 가능성이 있습니다.
프랙티컬 비잔틴 장애 허용(Practical Byzantine Fault Tolerance,实用拜占庭容错算法)
PBFT는 BFT를 실용적으로 개선해 비동기식 네트워크 상에서도 합의를 도출할 수 있게 했습니다.
PBFT 알고리즘은 Primary 또는 Leader라 불리는 노드가 존재합니다. 이 노드는 클라이언트의 요청 순서를 정렬해 그 결과를 기타 노드에게 전송합니다. PBFT의 합의 알고리즘의 진행 순서는 다음과 같습니다.
- Request: 클라이언트가 리더(프라이머리)에게 거래가 담긴 블록을 전송
- Pre-Preparewt: 리더가 클라이언트의 요청을 수집해 그 결과를 다른(n-1) 노드에게 전송
- Preparew: 리더의 메시지를 수신한 노드는 그 내용을 다시 다른 노드[((n-1)*(n-1)]에게 재 전송
- Commit: 각 노드는 다른 (n-1) 노드로부터 받은 결과를 검토해 유효성을 판단하여 다른(n-1) 노드에게 자신의 상태를 전송
- Rrply: 각 노드의 상태를 바탕으로 2/3 이상 노드의 결과가 동일할 경우 합의한 것으로 판단. 데이터를 저장하고 결과를 클라이언트에게 전송
PBFT는 2/3 이상의 노드만 합의를 하면 거래가 승인되기 때문에 거래 속도와 보안이 향상됩니다. 하지만 적은 수의 노드가 거래를 시스템을 관리하기 때문에 이역시 탈중앙화와는 거리가 있습니다.
마무리...
앞서 이야기한 것과 같이 합의 알고리즘은 블록체인 네트워크의 무결성과 보안을 위한 매우 중요한 요소입니다. 하지만 현재의 완벽한 합의 알고리즘이 존재하진 않습니다. 작업 증명, 지분 증명, 위임 지분 증명, PBFT는 모두 각자의 장단점을 가지고 있습니다. 이들의 단점을 보안하겠다는 또 다른 작업 증명 역시 꾸준하게 탄생하고 있습니다. 마치 각 지역과 국가 별로 다른 법률 체계를 가지고 있는 것처럼요. 블록체인 기술이 아직은 초창기면 빠른 속도로 성장하고 있는 만큼 당분간은 작업 증명에 관한 논의는 계속 진화할 것으로 보입니다.
앞으로 공부해야 할 내용이 늘어난다는 뜻이겠죠?^^
혹시 기회가 된다면 OPos, PoB, ePoW 등 다른 작업 증명에 관해서도 다뤄보겠습니다.
이 글은 투자권유를 목적으로 작성되지 않았습니다.
Seonho Shin_
facebook: https://www.facebook.com/shinseonho.kr
brunch: https://brunch.co.kr/@shinseonho
steemit: https://steemit.com/@shinseonho