중국에서 가장 큰 인기를 얻고 있는 퍼블릭 체인 프로젝트, “Conflux”

Conflux Chain.Kor
12 min readNov 7, 2019

--

컨플렉스 블록체인 프로젝트에 대하여

컨플럭스는 블록체인을 확장한 블록트리(block tree)와 DAG(Directed Acyclic Graph)를 활용해서 트랜잭션을 ‘자연스럽게’ 분산 처리하여 네트워크의 확장성과 보안성을 동시에 개선하는 한편, 규모의 경제를 완화하여 채굴 노드가 다양하게 분산될 수 있는 환경을 제공하고자 한다. 만약 잘 설계되었다면, 컨플럭스는 일반적인 샤딩 알고리즘에 필요한 온체인 랜덤 숫자 생성(RNG; Random Number Generation) 등의 복잡한 절차 없이도 자연스러운 지리적 샤딩(geological sharding)을 만들어 낼 수 있다.

컨플럭스 프로토콜의 원리

컨플럭스는 크게 세 개의 빌딩블록(building block)으로 구성되어 있는데, 이해를 돕기 위해 각각을 순차적으로 쌓아 나가도록 하겠다. 첫 번째 빌딩블록고스트 프로토콜(GHOST Protocol)이다. 가장 긴 체인을 메인 체인으로 삼는 비트코인과 달리 고스트 프로토콜에서는 가장 무거운 서브트리(heaviest subtree)를 따라가는 체인을 피봇 체인(pivot chain)이라고 부르고 이것을 메인 체인으로 삼는다.

‘가장 무거운 서브트리’와 ‘피봇 체인’의 개념을 도식화한 것. 빨간색이 일반적인 ‘가장 긴 체인’이고 파란색이 ‘피봇 체인’이다.

여기서 ‘무겁다’는 것은 자손이 더 많다는 의미이다. 예를들어 위 오른쪽 그림에서의 A와 B처럼 형제 관계에 있는 블록 사이에서 A는 3개의 자손 블록을, B는 4개의 자손 블록을 가지므로 B가 A보다 더 무겁다. 고스트 프로토콜의 장점은 고아 블록도 네트워크의 보안에 기여할 수 있다는 점이다.

‘가장 긴 체인 법칙’에 따라 A 블록에 있는 트랜잭션을 되돌리기 위해서는 A와 그 뒤에 이어지는 3개의 블록을 되돌려야 하는 반면 ‘가장 무거운 체인 법칙’에 따라 B 블록에 있는 트랜잭션을 되돌리기 위해서는 B와 그 뒤에 이어지는 4개의 블록을 되돌려야 한다. 즉, 기존에는 이중 지불 공격을 위해 하나의 메인 체인들의 블록들만 되돌리면 되었지만 고스트 프로토콜에서는 메인체인에 연결된 고아 블록들까지 모두 되돌려야 하므로 네트워크의 보안이 더 안전해지는 것이다.

컨플럭스의 두 번째 빌딩블록은 DAG+블록트리 구조이다. 컨플럭스에서 블록들의 관계는 일반적인 블록체인에서의 부모-자식 관계 외에 그보다 조금 더 느슨한 관계인 참조(reference) 관계가 있다. X블록이 Y블록을 참조한다는 것의 의미는 (부모-자식 관계와는 달리) X블록이 Y블록의 유효성을 지지한다는 것이 아니라 단순히 X블록이 Y블록을 ‘목격했다’는 의미이다. 즉 Y블록이 X블록보다 먼저 생성되었다는 것을 X블록이 인정해준다는 의미이다. 제네시스 블록을 제외하면 각 블록은 부모로는 단 하나의 블록만 지정할 수 있지만, 참조 블록은 동시에 여러 개를 지정할 수도 있다.

컨플럭스 블록 DAG의 구조. 실선 화살표로 연결된 트리 구조에서 점선 화살표의 DAG 구조가 합쳐져있다.

위 그림에서 실선으로 표시된 (A<-D), (Genesis<-B), (E<-H) 등은 부모-자식 관계이고 점선으로 표시된 (B<-C), (F<-E) 등은 참조 관계이다. 메인 체인의 역할인 피봇 체인을 결정하는 데는 부모-자식 관계만을 유효한 것으로 인정한다. 따라서 위 그래프에서 피봇 체인은 (Genesis<-A<-C<-E<-H)가 된다. 위 그림에서 확인할 수 있듯 컨플럭스에서 부모-자식 관계도는 트리 구조로 구성되어있으며 참조관계를 포함하면 DAG 구조이다.

