합의알고리즘 PoW, PoS의 조금 디테일한 설명!!

in #blockchainpowpos7 years ago (edited)

아직 스팀잇을 사용한 지 얼마 되지 않았고 사용법 또한 숙달되지 않았는데 오늘 놀라운 사실을 알았다... 일주일 이상 지난 글은 수정도 삭제도 되지 않는다!!! 자세히 안 알아봤지만 아마도 블록체인에 올리는 것 같다. 이에 대해 여러 생각이 교차하는데 이런 기능은 한편으로는 내 글에 대한 권리를 확실히 보장받는 것이기도 하지만 잘못된 정보나 생각들을 올렸을 때도 돌이킬 수 없다는 점, 그리고 평생 기록으로 남는다는 점이 포스팅 하나하나에 더 노력을 기울여야 하겠다는 생각이 든다. 얼마 전의 글이지만 공부를 더 하게 되면서 잘못되거나 부족한 부분이 보이는데.. 그런 부분들을 전혀 수정할 수가 없니..!!  


우선 합의 알고리즘을 살펴보자. 

 합의 알고리즘은 누가 블록을 생성할 것인지(채굴확률), 그리고 포크가 발생했을 때 어떤 체인이 유효한지에 대한 룰이다.   그리고 합의 알고리즘이 필요한 이유가 비잔티움 장군 문제 때문이다(게임이론에서는 오랫동안 난제로 남아 있었단다). 비잔틴 장군 문제는 공부를 시작했을 때 이해하기가 어려웠다. 다들 비유로써 설명하려고 하니 오히려 본래 뭘 말하는 것인지 더 혼란을 주었고, 정작 설명하는 본인도 정작 제대로 이해하지 못한 경우가 태반이었다. 비잔틴 장군 문제란 “분산 네트워크에서 악의적인 노드가 있음에도 어떻게 정상적으로 작동하도록  할까“의 문제이다. 블록체인은 이 문제를 합의 알고리즘으로 해결하였다.  합의 알고리즘은 크게 두 개로 나뉘는데, 비잔틴 문제를 해결한 경쟁적 블록생성방법과 비잔틴 장애 허용(Byzantine Fault Tolerance)하는 비경쟁적 블록생성방법이 있다. 확정성(Finalization)을 갖느냐 마느냐에 따라서도 갈리는데 여기서는 경쟁적 블록생성방법인 POW, POS를 얘기해보겠다.  

비잔틴 문제는 http://goodjoon.tistory.com/256 이 분이 가장 잘 성명해주시는 것 같다. 참고하시길. 

 블록체인은 탈중앙화된 P2P 네트워크임으로 참여자들 간에 블록이 분기되었을 때 어떤 블록이 맞는지에 대한 룰이 필요하다. 그리고 무엇을 기준으로 블록생성의 권한을 얻을 것인지에 대한 규칙이 필요하다. 두 개의 노드가 동시에 블록을 생성할 때에는 자연스럽게 발생할 경우가 있고 악의를 가진 노드가 거래내역을 변경하기 위해 할 경우가 있다.   블록이 두 개로 분기된다는 것은 거래내역이 다른 장부가 2개가 생긴다는 뜻이며 이는 이중지출이 발생할 수도 있다는 말이다. (이중지출 문제는 중요하다. 이 때문에 우리는 현재 중앙집권화된 DB를 사용한다)

   PoW(Proof of Work)  

작업증명이라고 불리는 이 방식은 많이 들어 봤다시피 비트코인이 채택하고 있는 합의 알고리즘이다, 암호화폐의 거래가 이루어진 장부를 정리한 후에, 누가 정리한 장부가 맞는지를 확인하고 이를 네트워크에 승인을 받는 과정이 필요한데 이것이 '증명'이다. 이 증명과정은 총 6번의 컨펌을 받아야한다(비트코인 PoW에서). 거래장부는 블록 안에 담기는데, 노드들이 블록생성을 위해 경쟁적으로 문제를 푼다(해시값을 찾는다). 그리고 해당 문제를 가장 먼저 푸는 사람이 블록을 만들도록 한다. 

왜 이런 쓸데없는 계산을 하는 거지?라고 생각할 수 있는데 이는 모든 노드가 동시에 블록을 생성하지 못하게 하기 위함이다.  그럼에도 불구하고 이는 막대한 에너지 소비를 만들어서 PoW의 가장 큰 문제점 이다.

  이때 해시값을 찾을 확률은 정확하게 컴퓨팅 파워(컴퓨터 연산능력)에 비례하는데 내가 해당 네트워크 컴퓨팅능력의 10%를 갖고 있다면 문제를 풀고 블록을 생성할 확률이 10%이다. 즉 문제를 풀고 보상을 받는 것은 내가 시스템에 기여한 정도(컴퓨팅 파워)에 따라 달라진다. 그리고 이 보상이 노드에게 경제적 유인을 제공하고 네트워크를 유지하는 핵심이 된다. 

 한편, 블록체인은 하나의 체인을 유지해야 하는데(이중지불방지), 동시에 두 개의 블록이 생기는 경우가 있다(자연스레 발생한 것, 악의적 노드가 고의로 하는 것). 이때 블록체인이 두 개로 갈라지게 되며 PoW에서는 블록 두 개를 일단 모두 유지시킨다. 그리고 그다음 블록이 더 먼저 연결되는 체인을 '진짜' 체인이라고 생각하고 나머지 블록은 탈락시킨다. 이 블록 뒤에 5개의 블록(총 6번)이 더 이어지면 거래확정이 된다. 다시 말해 더 긴 블록체인을 선택한다.  

