제가 만든 합의 알고리즘 ( My consensus algorithm)
제가 땡글에 2014년 10월에 올렸던 글입니다.
(http://www.ddengle.com/bitcoindeveloper/893822)
혹시 궁금한 것이 있으시면 댓글을 남겨주세요.
(합의 알고리즘에 중요한 부분이 무엇인지 파악할 수 있기를 바랍니다.)
-------------------------------
"저의 이전 글(http://www.ddengle.com/bitcoindeveloper/889821)에서 몇 분이 네트워크 부담을 이야기하셔서 네트워크 부담이 없는 합의 알고리즘을 다시 만들었습니다.
일단 제 생각에는 이것이 POS와 비슷하게 보이는 부분도 있습니다..
일단 POS의 coinday를 없애고 이를 코인데이 대신에 지갑의 주소에 일정량 이상 (예로, 만개 이상)의 코인이 있는 주소가 '기준해쉬'에 가까운지를 가려서 누가 블럭을 만들지를 정하는 방법입니다.
당연히 지갑에 코인이 많으면 여러 개의 주소로 코인을 분산을 시키면 그만큼 블럭을 생성할 기회가 많이 주어지게 됩니다.
네트워크 부담이 없는 합의 알고리즘
****************
* 개념.
1) POW와 같이 네트워크에 부담이 없고, POW와 달리 해쉬경쟁을 하지 않는 것이 목적임.
2) 이를 위해서, POW의 타겟값과 비슷한 역할을 하는 기준값을 만들고 이를 ‘기준 해쉬’라고 한다면, 다음의 기준 해쉬는 예측이 불가능해야 함.
* 방법
1) 바로 전 블록의 해쉬를 ‘기준 해쉬’로 정함. (블럭에는 거래 정보가 포함되기 때문에 다음에 생성될 기준 해쉬는 예측이 불가능함). 물론 이전 블록의 해쉬값을 다시 한번 해쉬로 바꾸어 사용할 수도 있음.
2) 각 노드는 자체적으로 코인을 일정량 이상을 가지고 있는 지갑의 주소에 대해서 이 지갑 주소를 해쉬함수에 입력하여 해쉬값을 만듬.
이때 각 노드의 지갑은 자체적으로 블록체인을 스캔한 db(즉, 마지막 블록까지 각 지갑주소의 코인보유량이 기록된 DB)를 가지고 있어서 일정향 이상의 코인보유량을 즉각적으로 확인이 가능함.
예로, 전체 코인 중에서 0.001% 이상을 가진 지갑의 주소만 블록을 생성할 기회를 주는 것으로 정할 수 있고, 이 코인 이상을 가진 주소는 해쉬함수의 특성 때문에 동일한 블록생성 기회를 가지는 것이 가능함.
3) 따라서 모든 노드는 이 db를 참조하여 어느 주소가 일정량 이상의 코인을 가지고 있는지 바로 확인이 가능하고, 이 주소를 해쉬함수에 입력하여 각 주소에 대한 해쉬값을 구함.
4) 각 노드는 각 주소의 이 해쉬값과 기준 해쉬값을 비교하여서 가장 가까운 해쉬값을 가진 주소에게 블록을 생성할 권한을 부여함.
* 기존의 POS와의 차이점
1) 일정량 이상의 코인을 가지고 있으면 동일한 블럭 생성기회를 줌.
# 추가부분1
***************************************
기준 해쉬까지는 같습니다.
기준해쉬와 가까운 주소로 정렬하여서 해쉬값의 리스트를 만듭니다.
1등 기준해쉬와 제일 가까운 주소의 해쉬값
2등 기준해쉬와 2번째 가까운 주소의 주소 해쉬값
..... 등으로 리스트가 만들어질 것입니다.
이것을 '기준해쉬 리스트'라고 부르도록 합시다.
그리고, 각 지갑의 코인수가 많은 순서로 정렬하여서 리스트를 만듭니다.
제일 많은 코인을 가진 지갑주소가 1등이 되고, 두번째 많은 코인을 가진 지갑주소가 2등이 됩니다.
1등 코인이 제일 많은 주소
2등 코인이 두번째로 많은 주소
.... 등으로 리스트를 만들고 이를 '코인수 리스트'라고 합시다.
그리고 '기준해쉬 리스트'와 '코인수 리스트'에서 같은 주소에 있는 등수를 더합니다.
즉, 특정 주소의 경우 '기준해쉬 리스트'에서 3등이고, '코인수 리스트'에서는 10등이라면 이 주소는 3+10 = 13입니다.
이와 같이, 다른 특정 주소의 경우, '기준해쉬 리스트'는 1등이고, '코인수 리스트'에서는 100등이라면 이 주소는 1+ 100 = 101이 됩니다.
또한 두 리스트에 가중치를 다르게 할 수 있습니다.
즉, 지갑을 여러개로 쪼개면 불이익이 가도록 코인수 리스트의 등수에 0.9를 곱하여서, 코인수 리스트가 더 중요하게 만드는 것입니다.
이런 방법으로 위의 13, 101을 정렬하여 작은순으로 '최종 순위리스트'를 만들고, 이 중에서 가장 작은 값을 가진 주소가 블럭을 만드는 것입니다.
이런 방법은 코인을 많이 가진 지갑이 더 많은 블럭 생성기회를 얻을 수 있고, 더불어 지갑을 여러 개로 쪼개는 것이 좋지 않은 결과가 되도록 한 것입니다.
# 추가부분2
*************************************
51% 공격을 완전히 방어할 수 있는 추가 알고리즘.
기존 알고리즘은 동일하다.
1) 단지 51% 공겍에 대한 방어를 위해서 코인을 생성할 때 만약 1억개의 코인을 발행할 것이라면, 2억 1개를 발행하고, 1억개는 유통이 가능한 코인으로 정하고, 나머지 1억 1개는 유통이 불가능한 코인으로 정한다.
2) 2억 1개를 가진 지갑은 블럭생성에만 참여하고, 나머지 유통, 전송 등의 기능은 전혀 없도록 코딩한다.
3) 2억 1개를 가진 지갑은 블럭생성시 이자를 받지 않도록 하거나, 이자를 받더라도 태워없애는 BURN을 시킨다.
즉 50%의 코인을 가진 지갑은 단지, 블럭생성에만 참여하여서 보안을 높이는 수단으로 사용한다.
POW와 같이 해쉬경쟁을 하는 것은 이런 방법이 소용없지만, POS 계열은 코인수로 블럭생성권한을 주게 되므로 이런 방식을 51% 공격을 완전하게 방어할 수 있습니다.
# 추가부분 3
*************************************
본 방법에서는 이전 블럭의 해쉬값을 '기준해쉬'로 정하는데..
이때 이 기준해쉬가 랜덤성이 부족하다는 의견이 제시되었습니다.
즉, 블럭을 만든 노드가 거래 데이터를 자기가 원하는 것을 선택하여서 자기가 원하는 블럭해쉬값을 만들 가능성이 있게 됩니다.
다시 말하자면, 거래 데이터의 순서 또는 개수를 조정하여 자신에게 유리한 블럭 해쉬값을 선택할 수 있는 여지가 있다는 것입니다.
물론 이 주장은 타당하지만, 노드가 이렇게 바꿀 수 있는 여지를 줄여나간다면 큰 문제는 없어보입니다.
그 이유는 해쉬값의 집합은 거의 무한대(찾아보지는 않았음)에 가깝고, 블럭을 만들 수 있는 노드가 선택할 수 있는 해쉬값의 가지수는 예로 몇 만개 정도라고 가정을 하더라도 이것은 거의 랜덤하다고 볼 수 있습니다.
따라서 랜덤성을 확보하기 위해서, 노드가 생성하려는 블럭의 해쉬값을 임의로 바꿀 수 없도록 하는 장치가 필요하게 됩니다.
이를 위해서,
1) 펜딩된 거래 데이터를 블럭에 기록할 때 코인 수에 따라서 정렬하여 기록하게 한다. (위치를 바뀌게 되면 머클트리가 바뀌고 따라서 블럭의 해쉬값이 바뀌는 것을 예방하기 위함입니다.)
2) 펜딩된 거래 데이터를 노드가 임의로 선택하여 블럭에 기록하지 못하게 특정 조건을 만족하는 펜딩 거래는 반드시 블럭에 기록하게 강제한다.
그 외에 조금 더 제한 사항을 만들면, 기준해쉬가 거의 안전하고 만족하는 랜덤성을 가질 수가 있을 것입니다.
기존 방법의 단점 및 본인 방법의 장점 비교.
**************************************
1) 기존 방법의 단점.
- pow, pos는 경쟁 방식으로 블럭생성권한을 주기 때문에 항상 포크(FORK)의 가능성이 열려있음.
- pos는 coinage를 사용하여서 timestamp 또는 지갑을 일정시간 꺼놓고 있는 등의 방법으로 코인 생성권한을 원하는 시간에 얻을 가능성이 있음
- dpos의 단점.
(1) 101개의 delegate(대표)는 모두 똑 같은 블럭생성권한을 가짐
이 때문에, 제 방법과 비교하면, 제 방법은 코인 수에 따라서 블럭생성권한이 달라짐
따라서, 101개에게 동일한 블럭생성권한을 주는 것보다 제 방법이 조금이 더 보안성이 있음
(즉, 더 높은 블럭생성권한을 얻기 위해서는 더 많은 투자를 해야한다는 것임)
(2) 추천을 해주는 방법에 문제점이 있음.
일반적으로 다른사람에게 추천을 잘 해주지는 않을 것 같음
이와 달리, dpos는 한사람이 여러 개의 주소를 만들고 서로 추천을 해주게 되면 이 들이 모두 블럭생성권한을 얻을 수 있음.
더욱 무서운 것은 이들이 거의 비슷한 추천수를 가지기 때문에 연속적으로 블럭을 생성할 기회를 얻을 수 있어도 보임.
예로, 10%의 지분을 가진 사람이 0.1%씩 100개의 지갑을 만들고 서로 추천을 하면 100개의 10%추천을 가진 주소를 만들 수 있음.
2) 본인 방법의 장점.
(1) pow와 pos와 달리 블럭생성권한이 비경쟁방식이므로, 일반적으로 포크가 생기지 않는다. (예외적으로 네트워크가 분리된 경우를 제외함)
(2) pow와 달리, 경쟁적인 계산을 하지 않음.
(3) dpos의 추천의 추천을 사용하는 것이 아니라, 이전 블럭의 해쉬값을 이용하여 이전해쉬값 + 코인수로 블럭생성권한을 주는 방식이므로 dpos보다 우수한 보안성을 가짐.
(4) 51% 공격을 막기 위해서, 약 50%의 지분을 가진 블럭생성권한만(코인의 이동을 원천적으로 막는다)을 가진 지갑을 생성하고 유지함.
일단, 제 방법은 코인수에 따라서 블럭생성기회가 다르기 때문에 이점은 pos와 비슷함.
하지만, 제 방법은 랜덤성 + 코인수에 따라서 블럭생성 권한이 분배된다는 차이는 있음.
Nice @loum
Shot you an Upvote :)
Thanks,
Keep up the great work @loum
Upvoted
Thanks !
Nice @loum
Shot you an Upvote :)
Thanks,
Keep up the great work @loum
Upvoted