Skip to content

7_블록전파

Onito on Earth! edited this page Oct 11, 2018 · 1 revision

블록의 전파

작업 증명을 위한 엄청난 연산을 거쳐 탄생한 블록을 전파하는 방법은 트랜젝션이 전파되는 방법과 똑같다. 비트코인 네트워크에서 자신과 연결되어있는 이웃노드로 전파시키고 해당 이웃노드는 전파받은 블록이 제대로된 블록인지 검사한 뒤 다음노드로 전파시키고.... 같은과정의 반복이다. 새로운 블록을 받은 채굴자는 블록이 올바르다는 검증을 완료하는 즉시 현재 작업중인 채굴을 멈추고 새로운 채굴작업을 시작하며 새로운 채굴경쟁이 시작되는 것이다.

하지만 이와같은 상황에는 두가지 예외적인 케이스가 발생한다. 한가지는 채굴에 도전하는 전세계의 채굴자들중 둘 이상의 채굴자들이 아주 우연히도 동시에 블록채굴에 성공하여 비트코인 네트워크에 두가지 버전의 블록이 떠돌아다니는 상황이고 나머지 한가지는 비트코인 프로토콜이 업데이트되면서 이전 비트코인체제에 맞는 블록버전과 업데이트된 후의 비트코인체제에 맞는 블록버전이 떠돌아다니는 상황이다.

이번파트에서는 비트코인이 이 두가지케이스를 어떻게 처리하는지 자세히 들여다보도록 하자.

서로다른 채굴자가 만든 두 블록

일반적으로 서로 다른 데이터를 가지지만 같은 부모를 가지는 블록이 거의 동시에 채굴에 성공될 확률은 그렇게 높지는 않다. 하지만 이는 분명히 발생하는 현상으로 통계적으로 한달에 38회정도 발생한다. 그 이유는 어떤 블록이 전 세계에 포진해있는 비트코인 네트워크 전역에 퍼지기까지는 고려할만한 시간이 소모되기 때문이다. 좀 더 구체적인 예시를 들어보자면 한국 서울에있는 채굴자가 만든 블록이 지구 정 반대편에있는 아르헨티나에 있는 비트코인 사용자에게까지 전파되는데까지 인터넷 속도 그 자체부터, 각 중간 비트코인 유저가 블록을 검증하는데 드는 시간등을 합치면 수초수십초의 시간이 소모되고 그 시간 사이에 아르헨티나에서 블록을 생성해 배포할 수도 있다는 것이다.

이러한 사건은 통계적으로 미국에서 만든 블록과 중국에서 만든 블록이 싸우는 경우가 많은데 (중국은 인터넷이 난개발되어서 해외 통신에 딜레이가 큰편이고 전세계 채굴성능의 반정도는 중국이 차지하고 있다.) 중국 베이징의 A지점에서 100번째 블록a를 생성하고 1초도 안지나서 미국 뉴욕의 B지점에서 다른버전의 100번째 블록b을 생성해 전파시키는 상황을 예시로 이 상황을 비트코인이 어떻게 해결하는지 살펴보자.

일단 비트코인이 이 사건을 해결하기위한 1차적인 해결책은 대세를 따른다이다. 여기서 말하는 대세란 비트코인이 업데이트 되면서 기준이 바뀌어오긴 했지만 대체로는 다음과 같은 느낌이다.

  1. 블록체인의 난이도가 높은게 대세이다.
  2. 블록체인의 높이가 높은쪽이 대세이다. (100번째 블록보다 1000번째 블록의 높이가 더 높다.)

물론 여기서 다루는 상황은 위 두가지기준으로 생각해보면 우위를 가릴 수 없다. 그럼 다음 해결책은 내가 채굴중인걸 대세로 만든다이다. 한마디로 먼저 다음블록이 탄생하는 버전의 블록이 높이가 더 높아지고 더 빠르게 블록을 만들 수 있으면 더 난이도가 높아진다는 의미이기에 위 두가지 기준을 충족할 수 있기에 내가 먼저 채굴에 성공하면 그것이 대세가 되는것이다.

특별히 비트코인 채굴프로그램에 손을 대지 않는한 각 채굴 프로그램은 먼저 받는 블록에 어울리는 블록체인 채굴을 시도함으로, 한국 채굴자가 100번째 블록을 채굴하다 중국에서 만들어진 블록a를 받으면 먼저 블록a의 해시값을 가지는 101번째 블록 채굴을 개시하며 그다음으로 받는 미국에서 만들어진 블록b는 보류하는 태도를 취한다.

