U-lis [491954] · MS 2014 · 쪽지

2017-06-27 01:50:12
조회수 7,720

[연재글] BlockChain - 06. Security

게시글 주소: https://ui.orbi.kr/00012401564

1편 : https://orbi.kr/00012313138

2편 : https://orbi.kr/00012318427

3편 : https://orbi.kr/00012334500

4편 : https://orbi.kr/00012341994

5편 : https://orbi.kr/00012367982


이 글은 암호화폐와 그 근간을 이루고 있는 블록체인에 대해 살펴보는 글이지 비트코인과 이더리움 시장을 예측해 투자 타이밍을 조언하는 글이 아님을 알려드립니다. 이걸 본다고 투자하는데 도움이 되지 않습니다. 기술은 개발자에게 투자는 주갤러에게.


안녕하세요 야심한 밤 공부하다가 하기싫어 글쓰러 왔습니다. 저번 글에서 블록을 만들어 체이닝하는 것을 소개해드리면서 기본적인 블록체인의 구조는 설명이 끝났습니다. 그런데 이게 안전하다 안전하다 하는데 왜때문에 안전한지 제대로 설명을 드리지 않은 것 같아 이번 글에서는 안정성 위주로 설명을 드려볼까 합니다. 그 전에 블록체인 네트워크가 어떻게 다수결로 체인을 동기화하는지부터 설명을 드리는 게 이해에 도움이 될 것 같네요.


1. 합의(consensus)

블록체인 네트워크는 주기적으로(보통 새 블록이 생성돼 전파되는 시점) 체인을 동기화하며 어떤 체인을 메인 체인으로 가지고 갈 지 동기화합니다. 이를 합의 매커니즘이라고 하는데요, 저마다의 블록을 캐는 노드들이 어떻게 모든 내용을 복붙하지 않고 합의에 이르러 같은 체인을 유지하는지 설명드리겠습니다. 사실 이건 별로 대단한 매커니즘이 있지는 않아요. 그냥 어떤걸 고를 지 같은 원칙을 가지고 움직이면 결국 하나로 모이게 되거든요. 기본적으로 모든 노드는 "가장 많은 노력이 든 체인" 을 메인 브랜로 선택합니다. 다른 브랜치는 메인 브랜치가 될 가능성이 있지만 아직 메인 브랜치가 되지 못한 채로 있다가 사라지기도 하고, 메인 브랜치로 승격되기도 합니다. 이 메인 브랜치를 고르는 단 하나의 원칙 "가장 많은 노력이 든 체인을 메인 브랜치로 한다"를 따르게 되면 결국 모든 노드는 같은 브랜치를 메인 브랜치로 하게 되겠죠? 왜냐하면 시간이 지나면 결국 모든 블록 데이터를 모든 노드가 공유하게 될 테니까요. 거기서 가장 많은 노력이 든 브랜치를 고르면 같은 녀석이 나올 수밖에 없겠죠. 여기서 가장 많은 노력이라 함은 체인의 길이가 길거나, 길이가 같은 경우 블록의 크기가 더 큰(더 많은 Tx를 포함하고 있는) 것을 뜻합니다. 체인의 길이가 길다는 것은 블록이 많다는 것이고, 그 블록을 캐기 위해 더 많은 컴퓨팅 파워를 사용했기 때문에 이를 우선적으로 택하는 것이고, 거래가 많다는 것은 블록체인의 빠른 검증을 위해 유리하기 때문에 이를 택하는 것이죠. 이런 식으로 모든 노드는 결국 같은 브랜치를 하나의 메인 브랜치로 선택하게 됩니다.


2. 브랜치 생성-합의 시나리오

블록이 여러 군데에서 거의 같은 시간에 발견되는 경우에 어떻게 합의에 이르는지 살펴보도록 할게요. 이 설명을 보시면 위에서 설명한 합의 매커니즘이 좀 더 이해가 가실거에요.


1) N-1번 블록을 부모로 한 N_A, N_B 블록이 동시에 아주 먼 곳(지리적으로 먼 곳이 아닌 P2P 토폴로지상으로 먼 곳)에서 채굴되었습니다.

2) 일정의 시간이 지나 전 세계의 절반 노드는 N_A의 생성 정보를 수신했고 나머지 절반은 N_B 블록의 생성 정보를 수신했습니다. 이 시점에서 세계의 절반은 N+1_A를 만들기 시작했을 것이고, 나머지 절반은 N+1_B를 만들기 시작했습니다.

3) 시간이 좀 더 지나 전 세계에 N_A, N_B 블록의 생성 정보가 전달되었습니다. 이때 각각의 노드는 자기가 먼저 받은 블록 옆에 형제처럼 새로 받은 블록을 가지쳐놓고(브랜치) 일단 하던 일을 합니다.

4) 어느 시점에서 N+1_A가 채굴되었고, 이 정보가 전 세계에 전달되었습니다.

5) N_A를 먼저 받았던 노드들은 이 뒤에 자연스럽게 N+1_A를 이어 붙이고 바로 N+2_A를 채굴하기 시작합니다. 이들에게는 N - N_A, N+1_A가 한 줄기로 자연스럽기 때문에 여전히 메인 브랜치는 A 브랜치입니다.

