체인이 스스로를 다시 쓸 때: Ravencoin의 합의 결함과 확인 하나의 진짜 값어치

·7분 읽기·작성자: SSP Editorial Team
SSP Academy 커버: Ravencoin의 합의 결함과 확인의 의미

체인이 스스로를 다시 쓸 때: Ravencoin의 합의 결함과 확인 하나의 진짜 값어치

암호화폐 사고는 대부분 키에 관한 이야기입니다. 누군가 시드 문구를 피싱당하고, 어떤 컨트랙트에 재진입 결함이 있고, 어떤 거래소가 핫월렛을 잃습니다. 장부는 여전히 정직하고, 다만 특정한 코인 묶음이 주인의 뜻에 반해 손을 바꿀 뿐입니다.

8월의 Ravencoin 사건은 다른 범주였고, 훨씬 드문 쪽이었습니다. 누구의 키도 건드려지지 않았습니다. 무너진 것은 장부 그 자체였습니다.

무슨 일이 있었나

2026년 8월 7일 15시 44분 UTC, 블록 높이 4,487,776에서 있을 수 없어야 할 블록 하나가 네트워크에 받아들여졌습니다. 그 뒤로도 더 나왔습니다. 조사된 2,089개 블록 구간에서 96개가 유효하지 않았습니다. 이 결함은 8월 11일에 공개적으로 시연되었는데, 첫 악용 블록으로부터 나흘 뒤입니다. 다시 말해 체인은 누군가 알리기까지 거의 일주일 동안 조용히 위조 블록을 만들어내고 있었습니다.

RVN은 약 20% 떨어져 0.0027달러 근처가 되었습니다. UpbitBitget은 입출금을 중단했습니다. Ravencoin 프로젝트는 거래소와 탐색기, 노드 운영자에게 즉시 업그레이드할 것을 요청하고, 블록 4,487,775 이후에 확인된 모든 거래를 되돌려질 수 있는 것으로 표시했습니다.

곱씹어 볼 만한 것은 바로 그 마지막 문장입니다. "일부 거래가 되돌려졌다"가 아닙니다. 사흘 치의 모든 거래가 잠정적이었습니다.

결함: 아무도 대조하지 않은 숫자

Ravencoin은 KAWPOW로 채굴합니다. ProgPoW에서 파생된, 메모리를 많이 요구하는 작업증명 알고리즘입니다. 메모리를 많이 쓰는 것이 요점 전부입니다. 연산이 램에 올려두어야 하는 커다란 데이터 집합에 의존하고, 바로 그것이 ASIC의 경제성을 없애고 채굴을 그래픽카드의 손이 닿는 곳에 남겨둡니다. 이 데이터 집합은 주기적으로 다시 만들어지며, 어느 것이 필요한지는 블록의 높이에서 도출됩니다.

블록 헤더에는 nHeight라는 필드가 있어, 그 블록이 체인의 어디에 놓이는지를 선언합니다. 노드는 블록이 스스로 주장한 높이를 기준으로 작업증명을 검증했습니다. 그 주장을 블록의 실제 체인상 위치와 대조한 적은 한 번도 없었습니다.

그러니 거짓말이 가능했습니다. 체인 초기의 높이를 선언하고, 작은 데이터 집합을 받고, 작업의 일부만 수행해서, 취약한 노드가 기꺼이 유효하다고 받아줄 블록을 만들어냅니다. Ravencoin 채굴을 비싸게 만드는 그 메모리 경도는, 실제로 캐고 있는 것과 다른 블록을 캐고 있다고 말하기만 하면 선택 사항이 되었습니다. 프로젝트 자신의 표현을 빌리면, 유효하지 않은 블록은 정당한 블록보다 극적으로 싸게 만들 수 있게 되었습니다.

합의 결함으로서 이보다 더 근본적이기는 어렵습니다. 작업증명은 블록체인이 전기를 최종성으로 바꾸는 바로 그 장치입니다. 증명을 싸게 위조할 수 있다면 최종성은 없습니다. 최종성의 겉모습만 남습니다.

치료약이 바로 그 재구성이었다

