brunch

You can make anything
by writing

C.S.Lewis

by SKKRYPTO May 17. 2019

[Tezos X Skkrypto] 테조스 공부노트 #5

합의알고리즘과 베이킹

테조스의 합의 알고리즘, 베이킹


 지난주까지 테조스의 큰 틀인 자가 개정과, 그를 가능케 한 오카멜(OCaml) 언어의 특성에 대해 알아보았습니다. 이번 주부터는 보다 깊게 들어가 실제 지금의 테조스가 작동하는 방식을 하나하나 살펴보겠습니다. 특히 오늘은 그 중에서도 테지(Tez)의 생성과 직접적으로 관계있는 행위, 베이킹(Baking)에 대해 알아볼 예정인데, 들어가기에 앞서 블록체인 네트워크에서 코인이 생성되는 과정과 그 개념을 한번 짧게 짚고 넘어가도록 하겠습니다.

 블록체인 네트워크에서의 코인은 기본적으로 블록 생성에 대한 보상입니다. 가장 익숙한 단어는 채굴(Mining)이죠. 작업증명 합의(Proof-of-Work Consensus) 기반 시스템에서의 블록 생성을 보통 이렇게 부릅니다. 해당 시스템에서 블록 생산자, 혹은 채굴자는 네트워크 상에서 이뤄진 거래(Transaction)의 풀(Pool)에 있는 거래를 모아 하나의 블록 원형을 만들고, 이 블록과 함께 임의의 값(Nonce)을 수정해가며 유효한 블록을 만듭니다[1]. 이 임의의 값을 찾는 작업은 한마디로 가능한 모든 구간에 대해서 대입을 통해 시도해보는 것인데요, 이 과정에서 컴퓨터를 장시간 가동해 값을 탐색하는 것이 마치 광산에서 노동자가 광물을 캐기 위해 돌아다니며 괭이질을 하는 것과 같아 채굴이라는 별명이 붙게 되었습니다.

 위 알고리즘의 대표주자는 우리가 모두 아는 비트코인이죠. 비트코인이 업계의 표준, 혹은 대장으로 자리하면서, 작업 증명은 마치 블록체인과 동의어처럼 사용되기 시작했습니다. 하지만 점차 블록체인에 참여하는 사람이 많아지고, 기술적인 의견이 다양해지기 시작하면서 작업 증명은 비판에 직면하게 됩니다. 가장 거센 두 가지 비판은 단순히 데이터를 검증하는데 너무나 많은 전력과 컴퓨팅 파워를 낭비한다는 것과, 채굴의 진입장벽이 높아져 집단 채굴 조합 등의 주도로 네트워크가 흘러가면서 애초의 비트코인 등 블록체인의 취지였던 탈중앙화가 손상되기 시작했다는 것입니다.


Figure 1 밀레니엄 광산의 현장


 논쟁이 분분한 가운데, 몇몇 사람들은 작업 증명을 대체하는 다른 합의 알고리즘을 고안하고자 노력했습니다. 그런 과정에서 지분 증명(Proof of Stake), 위임 지분 증명(Delegated Proof of Stake), 혹은 실용적 비잔틴 장애 허용(Practical Byzantine Fault Tolerance) 알고리즘 등 다양한 대안들이 제시되었습니다. 모든 알고리즘을 자세히 설명하는 것은 이 글의 목적과 범위를 크게 벗어나므로, 뒤에 설명할 테조스의 베이킹과 깊은 관계를 맺고 있는 지분 증명 및 위임 지분 증명 중심으로 살펴보도록 하겠습니다.