6) N_B를 먼저 받았던 노드들은 N+1_A를 N_A 뒤에 이어붙이고 N_B보다 N_A가 더 큰 노력이 들었다는 것을 확인합니다. 그리고 이 노드들은 A 브랜치를 메인 브랜치로 선택하고 즉시 N+1_B를 만들던 작업을 중지합니다. 이제 B 브랜치는 메인이 아니니 유지할 필요가 없거든요. 그리고 N+1_A를 부모로 하는 N+2_A를 만들기 시작합니다.

7) 이제 전 세계는 같은 브랜치를 메인 브랜치로 가지는 합의에 도달합니다.


뭔가 되게 아무것도 아닌데 놀랍게 합의에 도달하죠? 이렇게 거의 동시에 같은 블록을 채굴하는 경우는 생각보다 자주 일어나지 않는다고 합니다. 그리고 브랜치가 또 브랜치를 갈라서 가지가 아주 복잡해지는 경우는 거의 발생하지 않는다고 해요. 보통은 브랜치가 2단계가 되기 전에 합의에 도달한다고 합니다.


3. 블록체인의 변조 저항성

블록체인은 그 자체로 변조에 저항성이 있습니다. 이를 설명하기 위해 몇 가지 사항들을 되짚어보도록 할게요.

1) 비트코인 블록은 대략 10분에 한개정도 채굴된다.

2) 비트코인 블록을 만드는 작업은 해시를 찾는 작업이다.

3) 해시를 찾는 방법은 무작위 대입밖에 답이 없다.

4) 해시함수의 특성상 입력값이 조금만 바뀌어도 결과값은 예측 불가능하게 변한다.

뭐... 이것만 봐도 블록 자체의 안정성이 어떻게 확보되는지 이해가 가시는 분들도 있을 것 같긴 하지만, 예를 들어 설명해드리면 이해가 더 쉬울 것 같네요.


내가 친구에게 3BTC를 주고(현재 시세 기준 약 천만원) 중고차를 친구에게 구입했어요. 내가 발행한 트랜잭션이 N-2번 블록에 있고, 지금 마이너들은 N+1번 블록을 찾는 중이라고 가정해봅시다. 친구는 그걸 확인하고 제게 차키를 줬습니다. 이제 이 차는 제껍니다. 그런데 난 내 트랜잭션의 output을 조작해 내가 낸 돈이 친구가 아닌 나에게 되돌아오게 하고 싶어요. 이를 위해 트랜잭션의 output을 변경합니다. 그랬더니 N-2번의 해시값이 변경되면서 더이상 난이도 조건을 만족하지 않게 됐어요. 다행히 난 대학 연구원이라 슈퍼컴퓨터를 사용할 수 있어서 연구실 컴을 몰래 돌려(그러면 안됩니다) N-2번 블록의 해시를 다시 찾아냈어요. 음? 그렇게 해놓고 보니 N-1번 블록의 입력값에 N-2번 블록의 해시값이 들어가기 때문에 N-1번 블록의 해시값도 변경돼버렸네요. 또 연구실 컴을 돌려 N-1번 블록을 새로 만들어냅니다. 그랬더니 N번 블록도 같은 작업을 해줘야 해요. N번 블록까지 열심히 캐놓고 보니 N+1번 블록이 채굴됐다는 정보가 들어오네요. 하지만 내가 받은 N+1번 블록은 내가 만든 N번이 아닌 네트워크가 공유하고 있는 N번 블록의 자식이기 때문에 내 거래를 메인 브랜치로 심으려면 난 N+1번 블록도 새로 캐야 해요. 운좋게 내가 N+1번 블록과 N+2번 블록을 누구보다 빠르게 채굴했어요. 그리고 난 그 정보를 네트워크에 공유해 내가 변조한 체인이 메인 브랜치가 되도록 해요. 성공! 연구실 슈퍼컴퓨터를 몰래 돌린 결과 난 3BTC를 다시 내 지갑으로 되돌리면서 친구에게서 차를 받았어요.


자, 말로는 되게 금방 뚫리는 것 같은 위의 시나리오가 얼마나 골때리는 일인지 살펴보도록 하죠. 우선 비트코인은 전세계 수많은 컴퓨터들이 동시에 해시를 찾기 위한 쇼를 한 결과로 하나의 블록을 만들어냅니다. ASIC 채굴기가 나오면서부터 비트코인은 난이도 인플레가 심해져서 이제는 세계의 어떠한 단일 컴퓨터도(슈퍼컴 포함) 10분 안에 블록을 캐낼 수 없을 정도라고 합니다. 지금의 블록은 오로지 집단 노가다의 산물인거죠. 따라서 여러분이 정말 부자 내지는 정말 고학력자라서 슈퍼컴이고 뭐고 맘대로 갖다 쓸 수 있다고 해도 블록을 다시 캐는 속도는 새 블록이 생기는 속도보다 거의 확실하게 느리다는 말이죠. 운 좋게 한두개의 블록은 10분 안에 채굴할 수도 있겠지만, 통상적으로 고가의 거래 내지는 고도의 신뢰가 필요한 거래는 6번 이상의 컨펌을 거칩니다. 이 말은 다시 말하면 이 거래를 변조하기 위해 6개의 블록을 다시 채굴해야 한다는 말이에요. 단일 컴퓨터로 N-6부터 시작해서 N+M까지의 블록을 따라잡아 채굴한다? 가능할 것 같지 않을 시나리오죠? 이런 식으로 블록체인에 한번 명시된 거래는 사실상 변조가 불가능합니다. 이게 블록체인이 신뢰를 주는 이유지요. 물론 방금 캔 블록에 있는 거래는 변조할 수 있습니다만, 1컨펌만으로 거래를 성사시킬 정도의 금액이라면 저렇게 큰 노력을 들이는 게 의미가 없겠죠?