여기서부터가 밖에서 보면 불안해 보이지만 실제로는 옳았던 대목입니다.

네트워크 해시레이트의 과반을 합쳐 쥐고 있는 2Miners와 RavenMiner는, 4,487,776부터 악용된 가지를 배제한 체인을 채굴하고 있다고 발표했습니다. 패치된 노드 소프트웨어(2Miners가 4.6.1.1-hf1을 배포)는 선언된 높이가 실제 높이와 맞지 않는 블록을 거부하고, 블록 4,487,775를 체크포인트로 못박습니다. 그 선을 넘어 오염된 옛 역사가 다시 받아들여질 일은 이제 없습니다.

결과는 깊이 사흘가량의 체인 재구성이었습니다. 사흘 치 블록이 버려지고 대체되었습니다.

깊은 재구성은 보통 공격의 증상입니다. 여기서는 그것이 치료였습니다. 악용된 가지는 누군가 다시 쓴 정당한 역사가 아니었습니다. 애초에 유효하지 않았고, 네트워크는 아닌 척하기를 그만두기로 한 것입니다.

그 이음매는 오늘도 체인에서 볼 수 있습니다. 블록 4,487,775는 8월 7일 15시 43분 57초 UTC에 채굴되었습니다. 블록 4,487,776 — 회복된 체인 위의 정직한 쪽 — 에는 8월 10일 14시 9분 42초 UTC가 찍혀 있습니다. 1분을 목표로 하는 체인에서 연속된 두 블록 사이에 이틀 스물두 시간 이십육 분. 그 틈이 흉터 조직입니다.

RVN을 들고 있었다면 이것이 무슨 의미였나

코인이 당신이 통제하는 지갑에 있었고 그 며칠 동안 거래하지 않았다면, 당신에게는 아무 일도 없었습니다. 키는 애초에 문제가 아니었습니다. 4,487,775 이전의 잔액이 의심받은 적은 한 번도 없습니다.

그 창 안에서 거래를 했다면, 당신의 거래는 살아남기 위해 회복된 체인에 다시 채굴되어야 했습니다. 평범한 결제는 대체로 살아남았습니다. 유효한 거래가 버려진 블록에 들어 있었을 뿐이고, 멤풀로 돌아와 다시 확인되었으니까요. 재구성에서 살아남지 못하는 것은 버려진 역사가 영구하다는 데 기대고 있던 모든 것입니다. 전형적인 사례가 거래소 입금입니다. 코인이 도착하고, 잔고에 반영되고, 거래되거나 출금되고, 그다음에 그 입금이 일어나지 않은 일이 됩니다. 입출금 중단이 옳은 판단이었던 이유, 그리고 빠르게 움직인 거래소들이 공황에 빠진 것이 아니라 자신과 이용자를 지키고 있었던 이유가 정확히 여기 있습니다. 나중에 증발할 돈을 잔고에 반영하는 것이 대안일 때, 멈추는 것은 거래소가 흡수할 수 있고 흡수해야 할 실패 방식입니다.

확인이 실제로 약속하는 것

우리 것을 포함해 대부분의 지갑은 확인 횟수를 보여주고, 거기서 안전함을 짐작하게 둡니다. 그 숫자가 무슨 뜻인지 정확히 말해둘 값어치가 있습니다. 이런 사고에서야말로 부정확함이 무는 법이니까요.

확인은 보장이 아닙니다. 경제적 진술입니다. 이 지점부터 역사를 다시 쓰려면 이만큼의 작업증명을 다시 해야 하고, 그 비용은 이 결제의 가치보다 크다. 비트코인의 여섯 확인은 비용에 관한 경험칙이지, 영속성에 대한 암호학적 증명이 아닙니다.

그 진술에는 숨은 전제가 구워져 있습니다. 블록을 만드는 일이 비싸다는 전제입니다. Ravencoin의 결함은 그 전제를 걷어냈습니다. 유효하지 않은 블록이 거의 공짜가 되면, "확인 몇 회"는 아무것도 재지 못하게 됩니다. 화면의 숫자는 계속 올라가고 있었지만, 그것이 세던 대상은 소리 없이 의미를 잃은 뒤였습니다.

