(내용 일부를 이해하기 좀 쉽게 고쳤습니다. )
----------
이더리움의 캐스퍼 알고리즘을 조금 읽어보았다.
https://github.com/ethereum/economic-modeling/tree/master/casper
pos의 가장 큰 문제점이 'Nothing at stake'라는 문제라는 것입니다.
'Nothing at stake'는 유효한 블럭체인이 두개 이상이 존재하는 포크(fork) 상황에서 어느 블럭체인이 유효한지를 validator가 투표(vote)를 하는데,
validator가 모든 블럭체인에 투표를 하는 것이 보상을 받을 확률을 높이기 때문에, 모든 블럭체인에 투표를 해서 유효한 하나의 블럭체인을 결정하지 못하는 상황이발생하는 것을 말합니다.
validator는 일반 노드와 달리, 일정한 코인을 출금할 수 없게 deposit 하고 포크상황에서 vote를 하는 노드입니다.
참조: https://docs.google.com/viewer?url=http://tendermint.com/docs/tendermint.pdf
'Nothing at stake'를 해결하기 위해서, Tendermint 코인은 'shashing' 알고리즘으로 validator가 두개의 블럭체인 이상에서 투표를 하면 deposit한 코인을 빼앗는 방법을 사용합니다.
이더리움의 캐스퍼 알고리즘은 consensus-by-bet이라는 방법으로 정답을 맞춘( 다음 블럭체인에 투표한) validator에게 보상을 주고, 틀린 validator에게서 예금(deposit)한 코인을 빼앗는 방법을 사용합니다.
---
여기서 생각해볼 것은 현재의 pow, pos 알고리즘의 동작 방법입니다.
이들은 어떤 조건(pow은 target)값 이상일 때 블럭을 생성하여 네트워크에 블럭을 전파(broadcast)하고, 다른 노드는 이 블럭을 검증하여 검증을 통과하면 다음 블럭을 찾는 경쟁 합의 알고리즘 때문에 발생하는 문제입니다.
이런 pow, pos의 블럭찾기 경쟁은 노드가 전파된 블럭의 검증을 만족하면, 노드가 바로 다음 블럭을 찾는 방법을 사용하기 때문에 이를 '단독 결정'이라고 정하겠습니다.
포크가 발생하는 주원인은 "블럭을 전파받은 노드가 이 블럭을 검증하여 검증을 통과하면, 이 노드가 바로 다음 블럭을 찾는 단독 결정 알고리즘" 때문에 발생합니다.
즉, 각각의 노드가 독자적으로 판단하여 일정 조건을 충족하기만 하면, 무조건 다음 블럭을 찾는 것에 문제가 있는 것입니다.
그리고, 다수의 블럭체인이 동시에 생기는 포크 상황은 "네트워크의 전파 지연시간 때문에 발생을 합니다. 아시아에서 북미 등으로 데이터를 전파를 하면 네트워크 전파시간은 약 2초 이상이 걸리고 있습니다.
즉, '네트워크 전파 지연시간' + '단독 결정'이 블럭체인에서 포크를 발생시키는 원인입니다.
그렇다면, 이와 같이 포크가 생기는 핵심 알고리즘을 바꾸어 포크가 생기지 않도록 하는 합의 알고리즘을 만든 것이 해결방법이 될 것입니다.
그러면, dpos 합의 알고리즘을 살펴보겠습니다.
dpos는 일정한 증인 그룹을 만들고 이들 사이에 경쟁을 하는 그룹 안에서 각 노드가 '단독 결정'을 하는 방법입니다.
(비트쉐어의 경우, 몇시간에 한번씩 증인그룹을 다시 구성하고, 컨펌은 약 3초 정도입니다.)
예로, 만일 dpos의 경우 100명의 증인 그룹을 만든다면, 이들이 서로 coinage 경쟁(?)을 하여 누가 블럭을 만들지를 경쟁합니다.
이런 경쟁은 경쟁자가 적기 때문에 포크가 생길 확률도 상당히 줄일 수 있습니다,
하지만, dpos에서 'Nothing at stake'가 문제가 되었다는 글을 읽었는데요..
따라서, 포크가 생기는 문제는 해결하기 힘듭니다.
---
포크가 생기는 문제점은
1) 노드들이 전파된 검증을 통과하면, 노드가 바로 다음 블럭을 찾는는 '단독 결정', 즉 노드 단독에 의한 결정으로 바로 다음 블럭을 찾는 경쟁 방법 때문에 생깁니다.
그렇다면, 해결 방법도 다양하게 마련할 수 있습니다.
잠깐 생각나는 해결방법:
1) '단독 결정'을 없애자..
1.1) 개발자가 운영하는 검증노드를 만들고, 검증노드에서 네트워크로 전파된 블럭을 일정시간 동안 모아서 최종적인 블럭을 다시 네트워크에 전파하면 모든 노드가 이 블럭의 다음 블럭을 찾는다.
- 단점: 집중화로 보인다라고 공격받을 수 있음. 블럭을 모으는 시간으로 컨펌시간이 좀 길어질 수 있다.
- 포크 상황을 막기위한 검증노드 방법의 구현은 다양하게 만들 수 있고, 위 예는 한가지 방법에 불과합니다.
- 한가지 예로서, 검증노드가 일정시간 동안 모인 블럭을 모두 모아서 모든 블럭의 블럭해시값을 해시함수에 적용하여 기준 해시값을 만들고, 기준 해시값에 가장 가까운 블럭해시값을 가진 블럭이 우승자가 되어 다음 블럭을 생성하는 시스템입니다.
'단독 결정'을 없애는 방법은 위 방법 말고도 더 좋은 방법이 있을 것입니다.
2) 이더리움과 같이 계정정보(state)를 이용하여 누가 블럭을 생성할지 각각의 노드들이 바로 알게 하자
이런 방법은 이전에 제가 제안했던 비경쟁적 합의 알고리즘에 해당합니다.
기본적인 방법은 각 노드는 모든 계정의 코인량을 모두 알고 있어서,
이 코인량과 램덤화할 수 있는 다른 조건을 결합하여 다음 블럭을 누가 만들지를 모든 노드가 바로 알 수 있게 하는 방법입니다.
http://www.ddengle.com/bitcoindeveloper/985327
https://steemit.com/kr/@loum/5gc6kw
(제가 아직도 이해하지 못하는 것이 있을 수 있습니다. 따라서 위 글은 추측성 내용이 포함되었을 수 있습니다.)
매 블럭마다 어느 노드가 블럭을 생성해야 할지 리얼타임으로 경쟁하지 않습니다.
에포크 마다 (그러니까 하루에 약 2번) 다음번 에포크에서 블럭 생성을 담당할 validator 를 미리 뽑습니다. 현재 스펙상으로는 샤드당 100개의 validator 를 뽑습니다. 그러니까 하나의 에포크가 시작되면, 이미 누가 블럭을 생성할지 알고 있는 상태이고, 다만 해당 노드가 블럭 생성을 정해진 시간안에 안하면 스킵합니다.
그렇다면 노드간의 경쟁은 에포크가 시작하기 전에 이미 끝난 것이지요.
캐스퍼와 dpos 와의 가장 큰 차이점은, 노드선정 알고리듬과 bond deposit 여부가 될 것 같습니다.