고아 블록과 스테일 블록
비트코인에서는 규칙에 맞게 만들어진 블록이 언제나 최종 장부에 남는 것은 아닙니다. 서로 다른 채굴자가 거의 동시에 블록을 만들면, 참가자마다 먼저 받은 블록을 기준으로 잠시 다른 체인을 이어 갈 수 있고, 이후 누적 작업량이 더 큰 유효한 체인으로 수렴하면서 다른 블록은 경쟁에서 밀려날 수 있습니다.
이때 비슷한 상황을 가리키는 스테일 블록과 고아 블록이라는 표현이 쓰입니다. 두 용어는 실제 사용에서 자주 섞이지만, 원래 가리키는 상태에는 차이가 있습니다.
스테일 블록: 체인 경쟁에서 밀려난 블록
스테일 블록은 규칙에 맞게 만들어졌지만 선택된 체인에 남지 못한 블록을 말합니다. 채굴자는 계산을 제대로 수행했고 블록의 내용에도 문제가 없었지만, 이후 누적 작업량이 더 큰 유효한 체인이 선택되면서 자리를 잃습니다.
작은 마을의 장부를 생각해 보겠습니다. 여러 장부지기가 그날의 거래를 한 장에 정리해 벽에 붙이는데, 두 사람이 거의 같은 시각에 각자의 장을 붙일 수 있습니다. 참가자마다 먼저 전달받은 장이 다를 수 있으므로 잠시 서로 다른 장을 기준으로 다음 기록을 이어 갈 수 있습니다. 이후 한쪽에 누적 작업량이 더 많이 쌓이면 그 체인이 선택되고, 다른 쪽은 주된 기록에서 빠집니다.
떼어진 종이의 내용이 틀렸던 것은 아닙니다. 단지 체인 경쟁에서 선택되지 않았을 뿐입니다. 스테일 블록을 만든 채굴자는 해당 블록의 보상을 받지 못하며, 들인 전기와 시간은 비용으로 남습니다.
고아 블록: 부모 블록을 확보하지 못한 상태
고아 블록은 부모 블록의 해시는 알고 있지만, 해당 부모 블록 자체를 아직 확보하지 못해 연결 관계와 유효성을 충분히 확인할 수 없는 블록을 가리킵니다. 블록 헤더에는 부모 블록의 해시가 들어 있으므로, 부모를 전혀 모른다기보다 부모 블록을 아직 받지 못한 상태에 가깝습니다.
먼저 도착한 페이지에 앞 페이지의 식별자는 적혀 있지만 앞 페이지 자체가 아직 오지 않았다고 생각하면 쉽습니다. 네트워크가 부모 블록을 전달하면, 고아 상태였던 블록은 이어질 위치를 확인할 수 있습니다.
두 용어가 섞여 쓰이는 이유
‘고아 블록’이라는 말이 스테일 블록의 뜻으로 사용되는 경우가 있어, 문맥에 따라 실제로 어떤 상태를 가리키는지 확인해야 합니다. 엄밀하게 구분하면 다음과 같습니다.
- 고아 블록: 부모 블록의 해시는 알지만 부모 블록 자체를 아직 확보하지 못한 블록
- 스테일 블록: 규칙에는 맞지만 최종적으로 선택된 체인에 남지 못한 블록
일상적인 설명에서는 둘 다 ‘밀려난 블록’이라는 뜻으로 쓰일 수 있지만, 부모를 확보하지 못한 상태와 체인 경쟁에서 패한 상태는 구별하는 편이 정확합니다.
밀려난 블록에 담긴 거래는 어떻게 되나
스테일 블록에 송금 거래가 들어 있었다면, 그 거래가 블록과 함께 영원히 사라지는 것은 아닙니다. 선택된 체인과 충돌하지 않고 여전히 유효한 거래라면 다시 블록에 포함될 수 있습니다. 확인 횟수는 현재 선택된 체인에서 그 거래가 포함된 블록을 기준으로 다시 계산합니다.
블록 경쟁은 네트워크의 통신에 시간이 걸리기 때문에 언제든 발생할 수 있습니다. 통신이 빨라지면 발생 빈도를 낮출 수 있지만 완전히 없앨 수는 없습니다. 두 블록이 동시에 전파되는 가능성이 남아 있기 때문입니다.
그래서 방금 포함된 거래는 아직 체인이 바뀌는 영향을 받을 수 있습니다. 그 위에 블록이 더 쌓일수록 거래가 다시 밀려날 가능성은 크게 낮아집니다. 확인을 기다리는 일은 이런 가능성을 줄이는 과정입니다.
정리
스테일 블록은 규칙에 맞게 만들어졌지만 체인 경쟁에서 밀려난 블록입니다. 고아 블록은 부모 블록의 해시는 알지만 부모 블록 자체를 아직 확보하지 못한 블록입니다. 두 용어는 실제 사용에서 자주 섞이지만, 가리키는 상태는 다릅니다.
블록이 최종 체인에 남지 않아도 유효한 거래가 곧바로 사라지는 것은 아니며, 채굴자가 수행한 계산은 블록 경쟁의 일부로 남습니다. 이 구조를 더 이해하려면 최장 체인 규칙과 평균 10분을 함께 살펴볼 수 있습니다.