graph LR
99[99번째 블록]-->100a[100번째 a버전블록]
99[99번째 블록]-->100b["100번째 b버전블록(보류)"]
98[98번째 블록]-->99
100a-->mine[채굴 중]
Loading

한편 같은상황에서 미국에 있는 채굴자들은 b버전의 100번째 블록을 먼저받아 다음과 같은 상황이 연출되고 있을것이다.

graph LR
99[99번째 블록]-->100a["100번째 a버전블록(보류)"]
99[99번째 블록]-->100b["100번째 b버전블록"]
98[98번째 블록]-->99
100b-->mine[채굴 중]
Loading

이제 벌여지는것은 a버전 블록을 채굴하는 그룹과 b버전을 채굴하는 그룹의 소리없는 전쟁이다. 대체로 이 "전쟁"은 빠른시간안에 종료되는데, 전쟁의 승리조건은 앞에서 말했다시피 먼저 채굴에 성공하면 된다. 만약 a버전 블록을 이어나가는 채굴자가 먼저 채굴에 성공해 비트코인 네트워크 전역에 전파되었다면

graph LR
99[99번째 블록]-->100a[100번째 a버전블록]
99[99번째 블록]-->100b["100번째 b버전블록(Stale)"]
98[98번째 블록]-->99
100a-->101a[101번째 블록]
101a-->mine[채굴 중]
Loading

100번째 b버전 블록은 Stale Block이라 명명 되고 비트코인 네트워크 전체는 100번째 a블록을 정당한 블록체인으로 인정해 비트코인 시스템을 유지시켜 나가는 것이다.

물론 이러한 상황도 만약 a버전의 블록을 채굴하는 자와 b버전의 블록을 채굴하는자가 거의 동시에 101번째 블록 채굴에 성공하였으면, 채굴 전쟁의 연장선이 되는것이다. 대체로 이러한 상황은 두 버전의 블록이 하나 탄생할때 해당 세대에서, 좀 길어지면 바로 다음세대쯤에서 "전쟁"은 끝나게 되지만 딱 한번 이 전쟁이 엄청 길어졌던적이 있었다.

그것은 2013년 3월 11일 225430번째 블록이 생성될때 위에서 말한 상황과 같이 두가지 버전의 블록이 생성되어 "전쟁"을 했었다. 보통때라면 그냥 평범하게 해결될 문제였겠지만 전 세계적으로 비트코인 네트워크가 제대로 연결되어있지 않았는 모양인지 a버전의 블록과 b버전의 블록이 모두 비트코인 네트워크 전역에 퍼지지 않았고 a버전의 블록이 b버전을 채굴하는 채굴자에게 까지 도달하기까지 심각하게 오랜 시간이 걸려서 이 전쟁은 무려 6시간동안 24세대나 진행되었다.

사실 그냥 방치했었다면 24세대로 끝나지 않고 계속 유지되어 비트코인 자체가 두조각으로 나눠질수도 있었던 사건이었지만 다행이도 이 사건을 눈치챈 비트코인 개발자 멤버가 비상 메세지(거래의 생성밑 전파 맨 마지막부분)를 비트코인 네트워크 전역으로 배포함과 동시에 한쪽 버전의 블록을 의도적으로 제외시키는 프로그램 패치를 배포해 이 사건은 마무리가 되었다.

지금은 대다수의 비트코인 클라이언트가 이와같은 사건이 일어나지 않도록 패치된 프로그램을 사용하고 있으므로 그 후 이와같은 문제가 발생한 적은 없지만, 혹시 같은 사건이 다시 발생한다면 사라지는 버전의 블록체인에 들어있던 승인된 거래내역도 같이 사라지게되기 때문에, 큰돈이 움직이는 거래는, 거래가 블록에 포함된 후 그 위로 3~6개의 블록이 추가적으로 쌓일때까지 안심하지 말라는 이야기가 돌아다니게 되었다.

(3~6세대까지 전쟁이 지속되는 경우는 거의 없기 때문.)

서로다른 비트코인을 따르는 두 블록

그 어느 누구도 처음부터 완벽한 프로그램을 만들수는 없기에 비트코인도 계속 업그레이드 된다. 업데이트 내용은 단순히 더 효율적이거나 안전한 통신규격이나 새로운 방식의 비트코인 지갑정도가 주류이긴 하지만, 가끔씩은 블록체인에 저장되는 내용 그 자체가 업그레이드 되는경우도 종종 있다. 하지만 여기서 문제가 발생한다. 윈도우 보안업데이트를 제대로 하지않아 랜섬웨어가 전 세계의 컴퓨터를 빠른속도로 장악한것처럼, 새로운 안드로이드 버전이 나와도 기존 사용자는 기존 사용하는 안드로이드를 사용하는 것처럼, 비트코인도 업데이트를 제대로 하지 않는사람이 꽤 존재한다. 또한 업그레이드 방안이 나와도 비트코인 핵심 개발자가 만들지 않은 일반 개인이나 기업이 만든 비트코인 클라이언트에게까지 적용되려면 많은 시간이 필요하다. 물론 업그레이드하는 방법이 단순한 기능 추가로 이전버전의 블록과 새로운버전의 블록이 서로 호한되면 아무런 문제도 없지만, 만약 그렇지 않고 구조자체를 확 틀어벌이는 업그레이드가 나오면 어떻게 되는것일까?

이에대한 해결책으로 소프트포크(Soft Fork)와 하드포크(Hard Fork)가 존재한다. 이름에서 유추해볼수 있는것처럼 소프트포크는 뭔가 부드럽고 온난하게 업그레이드를 진행하며 하드포크는 과격하게 진행된다. 좀 더 상세히 알아보면 소프트포크는 기존버전과 새 버전의 블록이 동시에 호환 가능한 업그레이드의 경우에 일정 기간동안 두 버전을 모두 허용하여 진행되다가 특정 사건을 기준으로 기존 버전은 완전히 배제하고 새 버전만을 인정하는 방법을 말한다. 이 방법은 사용자로 하여끔 적응할 기간을 주고 혼란을 주지않아 안전한 방법이다. 특정 사건이란 비트코인에 소프트포크가 진행될때마다 바껴왔으며 "특정날짜" 혹은 "지지하는 사용자가 특정 비율을 넘어설때"등의 방법이 사용되어 왔다. 하지만 하드포크는 이러한 유보기간을 주지않고 어느순간부터 새버전의 블록만 인정하는 방법이다. 이 방법은 과격하고, 비트코인 네트워크에 기존버전의 블록과 새 버전의 블록이 동시에 떠돌아다니게 되어 사실상 이름만 같고 별개로 운영되는 두개의 비트코인이 탄생하는것과 마찬가지라고 생각하면 된다.

하드포크는 해당 블록체인의 신뢰성을 떨어뜨리고 가상화폐시장에 혼란을 가져오는 존재라서 사실 비트코인에서는 이 책을 쓰는 시점에서는 아직 한번도 발생한적 없는 사건이다. 하지만 이더리움의 경우 이 사건이 한번 일어났다. 이더리움이란 비트코인과 비슷한 가상화폐로 비트코인과는 다르게 스마트 컨트랙이라는 기능이 추가되어있으며, 사용자는 이 스마트 컨트랙을 이용해 수수료를 지불하는 대신 블록체인상에서 간단한 프로그램은 돌릴수 있다. 문제는 이 기능에 버그가 숨어있었다는 점이고 해커들이 이를 악용해 이더리움에 존재했던 이더(이더리움의 화폐 단위이다)의 총액의 10%가 말그대로 도난당한 사건이 일어났다. 이 도난사건은 즉시 이더리움 개발자들에게 보고되어, 즉각 가능한 2가지의 해결책을 제시하고 이용자들의 투표과정을 거쳐 3일만에 일부 블록은 없던일로 해버리고 도난당한 금액을 그대로 돌려주는 하드포크를 단행하였고 이는 성공적으로 진행되었다.

다만 문제가 발생하였는데 블록의 일부가 소실되었고, 이로인해 많은 양의 이더리움 거래가 "없던일"로 되어버린것이다. 이에 반발한 일부 유저는 해당 블록을 없애지 않고 해킹당한 금액도 그대로 유지되는 이더리움 클래식이란 새로운 가상화폐를 만들어 버렸다. 그 후 이더리움 사용자들은 누구를 사용해야 하는가?에대한 혼란때문에 이더리움이더리움 클래식의 시세는 변동을 계속하다가 지금은 각각 ETHETC란 이름으로 사실상 별개의 가상화폐로 계속 이용되고 있다.