3 분 소요

Casper


캐스퍼는 기존 이더리움의 작업증명 방식의 합의 알고리즘에 더하여, 지분증명을 기반으로 블록을 확정시키는 추가적인 메커니즘이다.

롤백 방지 : CheckPoint

coindesk

위 그림과 같이 캐스퍼는 블록체인에서 가장 먼저 생성된 블록인 제네시스 블록부터 매 32블록마다 위의 그림처럼 선택이 이루어지는데 이때 검증인 간 투표로 인해 선택이 이루어지는 블록을 ‘체크포인트’라고 한다. 체크포인트 간 거리를 늘릴수록 알고리즘 오버헤드(연산 시간, 메모리, 네트워크 광역대 등)을 줄이는 효과가 있다. 하지만 거리가 늘어나면 합의가 지연된다는 딜레마가 존재한다. 이러한 체크포인트는 악의적인 포크를 생성하여 원래의 정상적인 체인을 롤백시키는 51% 공격이 발생하더라도, 캐스퍼에 의하여 이미 한 번 확정된 체크포인트 이전의 블록들로 롤백시키는 걸 방지한다.

캐스퍼는 PoS와 매우 유사하며, 각 검증인들은 자신의 예치금을 걸어두고 총 예치금 중 자신이 차지하는 지분만큼 투표에 영향을 행사할 수 있다.

여기서 투표란 조상 체크포인트와 특정 체크포인트 간, 단 하나의 연결을 확정시키는 것이며, 다음 그림과 같다.

link

  • s : 조상의 체크포인트
  • t1, t2 : 자손 체크포인트 중 하나의 체크포인트
  • h(s) : 조상 체크포인트의 높이
  • h(t1 or t2) : 자손 체크포인트의 높이
  • v1, v2, v3 : 검증인 자신의 공개키

이와 같은 과정을 통해

  1. 메시지에 포함된 다른 검증인 공개키가 원래 검증인들의 집합에 속해있는 검증인의 것인지 확인함으로써 검증인 집합 외부로부터 스팸 메시지가 전송되지는 않았는지 확인
  2. 조상 및 자손 체크포인트의 높이를 확인함으로써 s가 t1 or t2의 조상이 확실한지도 확인

의 검증 과정을 거치며, 검증 과정이 유효하다면 투표를 진행하고, 전체의 지분 2/3이상 투표를 받아 연결을 인정한다. 그러나 Supermajority Link로 연결 인정은 블록이 확정된 것이 아니며, justify된 블록 바로 위 높이가 1만큼 높은 자식 체크포인트와 Supermajority link로 연결되어야 확정된 것이다.

투표 규칙에 따른 패널티 부과를 통한 Nothing at Stake Problem 해결

coindesk2

기존의 PoS에서 발생할 수 있는 Nothing at Stake Problem을 해결하기 위해 캐스퍼에서는 검증인들이 투표할 때 지켜야 할 규칙 두가지를 제시하고, 어길 시 패널티를 부과한다. 규칙은 위 그림과 같다.

  1. 검증인은 같은 블록 높이의 t1과 t2에게 두 개, 혹은 그 이상의 투표를 할 수 없다.
  2. 검증인은 s1 -> t1, s2 -> t2 두 개의 투표를 진행할 때, s1 -> t1 범위 내에 존재하는 s2 -> t2에 대한 투표를 할 수 없다.

이에 대한 패널티는 PoS의 구조에서 예치금 몰수로 이어진다.

캐스퍼의 Safety와 Liveness

Safety


만약 합의가 이루어졌다면, 모든 정상적인 노드는 동일한 값에 접근 가능하다. 그러나 Safety가 보장되지 않을 경우, 포크가 발생할 수 있다.

Liveness


모든 정상적인 노드는 결국 합의에 도달한다. 만약 Liveness가 보장되지 않을 경우, 체크포인트가 확정되지 않는 상태가 지속될 수 있다.

문제


캐스퍼에서는 지분이 두 가지 투표 규칙을 지키는 정직한 주체들에 의하여 장악된다는 가정하에 Safety가 만족되며, Liveness는 이더리움의 작업증명과 같이 캐스퍼를 뒷받침하는 블록 제안 메커니즘에 의존적이다. 이 말은 이더리움이 51% 공격을 당하게 될 경우, 악의적인 주체는 규칙 위반에 대한 증거를 임의적으로 누락시킴으로써 규칙 위반에 대한 처벌을 회피하고, 합의는 계속 이루어지지 않기 때문에 Liveness가 훼손될 수 있다.

동적인 검증인 집합 : Dynamic Validator Sets

위의 Supermajority Link에서는 매번 동일한 검증인이 체크포인트 생성 과정에 참여한다는 것을 전제로 한 것이다. 실제로는 검증인들이 예치하고 인출하면서 검증인들이 변화한다. 이를 동적인 검증인 집합이라고 하며,

  • 검증인 참여 : deposit 트랜잭션 전송, 그 트랜잭션이 블록에 포함된 이후로 두 개의 체크포인트가 확정되면 검증인 집합에 등록
  • 검증인 탈퇴 : withdraw 트랜잭션 전송, 그 트랜잭션이 블록에 포함된 이후로 두 개의 체크포인트가 확정되면 검증인 집합에서 탈퇴

로 체크포인트가 확정될 때마다 검증인 집합이 바뀌게 된다.

동적인 검증인 집합 문제


동적인 검증인 집합의 특성을 이용하면 첫 번째 투표 규칙인 “검증인은 같은 블록 높이의 체크포인트 두 개에 투표할 수 없다.”를 어기고도 처벌받지 않는 상황을 만들 수 있다. 그 상황이 발생하는 과정은 다음과 같다.

80258_23033_3518

문제 발생은 위 그림에서 S 체크포인트가 왼쪽과 오른쪽 포크에서 S가 확정되거나, 확정되지 않거나 두 가지 경우의 수가 동시에 존재할 수 있다는 것에서 시작한다.

왼쪽 포크 : S가 확정되지 않을 경우

  • S가 확정되지 않을 경우, 검증인 집합의 변경 없이 S와 C가 supermajority link로 연결되고 C와 C의 자식 체크포인트와도 연결되어 C가 확정된다.

오른쪽 포크 : S가 확정될 경우

  • S가 확정될 경우 검증인 집합이 변경되며, C’와 C’ 자식 체크포인트 모두 연속적으로 supermajority link로 연결되어 S와 C’까지의 모든 체크포인트들이 확정된다.

문제

  • 이 때, 왼쪽 포크와 오른쪽 포크가 다른 검증인 집합을 가짐으로써, C와 C’가 동시에 확정되었기 때문에 “같은 높이의 체크포인트들에 동시에 여러 개의 표를 던질 수 없다”를 위반한다.

솔루션

  • 따라서 캐스퍼는 이러한 문제를 해결하기 위해 동적인 검증인 집합에서 이제 새로운 검증인 집합과 이전 검증인 집합 모두에서 각각 2/3이상의 투표를 받아야만 supermajority link를 생성할 수 있도록 하여 해당 문제를 해결하였다.
    • 새로운 검증인 집합 : 체크포인트가 새롭게 확정되면서 들어온 검증인들을 포함하고 탈퇴한 검증인들을 제외한 검증인 집합
    • 이전 검증인 집합 : 체크포인트가 새롭게 확정되면서 들어온 검증인들을 제외하고 탈퇴한 검증인들을 포함한 집합

80258_23035_3655

  • 오른쪽 포크의 경우, 새로운 검증인 집합에서는 투표를 받았지만 이전 검증인 집합에서는 투표를 받지 못했으므로 S와 S의 초록색 자식 체크포인트는 supermajority link를 인정받지 못한다.