컨플럭스의 세 번째 빌딩블록은 낙관적 블록 처리(optimistic block processing)이다. 일반적으로 DAG 기반의 프로토콜들은 서로 직접적인 선후관계가 존재하지 않는 블록들(예를 들어 위 그림의 D와 J)에 대한 순서관계(ordering)를 정하지 않는다. 그렇기 때문에 그런 블록들 사이에 서로 상충되는 트랜잭션이 존재할 경우 둘 중 하나의 블록만을 참으로 인정하고 다른 블록은 버려진다. 이와는 달리 컨플럭스에서는 전체 블록들의 순서관계나 개별 트랜잭션 사이의 상충은 ‘일단’ 신경쓰지 않고 유효한 블록이 생성되기만 하면 낙관적으로 포함시킨 뒤 일정한 프로토콜에 따라 사후적으로 전체 순서(global ordering)를 정한다.

컨플럭스에서 트랜잭션의 순서를 정하는 방법. 블록B와 G에 서로 상충되는 트랜잭션인 Tx3과 Tx4가 담긴 상황을 나타낸다.

순서를 정하는 방법은 다음과 같다. 먼저, 피봇 체인 안에 있는 블록들 사이의 순서는 일반적인 블록체인에서와 같이 부모 블록이 자식 블록보다 우선한다. 다음으로, 피봇 체인 내의 각 블록들은 각각 하나의 에폭을 형성하고 자신이 해당 에폭의 가장 마지막 순서를 가지게 된다. 피봇 체인이 아닌 블록들은 자신을 직·간접적으로 참조하는 피봇 체인 내의 블록 중 가장 순서가 빠른 블록의 에폭에 포함된다.

예를 들어 위 그림에서 D는 피봇 체인 내의 E에 의해 참조되므로 E의 에폭에 속하게 된다. 또한 J는 I의 부모이고 I는 H에 의해 참조되므로 J는 H의 에폭에 속한다. 이때, 하나의 에폭 안에 있는 블록들 사이의 순서는 만약 부모-자식 관계나 참조관계가 있으면 해당 관계를 따르고 순서가 없을 경우 블록 해시값을 비교하여 결정론적인(deterministic) 방법으로 순서를 정한다.

예를들어 H의 에폭에 속한 J와 I는 J가 부모 블록이므로 J가 I에 우선하고, 마찬가지로 H의 에폭에 속하였지만 부모-자식 관계나 참조관계가 없는 G와 I는 블록 해시값을 비교해서 순서를 정한다.

마지막으로, 서로 다른 에폭에 속하는 블록들은 앞의 에폭에 속한 것을 우선한다. 예를 들어 위 그림에서 D는 E의 에폭에 속하고 J는 H의 에폭에 속하기 때문에 D가 J보다 우선한다. 이 규칙을 종합하여 위의 블록들에 순서를 매겨보면 (Genesis, A, B, C, F, D, E, J, I, G, H)가 되고(D와 F, G와 I사이의 순서는 임의로 정한 것) K는 아직 순서가 정해지지 않은 상태이다.

컨플럭스는 이처럼 블록을 일단 낙관적으로 포함시킨 후 그것이 피봇 체인에 포함되거나 특정 에폭에 포함되었을 때(즉 피봇 체인 내의 블록에 의해 직·간접적으로 참조되었을 때) 순서를 확정하고 장부의 상태를 업데이트하는 방식을 사용한다. 여기서 자연스럽게 드는 의문은 블록을 앞서 정한 순서에 따라 정렬했을 때 서로 상충되는 트랜잭션을 어떻게 처리하는가 하는 부분일 것이다.

컨플럭스는 여기에 대해 아주 간단한 답을 제시한다. 단순히 나중에 발생한 트랜잭션을 무시해버린다. 예를 들어 위 그림에서 X의 계좌에는 10개의 코인밖에 없는데 Tx2와 Tx3는 이 계좌에서 각각 8개의 코인을 소비하려고 하므로 서로 상충되는 트랜잭션이다. 한편 Tx2가 속한 A가 Tx3이 속한 B보다 우선하므로 컨플럭스 프로토콜은 Tx3을 무시한다.