지분 증명은 간단히 말해, ‘작업’이 아닌, ‘지분’을 통해 블록을 증명하는 합의 알고리즘입니다. 작업 증명에서 블록의 증명은 채굴자의 타당한 임의의 값 발견을 통해 이루어졌습니다. 그를 통해서 적법한 블록을 생성할 권리를 받고, 생성한 블록에 대한 보상을 받았죠. 반면, 지분 증명에서는 각 구성원이 가지고 있는 지분에 따라 블록을 검증하고 생산할 권리를 부여합니다. 이때, ‘지분’이라는 말에 대해선 정의가 다양합니다. 보통 우리가 생각하는 지분은 공유 재산에서 각자가 소유하는 몫이죠. 그렇다면 블록체인 네트워크의 공유 재산은 무엇이고, 몫은 무엇일까요?

 다들 좋아하는 코인을 생각해봅시다. 사람들이 블록체인에 담긴 가치, 혹은 재산이라고 생각하는 건 그 네트워크에서 사용되는 코인입니다. 그렇다면 지분이라는 것을, 전체 발행된 코인에 대한 각각의 개인이 갖고 있는 코인의 비율로 생각해볼 수 있을 것 같습니다. 그럼 여기서 질문을 하나 해보겠습니다. 앞 문장을 전제로 했을 때, 지분 증명은 어떤 방식으로 작동할까요? 가장 처음 드는 생각은 지분 보유를 내림차순으로 정렬해, 순서대로 블록을 검증 및 생산할 수 있는 권한을 주는 겁니다. 이러면 말뜻 그대로 지분의 순서에 따라 증명을 하는 알고리즘이 되겠죠.

 이제 ‘지분 증명’도 만들었는데, 작업 증명의 문제가 해결되었는지 확인해봅시다. 크게 두 가지 문제가 있었죠. 하나는 전력과 컴퓨팅 파워 낭비가 심하다는 것이었고, 다른 하나는 탈중앙화가 훼손된다는 점이었습니다. 우리의 지분 증명을 놓고 보니, 첫 문제는 해결한 것 같습니다. 더 이상 무식한 계산을 반복할 필요는 없어졌죠. 바로 확인할 수 있는 지분에 따라 블록 증명 권한을 나누어 주었으니까요.

 그렇다면 두 번째 문제는 어떨까요? 가만 보니 두 번째 문제는 해결이 되지 않았습니다. 오히려 악화가 되었다고 볼 수 있습니다. 기존의 작업 증명을 생각해보면, 채굴 조합들로 인해 중앙화가 심해지고 개인이 블록 생성 과정에 기여하기 어려워졌습니다. 하지만 그 과정은 결국 숫자 맞추기 게임이었기 때문에, 확률은 정말 낮았지만 운 좋게 블록을 만들 수도 있었습니다. 반면 우리의 새로운 지분 증명은, 지분을 많이 갖고 있는 큰 손이 아니면 유의미한 투표권 블록을 얻을 수가 없겠죠. 사실상 확률이 0%입니다. 심지어 블록이 생성될 때마다 보상을 받으니, 빈익빈 부익부는 더욱 심해집니다.



 이런 문제 때문에, 단순히 많이 가지고 있다는 사실로 결정권을 준다는 것은 부당하다는 의견이 많았습니다. 그래서 ‘지분’을 정하는 개념을 바꾸는 방식들이 등장했습니다. 널리 알려진 방식으론 크게 세 가지가 있습니다. 첫째는 임의의 수를 선택하는 방식입니다. 특정한 규칙을 만들어 난수를 생성하게 하고, 이 난수에 따라 지분을 주어 블록 생성 권한을 주는 것이죠. 언뜻 보기에 공정하지 않나 싶지만, 블록체인 네트워크에서는 조금 어려운 문제입니다. 모든 사람이 정보에 대한 열람권을 갖고 있기 때문에, 난수가 의사 난수 수준도 아닌, 자명한 수가 되어버리는 것이죠. 그렇다면 사실상 난수의 도입이 무의미해집니다.

 두 번째는 위에서 말한 위임 지분 증명입니다. 위임 지분 증명은 간단히 말해 민주주의입니다. 기본 틀은 우리가 처음 이야기한 지분 증명과 같습니다. 지분이 많은 사람이 블록에 대한 권한을 얻는 겁니다. 단, 하나 다른 점이 있습니다. ‘위임’이라는 말이 추가되었다는 것이죠. 무슨 의미가 있냐고요? 한번 예시로 살펴봅시다.

 한 블록체인 네트워크에 철수, 영희, 민수, 그리고 은지가 참여하고 있습니다. 이 블록체인 네트워크는 기본적으로 지분증명을 사용하는데, 단 한 사람만 블록을 만들 수 있습니다. 이때, 철수가 45%, 영희가 25%, 민수가 20%, 그리고 은지가 10%를 갖고 있다고 가정합니다. 기존의 규칙대로라면 철수가 블록을 생성할 권한을 갖게 되고, 나머지 사람들의 의견은 묵살됩니다. 4명이 있는데 1명 마음대로 일이 진행되는걸 막을 수가 없으니, 심하게 중앙화된 네트워크라고 볼 수 있죠.


 하지만 위임이 있다면 어떨까요? 영희를 대표자로 세우고, 민수와 은지의 지분을 위임합니다. 그러면 합이 55%로, 철수보다 지분이 많아 블록 생성 권한이 영희에게 넘어갑니다. 이때, 영희는 다른 두 명의 위임을 받았으므로 3명을 대표하는 셈이고, 기존의 철수 1명의 의사대로 결정되는 네트워크보다 훨씬 탈중앙화 되었습니다. 여기서 궁금증이 생깁니다. 원래 지분증명에서도 그냥 지분을 모으면 그만인거 아니야? 맞습니다. 그러나 그 지분을 받은 영희가 배신을 한다면 어떻게 될까요? 철수에서 영희로 바뀌었다 뿐이지, 1명에 의한 중앙화라는 점은 똑같습니다.

 위임 지분 증명이 좋은 점은, 실제 지분을 넘기지는 않는다는 것입니다. 만약 영희가 민수나 은지의 뜻을 거스른다면, 위임을 철회해 다시 25%로 만들어버릴 수 있습니다. 즉, 의사 결정에 있어서 다른 지분 보유자들의 의사를 존중해야 하고, 우리가 아는 민주주의처럼 다수를 설득해 투표(위임)를 받을 필요가 있는 것이죠. 이렇게 위임 지분 증명은 현실의 모습을 따라해, 제법 그럴듯한 모양새를 갖추는데 성공하였습니다. Steem, EOS등 제법 규모 있는 플랫폼들이 이 방식을 채택하고 있죠.



 이제 모든 문제가 해결되었을까요? 아쉽게도 그렇게 되지는 않았습니다. 많이 약화되긴 했지만 여전히 51%의 지분 확보에 대한 문제가 존재하며, 위임이 가능해졌기 때문에 적은 수의 지분을 가진 사람이 네트워크를 좌지우지할 수 있는 확률이 생겼습니다. 이에 대해선 조금 후에 ‘잃을 것이 없는 문제(Nothing-at-Stake)’를 이야기하며 다시 살펴보겠습니다. 아무튼 이런 문제들이 있기 때문에 여전히 위임 지분 증명도 최적의 해법은 아니라고 평가됩니다.

 설명이 좀 길었는데요, 이제 마지막으로 시간을 기반으로 한 지분 증명 방식을 살펴보겠습니다. 이 방식은 아주 독특합니다. ‘지분’의 개념을 ‘양’이 아닌, 들고 있던 ‘시간’으로 표현한 것입니다. 지분을 많이 보유하지 않아도, 오랜 세월 보유하고 있다면 그 사람에게 결정권을 주는 것입니다. 이 방식은 단순하지만 효과적인 점이 있습니다. 첫째로, 의사 결정권자가 네트워크에 오래 참여한 사람입니다. 아무나 거래소에서 토큰을 산다고 해서 그 세월을 살 수는 없고, 어떤 방식으로 한 번에 많은 양을 모은다 한들 그게 충분한 시간이 지나지 않은 지분들이라면 권한을 가질 수 없습니다. 이를 통해 돈에 상관없이, 네트워크에 오래 참여한 유저들, 즉 네트워크의 삶의 ‘지분’을 가진 유저들이 블록을 생성할 수 있게 됩니다.

 솔깃한데? 라는 생각이 들지만, 실제로 그렇게 장밋빛이지는 않습니다. 당장에 돈이 있는 사람이면, 그런 종류의 지분을 사모아 블록을 자기 맘대로 찍어낼 수 있습니다. 또, 돈은 없어도 오랜 시간동안 지분을 들고 있다가, 악의적인 목적으로 네트워크를 수정할 수도 있습니다. 이런 다양한 공격들이 가능하기 때문에, 이 알고리즘을 사용하는 네트워크들은 각자가 조금씩 방식을 수정합니다. 사람 간에 옮겨갈 때 코인의 세월이 초기화 된다거나, 아무리 코인을 들고 있어도 일정 이상으로 세월을 쌓을 순 없다거나 하는 식으로 말이죠.
 이렇듯 다양한 방법이 있고, 각자의 일장일단이 있습니다. 또한 위에 나열한 방식 대부분이 아까 잠깐 말한 ‘잃을 것이 없는 문제’를 갖고 있습니다. 당장에 작업 증명을 살펴보면, 채굴자는 남들이 보기에 타당한 블록을 만들어낼 동기가 있습니다. 만약 인정받지 못하면, 자신이 투자한 전기와 컴퓨팅 자원을 허공에 버리는 셈이니까요. 그러나 지분 증명에서는 그런 동기가 없습니다. 이미 지분은 들고 있고, 그 지분으로 얻은 권한을 통해 블록을 생성합니다. 이렇게 권한으로 찍어내면 끝인데, 그 사람의 악의적 행동을 어떻게 막을 수 있을까요?

 이런 문제 때문에 이더리움 같은 체인에서는 캐스퍼(Casper – CBC, FFG)같이 규율을 설정해, 그것을 어기는 블록 생성자의 지분을 몰수해버리는 방식을 연구하고 있습니다. 실제 도입도 머지 않았다고 합니다. 그러나 이에 대해서 설명하면 또 한참 길어질 테니, 건너뛰고 기다리던 테조스로 들어가겠습니다. 지금까지 알아본 지분 증명이 과연 테조스에선 어떻게 구현되는지, 위에 산적한 문제들을 어떤 방식으로 해결했는지 한번 살펴봅시다.


 앞선 주차동안 꾸준히 살펴봤지만, 테조스는 블록체인 거버넌스를 정형화(Formalize)한 시스템입니다. 사실 ‘테조스의 합의 알고리즘’이란 것은, 모든 것을 네트워크 참여자의 뜻에 따라 수정할 수 있다는 것 사실 말고는 가변적입니다. 현재의 합의 알고리즘으로는 지분 증명을 사용한다고 명시하고 있습니다만[2], 만약 모두가 베이킹이 싫다고 하면 작업 증명으로 바뀔 수도 있겠죠. 다행히 넉달전 바뀐 프로토콜(PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP)에서 베이킹이 사라지지는 않았습니다. 가능하면 최신 프로토콜을 기준으로 설명하고 싶지만, 해당 프로토콜이 일종의 버그 수정에 가깝고, 아직 문서화가 미비하기 때문에 오늘의 설명은 이전 프로토콜(PsYLVpVvgbLhAhoqAkMFUo6gudkJ9weNXhUYCiLDzcUpFpkk8Wt)과 백서에서 설명된 지분 증명의 방식(이하 베이킹)에 대해서 설명하도록 하겠습니다.