정직한 결론은 "확인은 쓸모없다"가 아닙니다. 확인 횟수란 그 체인의 합의 규칙이 얼마나 건강한지에 대한 주장이며, 그 규칙이 가진 약점을 전부 물려받는다는 것입니다. 걸린 값어치에 맞춰 인내심의 크기를 정하고, 진행 중인 합의 사고는 더 큰 숫자를 기다릴 이유가 아니라 거래를 아예 멈출 이유로 다루십시오.

SSP는 어디에 있었나

우리는 남의 API에서 잔액을 읽어오는 대신 자체 Ravencoin 인프라를 운영합니다. 그래서 "SSP는 올바른 체인에 있는가"라는 질문에는 안심시키는 대답이 아니라 확인 가능한 대답이 있습니다.

우리 노드는 Ravencoin 4.8.0으로 돌아가고 있고 — 하드포크를 한참 지난 버전입니다 — 이 글을 쓰는 시점에 회복된 체인의 높이 4,522,205에 있습니다. 이음매 양쪽 모두 기준 체인과 정확히 일치합니다.

  • 4,487,775 → 000000000002d64509e06e76ddbbe418c725291687ec62b41ecfc40386a091fd
  • 4,487,776 → 0000000000042bb50281ebb2f68d3f9143980b041178849015d95b067d52a841

공식 Ravencoin 탐색기와 같은 해시, 같은 사흘의 틈입니다. SSP 사용자에게 요구된 것은 아무것도 없었고, SSP의 Ravencoin은 이전과 똑같이 작동합니다.

정직한 한계

우리는 우리 구조가 무엇으로부터 지켜주는지 설명하려고 이런 글을 씁니다. 그러니 무엇으로부터는 지켜주지 못하는지도 분명히 해두는 것이 중요합니다.

2-of-2 멀티시그가 지키는 것은 서명 쪽입니다. 침해된 기기 하나만으로는 코인을 옮길 수 없다는 것, 모든 결제가 서로 독립된 두 하드웨어에서 두 번 승인된다는 것, 당신의 노트북을 훔친 자의 손에는 아무것도 남지 않는다는 것. 이 성질들은 사건 내내 유지되었고, 사람들이 암호화폐를 잃는 경로의 압도적 다수에 대해 실제로 효력을 갖는 성질이 바로 이것입니다.

그중 어느 것도 체인 재구성에는 도움이 되지 않습니다. 하드웨어 지갑도, 망 분리된 서명기도, 패스프레이즈도, 크기가 얼마든 멀티시그 정족수도 마찬가지입니다. 합의 실패는 이 모든 것의 아래에 있습니다. 당신의 보관 방식이 아니라 네트워크의 성질이니까요. 자기네 지갑이 나쁜 블록으로부터 당신을 지켜준다고 말하는 이가 있다면, 그는 무언가를 팔고 있는 것입니다.

지갑이 정직하게 내놓을 수 있는 것은 이렇습니다. 진짜 노드 인프라를 운영하고, 패치를 유지하고, 어느 체인을 따르는지 투명하게 밝히는 것. 그것은 유지보수 약속이지 암호학적 보장이 아니며, 그것이 주장으로서 옳은 크기입니다.

8월에서 가져갈 다른 하나는 위험이 실제로 어디에 사는지에 대한 상기입니다. Ravencoin의 결함은 누군가 악용하기까지 수년 동안 코드 안에 있었고, 상상할 수 있는 가장 화려하지 않은 자리에 앉아 있었습니다. 모두가 다른 누군가 대조하고 있으려니 여긴 헤더의 필드 하나 말입니다. Coldcard의 엔트로피 실패도 똑같은 모양의 문제였습니다. 작고 지루하고 아무도 들여다보지 않은 한 줄의 코드, 밖에서는 보이지 않으면서 그 위의 모든 것을 떠받치고 있던 코드.

아픈 것은 그런 결함입니다. 기묘한 암호학적 공격이 아니라, 아무도 테스트를 써두지 않은 전제 쪽입니다.

이 글 공유하기

관련 글