PoS
이더리움은 PoS 방식의 컨센서스를 사용한다.
알고리즘은 다음과 같다.
1. 각 노드는 32ETH 를 미리 예치한다.
2. 랜덤하게 validator 를 선택한다.
3. validator 가 블록을 만들어 뿌린다.
4. 나머지 노드가 해당 블록의 유효성을 검증하고 투표한다.
5. 2/3 이상이 찬성하면 블록체인에 포함된다.
이 과정에서 나쁜 행동을 하는 경우 (검증자, 투표 노드 모두) 자신이 담보로 맡긴 이더리움을 잃는 패널티를 받는다.
투표를 할 때는, 내가 거짓투표를 하지 않았다는 증거로 내 서명을 포함해서 블록을 만들기 때문에, 블록에는 찬성한 사람들의 서명이 모두 들어있게 된다. 이때 모든 validator 의 서명을 다 포함하면 블록의 크기가 너무 커지기 때문에 BLS 시그니처를 사용한다.
이는 하나의 서명만으로 다른 모든 서명자들이 서명했느지 안했는지를 뽑아낼 수 있다.
PoS, 지분 증명 방식의 컨센서스 매커니즘은 리워드와 패널티에 크게 의존한다.
그래서 규칙을 잘 지키면 보상을 받고, 규칙을 안지키면 패널티를 준다면, 당연히 규칙대로 행동할 것이라는 아이디어에 기반한다.
PoS 방식은 매번 단일 프로포저가 선출되므로, 블록이 포크될 가능성은 매우 낮다.
하지만 간혹 블록 프로포저가 동시에 2개 블록을 프로포즈 하려고 하거나, 프로포저는 정상적으로 프로포즈 했는데, 투표하는 사람들에서 악의적인 집단이 프로포즈 하지 않은 다른 블록에 대해 동의한다고 투표하면 포크될 수도 있다.
이때 포크가 발생한다면 비트코인에서는 가장 긴 체인을 캐노니컬로 두었다면,
이더리움에서는 가장 무거운 체인을 캐노니컬로 둔다.
그렇다면 이더리움은 어떻게 Sybil 공격에 대응할까?
(sybil 공격 = 한 명이 다수인척 하는 것)
PoW는 해시퍼즐을 풀게 시켜서 해시퍼즐을 풀고나면 그때 블록을 propose할 수 있도록 했고,
PoS는 일단 propose 는 할 수 있는데, 만약 속임수를 쓰는 것 같다고 판별되면 벌을 주는 방식으로 대응한다.
PoW 기준으로 장단점을 생각해보면
장점 : 누구나 참여할 수 있다. = 채굴자가 되기 위해서 프로토콜이 요구하는 조건이나 비용이 없다.
(이더리움은 32ETH를 예치해야 했다. 사실 비트코인도 요즘은 채굴하려면 전문 장비와 인력이 필요해져서 더 이상 해당하는 장점이 아니다. 참여는 할 수 있지만 블록을 채굴할 가능성이 0에 수렴하기 때문이다. 하지만 이더리움은 완전히 0이다. 예치를 안하면 블록을 못 만든다)
PoW는 비트코인을 통해 오랜기간 검증된 방식이다. 반면 PoS는 비교적 검증된 기간이 길지 않다.
PoW는 PoS에 비해 구현이 간단하다. 예치 받고, 랜덤하게 뽑고, 검증한거 투표 받고, 패널티 주고 하는 과정을 구현하지 않아도 되기 때문이다.
단점 : 환경에 안좋다. 경쟁적으로 채굴하다보니 채굴 장비의 쿨링 비용, 전기, 네트워크 비용에 의해 환경파괴가 발생한다.
그리고 마이닝 풀이 생기면서 아이러니하게 탈중앙화와 멀어졌다.
Gasper = LMD-GHOST + Casper FFG
이더리움은 12초마다 한 명의 검증자를 선택해서 블록을 만들기 때문에 이론적으로는 포크가 발생할 일이 거의 없으나,
실제로는 네트워크의 문제 또는 악의적인 사용자의 문제로 인해 포크가 발생한다.
그렇다면 포크가 발생했을 때 어떤 블록을 유효한 블록으로 인정할까?
바로 제일 무게가 무거운 = 더 많은 득표를 가진 블록을 캐노니컬로 인정하자라는 매커니즘을 사용한다.
먼저 포크가 발생했을 때 어떤 블록을 고를지 선택하는 것은 GHOST (Greedy Heaviest Observed SubTree) 에 기반을 둔다.
이때 이더리움은 LMD-GHOST, Lastest Message Driven 어떤 검증자가 여러개의 메세지를 보냈다면 가장 최근에 받은 투표만을 고려한 GHOST 방법으로 포크를 선택한다.
(이 알고리즘은 정상적인 상황이라면 쓸 일이 없는 알고리즘이다. 이 알고리즘이 동작한다는 것은 포크가 발생한 = 문제가 생긴 상황이다.)
GHOST 알고리즘은 이렇게 나와 연결된 노드들을 서브트리로 하는 트리를 그렸을 대, 그 서브트리를 구성하는 노드가 제일 많은 것을 무겁다고 보고 투표하는 것을 말한다.
LMD 고스트는 기존 고스트 알고리즘에서 약간 변형된 버전이다.
고스트에서는 이렇게 있을 때 파란색 노드를 캐노니컬로 취급한다.
LMD 고스트는 블록에 대한 '투표' 를 기준으로 봤을 때, 서브트리의 투표가 제일 많은 블록을 캐노니컬로 취급한다.
그림엥서 D와 C를 비교해보면 서브트리의 투표 수가 D는 2, C는 5 이므로 C가 선택되는 식이다.
Casper FFG 는 투표 방식을 말한다.
이더리움의 패널티 방식은 Slashing 으로 예치한 32ETH를 모두 뺏어가는 것을 말한다.
패널티를 주는 상황은 크게 2가지가 있다.
규칙을 따르지 않거나, 자신의 차례에 아무런 행동을 하지 않거나.
전자의 경우에는 이더리움을 회수하고 네트워크에서 추방한다.
후자의 경우에는 내가 예치한 이더리움의 일부를 회수해가는 패널티를 받게된다.
따라서 2/3 공격자 그룹이 의도적으로 liveness를 해치고자 투표를 안하면 점점 이더를 회수당해서 그 비중이 줄어들어 나중에는 1/3 쪽이 2/3 그룹쪽으로 변화된다.
Finality
비트코인의 컨퍼메이션과 같은 뜻이다.
이더리움의 블록이 finilized 되려면 justified - finalized 라는 2개의 단계를 거쳐야 한다.
먼저 처음에 블록이 모든 validator 의 2/3 (super majority) 의 동의(attestation)를 받아서 블록체인에 포함되면 justified 되었다고 말한다.
그리고 다른 블록이 그 위에 쌓여서 2/3 의 동의를 받으면 그때 그 밑의 블록은 finalized 된다.
이때 공격자가 finality 에 대해 공격을 가한다면 이렇게 가할 수 있다.
먼저 320 이더를 갖고 있는 공격자가 32 이더씩 나눠서 참여하여 10명의 사람어치만큼 투표를 할 수 있다.
(일종의 sivil 어택이지만, 정상적으로 예치를 했다면, 이건 막을 수 없다.)
이런식으로 공격자가 전체의 2/3 이상의 이더를 갖고 있다면 공격에 성공할 수 있다.
또한 만약 '포크'를 만드는 것이 목표라면 양쪽에 2/3 를 받은 블록이 양쪽에 있어야 한다.
이 말인 즉슨 공격자는 전체의 2/3 를 갖고 있지만 그중에 1/3은 더블 보트를 했다는 뜻이 된다.
a 에 정상적인 사람 1/3 + 공격자 1/3
b 에 공격자 2/3
공격자가 가진 총 코인은 2/3 이므로 1/3은 중복 투표한 것
그리고 이더리움에서 중복 투표는 slashing 에 해당하며, 1/3에 해당하는 이더리움이 회수당하게 된다.
그리고 이 가치는 2022년 5월 기준 5억 달러에 해당한다.
Vailidator 의 선정
validator 로 선정되려면 먼저 참여하려는 사람들이 32ETH를 예치해야 한다.
이를 위해서 validator를 위한 전용 스마트 컨트랙트에 32ETH를 보내면 된다.
그러면 밸리데이터 큐에 보낸 사람의 정보가 들어가는데, 밸리데이터가 수를 조정하기 위해서 액티베이션 큐에 밸리데이터를 넣어두고 일부만 허용하고 나머지는 기다리도록 한다.
그래서 앞에서부터 밸리데이터로서 역할을 하다가 내 차례가 오면 그때 밸리데이터로 역할을 수행한다.
밸리데이터가 되면 이웃으로부터 블록을 받아서 검증하고, 경우에 따라서는 직접 블록을 만드는 역할을 수행하기도 한다.
검증은 프로포저가 실행한 순서대로 트랜잭션을 실행해서 최종 상태가 프로포저가 만든 상태대로 만들어지는지를 확인하면 된다.
그리고 검증에 통과하면 찬성하면서 나의 시그니처를 제시해서 투표한다.
블록을 생성하고 검증할 때는 slot (12초) 와 epoch (32 slot) 이라는 단위가 존재한다.
epoch (이포크) 는 12*32 = 6.4 분 정도의 시간을 나타낸다.
그리고 현재 액티베이티드 된 밸리데이터들은 하나의 이포크에 있는 모든 슬롯에 대해 proposer 또는 committee (검증) 역할 중 하나에 반드시 참여하며, 이포크가 지날 때마다 그 다음에는 어떤 슬롯에서 어떤 역할을 맡는지가 바뀐다.
이때 각 이포크의 첫번째 슬롯은 checkpoint가 된다.
그리고 checkpoint 에서는 투표가 일어나며, 이 투표를 통해 블록이 justified 에서 finalized 로 변화한다.
(그러니까 매 블록 생성마다 바꾸는게 아니라, 이포크 마다 justified 와 finalized 가 바뀌는 것..)
이때 투표는 체크포인트 2개에 대해서 어떤 것이 더 최신의 체크포인트 인지를 투표한다.
(근데 뒤에서는 각 슬롯마다 해당 슬롯에 대한 블록의 유효성 투표와 더불어, 해당 슬롯이 포함된 이포크의 첫번째 블록 = 현재 체크포인트 와 이전 체크포인트에 대해서도 투표한다고 한다. 첫번째 슬롯에서만 투표하는게 아닌건가? 일단 지피티는 첫번째 슬롯에서만 체크포인트 투표가 이뤄진다고 함. 블록에 대해서 투표할 때는 (블록 height , 블록 hash) 조합으로 투표한다고 한다.)
모든 노드는 트랜잭션을 받아서 검증한 뒤 유효하면 자신의 mem pool 에 추가하고 다른 노드에게 보낸다.
(이렇게 mem pool 에 들어간 트랜잭션을 pending transaction 이라고 한다.)
그리고 EVM에 넣을 때는 트랜잭션들을 일정 순서에 따라 execution payload로 만들어서 넣는다.
그리고 그 실행 결과를 자신의 마지막 블록이자 상태로 인지한다.
이 상태에서 밸리데이터의 선발은 슈도 랜덤 알고리즘인 RANDAO 에 의해 선출된다.
RANDAO는 각 밸리데이터가 자신이 받은 랜덤 넘버를 내 랜덤 넘버에 시그니처를 적용해서 더하고 넘겨주는 방식으로 랜덤하게 뒤섞는다.
이렇게하면 누구도 그 결과를 예측할 수 없어서 완전한 랜덤과 모든 validator 들이 동등한 확률로 커미티 또는 밸리데이터로 선출된다.
(특히 밸리데이터는 받는 보상이 더 크기 때문에 공정하게 선출되어야 불만이 없다.)
위 그림을 보면 체크포인트에서 슬롯에 대한 투표 외에 추가적으로 체크포인트에 대한 투표도 진행한다.
source 는 이전 체크포인트, target 은 현재 이포크의 체크포인트로 투표한다.
먼저 justified 되는 조건은 제네시스 블록이거나, 2/3 의 밸리데이터가 (A, B) 에 투표현 것이다.
이때 A는 이전의 체크포인트이고, B는 현재 이포크의 체크포인트이다.
B가 finalzed 되는 조건은 제네시스 블록이거나,
B가 justified 된 상태에서 2/3 이상의 밸리데이터가 (B, C) 를 투표한 것이다.
이때 C는 B의 직접 연결된 인접한 이포크(블록 아님)여야 한다.)
그리고 B가 finalized 되면, 그 이전의 모든 체크포인트는 finalized 된다.
이때 투표에는 규칙이 있다.
1. 같은 높이의 두 블록에는 투표할 수 없고
2. 두 투표에 대해 하나의 투표가 다른 투표를 감싸는 범위로는 투표할 수 없다.
위 그림은 1번 조건을 위배한 것을 보여준다.
두 투표는 서로 다르지만, 타겟 블록의 높이가 같다. (
이 경우는 2번째 조건을 위반한 것으로, 두 투표가 다르지만 surround vote 를 한 상황이다.
이런 투표는 유효하지 않다.
이때 투표의 대상(위 그림의 네모)은 체크포인트로, 그 사이에는 32개의 슬롯이 있다.
그래서 Casper FFG를 통해 나쁜일이 일어나지 않도록 막고, 안정적으로 시스템이 계속 유지될 수 있도록 한다.
'CS > 블록체인' 카테고리의 다른 글
[블록체인] 20. 이더리움 - Smart Contract & dApp (1) | 2024.12.13 |
---|---|
[블록체인] 19. 이더리움 - Account, Transaction, Block (0) | 2024.12.13 |
[블록체인] 18. 이더리움 개요 (0) | 2024.12.13 |
[블록체인] 17. Lightning Network (3) : 라이트닝 네트워크 vs 비트코인 (1) | 2024.12.09 |
[블록체인] 16. Lightning Network (2) : Commitment Sign & Payment Channel (0) | 2024.12.04 |