• 본 게시글은 K-MOOC 묶음강좌 '블록체인 암호화폐:입문부터 심화까지' 강의를 수강하고 공부하며 정리한 내용입니다.
블록체인 네트워크는 블록을 체인 형태의 연결되어 있는 분산 데이터 환경에 저장하였습니다. 그럼 블록을 생성할 때 어떤 노드에서 생성되는 블록을 체인에 연결해야 할까요? 이것은 블록체인에서 매우 중요한 주제이고, 이것을 분산 합의라고 합니다. 탈중앙화 시스템에서는 결정을 내려줄 주체가 없기 때문에, 분산 시스템에서 모두가 동일한 상태를 가지고 있을 수 있도록 하기 위해서 분산 합의는 꼭 필요합니다.
분산 합의(Consensus Algorithm)
블록체인 네트워크에서 어떤 참여자에게 블록을 생성할 권한을 주느냐 결정하는 것
분산 합의가 성공적으로 수행되기 위해서는 다음과 같은 요구 조건이 필요합니다.
이 때, 올바른 참가자는 블록체인 네트워크에 정상적으로 기여하며 악의적인 공격을 하지 않는 참가자를 의미합니다.
분산 합의 시스템에는 다음과 같은 기술적 문제점들이 있습니다.
따라서 분산 합의 시스템에서는 이러한 문제점들을 다양한 알고리즘을 통해 보완하고 해결하고 있습니다.
위에서 말한 문제점들을 해결하기 위한 다양한 합의 알고리즘이 존재하고 있고, 블록체인 네트워크는 아래와 같은 합의 알고리즘 중 하나를 선택하여 사용합니다.
사토시 나카모토의 비트코인에 대한 이야기를 담은 논문에서 처음으로 제안한 비잔틴 합의 알고리즘으로, 블록 내에 포함되어있는 값(nonce)을 0부터 1씩 증가시키면서 해시 함수에 넣고 해시함수의 출력이 목표값(Difficulty)보다 작은 값이 나오면 채굴에 성공하는 알고리즘 입니다. 모든 노드가 동시에 블록을 만들 수 없게 하기 위해서 이러한 알고리즘을 사용합니다.
비트코인 블록의 헤더 속에는 Difficulty와 Nonce 데이터가 설정되어 있습니다. 블록의 채굴 속도에 따라서 평균 10분마다 1개의 블록이 생성되도록 Difficulty를 조절합니다. 이 때 동시에 2개 이상의 블록이 생성되면, 그 블록들은 그 다음 블록을 생성하여 가장 긴 체인을 메인 체인으로 선택하여 사용하는데 보통 6개의 블록이 생성되기 전에 보통 종료되고 이것을 '6 confirmation'이라 부릅니다. 이는 거래가 포함된 블록 이후 5개 블록이 더 생기면 해당 트랜잭션이 완전하게 거래가 성사되었음을 의미합니다.
작업증명 알고리즘은 글로벌 규모의 완전히 오픈된 네트워크에서 운영할 수 있는 알고리즘입니다.
위에서 살펴보았던 작업증명 알고리즘(PoW)에는 여러가지 문제점이 있고, 이러한 문제점을 해결하기위해 지분증명 알고리즘(PoS)이 개발되었습니다.
지분증명 알고리즘은 소유한 암호화페의 양에 따라서 블록을 생성할 권한을 주는 알고리즘 입니다. 채굴이 일어나지 않으므로 채굴자가 없고, 대신 검증자가 존재합니다. 얼마의 암호화폐 지분을 Staking 했냐에 따라 검증자가 선택되고, 더 많은 지분을 보유하고 있을수록 검증자로 선택될 확률이 높아집니다. 이더리움은 작업증명 알고리즘(PoW)의 문제점을 해결하기 위해서 합의 알고리즘을 지분증명 알고리즘(PoS)로 변경하는 중에 있습니다.
위임 지분증명 알고리즘은 지분증명 알고리즘을 보완하여 나타난 알고리즘 입니다. 위임지분증명 알고리즘은 지분증명 알고리즘과 마찬가지로 지분으로 블록을 생성할 권한을 주지만 위임된 몇몇의 참여자만 생성할 수 있도록 제안된 알고리즘입니다.
네트워크의 참여자들은 자신이 가진 지분을 이용하여 블록 생성을 위한 투표를 합니다. 이 때, 네트워크의 검증자 수를 제한하여 높은 수준의 확장성을 제공할 수 있는 알고리즘이 위임지분증명 알고리즘 입니다. 검증자의 수는 각각의 블록체인마다 다릅니다.
합의 알고리즘이 네트워크에서 통용되기 위해서는 Safety와 Liveness라는 특성을 가지고 있어야 합니다.
Safety
노드간 합의가 발생했다면, 어느 노드가 접근하든 그 값은 동일해야 한다는 특성
블록체인에서의 finality와 동일한 개념으로 생각할 수 있음
Liveness
합의 대상에 문제가 없다면 네트워크 내에서 반드시 합의가 이루어진다는 특성
하지만 비동기 네트워크에서는 Safety와 Liveness를 모두 완벽히 만족하는, 즉 합의 문제를 완벽히 해결할 수 있는 분산 알고리즘이 없습니다. 따라서 이러한 문제를 비잔틴 장애 허용을 통해 해결합니다. 그럼 비잔틴 장애 허용은 무엇일까요? 비잔틴 장애 허용에 대해 알아보기 이전에 비잔틴 장군 문제에 대해 살펴봅시다.
비잔틴 장군 문제는 1982년 래슬리 램포트와 마샬피즈가 함께 쓴 논문에서 제시된 논리적 딜레마입니다. 비잔티움의 장군들이 차후의 행동을 합의하려 할 때, 발생할 수 있는 의사소통의 문제에 대한 이야기 입니다. 광활한 영토 지역에 각 장군들은 자신의 군대를 가지고 있고, 각 장군이 공격하려는 도시가 아닌 다른 장소에 있을 경우를 가정합니다. 공격이 성공하기 위해서는 모든 장군이 이끄는 군대를 집중시켜야 하는데, 모든 장군이 합의에 도달하지 못한다면 공격은 실패하게 됩니다. 특히 배신자가 있다면 실패할 가능성이 더더욱 커집니다.
비잔틴 장군 문제의 조건을 블록체인으로 생각하면 장군들은 하나의 노드가 되며 다음과 같은 조건을 가지게 됩니다.
이러한 조건에서 네트워크의 참여자들이 정직하게 행동하는 것이 보장할 방법이 있어야 합니다. 일부 노드가 고장나거나 악의적으로 행동하더라도 블록체인 네트워크는 계속 작동해야하기 때문입니다.
이러한 비잔틴 장군 문제를 해결하기 위한 방법은 다양할 수 있습니다. 블록체인에서는 비잔틴 장애 허용을 이용한 합의 알고리즘을 통해 이러한 문제를 해결합니다. 비트코인에서는 합의 알고리즘으로 작업증명 알고리즘을 사용하는데, 작업증명은 비트코인보다 오래된 것이지만 이를 수정하여 비잔틴 장애허용 시스템으로 비트코인이 탄생하였습니다.
작업 증명 알고리즘이 비잔틴 실패를 100% 막아내는 것은 아니지만 비용집약적인 마이닝 과정과 암호화 기술로 인하여 블록체인 네트워크에서 작동하는 가장 안전하고 신뢰할 수 있는 것으로 증명되었습니다.
프랙티컬 비잔틴 장애 허용은 분산시스템이 약속된 행동을 하지 않는 노드가 존재할 수 있는 비동기 시스템일 때, 해당 시스템에 참여한 모든 노드가 성공적으로 합의를 이룰 수 있도록 개발된 합의 알고리즘 입니다. 위 알고리즘은 Safety를 확보하고 Liveness를 일부 희생하면서 비동기 네트워크에서도 합의를 이룰 수 있습니다. 합의는 다음과 같은 과정을 통해 수행합니다.
블록체인 합의 알고리즘 중 BFT 방식을 채택한 경우 대부분의 PBFT 합의 알고리즘을 바탕으로 조금씩 변형을 가한 것입니다. 이러한 PBFT 합의 알고리즘은 비동기 네트워크에서 배신자 노드가 f개 있을 때, 총 노드 개수가 3f+1개 이상이면 해당 네트워크에서 이루어지는 합의는 신뢰할 수 있다는 것을 수학적으로 증명하였습니다.