비슷하게 Tx4는 B와 G에서 중복으로 처리되었는데 B가 G에 우선하므로 G에서 처리된 것은 무시한다. 여기서 무시되는 것은 개별 트랜잭션이지 블록 전체가 아니라는 것에 주목할 필요가 있다. Tx3이 무시되더라도 여전히 B에 속한 다른 트랜잭션들은 정상적으로 처리된다. 이런 구조이기 때문에 컨플럭스 체인에서 트랜잭션은 단지 블록에 포함되었다고해서 처리된 것이 아니라 자신이 포함된 블록이 피봇 체인에 포함되거나 피봇 체인 내의 블록에 의해 직·간접적으로 참조된 후 규칙에 따라 정렬했을 때 유효하다는 것을 확인한 후에 처리된 결과를 확인할 수 있다.

물론 가장 긴 체인 규칙에서 가장 긴 체인의 마지막 블록이 확정되는 데에 일정한 시간(가령 비트코인의 경우 약 1시간 정도)이 추가적으로 필요한 것처럼 피봇 체인도 그 체인이 진짜 피봇체인인지 확정하는 데까지 추가적인 시간이 필요한데, 컨플럭스 기술 논문에 따르면 비트코인 네트워크와 비슷한 조건으로 비교했을 때 약 6분 정도면 충분하다고 한다.

이중 지불 공격 시나리오

어떤 공격자가 Tx2를 이중지불하기 위해 제네시스 블록을 부모로 지정한 AttackB라는 블록을 생성했다고 하자. AttackB가 비록 제네시스 블록의 직계자손일지라도 컨플럭스의 프로토콜에 따르면 이것은 피봇 체인에 속하지도 않았고 아직 어떠한 에폭에도 속하지 않기 때문에 이 블록 안의 트랜잭션은 처리되지 않는다. 한편 앞서 고스트 프로토콜에서 설명한 것과 같이 피봇 체인을 바꾸는 것은 가장 긴 체인을 바꾸는 것보다 더 어려운 일이다.

합의 프로토콜에 따라 공격이 실패했다.

따라서 AttackB 내의 트랜잭션이 처리되는 유일한 방법은 이 블록이 피봇 체인에 속한 블록에 의해 참조되는 방법뿐인데, 그 블록은 분명히 A보다는 뒤에 있게 될 것이다. 따라서 공격자의 블록은 A의 에폭보다 순서가 늦은 에폭에 포함될 것이기 때문에 Tx2가 아니라 Tx2와 상충되는 AttackB의 트랜잭션이 무시될 것이다.

이러한 구조는 위 논문에서 지적한 작업증명 기반 블록체인의 한계의 전제를 파괴하게 된다. 반드시 피봇 체인에 포함되지 않더라도 일단 유효한 블록을 생성하기만 하면 사후적으로 반드시 처리되기 때문에 채굴자들은 자신들의 블록이 피봇 체인에 포함될지 여부를 알 필요가 거의 없다.

따라서 블록 전파와 검증에 소요되는 시간을 충분히 고려해서 블록 사이즈와 블록 생성 주기를 적절히 제한해야 하는 비트코인 프로토콜과 달리 그러한 제약이 거의 없어진다. 따라서 컨플럭스에서는 현재의 비트코인보다 더 큰 블록을 훨씬 짧은 간격으로 생성할 수 있다.

블록이 피봇 체인에 포함되지 않아도 블록 생성에 대한 보상을 어느 정도 받을 수 있다는 특징 때문에 컨플럭스는 채굴 보상의 확률적 편차가 낮다. 예컨대 작은 컴퓨팅 파워로 비트코인 채굴을 시도하는 것은 마치 복권을 구매하는 것과 같이 아주 운 좋게 채굴에 성공하면 많은 수익을 얻을 수 있지만, 대부분의 경우 하나도 채굴하지 못하고 투자금만 낭비하게 된다.

이와 달리 컨플럭스는 작은 수익이라도 비교적 일정하게 얻을 수 있다. 따라서 채굴자들이 현재의 비트코인과 같이 중앙화된 채굴풀에 들어갈 유인이 줄어들고 해시파워를 훨씬 더 분산시킬 수 있다.

시뮬레이션 데이터

