경쟁적 합의 알고리즘에는 pow(Proof Of Work)와 pos(proof of stake)가 있습니다.
이들은 마치 100m 경주를 이어달리기 하는 것과 유사합니다.
일등을 하는 사람(노드)가 블럭을 생성합니다.
블럭이 생성된 후 다음 블럭을 찾으므로, 이어달리기를 무한 반복합니다.
비트코인의 경우 10분이고, 이더리움은 약 10초(?) 정도의 경주를 무한 반복하죠..
이들 경주자의 뛰는 능력은 pow의 경우 초당 해시 계산능력, 즉 계산능력에 비례하고, pos의 경우 지분에 비례합니다.
즉, 해시 계산능력인 월등하거나 지분이 많으면 경주에서 일등하기 쉽겠죠.
하지만, 해시능력이나 지분이 가장 많다고 경주에서 항상 일등을 하는 것은 아닙니다.
가장 작은 경주 능력을 가진 경주자도 일등을 하도록 만들었습니다.
(블럭 생성하는 노드가 랜덤하게 선정되도록 하기 위함입니다.)
예를 들면, pow 경주자는 모래주머니를 발에 차고 뜁니다.
pow의 경우는 거의 완전한 난수성을 가진 난수발생기인 해시함수를 사용합니다.
이 해시함수가 일종의 모래주머니 역할을 하고 이 때문에 경주할 때마다 모래주머니의 무게가 달라집니다. 물론 다음 주자가 이어 달리기를 할 때마다 모래 주머니의 무게가 달라집니다.
즉, 경주 능력이 제일 작은 선수도 해시함수의 거의 완전한 랜덤성에 의해서 '자신의 해시능력/전체 네트워크의 해시능력'의 비율로 일등을 할 가능성이 있습니다.
이제 pos의 경우는 특정 시간 후에 누가 가장 큰 수를 가졌는가를 겨루는 이어달리는 경주 같습니다.
이때 숫자는 지분 * 시간으로 정해지는 coinage로 정해집니다. (coinage의 공식은 각 코인마다 조금씩 다릅니다.)
지분은 전체 코인 수 중에서 지갑에 들어있는 코인의 수이고, 시간은 계속 증가를 합니다.
만일 coinage가 제일 큰 지갑이 블럭을 생성하면, 이 지갑은 시간이 제로로 세팅이 되어서 coinage는 다시 제로부터 시작을 합니다.
따라서 지분을 적게 가져도 오래 기다리면 결국에는 coinage가 가장 많아져서 지분이 가장 적은 지갑도 블럭을 생성할 수 있습니다.
이와 같은 경쟁적 합의 알고리즘의 네트워크 보안은 1) pow의 기계값 + 전기료, 2) pos의 지분 (이것을 '비용'이라고 하자)에 의해서 유지됩니다.
그 외에 누가 블럭을 생성할지를 랜덤하게 결정하는데 이것도 일정 부분 네트워크 보안에 기여를 합니다.
하지만, 이 랜덤성의 중요성은 '비용'보다 보안에 취약합니다.
즉, 해시능력 또는 지분의 51%를 가진자가 모든 것을 할 수 있습니다. (마치 주식회사의 주식과 비슷함.. )
이 경우 랜덤성이 거의 필요가 없습니다.
이를 51%공격이라고 하죠..
----
그러면 비경쟁적 합의 알고리즘은 무엇일까요?
마치 '가위바위보' 게임과 비슷합니다.
대부분의 노드들이 모여서 가위바위보 게임을 일정한 시간(예로 10초)마다 계속하게 됩니다.
전체 노드가 모일 필요는 없고 다수의 노드가 모여서 게임을 하면 됩니다.
예로 매 10초마다 게임을 하게 된다면, 당시 게임에서 이긴 노드가 합의 알고리즘을 각각 만들게 됩니다.
제가 처음 비트코인의 pow 합의 알고리즘을 보고, 참 힘들게 게임을 한다고 생각했습니다.
그 당시 제 생각에는 비트코인의 pow 알고리즘은 어차피 다음 블럭 생성을 랜덤하게 하려는 게임인 것같이 보였는데,
왜 저렇게 전기를 많이 쓰고 해야 하나라는 생각이 처음 들었죠
하지만, 다수의 계정을 이용한 시빌 공격 때문에 랜덤하게 블럭을 생성하는 것만으로는 해킹을 막을 수 없다는 것을 나중에 알았죠.
비트코인의 pow 합의 알고리즘을 처음 이해했을 때, 제게 든 첫번째 생각은 노드들이 모여서 가위바위보를 하면 될 텐데 왜 저렇게 돈을 많이 들이면서 합의를 할까라는 것이었습니다.
어차피 '안전'하게 합의만 하면 될텐데...
(당시에는 '안전'은 '랜덤성', 즉 다음 블럭을 누가 생성할지 전혀 모르게 하는 것이라고 생각했죠)
그래서, 제가 처음 만든 합의 알고리즘의 제목이 'Proof of Randomness' 였습니다.
http://www.ddengle.com/bitcoindeveloper/889821
물론 pow는 앞에서 언급한 '비용'이 네트워크 보안을 강화하죠..
하지만 pow 알고리즘은 비트코인 이전에 도스 또는 디도스 공격을 방어하기 위해서 공격자 pc에게 일정량의 계산을 시킴으로서 도스 공격을 완화시키기 위해서 만든 알고리즘이었죠.
이것이 비트코인의 합의 알고리즘으로 쓰인 이유는 그냥 사토시가 합의 알고리즘에 쓸 것을 찾다가 이미 잘 알려진 pow를 선택한 것이 아닌가라는 생각도 했습니다.
비경쟁적 합의 알고리즘의 장점은
1) 유효한 블럭체인이 두개 이상이 동시에 존재하는 포크가 생길 가능성이 거의 없습니다. (이것은 굉장한 이점입니다. 포크가 발생하면, 어느 블럭체인을 선택할지에 대한 투표 등을 해야 하는 경우가 발생합니다.)
2) 일정시간마다 컨펌이 이루어집니다.
이에 반해서 경쟁적 합의 알고리즘은 평균적인 일정시간마다 컨펌이 이루어지도록 난이도를 조정하죠..
3) 경쟁을 하지 않으므로 컴퓨팅 능력을 많이 사용하지 않습니다. 정해진 규칙에 따라서 베팅이 이루어집니다.
4) 컨펌시간을 거의 네트워크의 지연시간(약 2초)로 줄일 수 있습니다. 가위바위보 게임만 하므로, 경쟁을 하는 시간이 필요가 없죠..
5) pow의 경우, 네트워크가 1TH라고 하면 1Tera번의 블럭을 생성해서 그 중 마지막 하나의 블럭이 유효한 블럭이 되는 것입니다.
(엄청난 비능률이죠.., 즉 1Tera번 블럭을 계산하고 그 중에서 마지막 하나를 선택하고 이전의 모든 계산은 버리는 것입니다.)
하지만, 이런 비경쟁적 합의 알고리즘도 '비용'문제를 생각하지 않으면, 해킹에 매우 취약합니다.
따라서 비경쟁적 합의 알고리즘도 pos를 기반으로 만들게 됩니다.
해커가 '비용'을 지불하도록 하지 않으면, 다수계정에 의한 시빌 공격에 아주 취약합니다.
--
경쟁적 합의 알고리즘은 각자 알아서 경쟁을 하는 것입니다.
구체적으로 말하면, 제일 처음 유효한 블럭을 만든 노드가 그 블럭을 네트워크에 전파를 하면, 다른 노드들이 자체적으로 검증을 해서 맞으면 이 노드들은 다음 블럭을 찾게 됩니다.
즉 블럭을 전파받은 노드는 만약 그 블럭이 유효하다면, 다음에 다른 블럭에 도착해도 이를 무시합니다.
이 때문에 블럭체인이 두개 이상이 유효한 포크가 생길 수가 있습니다.
네트워크에 특정 문제가 있을 때 vote(투표)를 한다고 사토시의 논문에 나옵니다.
원칙은 1cpu, 1vote라고 나오죠..
(급하게 쓴 글이라서,, 좀.. 산만합니다. 그리고 저는 이쪽에 전문가가 아니기 때문에 다소 틀린 내용이 있을 수 있습니다.)
(여기서 해시계산능력을 다른것으로 바꾸어도 되겠지요?...최저비용을 계산해내는 문제로 말입니다.)
여기서 랜덤성은 정답을 풀어낸 노드들중에서 랜덤하게 선택한다는 것이죠?