[이더리움2.0 깊이보기 시리즈] ETH 2.0 Explained: Phase 0 [1편]
이더리움2.0 깊이보기 시리즈는 개발이 진행되고 있는 이더리움2.0에 관한 스펙과 작동원리에 대해서 이해의 저변을 넓히고자 하는 목적으로 온더에서 기획되었습니다. 연재는 다음 순서로 이어집니다.
[1편] — ETH 2.0 Explained: Phase 0
[2편] — Cross Shard Communication -1- 비동기 커뮤니케이션
[3편] — Cross Shard Communication -2- 동기 커뮤니케이션
[4편] — CBC casper explained (1/2)
[5편] — CBC casper explained (2/2)
[6편] — ETH 2.0 Explained: Phase 1
[7편] — 스태이트리스 클라이언트(Stateless Client)
[8편] — ETH 2.0 Explained: Phase 2
[9편] — Execution Environment
ETH 2.0 Explained: Phase 0는 이더리움 2.0의 Phase 0를 기술적으로 가능한 깊게 이해하는 것을 돕기 위해 작성되었습니다.
Notice: 본 연재물에 포함된 내용들은 활발하게 연구 및 개발이 진행중인 상태로, 구체적인 내용들은 모두 향후에 변경될 수 있습니다.
TL;DR
- Phase 0는 오직 비콘체인을 도입하는데 집중합니다. 이를 통해 지분증명(Proof of Stake)기반으로 완전히 전환하게 됩니다.
- 비콘체인이 뇌라면, 샤드체인은 손과 발입니다.
- 비콘체인은 모든 샤드체인들의 허브 역할을 하게 되며, 연결된 모든 샤드체인들의 합의를 책임지게 됩니다.
- 샤드체인은 이더리움 1.0과 같이 스마트 컨트랙트를 실행하고 자산을 전송하는 등의 실질적인 연산 기능을 수행하게 됩니다.
- Phase 0에서 샤드체인은 도입되지 않습니다.
- 비콘체인의 블록은 높이가 아니라 슬롯을 기준으로 합니다. 슬롯은 일종의 시간개념으로 해당 슬롯에 블록이 있을수도 없을수도 있습니다.
- 비콘체인을 운영하는 주체는 검증인으로, 검증인들은 각 슬롯의 위원회로 랜덤하게 배정됩니다.
- Phase 0에서 편향되지 않은 랜덤값을 생성하기 위해서 RANDAO를 사용합니다. VDF는 도입되지 않습니다.
- RANDAO는 commit-reveal 방식의 랜덤값 생성기로, 마지막 공개자가 랜덤값에 제한된 영향을 줄 수 있다는 점에서 단점이 있습니다.
- 비콘체인의 새로운 합의알고리즘은 Gasper로 LMD GHOST와 Casper FFG를 결합 및 수정하였습니다.
- LMD GHOST는 가장 최근의 메세지를 바탕으로 하여 가장 많은 지지(투표)를 받은 블록이 올바른 블록으로 간주되는 포크 선택 규칙(Fork-choice rule)입니다.
- Casper FFG는 여러개의 블록을 에폭 단위로 묶고, 각 에폭마다 마지막 블록을 체크포인트로 하여, 이 체크포인트들에 대해서 투표를 하는 합의 알고리즘입니다.
- Casper FFG의 핵심은 동일 블록에 대해 2/3 보다 많은 투표가 두번 모이게 되면, 해당 블록은 완결(Finalized)되는 것입니다. 이 두 번의 과정을 가완결(Justification), 완결(Finalization)이라 합니다.
- Gasper의 블록 제안 및 검증 투표는 LMD GHOST의 방식을 따르고, Finality 부여 방식은 Casper FFG를 따릅니다.
- 최근 Gasper에 대해 새롭게 알려진 공격방식인 Bouncing attack, Decoy-flip-flop attack 이 발견되었지만, 이를 해결하는 업데이트가 진행되었습니다.
- 이더리움 2.0 Phase 0 의 연구 및 개발은 순조롭게 진행중으로, 내년 초 혹은 중순에 성공적으로 도입될 것으로 예상됩니다.
Introduction: Phase 0 — The beacon chain
이더리움 2.0의 첫 단계인 Phase 0의 핵심은 비콘체인(Beacon chain)의 도입입니다. 향후 수 많은 샤드체인(Shard chain)들로 확장될 이더리움 2.0 체인의 중추적인 허브 역할을 하는 비콘체인을 성공적으로 동작시키는 것이 Phase 0의 주요 목표입니다. Phase 0에서는 다음과 같이 오직 비콘체인의 운영과 관련된 부분들만 포함되어있습니다.
- 검증자(Validator)들과 보증금(Stake) 관리
- 위원회(Committee)와 제안자(Proposer) 구성
- 합의알고리즘(Consensus rules) 적용
- 검증자에 대한 보상과 처벌
따라서 Phase 0를 이해하기 위해서는 비콘체인의 구조와 역할과 비콘체인에서 사용되는 합의알고리즘에 대한 이해가 필요합니다. 본 글에서는 먼저 비콘체인에 대한 간략한 소개와 더불어 핵심 구성요소들의 명칭과 역할을 소개하겠습니다.
Beacon chain
비콘체인은 이더리움 2.0의 심장으로, Phase 0 이후 도입될 수 많은 샤드체인들의 합의를 책임지는 시스템 체인(System chain)이자 중심체인(Spine chain)입니다. 기존의 이더리움 1.0의 체인과 달리 지분증명(Proof of Stake)기반으로 운영되며, 이에 참여하는 검증인(Validator)들은 비콘체인 및 샤드체인의 블록들을 검증하는 역할을 수행하며, 이 과정에서 검증인들을 랜덤하게 할당하기 위한 난수 생성(Random number generation) 프로토콜에도 참여하기도 합니다.
비콘체인을 이루는 자료구조의 핵심은 비콘상태(BeaconState)과 비콘블록(BeaconBlock)입니다.
비콘상태는 비콘블록으로 구성된 일련의 체인의 상태 전이 함수를 실행한 결과 변경되는 비콘체인 자체의 상태를 의미합니다. 비콘상태에는 포크(Fork) 버전, 캐시 기록, ETH 1체인에 대한 정보, 검증자 목록, 검증자 랜덤 선정을 위한 랜덤성에 대한 정보, 과거 검증자 처벌 기록, 최근의 검증 투표, 최근의 크로스링크(Crosslink), 그리고 확정성 혹은 완결성(Finality)에 대한 정보등이 포함됩니다.
비콘블록은 비콘체인의 핵심 요소로, 각 블록들은 자기 자신의 부모 블록과 블록 루트를 참조하여 제네시스(Genesis) 블록부터 이어져 있습니다. 비콘 블록은 헤더(Header)부분과 블록바디(Block Body)로 구성됩니다. 기존의 블록과 마찬가지로 비콘 블록 역시 헤더는 주로 바디에 포함된 정보나 현재 상태 데이터의 루트를 포함합니다. 바디 부분 역시 비콘체인의 트랜잭션에 해당하는 데이터들이 포함되며, 이는 주로 검증자들의 행동과 상태에 대한 내용들이 주를 이룹니다.
물론 비콘체인의 목적은 합의를 구성하고, 각 샤드체인들의 합의를 책임지는 것이기 때문에 기존의 이더리움 1.0과 달리 임의의 프로그램을 실행할 수 있는 것과 같은 것들은 다루지 않는다는 것에 유의하시기 바랍니다.
Shard and Crosslink
Phase 0에서 사실상 샤드체인은 도입되지 않는 것이나 마찬가지이긴 하지만, Phase 0과 향후 계속해서 등장할 용어인 샤드체인과 크로스링크(Crosslink)에 대해 간략하게 설명하겠습니다.
비콘체인이 이더리움 2.0의 척추와 같은 중심체인 역할을 한다면 샤드체인은 우리 몸의 손과 발 역할을 한다고 표현할 수 있습니다. 즉, 기존의 이더리움 1.0 체인에서 수행하던 자산의 전송이나 임의의 프로그램 실행 역할을 각 샤드체인이 수행하게 됩니다.
크로스링크는 이러한 샤드체인의 샤드블록의 상태들이 주기적으로 비콘체인에 기록되기 위한 참조(Reference)역할을 하는 데이터입니다. 만약 크로스링크가 없다면 해당 샤드체인의 블록들은 비콘체인에서 기록된 것이 아니기 때문에 비콘체인에 의해 완결성이 보장될 수 없게 됩니다. 하지만 정상적으로 크로스링크가 비콘블록에 기록되고, 해당 비콘블록이 완결되면 포함된 크로스링크에 해당되는 모든 샤드블록들 또한 완결됩니다.
또한 각 샤드체인마다 비콘체인의 검증자 풀(Pool)중 일부가 샤드체인의 위원회(Committee)로 구성되며, 해당 위원회가 샤드체인을 비콘체인과 크로스링크하게 됩니다. 일반적인 경우 각 샤드는 비콘체인에 에폭(Epoch)당 한번 기록됩니다.
물론 실질적으로 샤드체인은 Phase 1이 되어서야 도입되므로, Phase 0에서 위원회가 크로스링크를 기록할 때는 Bytes32(), 즉 Empty 32Byte만을 기록하게 됩니다. 말 그대로 빈 블록만 기록하는 것입니다.
Slot, Height and Epoch
슬롯(Slot)개념은 이후 설명드릴 비콘체인의 합의알고리즘인 Gasper의 동작과정을 이해하기 위해 반드시 이해해두셔야 할 개념입니다.
기존의 이더리움 1.0의 경우 블록 높이(Height)라는 개념을 사용했었습니다. 높이는 말 그대로 일련의 블록들을 제네시스 블록의 높이를 0으로 하여 1씩 증가시켜 기록하는 것을 말합니다. 0번 높이 다음에는 1번이, 그 다음에는 반드시 2번이 와야 하는 구조입니다. 반드시 1씩 증가하기 때문에 특정 높이를 건너뛴 상태에서 다음 높이의 블록이 생길 수 없습니다.
슬롯은 반대로 해당 높이의 블록이 반드시 존재해야 하는 높이 개념과 달리, 해당 슬롯에 블록이 존재할수도, 혹은 그렇지 않을수도 있는 일종의 시간개념에 가깝습니다. 슬롯은 블록의 제안자(Block proposer)가 검증(Attestation)을 받기 위해 블록을 제출할 수 있는 일정 기간을 의미합니다. 따라서 슬롯은 얼마든지 비어있을 수도 있고, 검증된 블록으로 채워질수도 있는 것입니다.
에폭(Epoch)은 여러개의 슬롯으로 이뤄진 하나의 큰 주기이며, 에폭마다 검증인들이 다시 랜덤하게 여러 위원회로 구분되어 선정됩니다. 현재 논의되고 있는 에폭당 슬롯의 수는 64개입니다.
Validator, Block Proposer, Committee, and Attestation
검증인(Validator)은 비콘체인을 운영하는 핵심 주체입니다. 검증인은 랜덤하게 블록 제안자(Block Proposer), 위원회 등으로 선정되어 비콘블록 및 샤드블록의 제안 및 검증을 수행하게 됩니다. 검증인으로 참가하기 위해서는 이더리움 1.0의 예치 컨트랙트(Deposit Contract)에 32ETH를 예치해야 합니다.
블록 제안자(Block Proposer)는 검증인들 중 랜덤하게 선정되며, 검증 대상 블록을 제안하게 됩니다. 비콘체인과 각 샤드체인의 슬롯마다 하나의 제안자가 선정됩니다.
위원회(Committee) 역시 랜덤하게 선정된 검증자들로 이루어진 하나의 집단으로 비콘체인과 샤드체인의 블록의 유효성을 검증하는 역할을 합니다.
검증 투표 혹은 검증(Attestation)은 말 그대로 비콘과 샤드블록의 유효성에 대한 검증 투표를 의미합니다.
Randomness — RANDAO
이더리움 2.0의 Phase 0에서 편향되지 않은 랜덤값을 생성하기 위해 사용하는 방법은 RANDAO로 간단한 commit-reveal 방식을 이용합니다.
RANDAO에 참여하는 참가자들은 비밀값을 해싱한 해시값만을 우선적으로 등록(Commit)하게 됩니다. 이어서 차례대로 해시값과 일치하는 비밀값을 공개(Reveal)하여, 이 비밀값들을 XOR하여 랜덤값을 생성하게 됩니다.
이더리움 2.0의 RANDAO또한 위원회에 소속된 검증인들이 각각 해시를 제출하고, 이를 차례대로 공개하여 랜덤값을 구성하게 됩니다. 일견 RANDAO 방식은 완벽하게 편향되지 않은 랜덤값을 생성할 수 있는 것처럼 보이지만, 한가지 치명적인 단점이 존재합니다.
바로 마지막 공개자 공격(Last Revealer Attack)으로 마지막으로 비밀값을 공개하는 참가자는 미리 결과값을 계산할 수 있게 되어, 자신의 비밀값을 공개하거나 비공개하여 자신에게 유리한 값이 생성되도록 유도할 수 있습니다. 이를 방지하기 위해 추후 검증가능한 지연 함수(Verifiable Delay Function; VDF)를 도입하여 랜덤값을 산출하는 연산을 지연시켜 마지막 공개자도 이를 알 수 없도록 하는 방법이 도입될 예정입니다. 하지만 Phase 0 에서는 오직 RANDAO만 적용됩니다.
Consensus — Gasper(Combining LMD GHOST and Casper FFG)
Notice: 본 파트에서 다루는 Gasper(Combining LMD GHOST and Casper FFG)는 여전히 활발하게 연구중으로, 가장 최근까지 논의된 내용을 바탕으로 설명드립니다. 향후 구체적인 내용이 변경될 수 있습니다.
이더리움 2.0의 비콘체인의 합의 알고리즘으로 사용될 Gasper는 완전한 지분증명(Proof of Stake)기반의 합의 프로토콜입니다. 기존에 논의되었던 Casper FFG의 경우 블록을 제안하는 과정에서 작업증명(Proof of Work)방식이 사용되었지만, Gasper는 모든 과정에서 작업증명을 필요로 하지 않습니다.
Gasper는 완결성을 보장하기 위한 Casper FFG와 포크 선택 규칙(Fork-choice rule)을 위한 LMD GHOST를 수정 및 결합하였습니다. 2/3보다 많은 검증자들이 올바를 때(Honest), 적절한 동기 모델(Synchrony assumptions)하에 plausible liveness와 probabilistic liveness를 보장하며, 동적인 검증자 집단 가정하에서도 Safety를 보장한다고 합니다. 하지만 이는 여전히 연구 및 검토 중으로, 현재까지 알려지지 않은 공격방식이 발견될 수 있는 여지가 있습니다.
본격적으로 Gasper를 살펴보기 전에 먼저 핵심 구성요소인 LMD GHOST와 Casper FFG에 대해 설명드리겠습니다.
LMD GHOST
LMD GHOST는 Latest Message Driven Greediest Heaviest Observed SubTree의 약자로, 기본적으로 기존 이더리움 1.0의 GHOST 알고리즘의 수정된 버전입니다. LMD GHOST의 핵심은 가장 최근의 메세지를 기반으로 하여 가장 많은 참가자가 선택한 체인을 따르도록 하는 것입니다.
비탈릭 부테린의 설명을 통해 이를 더 자세히 살펴보겠습니다.
먼저 검증인 A, B, C, D, E가 있고, 각 검증인들은 순서대로 0번째 슬롯부터 블록을 제안할 수 있습니다. LMD GHOST를 따르는 클라이언트는 각 검증인이 서명한 가장 최근의 메세지, 즉 가장 높은 슬롯의 블록을 기준으로만 판단합니다. 아래 그림에서 최근의 메세지는 파랑색으로 표시되어 있습니다.
여기서 이 메세지들을 바탕으로 하여 “greedy heaviest observed subtree” (GHOST) fork choice rule을 구성해보겠습니다. 제네시스 블록부터 시작해서 최근 메세지 중 가장 많은 수가 지지하는 쪽의 포크를 선택하고, 이를 계속해서 자식 블록이 없을 때까지 지속합니다. 이를 통해 현재 체인의 헤드(Head)가 무엇인지 결정할 수 있습니다.
첫 블록에서 시작해, 첫 포크에서는 4개의 최근 메세지가 지지하는 체인을 선택합니다. 그리고 두번째 포크에서는 2개의 메세지가 지지하는 중간 체인을 선택하게 됩니다. GHOST에 익숙하신 분들은 총 난이도(Total Difficulty)의 개념이 최근 메세지 수의 합으로 변경되었을 뿐이라는 것을 쉽게 눈치채실 수 있을것입니다.
사실 잘 작동하는 네트워크, 즉 고아 블록의 발생률(Orphan rate)이 낮은 경우에는 LMD GHOST와 Longest chain rule(가장 긴 체인이 올바른 것으로 간주하는 규칙, 비트코인에서 적용)의 적용 결과가 거의 동일할 것입니다. 하지만 네트워크 상황이 좋지 않을 경우 결과는 얼마든지 달라질 수 있습니다. 예시를 통해 살펴봅시다.
체인의 길이를 통해 포크를 결정할 경우, 가장 위쪽의 체인이 높이가 6으로 가장 길기 때문에 올바른 체인이 됩니다.
반대로 LMD GHOST를 적용할 경우, 아래 체인이 최근의 메세지 중 가장 많은 지지를 받고 있기 때문에 올바른 것으로 간주됩니다.
LMD GHOST는 지연율이 높은 상황에서 올바른 포크를 보다 올바르게 선택할 수 있다는 점에서 이점이 있습니다. 만약 두명의 검증인이 동일한 블록을 부모블록으로 하는 다른 두개의 블록을 각각 생성 했을 경우, 이 둘은 서로 배치되는 투표를 하였지만, 사실상 동일한 부모블록에 대해 투표한 것과 다름이 없기 때문입니다. 반면 Longest chain rule은 이러한 점들을 반영하지 못합니다. 기존의 이더리움 1.0의 GHOST가 Longest chain rule의 단점을 보완하기 위해 제시된 것처럼 LMD GHOST 또한 동일한 장점을 갖습니다.
LMD GHOST를 알고리즘으로 나타내면 위와 같습니다. 제네시스 블록부터 시작해서(Line 2), 검증자들에게서 가장 최근의 검증 투표 메세지들로(Line 3), 자식 블록이 없을 때까지(Line 4) 가장 많은 비중이 투표된 블록을 선택(Line 5)합니다.
Casper FFG
Casper FFG는 Casper the Friendly Finality Gadget의 약자로 PoS 기반의 하이브리드 합의 알고리즘입니다. 기존에 이더리움 2.0의 합의 알고리즘으로 채택 예정이었던 만큼, Gasper의 핵심적인 완결성 부여방식 등은 모두 Casper FFG를 바탕으로 하고 있습니다.
Casper FFG의 전체적인 동작과정을 간단하게 표현하면 다음과 같습니다. 여러개의 블록들로 구성된 에폭이 존재하고, 각 에폭의 마지막 블록은 체크포인트가 됩니다. 검증인들은 이 체크포인트에 대한 합의를 위해 투표를 하게 되고, 2/3보다 많은 투표가 모이면 해당 체크포인트는 Justified되고, 부모 체크포인트까지의 블록들은 모두 Finalized 되는 구조입니다. 이를 조금 더 자세히 살펴보도록 하겠습니다.
검증인의 투표 메세지는 위와 같이 구성됩니다. s는 이미 Justified가 완료된 체크포인트이고, t는 s의 자손 체크포인트 중 하나입니다. h(s)와 h(t)는 각각 s와 t의 높이를 의미합니다. 이 때 s와 t가 반드시 인접한 체크포인트일 필요는 없다는 점에 유의하시기 바랍니다.
Supermajority link
만약 두 체크포인트(s, t) 간에 검증인들 중 2/3보다 많은 수가 투표를 했을 경우, (s, t)는 Supermajority link가 됩니다. 이 때 t는 Justified됩니다.
Justified checkpoint
위 그림에서 r → b1 → b2 → b3는 모두 각각 Supermajority link가 형성되어 있고, Justified되어 있는 상태입니다. 하지만 r을 제외하고 b1, b2, b3는 모두 아직 Finalized 상태는 아닙니다.
Finalized checkpoint
체크포인트 s가 Finalized가 되기 위해서는, 이미 s가 Justified 되었고, s,t가 인접한 에폭의 체크포인트이며, s와 t가 Supermajority link가 되어야 합니다. 즉, h(t) = h(s) + 1 입니다.
Slashing condition
Casper FFG의 삭감조건(Slashing condition)은 두가지로 매우 간단합니다. 첫째는 동일한 높이에 충돌되는 두개의 다른 체크포인트를 투표할 수 없다는 것입니다. 둘째는 하나의 체크포인트 쌍(s1, t1)의 높이 h(s1), h(t1) 사이에 있는 쌍(s2, t2)에 투표할 수 없다는 것입니다.
이러한 삭감조건을 위반하여 보증금을 삭감당하지 않는 이상, 두개의 다른 포크에 있는 체크포인트가 모두 Finalized 되는 것은 불가능합니다. 이를 통해 Accountable Safety를 보장할 수 있습니다. 또한 항상 새로운 체크포인트가 Finalized 될 수 있고, 새로운 블록이 계속해서 생성될 수 있기 때문에 Liveness도 보장됩니다.
Gasper
앞서 설명했던 LMD GHOST와 Casper FFG를 활용하여 새로운 합의 프로토콜인 Gasper가 어떻게 구성되는지 구체적으로 살펴보겠습니다.
먼저 Gasper를 구성하는 핵심 개념들인 에폭 경계 페어(Epoch boundary pairs)과 위원회(Committees)에 대해 살펴보고 구체적인 블록 제안 및 투표 과정, 그리고 가완결과 완결조건을 살펴보겠습니다.
Epoch boundary Blocks and Pairs
에폭 경계 블록(Epoch boundary block; EBB)은 해당 에폭의 첫번째 슬롯과 같거나 혹은 더 낮은 슬롯 중 가장 높은 슬롯의 블록을 의미합니다. 설명이 다소 어렵게 보일수도 있지만 사실은 매우 간단합니다.
예를 들어 보겠습니다. 3번째 에폭의 첫번째 슬롯 넘버는 64*2인 128이 될 것입니다. 따라서 3번째 에폭의 에폭 경계 블록은 128번 슬롯과 같거나 더 낮은 슬롯 중 가장 높은 블록이 됩니다. 만약 3번째 에폭의 첫 슬롯에서 블록이 문제 없이 처리되었다면 해당 블록이 에폭 경계 블록이 될 것입니다. 하지만 해당 슬롯에 블록이 없을수도 있기 때문에 127이하의 슬롯 중 가장 높은 슬롯의 블록이 에폭 경계 블록이 됩니다.
에폭 경계 블록을 해당 블록이 포함된 에폭과 함께 순서쌍의 형태 페어 (B, j)로 정의할 수 있습니다. 이를 에폭 경계 페어(Epoch boundary pairs)이라 하고, 이는 Casper FFG의 체크포인트와 같은 역할을 수행하게 됩니다.
어떠한 블록 B가 있다고 할 때, B가 포함된 체인의 j번째 에폭 경계 블록은 EBB(B, j)로 정의할 수 있습니다. 또한 마지막 에폭 경계블록(Last Epoch Boundary Block)을 LEBB(B)로 정의할 수 있습니다. 물론 모든 블록 B에 대해서 EBB(B, 0) = Genesis 입니다.
위 그림을 통해 에폭 경계 블록의 개념에 대해 더 자세히 살펴보겠습니다. EBB(C, 1) = B 이고, EBB(D, 1) = A임을 확인할 수 있습니다. 이는 C가 포함된 체인에서 에폭 1의 첫 슬롯인 64의 블록이 B이기 때문이고, D블록이 포함된 체인에서 에폭 1의 첫 슬롯에는 어떠한 블록도 없기 때문에 더 낮은 슬롯 중 가장 높은 블록인 에폭 0의 슬롯 63의 블록이 A이기 때문입니다.
이 때 주의해야 할 것은 어떠한 에폭 경계 블록 B’이 에폭의 첫번째 슬롯이 아닌 이상 해당 블록을 포함하는 모든 체인에서 에폭 경계 블록이 아닐수도 있다는 것입니다.
이는 당연한 이치인데, 위 그림에서 A는 C체인과 D체인에 모두 포함되지만, D체인에서만 에폭 경계 블록일 뿐 C체인에서는 아닙니다. 이는 A가 에폭의 첫번째 슬롯이 아니기 때문입니다.
또한 한 블록이 다른 에폭에서 여러개의 체인에서 에폭 경계 블록이 되는 것 또한 가능합니다. 위 그림의 A 블록이 바로 그러한 예시입니다. EBB(C, 0) 이면서 EBB(D, 1)이기도 하기 때문입니다.
또 중요한 점은 앞으로 설명할 가완결과 완결 과정이 모두 블록이 아니라 에폭 경계 페어를 기준으로 수행된다는 것입니다. 어떠한 페어 P = (B, j) 가 있을 때, P의 검증 에폭은 j라고 표현하며 이를 aep(P) = j로 표현합니다.
기존의 Casper FFG와 같이 블록을 단위로 하지 않는 이유는 Gasper에서는 에폭에 블록이 하나도 존재하지 않을수도 있기 때문입니다. 이는 물리적인 블록을 단위로 하는 높이의 개념이 아닌 일종의 시간 단위인 슬롯을 기준으로 하기 때문입니다. 따라서 이러한 시간 개념이 포함된 페어 P = (B, j)를 사용하는 것입니다.
아래 개념들은 앞으로도 계속 사용 되기 때문에 유념해주시기 바랍니다.
- 에폭 경계 블록 = EBB(B, j)
- 페어 P = (B, j)
- 에폭 경계 페어 = (EBB(B, j), j)
- P의 검증 에폭 = aep(P) = j
Committees
에폭에 포함된 슬롯의 수가 C라고 할 때, 각 에폭마다 검증인들은 C개의 위원회로 각각 랜덤하게 배정이 됩니다. 즉, 위원회는 슬롯 당 하나씩 구성되며, 각 슬롯마다 구성된 위원회 중 한명의 검증인이 제안자(Proposer)가 되어 블록을 제안하고, 소속된 나머지 검증인들은 각자 체인의 헤드에 대해 투표를 하게 됩니다. 이 때 투표의 대상이 제안자가 막 제안한 블록이 아닐수도 있다는 점에 유의하시기 바랍니다. 검증인들이 따르는 포크 선택 규칙은 HLMD GHOST로, LMD GHOST의 변형 버전입니다. HLMD GHOST에 대해서는 아래에서 자세히 다루겠습니다.
Protocols for each Slot: Blocks and Attestation
앞서 매 슬롯마다 랜덤하게 검증인들을 선정하여 위원회가 구성되고, 위원회 중 한명의 검증인이 새로운 블록을 제안하는 것이고, 나머지 검증인들은 체인의 헤드에 대해서 검증 투표를 한다고 설명드렸습니다. 이제 그 과정이 구체적으로 어떻게 이루어지는지 살펴보겠습니다.
블록을 제안하고, 검증하는 것 모두 동일한 포크 선택 규칙인 HLMD GHOST를 따릅니다. 이는 Hybrid LMD GHOST로, 기존의 LMD GHOST를 소폭 변경한 버전입니다.
먼저 현재까지 확인한 가완결된 페어 J(G) 중에서 가장 높은 에폭의 페어 (B_J, j)를 선택합니다(Line 2). 이를 기준으로 하여(Line 3), 가장 최근의 메세지들을 취합하여(Line 4), 해당 블록의 자식 블록이 없을 때 까지 가장 많은 수의 메세지가 지지하는 블록을 찾는 과정을 반복합니다(Line 5~8).
해당 알고리즘의 결과 가장 최근의 가완결된 블록의 자식 블록 중에서 가장 많은 수의 메세지가 지지하는, 즉 가장 많은 투표를 받은 블록을 선택하게 됩니다. 이 HLMD GHOST를 활용하여 진행되는 블록의 제안과 검증 투표의 구체적인 과정은 다음과 같습니다.
Block Proposal
에폭 j의 k번째 위원회에 소속된 첫번째 검증인인 제안자 P는 슬롯 i에서 HLMD를 통해 블록 Bp를 계산합니다. 이 경우 P의 관점에서 Bp가 올바른 체인의 헤드일 것입니다. 이어서 새로운 블록 B를 제안하게 되는데, 해당 제안 메세지가 포함하는 내용은 다음과 같습니다.
a) slot(B) = i
b) P(B) = Bp
c) newattests(B)
d) 구현과 관련된 임의의 데이터
a)는 블록 B의 슬롯 넘버가 i임을 의미합니다.
b)의 P(B)는 B블록의 부모 블록을 의미합니다. 즉, 제안하는 블록 B의 부모 블록이 HLMD GHOST의 연산 결과 선택된 블록 Bp임을 의미합니다.
c)의 newattests(B)제안자 P가 받은 B에 대한 모든 검증 투표(Attestations)의 일련의 포인터들을 의미합니다. 물론 이들은 B의 조상블록이 B’ 라고 할 때, newattests(B’)에는 포함되지 않은 메세지여야 합니다.
d)에서 예를 들어 Alice가 Bob에게 3ETH를 지불한다와 같은 메세지들을 포함할 수 있습니다.
Block Attestations
i + 1/2 시점에서 제안자 P를 제외한 해당 위원회의 나머지 검증인들은 모두 HLMD를 통해 블록 B’를 계산합니다. 그리고 검증 투표 α를 전파합니다. α는 다음과 같이 구성됩니다.
a) slot(α) = jC + k
b) block(α) = B’
여기서 B’이 각 검증인마다 서로 다를 수 있고, 해당 슬롯의 제안자가 제안한 블록 B와도 다를 수 있다는 점에 유의하시기 바랍니다.
C는 에폭에 포함된 슬롯의 수를 의미합니다. 따라서 jC + k =[에폭넘버 x 에폭당 슬롯 수 + 위원회가 할당된 슬롯 넘버] 이므로, slot(α)은 해당 검증인이 검증을 하는 시점의 슬롯을 의미하게 됩니다.
block(α)는 검증 투표의 대상이 되는 블록 B’를 의미합니다.
여기서 slot(block(α)) ≤ slot(α) 가 되는데, 앞서 강조했듯이 검증 투표의 대상이 되는 블록이 항상 해당 슬롯에 제안된 블록이 아닐수도 있기 때문입니다. 만약 지연율이 매우 낮고 네트워크에 문제가 없다면 slot(block(α)) = slot(α)가 될 것이고, 이것이 가장 이상적인 상황이라고 볼 수 있겠습니다.
Justification and Finalization
이제 Gasper의 핵심 메커니즘인 완결성을 부여하는 과정에 대해 자세히 살펴보겠습니다. 과정은 크게 두가지 가완결(Justification)과 완결(Finalization)로 구성이 됩니다. 먼저 가완결 과정에 대해 설명드리겠습니다.
Justification
앞서 다룬 검증 메세지 α에서 우리는 다음과 같은 두가지 페어를 알 수 있게 됩니다.
- LJ(α), 마지막 가완결 페어(Last justified pair of α)
α를 바탕으로 마지막 에폭 경계 블록 B = LEBB(block(α))를 계산할 수 있습니다. 해당 블록 B의 가완결된 조상블록 중 마지막 가완결된 페어가 LJ(α)입니다.
- LE(α) = (B, ep(slot(α))), 마지막 에폭 경계 페어(Last epoch boundary pair α)
ep()는 해당 슬롯이 포함된 에폭 넘버를 의미합니다.
LEBB(α)가 B였으니, (B, ep(slot(α)))는 단순히 블록과 에폭 넘버를 페어로 표현한 것입니다.
체크포인트 경계 = V: LJ(α) → LE(α)
이제 우리는 α를 통해 체크포인트 경계쌍(Checkpoint edge)를 구성할 수 있게 되는데, 이는 V: LJ(α) → LE(α)로 표현됩니다. α는 block(α)를 검증하는 메세지이지만, 동시에 LE(α)에 대해 체크포인트 검증(Checkpoint-attests)을 하는 것이기도 합니다.
class AttestationData(Container):
slot: Slot
index: CommitteeIndex
# LMD GHOST vote
beacon_block_root: Root
# FFG vote
source: Checkpoint
target: Checkpoint
eth2.0 spec의 AttestationData에서 source와 target이 체크포인트 경계를 의미함을 확인할 수 있습니다.
Supermajority Link
어떠한 체크포인트 경계쌍 V: (A, j’) → (B, j)이 있고, 이를 검증하는 투표가 전체 보증금의 2/3보다 많다면, (A, j’)에서 (B, j)로 절대다수 링크(Supermajority Link)가 구성되었다고 정의합니다.
이 때, 이를 J: (A, j’) → (B, j) 로 표현합니다.
이제 에폭 j의 어떠한 블록 B이 있을 때, 페어 (B, j)가 가완결되기 위한 조건을 정의할 수 있게 되었습니다. 조건은 두가지로 다음과 같습니다.
- B = Genesis block, j = 0
- 어떠한 가완결된 페어(A, j’)에 대해, J: (A, j’) → (B, j)가 구성될 때
즉, 어떠한 페어가 가완결되기 위해서는 해당 페어가 제네시스 페어이거나, 기존의 가완결된 페어를 바탕으로 절대다수 링크가 구성되어야 함을 의미합니다.
역시 그림을 통해 가완결에 대해 살펴보겠습니다. 여기서 두겹의 실선은 절대다수 링크를 의미합니다. 그림에서 제네시스 블록과 64 블록만이 가완결된 상태이네요. 그리고 당연하지만 제네시스 블록은 역시 완결된 상태입니다. 에폭3의 에폭 경계 블록은 첫번째 슬롯에 해당하는 슬롯 192에 블록이 없기 때문 이전 에폭의 슬롯 180의 블록이 또 다른 체크포인트 경계쌍을 구성하는 것을 확인할 수 있습니다.
내용이 조금 복잡해 보일 수 있지만, 표현이 페어로 바뀌고 체크포인트 개념이 에폭 경계 페어로 바뀌었을 뿐, 기존의 Casper FFG와 거의 완전히 동일합니다.
Finalization
이제 완결(Finalization)과정이 어떻게 진행되는지 살펴보겠습니다. 완결은 가완결과 같이 페어를 대상으로 진행되며, 전체 보증금의 1/3 이상이 삭감되지 않는 이상 서로 충돌되는 페어는 완결될 수 없습니다. 즉, 동일한 에폭에 대해 서로 다른 페어가 완결될 수 없다는 의미입니다.
어떠한 페어 (B0, j)에 대해, 다음과 같은 조건을 만족할 때 (B0, j)는 완결되었다고 정의합니다. (k는 1 이상의 정수입니다.)
- (B0, j), (B1, j+1), … , (Bk, j+k) 가 Bk가 포함된 체인에서 모두 인접한 에폭 경계 페어이다.
- (B0, j), (B1, j+1), … , (Bk, j+k) 가 모두 가완결되었다.
- J: (B0, j) ->(Bk, j+k) 이다.
정의에 따르면, 에폭 경계 페어(B0, j) 와 (Bk, j+k)를 포함한 사이의 인접한 에폭 경계 페어들이 모두 가완결되었고, (B0, j)에서 (Bk, j+k)로 절대다수 링크가 성립했을 때 (B0, j)가 완결된다고 할 수 있습니다.
기존의 Casper FFG의 경우 k=1인 경우에만 완결이 성립했던것과 달리, Gasper에서는 k≥1에도 모두 완결이 성립하는 것으로 정의하고 있습니다.
이를 k-finality rule이라고 지칭하는데, 지연율이 높거나 특정 에폭에서 검증 투표의 전파에 지연이 발생하는 경우와 같은 다양한 상황등을 모두 반영하기 위함입니다.
k-finality 그림에서 화살표는 절대다수 링크(Supermajority Link)입니다.
위 그림에서 k=2인 경우 J: B0 -> B2 로 절대다수 링크가 구성되어 B0가 완결되고 B1, B2가 가완결되는 과정을 확인할 수 있습니다.
정상적인 경우 J: B0 -> B1 으로 절대다수 링크가 구성되어야 하지만, 모종의 네트워크 문제로 인해 B1이 가완결되었음을 확인하지 못한 상황에서, 검증인들은 V: B0 -> B2에 대해 검증 투표를 하는 상황이 된 것입니다.
k=3인 경우는 이보다 더 혹독한 상황을 가정하고 있는데, 현실적으로 이러한 상황은 의도적인 담합으로 인한 공격상황이 아닌 이상 발생하기 어렵기 때문에 이더리움 2.0의 공식 스펙은 k ≥ 3에 대한 경우는 다루지 않습니다.
종합해보면 Gasper의 가완결과 완결은 Casper FFG의 그것과 거의 동일하지만, Gasper의 경우 체크포인트 블록이 아닌 페어를 대상으로 진행한다는 점, 그리고 새롭게 가완결하는 블록이 반드시 기존 가완결 블록과 여러 에폭이 차이가 나도 상관이 없다는 점에서 차이가 있다고 할 수 있습니다.
Slashing Conditions
Gasper의 삭감 조건(Slashing Condition)은 Casper FFG와 동일합니다.
(S1) 검증인은 ep(α1) = ep(α2)인 두개의 서로 다른 검증 투표 α1, α2를 할 수 없다. 이는 aep(LE(α1)) = aep(LE(α2)) 조건과 동일하다.
(S2) 검증인은 aep(LJ(α1)) < aep(LJ(α2)) < aep(LE(α2)) < aep(LE(α1))인 두개의 서로 다른 검증 투표 α1, α2를 할 수 없다.
첫번째 조건은 동일한 에폭에서 서로 다른 에폭 경계 페어에 대해 투표할 수 없다는 것을 의미합니다. 두번째 조건은 이미 특정 체크포인트 경계쌍에 투표했다면, 해당 체크포인트들 사이의 에폭에서 다른 체크포인트 경계쌍에 대해 투표할 수 없음을 의미합니다.
Casper FFG에서 체크포인트의 개념이 에폭 경계 페어로 변경되었을 뿐, 기존과 다르지 않음을 확인할 수 있습니다.
Recent Discussion — Gasper
본 장에서는 Gasper와 관련된 최근 논의에 대해 살펴보겠습니다. 새롭게 알려진 공격 방식인 Decoy-Flip-Flop attack과 Bouncing Attack에 대해 살펴보고, 이를 완화하기 위해 공식 스펙 문서에 반영된 업데이트 내역을 간단하게 설명 드리겠습니다.
이에 대한 내용들을 보다 깊이 이해하고 싶으시다면 해당 글의 원문을 읽어보시는 것을 추천드립니다.
Decoy-Flip-Flop attack
Decoy-Flip-Flop attack은 LMD GHOST에서 정상적인 블록의 진행을 방해하는 공격으로, 자신이 가진 투표들을 활용하여 서로 다른 두 체인의 블록들이 번갈아 가며 선택되도록 하는 공격 방법입니다.
우선, LMD GHOST를 통해 블록이 아니라 단순히 두개의 색깔을 N명의 검증인들이 결정한다고 가정하겠습니다. 이 때 모든 검증인들은 동일한 양의 보증금을 보유하고, 악의적인 검증자 M의 보증금은 전체 보증금의 1/3 이상이 될 수 없습니다.
M의 decoy-flip-flop 공격 방법은 다음과 같습니다.
- M은 특정 슬롯에 대해, 어떤 색깔이 완전히 선택(과반 이상이 투표)되지 않는 한 계속해서 다른 정직한 검증자들이 투표하는 것을 최대한 기다립니다.
- 특정 색깔이 선택되기 직전에 다른 색깔에 투표하여 다른 색깔이 선택되도록 합니다.
- 1에서 계속 반복합니다.
이러한 공격을 반복하게 될 경우, 위 그림과 같이 파란색이 선택될 것 처럼 보이다가 붉은색이 선택되고, 반대로 파란색이 선택될 것 같다가 붉은색이 선택되는 상황이 반복될 수 있습니다.
이렇게 다른 정직한 검증인들이 투표하는 것을 기다렸다가 상황을 보고 자신에게 유리한 투표를 하는 것을 Savings strategy라고 합니다. LMD GHOST에서는 최근의 메세지만 반영하기 때문에 이전의 슬롯이라고 하더라도 악의적인 검증인이 투표를 나중에 전파하는 이러한 전략이 유효하게 됩니다.
이제 이를 다시 색깔이 아닌 블록체인의 세계에서 생각해보면, 서로 다른 두 체인의 블록들이 번갈아가며 선택되는 상황이 발생되어 정상적인 완결 과정을 방해하게 되는 것입니다.
FMD GHOST
이에 대한 해결책으로 제안된 것이 Fresh-message-driven GHOST, 즉 FMD GHOST입니다. FMD GHOST는 LMD GHOST와 거의 동일하지만 오직 최근의 메시지 중 현재와 이전 에폭에 대한 투표만 받아들인다는 점에서 차이가 있습니다. 이를 통해 공격자는 오랫동안 자신의 검증 투표를 보류할 수 없게 되어 Decoy-Flip-Flop attack 수행하기가 매우 어려워집니다.
FMD GHOST는 현재 이더리움 2.0 공식 스펙 문서에 반영된 상태로 해당 내용은 여기서 확인할 수 있습니다.
Bouncing Attack
Bouncing Attack은 Casper FFG에서 Fork-choice가 최근의 가완결된 체크포인트에서 시작해야 한다는 점을 이용하여 서로 다른 두 체인의 체크포인트를 가완결만 계속해서 반복하도록 하여 완결은 지연시키는 공격방식입니다. 이를 통해 완결과정을 방해하여 Liveness를 보장하지 못하도록 할 수 있습니다.
위 그림에서 전체 투표수는 100개이고, 각 투표의 가중치는 동일하다고 가정하겠습니다. 또한 공격자는 10개의 투표를 행사할 수 있습니다. 우선 왼쪽 체인의 블록이 가완결된 상황입니다. 이런 상황에서 오른쪽 체인의 블록이 가완결되기 직전인 상황입니다. 7표 이상만 더해지면 가완결이 되는 상황에서 공격자는 고의적으로 자신의 투표 메세지를 전파하지 않습니다. 오른쪽 체인의 블록이 가완결 되지 않기 때문에 다른 검증인들은 다시 왼쪽 체인의 블록을 가완결하기 시작합니다. 하지만 역시 왼쪽 체인의 블록이 가완결되기 직전에 공격자가 자신의 투표 메세지를 전파하여 오른쪽 체인의 블록을 가완결시킵니다. 이 때 공격자는 이후에 왼쪽 체인의 가완결 직전의 블록도 동일하게 가완결시킬 수 있게 됩니다. 이러한 공격을 반복하여 양쪽체인의 블록들을 가완결만 시키고 완결은 되지 않도록 할 수 있게 됩니다.
Fix on FFG
Bouncing Attack을 완화하기 위해서 제시된 해결책 중 하나는 Casper FFG의 가장 최근의 가완결된 체크포인트를 기준으로 투표하는 규칙을 소폭 수정하는 것입니다. 수정 내용은 다음과 같습니다.
에폭마다 첫 k 슬롯까지만 새로운 가완결된 체크포인트가 확인될 경우 변경하도록 하고, k슬롯 이후에는 이를 확인하더라도 변경하지 않습니다.
보다 구체적으로,
- 검증인이 현재 기준 체크포인트와 상충되는 새로운 최근의 가완결된 체크포인트를 확인했을 때, 현재 시점이 k 슬롯 이내라면, 새로운 체크포인트로 변경한다.
- 만약 k 슬롯 이후라면, 현재 체크포인트를 유지하고 새로운 체크포인트를 펜딩(Pending) 상태로 둔다.
- 새로운 에폭이 시작될 때, 다시 최근의 가완결된 체크포인트를 계산한다. 이 때 펜딩상태에 있는 체크포인트도 포함하여 계산한다.
이 때, k는 에폭의 전체 슬롯수의 1/3보다 작아야 합니다. 또한 공격자의 투표 수는 전체의 1/3보다 작다고 가정합니다.
이제 이 방법이 어떻게 Bouncing attack을 막을 수 있게 되는지 살펴보겠습니다.
위 그림에서 C는 이미 가완결된 상태이고, 공격자는 C’를 가완결하고, 이어서 C’’를 가완결하고자 한다고 할 때, 수정된 Casper FFG를 따르면 C’’를 가완결할 수 없게 됩니다.
현재 상황은 정직한 검증인들이 C’이 가완결되지 않아 다시 C’’에 대해 투표하고 있습니다. 공격자는 C’’에 충분한 수의 투표가 모이기를 기다리다 C’를 가완결하여 다시 C’가 포함된 체인의 체크포인트에 투표하게끔 유도합니다.
하지만 이 때 만약 k 슬롯 이후라면 C’가 가완결되더라도 C’’을 그대로 가완결하게 됩니다. 또한 k 슬롯 이내라면 C’를 기준으로 다시 투표를 하게 되고, 공격자는 C’’를 가완결하기 위해 필요한 충분한 투표 수를 모으지 못하게 되어 C’’를 가완결하지 못하게 됩니다. 어느 경우에도 양쪽체인을 반복해서 가완결 하는 것이 아니라 한 쪽 체인으로 수렴하게 되므로 Bouncing attack은 실패하게 됩니다.
여기서 공격자가 C’’를 가완결하기 위해 필요한 충분한 투표 수를 모으지 못하는 이유는 k < 에폭 당 슬롯 수/3 이기 때문입니다. 전체 검증인이 에폭마다 위원회로 구성되어 각 슬롯에 균등하게 할당된다는 점을 고려할 때, C’’에 대한 투표수는 최대한 모아도 전체 투표 수의 1/3보다 작을 수 밖에 없게 됩니다. 따라서 공격자는 계속해서 서로 다른 체인의 체크포인트를 가완결하는 것을 반복할 수 없게 됩니다.
이 역시 현재 이더리움 2.0 공식 스펙 문서에 반영된 상태입니다. 구체적인 내용은 여기서 확인할 수 있습니다.
Conclusion
이더리움 2.0의 Phase 0는 오랫동안 준비해왔던 지분증명(Proof of Stake)으로의 전환이 본격적으로 시작되는 매우 중요한 단계입니다. 앞으로도 계속해서 연구 개발이 될 것이지만, 이론적인 측면에서 대부분의 주요한 이슈들은 이미 해결된 것으로 보입니다. Phase 0는 예정대로 진행된다면 2020년 초 혹은 중순에 성공적으로 도입될 것으로 예상됩니다. 이더리움 2.0의 본격적인 도입이 드디어 초읽기에 들어온만큼, 앞으로는 이더리움 생태계가 어떠한 모습으로 성장하고 확장할지 매우 기대가 됩니다.
References
- Ethereum 2.0 Devs Handbook and FAQs
- eth2.0-specs
- Serenity Design Rationale
- Eth2 shard chain simplification proposal
- Learn about Ethereum
- Eth 2.0 Info
- Ethereum Sharding Research Compendium
- ETH2.0: Resources
- ETH 2.0 educational resources
- Phase 0 accompanying resource
- Combining GHOST and Casper
- Phase 0 for Humans [v0.8]
- State of Ethereum Protocol #2: The Beacon Chain
- Decoy-flip-flop attack on LMD GHOST
- Saving strategy and FMD GHOST
- Analysis of bouncing attack on FFG
- Prevention of bouncing attack on FFG
- A CBC Casper Tutorial
- Casper FFG Overview
- Presenting Quantstamp’s ETHDenver Beacon Chain Simulator
온더에서 공개 채용을 진행하고 있습니다.
많은 관심과 추천 부탁드립니다 :)