그러면 왜 참여자들이 가장 긴 블록을 선택해야 하는 거지? 

 여기에서 손해의 개념이 들어간다.  더 긴 블록체인은 다수의 이용자들(51% 이상 선의의 채굴자)이 더 강한 컴퓨팅 파워를 집중시켜 참여하고 있다는 말이고 (블록생성확률은 컴퓨터 연산능력에 비례한다), 분기된 다른 체인과의 경쟁에서 이길 확률이 높다는 뜻이다.   탈락한 블록을 만든 사람은 받았던 블록 보상을 다시 회수당하게 된다. 그래서 노드들은 본인이 생성한 블록이 취소되는 것을 바라지 않기 때문에, 자신이 보상을 받을 확률이 높 곳에 컴퓨팅 파워를 집중시키게 된다.   

거래가 담긴 블록이 중간에 탈락할 수 있기 때문에, 적어도 6번 이상은 해당 체인에 새로운 블록들이 생겨야 해당 거래가 담긴 블록이 '진짜' 블록체인에 연결된 블록이라고 볼 수 있다는 것을 의미한다. 이 때문에 POW의 전송속도(TPS)는 느리다. Dapp 플랫폼인 이더리움도 TPS 15회 내외이며, 비트코인은 7회 수준에 불과하다.)  

*51% 공격

  그렇다면 악의적인 노드가 51% 이상의 컴퓨팅 파워를 보유한다면 더 빠르게 블록을 생성하고 긴 체인을 연결해서 거래내역을 조작할 수도 있다는 말 아닌가? 

 맞다. 가능하다.

그러면 해커가 더 강력한 컴퓨팅 인프라를 설치하고 비트코인을 해킹했다고 가정했다고 가정해보자. 그런데 이 블록체인은 절대 해킹을 통한 장부의 조작이나 변조가 일어나지 않는다는 신뢰를 전제로 가치를 획득했다. 만약 해킹을 당한다면 이 비트코인의 가치는 0이 될 수밖에 없다. 거래내역이 조작되었기 때문에 누구도 비트코인을 믿고 가치를 부여하지 않을 것이 때문이다. 그러므로 이미 가치가 없어진 비트코인을 본인이 소유해봤자 해커가 얻을 수 있는 경제적 실익 또한 제로가 된다.   그리고 해커가 장부를 조작해서 얻는 이익보다 시스템의 룰에 따라 활동하는 것이 오히려 자신에게 더 큰 이득이 된다. 컴퓨팅 파워가 크면 클수록 블록생성하고 비트코인을 보상받을 확률이 더 높아진다. 따라서 꼼수를 부리기보다 정직하게 하는 게 자신에게 더 큰 보상을 안겨준다.

   위와 같이 비트코인에 이용된 작업증명방식은 보상과 손해의 경제적 유인과 해싱연산이라는 작업을 이용해서 서로 신뢰할 수 없는 분산 네트워크에서 각자의 이익을 추구하더라도 신뢰라는 가치를 도출해 낼 수 있게 함으로써 비잔틴 장군 문제를 해결했다. 

 PoS(Proof of Stake) 

 지분증명 알고리즘인 PeerCoin이라는 가상화폐에서 처음으로 발표한 합의 알고리즘이다. 기존 작업증명 알고리즘의 해시 연산에 소비되는 엄청난 에너지 낭비 문제를 해결하기 위해 만들어졌다. PoS는 PoW처럼 계산능력에 근거해서 블록을 생산하는 것이 아니라 채굴자가 가진 코인의 비율에 따라 블록 생산의 ‘확률’이 정해진다. 

 초기에 PoS가 나왔을 때, 블록이 분기했을 때 하나의 가장 긴 체인으로 수렴하지 못하는 모습을 보여줬다, 이것이 Nothing at Stake 문제인데, Nothing at Stake(어떤 것도 손해 볼 것이 없다는 뜻)는 두 블록이 동시에 만들어졌을 때, 어떤 블록이 진짜인지 정하는 과정에서 양쪽 모두에게 참여하는 것을 의미한다.   이와 같은 일이 발생하는 이유는 자신이 분기 된 두 개의 블록에 모두 참여하더라도 자신이 ‘손해’ 보는 것이 없기 때문이다. 무슨 말이냐 하면 PoW의 경우 컴퓨팅 파워를 유지하기 위해서 비용(채굴기, 전기세 등)이 들어간다. 또 이 컴퓨팅 파워를 양쪽에 배분했을 때, 연산능력 또한 반으로 줄어듦으로 자신이 블록을 생성하여 보상받을 확률이 반으로 적어진다. 그러므로 양쪽에 참여하지 않고 확률이 가장 높은 체인에 올인 한다. 

