46 / 736STALE

Stale Block

주 체인에 남지 않은 유효한 블록

Stale Block은 옆 분기에 남은 유효한 Bitcoin 블록입니다. 사기가 없어도 생길 수 있습니다. 두 채굴자가 거의 동시에 블록을 찾은 뒤 네트워크가 한쪽 분기만 이어 가는 경우입니다.

Stale Block은 Bitcoin 규칙을 지키지만 활성 체인에는 포함되지 않습니다. 활성 체인은 블록과 거래를 검증하는 컴퓨터인 노드가 확인 수를 세고 쓸 수 있는 자금을 판단할 때 기준으로 삼는 기록입니다. 유효한 분기 사이에서는 누적된 채굴 작업량이 선택을 결정합니다. 결제를 받는 사람은 확인 하나가 사라져 다시 기다려야 할 수 있지만, 비트코인이 자동으로 없어지는 것은 아닙니다.

채굴자 안나와 파벨을 생각해 보겠습니다. 둘 다 같은 마지막 블록을 이을 새 블록을 찾고 있습니다. 안나가 먼저 찾았지만 그 소식이 파벨에게 닿기 전에 파벨도 자신의 블록을 찾습니다. 담긴 거래가 조금 다를 뿐 두 블록 모두 유효할 수 있습니다. 블록과 거래를 검증하는 노드들은 두 블록을 서로 다른 순서로 알게 됩니다. 그래서 잠시 서로 다른 체인 끝을 따릅니다. 유효한 한 분기가 더 많은 작업량을 쌓고 노드들이 이를 검증하면 그쪽으로 옮겨 갑니다. 선택되지 않은 분기에 남은 블록을 Stale Block이라고 합니다. [1]

Bitcoin에는 같은 자금을 두 번 모두 유효하게 쓰지 못하도록 하나의 기록이 필요합니다. 따라서 두 블록이 각각 규칙을 지켰는지 확인하는 것만으로는 부족합니다. 노드는 어느 유효한 분기를 따를지도 선택해야 합니다. 블록의 유효성과 체인 선택은 서로 다른 문제입니다. Stale Block은 채굴 작업 증명인 Proof of Work, 거래, 서명이 모두 올바르더라도 선택된 기록 밖에 있을 수 있습니다. 그렇다고 결함이 있거나 사기성 블록이라는 뜻은 아닙니다. [1] [2]

파벨의 블록에 내 결제가 담겨 지갑이 확인 1회를 표시했다고 가정해 보겠습니다. 안나의 분기가 최종적으로 선택되면 그 안에 무엇이 있는지가 중요합니다. 같은 거래가 그쪽에도 있으면 확인된 상태가 유지됩니다. 그렇지 않으면 노드가 보관하는 미확인 거래 목록인 Mempool로 돌아가 다른 블록을 기다릴 수 있습니다. 다만 복귀가 보장되지는 않습니다. 여전히 받아들일 수 있는 거래여야 하고 새 기록과 충돌해서도 안 됩니다. 새 기록에 같은 자금을 쓰는 다른 거래가 이미 있으면 원래 결제도 그 안에서 동시에 확인될 수는 없습니다. [2]

일반 결제와 Coinbase Transaction은 구분해야 합니다. Coinbase Transaction은 블록의 첫 거래로, 채굴자에게 새로 발행된 비트코인과 거래 수수료를 보상으로 배정합니다. 파벨의 블록이 활성 체인 밖에 남으면 그 coinbase 보상은 해당 기록에서 쓸 수 없습니다. 일반 결제처럼 Mempool로 옮겨 가지도 않습니다. 그렇다고 파벨이 사용한 전력이 돌아오는 것은 아닙니다. 그래서 채굴자는 블록을 찾는 것뿐 아니라 다른 참여자에게 빨리 알리는 일도 중요하게 생각합니다. [1] [2]

기사나 블록 탐색기에서 Stale Block을 Orphan Block이라고 부르기도 합니다. 두 말을 동의어처럼 쓰지만 엄밀한 뜻은 다릅니다. Orphan Block은 노드가 바로 앞 블록을 아직 몰라 체인에 연결하지 못한 블록입니다. 반면 Stale Block은 앞 블록이 알려져 있고 자체도 유효할 수 있습니다. 단지 선택된 분기 밖에 있을 뿐입니다. 노드에 입력 검증에 필요한 앞선 거래가 없을 때 그 거래에도 orphan이라는 말을 씁니다. 따라서 자료가 어떤 뜻으로 사용하는지 살펴봐야 합니다. [1]

