앞선 포스트에서 블록 안에 있던 거래들은 취소된다.
라고 작성하였는데, 해당 부분에 모호한 지점이 있어 포스트를 따로 팠다.
포크의 의미와 포크가 일어났을 때 어떤 일이 일어나는지, 채택되지 못한 체인의 거래들은 어떻게 되는지에 대해 여러 자료들을 찾아본 후 다시 정리해보았다.
포크는 분기점을 의미한다. 만약 두 개의 블록이 거의 동시에 채굴이 되었을 경우 체인상에 포크가 일어났다, 라고 표현한다. 혹은 체인 상에 업데이트가 일어났을 때에도 포크가 일어난다.
블록체인은 지속적으로 개선이 이루어진다. 새로운 기능이 추가 되거나 기존의 문제점을 해결하기 위해 종종 포크가 일어난다.
블록체인 네트워크 참여자들 사이에 규칙 변경에 대한 합의가 이루어진다면 그 변경사항을 적용하기 위해 포크가 일어난다. 예를 들어 블록 크기 제한을 변경하거나 합의 알고리즘을 변경하는 등의 경우가 이에 해당한다.
블록이 거의 동시에 채굴되는 경우에도 포크가 일어날 수 있다. 블록이 동시에 채굴되는 경우는 흔하지 않지만, 블록체인은 P2P 네트워크 상에서 움직이기 때문에 블록이 다른 노드들에게 전달되는 시간 차가 존재한다. 이 시간차에 의해 블록이 도달하는 시간이 겹쳐 두 개의 체인으로 포크가 일어날 수 있다.
우선 하드포크와 소프트 포크에 대해 정리하고 블록의 포크가 일어 났을 때 거래 유효성에 대해 알아보자.
버전을 업그레이드 했을 때 블록이 기존의 체인에 연결되는 것이 아니라 두 갈래로 나뉘어 지는 것을 하드포크라고 한다. 주로 과감한 업그레이드가 일어났을 때 하드포크가 일어난다.
이전의 체인과는 호환이 되지 않아서 새로운 규칙이 적용되어야 하기 때문에 분기가 두 갈래로 나뉘어 지는 것이다. 하드 포크가 발생하면 모든 노드는 새 버전의 소프트웨어를 사용해야 한다.
예를 들어 PoW 합의 알고리즘을 선택했던 이더리움이 PoS 합의 알고리즘으로 갈아 탔을 때 하드포크가 일어났다. 우리가 흔히 알고 있는 이더리움과 이더리움 클래식 두 체인이 각각 존재하는 이유 또한 하드포크가 일어났기 때문이다.
하드포크가 일어난 블록체인은 포크가 일어난 분기점을 기준으로 했을 때, 이전의 체인은 사실상 완전히 동일하다.
버전을 업그레이드 했을 때 블록이 기존의 체인에 그대로 덮어 씌워진다. 단순한 버전 업그레이드일 때는 소프트포크가 발생한다.
단순한 업데이트 정도이므로 모든 노드들의 소프트웨어가 업데이트 될 필요는 없다. 그러나 새로운 버전에 따라 생성된 블록은 구버전을 사용하는 노드에게는 유효하지 않게 된다.
포크가 일어났을 때 어떤 체인을 옳은 체인으로 채택할 것인가?에 대한 두가지 규칙과 함께 트랜잭션에 대해서도 다시 살펴보도록 하겠다.
더 긴 체인을 옳은 체인으로 선택한다.
한 시간 동안 가장 긴 블록체인을 생성하는 노드의 체인이 옳은 체인이라고 인정해주는 룰이다. 비트코인이 포크가 일어났을 때 가장 긴 체인을 옳은 체인이라고 선택한다.
위 상황에서는 체인 B가 더 옳은 체인으로써 채택된다. 이 룰 때문에 60분이라는 시간이 지나야 완벽한 동기화(궁극적 일관성)가 되는 것이다. 비트코인은 확률적으로 6블록이 뒤에 붙을 때 99.9%의 확률로 동기화 된다.
체인 A와 C를 가지고 있던 노드는 블록 2를 기준으로 체인 B로 교체된다. 체인 A와 체인 C는 버려진다. 이때 A와 C 체인에 있는 블록들을 Orphan Block, 즉 고아 블록이라고 한다.
이런 상황에서 문제가 되는 트랜잭션은 대부분 코인베이스에 있다. 만약 블록체인이 변경되게 되면 트랜잭션도 변경되기 때문에 기존의 블록 보상이 사라지게된다. 그렇기 때문에 코인베이스로 발행된 코인은 해당 블록 이후에 99개의 블록이 쌓인 다음에서야 사용이 가능하다.
고아가 된 체인도 6번째 블록까지는 거래를 그대로 둔다. 분기가 발생하더라도 3~5개의 블록이 추가되는 과정에서 분기 상태가 해결되며 결국 하나의 블록체인만 남게 된다.
그렇기 때문에 체인 A와 C의 모든 거래가 취소되는 것은 아니다. 체인만 교체가 되고 블록은 그냥 버려진 블록이 되는 것이기 때문에 모든 거래가 취소된다고 볼 수 없다.
난이도의 합이 더 큰 체인을 옳은 체인으로 선택한다.
여기서는 난이도의 합이 제일 큰 체인 A가 선택이 된다. 난이도가 높다는 것은 채굴하기 어렵다는 의미이기 때문에 해시 파워를 많이 쓴 노드의 체인을 선택하게 된다.
위의 그림에서 고아블록인 D에 포함된 트랜잭션이 유실되지는 않는다.
메인체인에 연결된 정상적인 블록 A 또한 같은 시간대에 모여진 트랜잭션에 대해 생성된 블록이기 때문이다. 따라서 고아블록이 되더라도 그 안에 포함된 트랜잭션들은 정상적으로 연결된 블록 A에 똑같이 존재할 확률이 크다. 물론 트랜잭션이 네트워크에 전파되는 시간이 있기 때문에 메인체인에 연결된 블록과 고아블록의 트랜잭션 내용이 정확히 일치한다고는 할 수 없지만 블록 A에 포함되지 못한 트랜잭션은 그 다음 블록인 블록 B, 혹은 블록 C에 존재할 것이다.
(출처 : 해시넷 위키)
블록체인에서 포크가 발생했을 때, 선택되지 않은 체인의 블록에 포함된 거래들이 어떻게 처리되는지는 상황에 따라 다르다.
포크가 일어났을 때 체인으로 선택되지 못한 블록을 고아 블록이라고 한다. 고아 블록은 메인 체인에 포함되지 않기 때문에 거래들도 유효성을 잃는다.
그러나, 이런 거래들이 모두 "취소" 되는 것은 아니다.
그 대신 고아 블록에서 아직 처리되지 않은 트랜잭션들은 다시 트랜잭션 풀(=Mempool)로 돌아갈 수 있다. 이 거래들은 다시 새로운 체인의 블록에 포함될 수 있다.
요약하자면, 선택되지 않은 다른 체인의 블록과 그 안에 있는 거래들이 굳이 삭제된다거나 완전히 사라진다기보다는 Main Chain에서 인정받지 못한다는 의미이다.