4. 51% 어택

그럼 이런식으로 생각해볼 수 있을 것 같네요. "단일 컴퓨터로 안되면 네트워크를 통째로 갖다 쓰면 되잖아?" 네 맞아요. 위에서 말했듯 새 블록이 생기면 전 세계 노드들이 어떤 걸 메인 브랜치로 가져갈 지 선택한다고 했죠? 그럼 내가 전세계 노드의 절반 이상을 내가 변조한 블록을 고르도록 하면 내가 의도한대로 모든 거래를 변조할 수 있게 되는거죠. 이걸 51% 어택이라고 해요. 실제로는 51%까지 필요가 없다고 하더라구요. 노드들이 블록을 전파하는 시간도 있고, 내 브랜치 위에 블록이 한두개만 더 올라가도 거의 확실하게 메인 브랜치가 굳어지기 때문에 그렇다고 해요. 그런데, 내가 조작할 수 있는 거래는 오로지 내 거래뿐입니다. 내가 사인해서 잔고를 사용할 수 있는건 내 지갑에 있는 돈뿐이니까요. 한마디로 51% 네트워크를 동원해서 할 수 있는게 겨우 한 사람의 거래 조작이라는 겁니다. 그리고 이걸 변조해서 전파에 성공했다고 했을 때, 나머지 51%-1명의 사람들의 받는 보상은 없어요. 네 없어요. 다시 캔 블록 보상이 있지 않냐구요? 이미 그건 정상 블록체인이 생성되던 시점에도 만들어지던 보상이잖아요. 물론 그 보상을 먹는 사람이 달라질 수는 있겠지만, 전세계 51% 사람들이 12.5BTC를 나눠먹으면 뭐 얼마나 떨어지겠어요? 그렇다고 이 난리를 치는 사람이 자기 거래 변조하면서 전세계 51% 사람들에게 자기가 거래를 변조해 얻은 이익을 나눠줄까요? 나눠먹으면 얼마나 되겠어요. 51% 사람들은 아무 보상도 없이 좋다고 누군가의 거래 하나를 조작하기 위해 자기 컴퓨팅 파워를 기꺼이 바쳐줄까요? 말도 안 되는 얘기죠? 물론 비트코인 초기에, 노드 갯수가 얼마 되지 않아 강력한 컴퓨팅 파워를 지닌 노드가 대부분의 블록을 채굴하던 시절에는 그 노드가 맘만 먹으면 블록을 변조할 수 있었겠지만, 이런건 코인 발행 초기에 발행인이 노드를 많이 만들어놓으면 해결할 수 있는 문제여서 사실상 이런 사태가 일어날 수는 없다고 봐도 무방해요.


이번 글은 좀 짧네요. 간단하게 일어날 수 있는 거래 조작 시나리오와 이에 대해 블록체인이 얼마나 안정성을 지니고 있는지 살펴봤습니다. 유일하게 블록체인을 조질 수 있는 방법은 SHA256 해시를 예측하거나 매우 빠른 시간에 찾아낼 수 있는 방법을 찾는 건데, 지금까지 알려진 방법은 rainbow table 밖에는 없어요. fait 팀도 저런건 못만듭니다. 물론 SHA256 레인보우 테이블을 만드는 데 드는 시간은 비트코인의 수명이 다하는 것보다 훠어어어어얼씬 느릴 것이구요. (그래서 일각에서는 NSA 같은데서 SHA256 rainbow table을 만들려고 비트코인을 만든게 아니냐는 음모론(?)도 제기하고 그럽니다. 만든사람이 누군지 모르니 뭘 끼워넣어도 말은 되는거죠 ㅎㅎ) 어쨌든 아직까지는 뚫을 수 없는 해시함수를 보안에 사용하고 있고, 심지어 이게 체인을 이루고 있어 블록체인의 방어력은 무시무시합니다. 다음 글에서는 이렇게 블록에 실린 거래가 어떻게 검증되는지 알아보도록 하겠습니다.



작성자 아들딸 까까사주기:

BTC 14eM4cd28q77Q4AujrV6jGBDH9unX3zD3f

ETH 0xf05C7196CF4e3494023aeABB6053d053ecB3937A

0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.