본문 바로가기
컴퓨터공학/네트워크

블록체인- 소프트 포크, 하드 포크

by 딩코딩코 2019. 10. 18.

블록을 생성하다 보면 '충돌'이 발생하는 경우가 있다.

A-B-C-D-E 이렇게 줄줄이 열차로 이어진 노드가 있다.
그런데 A와 E가 거의 동시에 블록을 생성하고 블록에 각자 내용을 기록해서 피어에 전송한다.
그러면 B는 A가 생성한 블록을 기록하고, D는 E가 생성한 노드를 기록할 것이다.(네트워크 상황 동일, 오류 없음 가정)
그리고 문제는 C다.
C는 B가 전송한 블록체인과 D가 전송한 블록체인을 동시에 전달받는다.
이때 누구의 블록체인을 따를 것인가?

먼저, C는 둘 중 무거운 블록체 안을 따른다.
'무겁다'라는 것은 블록이 더 길게 이어진 것, 더 많은 블록이 이어진 것을 따른다는 것이다.

한편, 이런 경우가 있다. 
A와 B가 있는데,
A는 프로그램을 업데이트해서 과거에는 없던 새로운 규칙을 적용했다.(예를 들어, 기존에는 2MB로 제한되던 것을 3MB로 늘렸다.)
그리고 3MB짜리 블록을 생성하여 전파했다.
이때, B는 업데이트를 하지 않은 상태이다.
그렇다면 B는 기존의 블록체인을 따를까? 새로운 블록체인을 따를까?
B는 당연히 기존 자신의 블록체인을 갖고 새로운 블록체인은 폐기할 것이다.
이렇게 둘은 서로 다른 길을 가게 되는 것이다.
이렇게 과거에 없던 새로운 규칙을 적용하는 것을 '하드 포크'라고 한다.
하드 포크의 결과 새로운 규칙이 적용된 시점에서 체인은 둘로 나눠진다.
이렇게 영원히 달리 가다가 둘이 다시 만날 수도 있다.
B도 업데이트를 할 경우 그렇다.(그러나 그럴 일이 거의 없다... 왜냐하면 기존에 자신이 가지고 있던 블록들을 다 폐기해야 한다. 그렇게 되면 폐기한 것 중 자신이 생성한 블록이 있을 경우 블록 보조금을 다시 뱉어야 하고, 자신의 거래 기록들도 다 사라지기 때문이다. 새로운 규칙을 적용한 시점보다 지출을 많이 하고 블록 생성을 안 한 사람이면 좋을 수도...?)

반대로 이런 경우도 있다.
이번에는 A가 프로그램을 업데이트했는데, 과거에 있던 규칙을 없애버린 것이다.
(예를 들어, 기존에는 계약 내용'도' 기록할 수 있었는데 이제부터 블록에는 숫자로 된 거래 내역만 적을 수 있다!)
그리고 숫자로 된 블록을 생성해서 B에 전달했다.
이때, B는 업데이트하지 않은 상태이다.
그러나 이 경우는 앞의 경우와 다르다.
A가 전송한 데이터가 B의 규칙에 어긋나지 않기에 B는 자신의 블록체인에 해당 블록을 추가한다.
그러나 A는 더 이상 B가 계약 내용을 담은 블록을 생성하면 이를 받아들이지 못한다.
여기서 또 두 가지 형태의 체인이 발생하는 것이다.
그런데 이 경우에는 두 체인이 하나로 합쳐지기가 앞의 경우보다 쉽다.
B가 굳이 업데이트를 하지 않더라도 A의 체인이 더 길 경우 둘은 합쳐진다.
B가 업데이트를 하면 당연히 합쳐진다.
앞의 경우보다 다시 합쳐질 가능성이 높다.
그래서 이렇게 과거에 있던 규칙을 없애는 경우를 '소프트 포크'라고 한다.