Figure 2 빵 굽는 마을, 테조스



 테조스의 베이킹은 어떤 방식으로 이루어질까요? 흔히 위임 지분증명으로 소개되는데, 엄밀히는 변형된 지분 증명, 혹은 변형된 위임 지분 증명이라고 이야기 해야합니다.


이유는 롤(Roll)이라는 독특한 개념 때문입니다. 롤은 10,000XTZ의 토큰 뭉치로, 지폐와 같은 역할을 합니다. 우리가 돈을 지폐와 동전으로 보관하듯, 테조스는 유저의 토큰을 롤 + 롤이 되지 못한 잔액의 형식으로 보관합니다.


  그림과 같이 유저A와 B의 지갑에는 롤과 롤이 되지 못한 잔돈이 보관되어 있습니다. 만약 A가 B에게 5000XTZ를 전송할 경우, 잔돈만으로 전송이 가능한지 확인합니다. 만약 그림의 A 지갑 처럼 잔돈이 부족한 경우 롤 하나를 깨서 해당 금액을 전송합니다. 이때, 토큰을 전송받은 B 지갑에서 잔액이 10,000XTZ를 넘었을 경우 다시 롤로 만들어집니다.


 토큰을 통한 지분증명을 사용하려면 모든 토큰에 식별할 수 있는 ID를 붙여 선택된 토큰에 해당하는 토큰을 소유한 사람에게 권리를 부여해야 합니다. 하지만 이것은 너무나 비효율적인 일입니다. 그래서 테조스에서는 이 롤마다 ID를 부여해 지분증명을 진행합니다. 롤을 기준으로 지분증명를 진행하면 기존의 토큰 기반보다 효율적이라는 장점이 있지만 1롤 미만의 토큰을 가지고 있는 사람들은 참여할 수 없다는 단점이 있습니다. 이런 단점의 보완책으로 테조스에서는 충분한 토큰을 가지고 있지 않지만 합의 과정에 참여하고 싶은 사람들을 위한 ‘위임’기능을 지원하고 있습니다. 자신의 토큰의 권리를 타인에게 위임하고 위임받은 베이커는 새로운 롤을 만듭니다.(원리는 위 그림과 동일합니다.)토큰의 권리를 위임받은 베이커가 블록을 생성하면 해당 블록에 해당하는 보상을 베이커와 위임한 사람들이 나누어 갖게 됩니다. 위의 설명 중 일정 자격조건의 사람, 지분을 위임 등 특징을 보면 지분증명보다 위임지분증명에 더 가까워 보이기도 합니다. 하지만 기존의 위임지분증명와 테조스의 지분증명은 몇 가지 차별점이 있습니다.