이와는 다르게 PoS의 경우는 자신이 양쪽에 참여해도 보상을 받을 확률이 반이 되는 게 아니라 자기 소유 지분에 따라 정해지므로 양쪽에 모두 참여해도 같은 확률로 보상을 받기 때문에 하나로 수렴하지 않았던 것이다. 

  나는 여기서 의문이 들었던 것이 “블록이 분기하였을 때 채굴자가 양쪽에 모두 배팅한다면 연산능력이 반으로 나뉘기 때문에 손해 보는 것이 아니냐?” 인데, 이 생각은 내가 PoS도 PoW와 같이 해싱연산을 한다고 생각했기 때문이다. PoS의 경우는 임의의 해시 값을 찾기 위한 해싱연산을 하지 않는다. 이 해싱연산에 막대한 컴퓨팅 파워가 필요한 것이지 단지 블록을 유지하기 위해서는 가정용 컴퓨터로도 가능하다. 이것이 PoW가 갖고 있던 막대한 에너지 낭비의 원인이고 이것을 PoS가 해결한 것.   

여하튼 이 nothing at stake 문제를 개선하기 위해 나온 것이 예치금을 걸어 두는 방식이다.  PoS에서는 채굴에 참여하기 위해서 일정량의 코인을 보유해야 하고 이를 담보로 잡아둬야 한다. 이때 악의적인 채굴자가 거래내역을 변경하거나 조작하려고 했을 때 이 예치금에 불이익을 줌으로써 악의적인 행동을 차단하는 것이다.  

작업 증명을 위한 채굴기 개수(총 해시파워) = 지분 증명을 위한 코인 개수 (총 지분) 

작업 증명 채굴기 가격 = 지분 증명 코인 가격 

두 경우 모두 51% 어택을 위해서는 채굴자 총투자금의 51% 이상 필요

 https://steemkr.com/kr/@seungjae1012/pow-pos-5  


*비트코인 오해가 있는 상식

장부가 모든 피시에 분산되어 있기 때문에 해킹하려면 모든 피시를 해킹해야한다. 즉 모든 장부를 조작해야한다?  

*롱레인지 어택(Long-Range Attack)

 위와 같은 방식을 롱어레인지 어택이라하는데 길게는 제네시스블록(최초의 블록)부터 장부를 조작해서 이어붙이는 것이다. 이는 이론적으로는 가능하나 PoW에서는 사실상 불가능하다. 비트코인의 경우 이미 수없이 많은 블록이 이어져있고 이 블록들은 해싱연산을 통해 연결되어 있다. 장부를 조작하기 위해서는 지금 까지 이어져온 블록들의 모든 해싱연산을 새로 수행해야한다. 즉, 블록이 컨펌이 되어 거래확정이 된 블록은 위처럼 해야 한다.  반면에 PoS에서는 가능하다. 블록을 연결하는데 해싱연산을 이용하는 것이 아니여서 블록생성에는 큰 연산력이 필요없다.

 하지만 PoW에서느는 거래확정이 되지 않은 블록은 높은 해싱파워로 더 긴 블록만 생성해서 전파한다면 조작이 가능하다  그러므로 해커가 일일이 개인피시 장부를 조작할 필요가 없다.


이상으로 합의 알고리즘과 대표적인 PoW, PoS 방식을 알아보았다. 이는 합의 알고리즘의 기본 틀이고 이에 발전해서 나온 수없이 많은 합의 알고리즘이 있다. 다음번에 공부하게 되면  올리도록 하겠다!!  

 블록체인에 대해 공부를 하면서 느끼는 것이 양이 방대하다는 것... 그리고 블록체인 기술은 계속 발전하고 있으므로 지속해서 정보를 습득해야 한다는 점들이 나에게 자그마한? 좌절을 안겨준다. 그럼에도 불구하고 블록체인이 보여주는 잠재성은 나의 흥미를 마구마구 돋우고 자발적으로 공부할 수 있게 한다.   그리고 블록체인의 수많은 한계점에도 불구하고 사람들은 이것을 하나씩 극복해 나가고 있고 앞으로도 그렇게 되리라는 것을 믿는다. 나도 빨리 블록체인 전반에 대한 지식을 통달하고 의문을 제기하고 해결책을 제시할 수 있는 수준, 그리고 내가 스팀 같은 공유경제 구조를 백서로 만들 수 있는 수준이 오기를 고대한다. 꿈은 크게 가져야지 :)