컨플럭스 기술 논문은 여러 가지 시뮬레이션 데이터를 제공하고 있다. 네트워크 대역폭 제한 20Mbps와 40Mbps에 대해 각각 실험하였으며 1만 개에서 최대 2만 개의 풀노드를 20개국 800개의 EC2 가상머신에 분산 배치하고 도시 간 지연(latency)까지 고려하였다고 한다. 비트코인 프로토콜 및 고스트 프로토콜과의 비교도 제시하고 있다.

비트코인, 고스트, 컨플럭스의 블록 크기와 주기에 따른 블록 사용성을 비교한 그래프(위)
비트코인, 고스트, 컨플럭스의 블록 크기와 주기에 따른 블록 컨펌 시간을 비교한 그래프(아래)

시뮬레이션 데이터에 따르면 컨플럭스는 대역폭을 20Mbps로 제한했을때 4MB 블록 사이즈 및 블록 생성 주기 5s의 조건에서 2.88G/h의 처리용량을 보인다. 비트코인과 고스트 프로토콜에서 블록 사이즈 및 주기에 따라 버려지는 블록의 비율이 유의미하게 영향을 받는 것과 달리 컨플럭스에서는 모든 조건에서 거의 100%에 가까운 블록 사용성(block utilization)을 자랑한다.

공격자가 20%의 해시파워를 보유한다고 가정하고 허용오차(risk tolerance)을 0.01%로 잡았을 때 위와 같은 조건에서 컨플럭스의 트랜잭션 컨펌 시간은 평균적으로 10분 정도로 나타났다. 비트코인의 경우 서론에서 언급한 것과 같이 짧은 블록 생성 주기와 큰 블록 사용은 매우 긴 컨펌 시간으로 이어진다.

컨플럭스에서도 공격자의 비율이 증가할수록 트랜잭션 컨펌 시간이 길어지기는 하지만 컨펌을 위해 기다리는 시간에 따라 트랜잭션이 되돌려질 위험도가 지수적으로 감소하는 모습을 볼 수 있다. 이것은 고스트 프로토콜의 구조를 통해 네트워크 해시파워가 네트워크 보안에 매우 효율적으로 사용되고 있기 때문이다.

추가로, 네트워크의 대역폭 제한을 40Mbps로 상향 조정할 경우 5.76Gb/h, 비트코인 기준 약 6400TPS의 처리용량을 보여주었다고 한다.

결론

컨플럭스는 블록체인의 확장성 문제에 대해 기존의 타 프로젝트들과는 완전히 다른 형태의 솔루션을 제시하고 있다. 일반적으로 알려진 샤딩과 같이 여러 트랜잭션을 병렬적으로 처리히여 수평적 확장을 제공하면서도 그것을 위한 별도의 온체인 절차를 요구하거나 네트워크의 보안을 희생하지 않으며 오히려 더 강화한다. 또한 DAG를 기반으로 한 타 솔루션들이 블록 혹은 트랜잭션들의 위상적 순서(topological order)만을 제공하고 분산장부의 전체 상태(global state)를 확인하기 힘든 것과 달리 컨플럭스는 피봇 체인을 중심으로 항상 모든 블록의 절대적 순서와 분산장부의 전체 상태를 일반적인 나카모토 합의에서처럼 확률적으로 확인할 수 있다.

기술 논문에는 작업증명 알고리즘을 기준으로 기술하고 있지만, 지분증명이나 다른 알고리즘도 메커니즘 설계만 잘 한다면 충분히 적용될 수 있으며 샤딩과 같은 기존의 온체인 솔루션이나 플라즈마 사이드체인, 스테이트 채널 등의 오프체인 솔루션들과도 병용할 수 있는 구조이다. 또한 논문상에서는 합의 알고리즘 자체에 대해서만 집중하고 스마트 컨트랙트나 라이트 노드 등에 대해 구체적으로 언급하고 있지 않지만 이러한 기능들 역시 충분히 구현 가능할 것으로 보인다. 즉 컨플럭스는 기술적인 측면에서 범용적인 솔루션을 제공하고 있다고 할 수 있다.

[Conflux Community]

Conflux Website: https://www.conflux-chain.org
Medium: https://medium.com/@confluxchain.kor
Naver Blog: https://blog.naver.com/conflux-chain
Telegram: t.me/ConfluxKorea

--

--

Conflux Chain.Kor

Conflux는 처리량의 증가와 확인 속도 향상을 위해 PoW 나카모토 컨센서스 프로토콜을 기반으로 한 빠르고 확장 가능한 Tree-graph입니다.