1.      위임이 선택적이다. 

EOS등 타 위임 지분 증명 블록체인이 확장성을 위해 블록 생산자에 대한 투표를 의무화하는 것과 다르게 테조스에서는 위임이 선택적입니다. 이는 소액 보유자의 목소리가 거대 투자자, 보유자에 의해 묻히게 되는 것을 방지해줍니다.

2. 블록 생산자의 수가 유동적이다.

위임 지분 증명을 시행하는 대표적인 블록체인 EOS의 경우 블록생산자를 21명으로 고정시켜 놓았습니다. 하지만 테조스에서는 1롤 이상의 XTZ(개인 보유분 + 위임 받은 수량)를 가지고 있는 사람들 모두가 베이커가 될 수 있으며21명보다 확연히 많은 사람들이 블록 생성 과정에 참여할 수 있는, 보다 건강한 방식입니다.

 이러한 차이점들을 볼 때 테조스는 위임지분증명보다는 변형된, 새로운 지분증명에 가깝다고 할 수 있습니다.

 테조스의 블록들은 단순히 베이킹에서 끝나지 않습니다. 한 명의 베이커가 만든 블록에는 전 블록의 인도싱(서명)이 담겨 있습니다. 베이킹이 블록을 생산하는 것이라면 인도싱은 생성된 블록을 검증하는 것입니다. 한 블록에는 최대32명의 인도서가 서명을 할 수 있습니다. 인도서도 베이커와 마찬가지로 roll을 보유하고 있는 유저 중 랜덤으로 결정되며 해당 행위를 수행하려면 각각 베이커는 512XTZ, 인도서는 64XTZ의 보증금을 내야 하며 후에 블록에 대한 보상을 받게 됩니다. 테조스의 블록 생성주기는 약 1분이고 4096블록을 1 사이클이라고 하는데, 모든 보증금은5사이클 동안 동결됩니다. 블록 생성과 서명에 대한 보상으로는 하나의 블록을 생성할 때 베이커는 16XTZ, 인도서는2/dT XTZ를 받게 됩니다. 여기서 dT란 인도서가 서명하려는 이전 블록과 인도서의 서명이 담길 현재 블록의 간격을 말합니다. 보다 자세한 내용은 테조스 실습노트 #3을 참고해주세요!

 테조스에서 베이커와 인도서는 랜덤으로 결정되며 그 확률은 소유하거나 양도받은 롤에 비례합니다. 베이커의 후보들과 인도서에 해당하는 롤의 고유번호를 가지고 있는 ‘랜덤 시드’는 6 사이클 이전에 미리 생성됩니다. 랜덤 시드를 사용하여 베이커와 인도서가 어떻게 정해지는지는 개발팀 3주차에서 자세하게 다루었으니 이번에는 n번째 사이클의 랜덤 시드는 어떤 식으로 생성되는지 알아보겠습니다.

 n-7번째 사이클에서 베이커들은 미리 정해진 베이킹 스케줄에 따라 블록을 생성하고 임의의 숫자를 암호화하여 해당 블록에 포함시킵니다. 이 숫자는 다음 사이클인 cycle(n-6)에 공개해야 합니다.(숫자를 공개하지 않는 경우 해당 블록의 보상과 전송 수수료를 몰수 당하게 됩니다.) cycle(n-6)에 공개된 숫자를 모두 결합하여 cycle(n-6) 사이클 마지막에 해시 한 후 cycle(n)의 랜덤 시드를 만들게 됩니다. cycle(n-6)에서 랜덤 시드를 정하는데 사용되는 숫자는 32블록마다 주기적으로 공개됩니다. 따라서 악의적인 의도를 가지고 있는 노드가 베이킹을 할 때 자신이 임의로 넣는 숫자를 조작하여 자신에게 결과를 유리하게 조작하는 것이 불가능합니다.


 이러한 과정을 통해 베이커가 블록을 베이킹하고 32명의 인도서가 서명합니다. 모든 인도서가 가장 건강한 블록에 서명해 최대의 보상을 받을 경우 한 블록당 모든 사람들이 받을 수 있는 보상은 16XTZ(베이킹) + 2XTZ(인도싱) * 32의 80XTZ이고 테조스는 1분당 하나 1년에 총 525,600개의 블록을 생성하므로 연간 보상의 명목으로 발행되는 테조스는 42,048,000XTZ이며, 이에 따라 매년 약 5.5%의 물가상승률을 적용하고 있습니다. (Endorsers per block* Endorsement reward + block reward= 80 XTZ : 최대 5.51% 연 인플레이션)


 이상의 과정이 테조스의 합의 알고리즘에 대한 소개입니다. 최초의 작업증명에서 대안으로 지분증명, 위임지분증명이 등장하였고 테조스는 한발 더 나아가 개선된 방식을 자체적으로 사용중입니다. 크게 크게 뭉뚱그려 본다면 위임지분증명으로 분류될 수도 있겠지만, 테조스의 자체적인 합의 알고리즘은 건전한 블록체인 플랫폼의 근간이 되는, 테조스가 가지는 장점으로 꼽힙니다. 그간 테조스의 이론 측면에 집중하였다면 다음 글에서는 실제로 테조스의 합의 프로토콜이 구동하는 과정을 공부해보겠습니다. 다음 글에서 봐요!


글쓴이: 구제성 김선우 이교영


Reference

[1] 풀(Pool)과 머클 루트, https://brunch.co.kr/@skkrypto/1

[2] 테조스 공식 홈페이지 https://tezos.com/

[3] 테조스 White Paper https://tezos.com/static/white_paper-2dc8c02267a8fb86bd67a108199441bf.pdf#page8

[4] 테조스 Position Paper https://tezos.com/static/position_paper-841a0a56b573afb28da16f6650152fb4.pdf

[5] 테조스 개발자 문서 https://tezos.gitlab.io/master/whitedoc/proof_of_stake.html

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari