자고 일어나면 새거가 되야하는데 역시 꿈자리가 뒤숭숭하면 영 개운하지 않네요.
괜찮습니다. 저에겐 괜찮아 다 잘 될거라고 말해주는 박카스가 있으니까요.ㅎㅎ
자 다시 달려봐야겠죠. 주말이라서 계속 글을 쓰긴 하는데 평일에는 제가 쓴 글 다시 한 번 읽어보고 곰곰히 생각해볼 시간을 꼭 가지려고 합니다. 시간이 되면 백서글도 계속 쓸거고요^^
우선 이 전 글들 링크를 올리겠습니다. 예전에 참새님 코인설명글의 링크가 너무 편하기도 했고 스팀이 검색 후 백스페이스를 하면 첫 검색화면으로 돌아가는게 너무 불편했거든요.ㅎ
비트코인 백서부터 시작합니다
비트코인 백서부터 시작합니다(2)
비트코인 백서부터 시작합니다(3)
4. 작업증명
P2P를 기반으로 하는 분산 네트워크 타임스탬프 서버를 구현하기 위해서는 신문이나 유즈넷 포스트 대신 Adam Back’s Hashcash[6]와 비슷한 작업증명 시스템을 이용할 필요가 있다. 작업증명에는 SHA-256과 같은 알고리즘으로 다수의 0비트들로 시작되는 암호화 해시값을 찾는 과정이 포함된다. 평균적으로 이러한 작업에 드는 시간은 연속되는 0비트의 요구 개수에 따라 지수적으로 증가하며, 암호화 해시를 한번 수행하는 것으로 확인할 수 있다. 타임스탬프 네트워크에서는 작업증명의 방법으로 블록 해시 결과가 0비트들을 갖도록 하는 해시값을 찾을 때까지 블록에 임시값(nonce)을 증가시켜가는 과정을 구현한다. CPU가 노력한 결과가 한번 작업증명 조건에 도달하게 되면, 그 블록은 다시 과정을 번복하지 않는 한 고정된다. 그 다음 블록들이 체인을 형성함으로써, 하나의 블록을 변경하기 위해서는 그 블록을 포함한 다음 모든 블록들에 대해 작업증명 과정을 다시 수행해야 하게 된다.
1) 작업증명 시스템이란?
우선 Adam Back라는 사람은 현재 Blockstream이라는 사기업에 몸담고 있는 비트코인 코어 개발자입니다. 비트코인 코어 개발자라 함은 비트코인은 사토시 나카모토의 논문에서 시작되고 만들어졌지만 그 뒤에 비트코인을 계속 발전 시킨 사람 중 하나라는 말이며 저 사람이 바로 해시를 이용한 작업증명과 비트코인에서 쓰이는 마이닝(채굴)을 만든 사람이라고 아시면 됩니다. (걍 현재 비트코인 생태계에 영향이 아주 큰 사람이며 천재구나 생각하셔도 되요.ㅋ)
작업증명 시스템(Proof of Work, POW)은 비트코인이 다른 알트코인의 기본이 되듯이 다른 블럭 생성 시스템(POS, DPOS 등등)의 기본입니다.
이 작업증명에 관한 글을 정말 많은데 어제 계속 링크해드렸던 2분의 글과 @hanmomnanda 님의 글을 올립니다.
@easyblockchain/2 (3탄의 글과 같습니다)
@twinbraid/2b3hcu
@twinbraid/29zwvz-02
@hanmomhanda/blockchain
어제까지 공부한 내용도 있고 더 나간 내용도 있습니다. 우선 읽어보시고 아는 선까지 이해하시기 바랍니다.
그리고 여기서 좀 더 나아가 좀 어렵긴 한데 언젠가 듣게 될 내용이고 유익한 글이니 꼭 읽어보시길 바라는 @maa 님의 글 올립니다.
@maa/pow-pos-poi
제가 이해하는 작업증명(POW)는 쉽게 컴퓨터가 노가다를 해서 어려운 문제를 풀면 블럭이 생성된다는 것입니다. 컴퓨터가 이 때까진 CPU(2008년 이야기입니다. 요샌 아닙니다.)를 열심히 굴려 SHA-256이라는 해시함수를 푸는 과정에서 적절한 해시값을 찾으면 블럭이 생성되는 것입니다. 여기에서 채굴이라는 개념과 채굴난이도, 해시레이트, 해시 파워 등등의 한 번쯤은 들어본 거 같은 개념들이 나옵니다. 이러면서 더 어려워지고 생각할 게 많아지는 거죠. 이 개념들은 차차 설명할 수 있을 것이라고 생각합니다.(위에 링크들에서 대충이라도 이해하셨을 것 같네요.)
저 해시값을 찾는 과정에서 임시값(nonce)를 증가시킨다는 nonce값 1-2-3... 이렇게 올려가면서 SHA-256 함수에 대입하여 적절한 값을 찾는 과정이라고 생각하시면 됩니다.
이렇게 만들어진 블럭은 블럭체인 고정됩니다. 그리고 그 다음 블럭이 다시 이런 과정을 통해 고정되는 연속적인 과정입니다. 그림에서와 같이 하나의 블럭은 이 전 블럭의 해시값을 가져오기 때문에 하나의 블럭을 고칠려면 고칠려는 블럭 다음 블럭들을 다 다시 작업증명해야한다는 결론이 나오죠. 이게 바로 블럭체인의 보안성 중 하나구요.
작업증명은 또한 다수결에 의한 의사결정 과정에서 대표자를 결정하는 문제를 해결한다. 다수가 한 IP주소당 한번의 투표를 할 수 있는 시스템 기반으로 결정된다면, IP주소를 많이 확보하는 방법으로 누구나 시스템을 뒤엎어버릴 수 있다. 그러나 작업증명은 본질적으로 한 개의 CPU당 한 번의 투표를 하는 구조이다. 다수의 결정은 가장 긴 체인을 나타내며, 이는 가장 많은 작업증명에 노력이 투입된 것이 된다. 컴퓨팅 파워의 과반수가 정직한 노드들에 의해 제어되고 있다면, 정직한 체인이 가장 빠르게 늘어나, 경쟁 체인을 압도하게 될 것이다. (역자 주: 실제로는 Emin Gün Sirer, Ittay Eyal에 의해 전체 컴퓨팅 파워의 과반수인 50% 이상이 아니라 25% 이상만 점유해도 된다고 밝혀졌는데, 현재 전체 순위 1~2위의 마이닝풀 집단은 25% 이상에 달하고 있습니다.) 과거의 블록을 수정하기 위해서는 공격자는 수정할 블록과 그 이후에 이어진 모든 블록에 대해 작업증명 과정을 번복한 다음에 이어서 다른 정직한 노드들이 이루고 있는 체인보다 더 빠른 속도로 따라잡아 추월해야 한다. 느린 공격자의 추격 가능성은 블록들이 이어서 추가될 수록 지수적으로 감소하는 것에 대해 뒤에서 언급하기로 한다.
다수결에 의한 의사결정 과정에서 대표자를 결정하는 문제는 어떤 체인이 참인가의 문제와 같습니다. 블럭들이 연결된 체인이 두 갈래 이상으로 퍼져버릴 때 어떤 체인이 옳은 체인인가(대표자)를 뽑는 문제라는 이야기입니다.
여기서 IP주소를 많이 확보하는 방법으로 공격할 수 있다는 이야기는 시빌 공격(Sybil attack)을 얘기하는 것입니다.
시빌 공격은 블럭체인이나 다른 코인들 공부를 하다보면 계속 나오는 이야기라서 간단히 링크하고 정리하겠습니다.
티스토리에 올라온 Human Security Research Laboratory의 글입니다.
http://sybil.tistory.com/entry/Sybil-%EA%B3%B5%EA%B2%A9-Sybil%EC%9D%B4-%EB%8F%84%EB%8C%80%EC%B2%B4-%EB%88%84%EA%B5%AC
영어가 가능하시면 http://www.toptenreviews.com/software/articles/what-is-a-sybil-attack/ 이 글을 추천드립니다.
한마디로 한 사람의 여러 개의 아이디를 만들어서 여러 사람인척 투표하는 것입니다. 블럭체인에서 아이디를 노드라고 한다면 하나의 노드에게 한 번의 투표권을 주면 노드를 많이 가지고 있는 사람이 많은 투표권을 가지는 것이 되겠죠. 블럭체인에는 누가 누군지 아이디를 검열할 수 있는 중앙장치가 없기 때문에 한 사람이 여러 개의 투표권을 가졌는지 알 길이 없습니다.
하지만 작업증명(POW 방식)은 이 문제를 해결합니다. 블럭을 만들어내는 것을 투표라고 본다면 블럭생성은 하나의 CPU가 하니까 하나의 CPU가 하나의 블럭을 생성하는 것이 한 번의 투표가 됩니다. 따라서 투표를 많이 받은, 즉 제일 긴 블럭체인이 다수의 결정이 되는 방식으로 대표자(옳은 체인)을 선정하는 것입니다.
역자 주에서도 나오듯이 이 방법은 컴퓨팅 파워의 과반수가 정직한 노드라는 것을 전제로 합니다. 쉽게 이해할 수 있습니다. 과반수가 넘는 CPU가 잘못을 저지르려고 한다면 당연히 그 체인이 가장 길어져서 대표자가 될 확률이 제일 큰 것이겠죠. 이래서 위에 링크한 글들에 51% 어택이 계속 등장하는 것입니다. 중국이 대단하기도 싫어지기도 하는 이유구요.ㅎ 51%가 넘어가는 배신자가 생긴다면 과거의 한 블럭을 고치는 일도 어려운 일이 아닐 것입니다. 고치고 빠르게 블럭을 생성하여 더 길게 만들어버리면 되니까요. 무슨 일이 일어났건 가장 긴게 참이 되는 세상이니.
배신자가 51%가 넘지않는 상황에서 블럭을 고쳐서 따라잡거나 이중지불 상황을 만드는 일이 얼마나 어려운지 이 백서 마지막에 수식으로 설명하고 있습니다.(물론 이해가 힘든...어렵...)
51% 공격에 관한 글입니다. 한 번 읽어보시길^^
시간이 흐름에 따라 하드웨어 속도 증가와 노드들의 참여도 증가율을 보상하기 위해서, 작업증명의 난이도는 시간당 평균 블록 생성 수를 기준으로 하는 이동평균을 타깃으로 결정한다. 블록이 너무 빠르게 생성되면 난이도는 급증한다.
블럭생성 난이도에 대한 이야기가 나옵니다. 흔히 채굴 난이도라고 많이 말하죠. 채굴 관련해서는 참 공부할 게 많아 보입니다. 이게 코인 시세에도 상당한 영향을 주고요. 위에 링크한 글들에도 난이도에 대한 설명이 좀 나오는데 좀 링크하겠습니다. 역시 친절하신 @twinbraid 님의 글과 ddengle.com 커뮤니티에 올라온 TMT님의 글입니다.
@twinbraid/5acabk
https://www.ddengle.com/board_free_voted/160514
백서에도 적혀있듯이 너무 빨리 캐지게 되면 난이도가 올라가고 너무 느리게 캐지게 되면 난이도가 내려가는 방식입니다. 이 난이도와 채산성 등이 섞여서 채굴업자들이 이동하고 가격이 변하고 박터지는 쌈이 시작되곤 하죠...(무서운 세계입니다..ㄷㄷ) 흐음 어쩌다가 이런 생각까지 하게 됐는지 참 외계인 같다는 생각을 합니다. '컴퓨터는 발전할 것이고 그럼 블럭 생성도 빨라질테니 난이도라는 것을 만들어서 블럭생성속도를 조절하고 화폐발행량을 조절해야겠다.' 라는 생각. 무슨 생각으로, 어디까지 생각하고 비트코인을 만들었는지 다시 한번 궁금해집니다.ㅎ
비트코인 채굴 난이도를 볼 수 있는 사이트들입니다. 그냥 눈팅 정도만 하셔도 될 거 같습니다. 아 이런게 있구나..
https://bitcoinwisdom.com/bitcoin/difficulty
https://fork.lol/
저두 그림도 좀 넣고 좀 산뜻하게 꾸미고 싶은데 맘처럼 쉽게 안되네요.ㅎㅎ
좀더 블로그 쓰는 법을 공부해야겠습니다. 연습도 좀 하고 그림도 좀 찾고.ㅎ
그럼 다음 편에서 뵙겠습니다~