노드가 이미 파벨의 블록을 사용하다가 안나의 분기로 교체하면 Reorg가 일어납니다. 활성 기록으로 인정하는 부분을 바꾸는 것입니다. 이 때문에 지갑에 표시되는 확인 수가 달라질 수 있습니다. 예시처럼 짧은 경합은 정직한 채굴에서도 생깁니다. 다만 공격자가 기록 변경을 이용해 같은 자금으로 다른 결제를 통과시키는 Double Spend를 시도할 수도 있습니다. Stale Block 하나만으로 그 의도를 입증할 수는 없습니다. 사건의 경과와 충돌하는 거래가 있는지 함께 확인해야 합니다. [1] [2]

새 블록 소식이 온 세상에 즉시 전달되지는 않습니다. 전파가 오래 걸릴수록 다른 채굴자는 모르고 같은 이전 블록 위에서 더 오래 작업할 수 있습니다. 전송 속도, 노드 사이의 연결, 블록 간격에 비한 전파 시간이 모두 영향을 줍니다. Stale Rate는 발견된 유효 블록 가운데 활성 체인에 남지 않은 비율입니다. Bitcoin 규칙이 정한 고정 비율은 아닙니다. 수치를 비교할 때는 관측 기간과 관측자가 실제로 어떤 블록을 보았는지도 고려해야 합니다. [1] [3]

BIP152는 Compact Block Relay를 설명합니다. 노드는 새 블록의 거래 대부분을 Mempool에서 이미 알고 있는 경우가 많으므로 모든 내용을 다시 보낼 필요가 없습니다. 짧은 식별자로 기존 데이터를 조합해 블록을 만들고, 빠진 거래만 요청할 수 있습니다. 전송량을 줄이고 조건이 맞으면 새 블록을 더 빨리 알게 해 줍니다. 전파 방식을 개선하는 것이지 유효성 규칙을 바꾸는 것은 아닙니다. 두 채굴자가 거의 동시에 블록을 찾는 상황을 완전히 없앨 수는 없습니다. [3]

분기에 누적된 작업량의 기술적 이름은 chainwork입니다. 실제로 쓴 전력을 측정하는 것도, 컴퓨터 수로 투표하는 것도 아닙니다. 각 블록은 채굴 작업의 증거인 Proof of Work의 난이도에서 계산한 값을 더합니다. 그래서 ‘더 긴 체인이 이긴다’보다 ‘chainwork가 더 큰 유효한 분기가 선택된다’가 정확합니다. 노드는 규칙 준수를 검증해야 합니다. 작업량이 아무리 많아도 무효한 거래가 유효해지지는 않습니다. 또한 stale이라는 말은 특정 노드가 그 순간 선택한 기록과 블록의 관계를 나타냅니다. [1] [2]

블록 탐색기는 편리하지만 해당 서비스의 관점을 보여 줍니다. 규칙을 검증하는 자신의 Full Node가 있으면 독립적으로 받아들인 기록을 살펴볼 수 있습니다. 노드가 해당 블록 데이터를 보관하고 있다면, Bitcoin Core의 getblock은 활성 체인 밖의 블록에 대해 confirmations: -1을 반환합니다. 저장 공간을 절약하는 프루닝으로 삭제되는 등 데이터가 없으면 오류를 반환합니다. 이 값만으로 모든 유효성 검사를 통과했다고 입증되지는 않습니다. 정확한 위치를 알려면 식별자인 hash, 이전 블록, 높이(그 블록 앞에 있는 블록 수), chainwork도 확인하고 개별 결제의 결과는 따로 살펴보세요. 두 블록은 높이가 같아도 hash는 다를 수 있습니다. [4] [5]

더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 Reorg, 확인, Block, Block Header, Proof of Work, 채굴. 다음 항목에서도 이 글을 참조합니다 Reorg, Mining Pool, Hashrate, Selfish Mining.

DOC · 001Bitcoin Developer Guide — Block Chain문서 DOC · 002Bitcoin Core v29.0 — chain activation and mempool reconciliation1차 출처 DOC · 003BIP 152 — Compact Block Relay명세 DOC · 004Bitcoin Core v29.0 — getblock문서 DOC · 005Bitcoin Core v29.0 — block RPC implementation1차 출처
개정일: 1차 출처 우선 · 투자 조언이 아닙니다