공공 블록체인은 왜 멈추는가? 코스모스 25시간 정지 사태로 진짜 이해하는 블록체인 합의

Cosmos Hub는 Neutron 거버넌스 공격 이후 1/3 이상의 투표권을 가진 검증자들이 도난 자산 이동을 막기 위해 블록 생성을 중단하면서 약 하루 동안 중단되었습니다. 복구를 위해 검증자들은 클라이언트를 업그레이드하고 공격자 주소의 자금을 동결하는 단일 상태 변경을 실행해야 했습니다. 이 기사는 이 사건을 통해 블록체인 합의의 본질을 탐구하며, 탈중앙화가 무중단을 보장하지 않는다는 점을 강조합니다. 다양한 합의 메커니즘(PoW, PoS, BFT)은 공격 시 안전성과 생존성에 대해 서로 다른 트레이드오프를 가지며, 사용자의 개인 키 통제권은 네트워크의 합의 권한과 별개입니다. 핵심은 합의가 일시 중지되거나 수정될 수 있지만, 충분히 큰 집단적 합의가 있을 때만 가능하다는 것입니다.

요약

글: imToken

9월 22일 저녁, 한 사용자가 ATOM 전송을 보냈다.

하룻밤이 지나도록 거래는 여전히 '확인 대기' 상태에 머물러 있었다.

개인키를 잃어버린 것도 아니고, 지갑에 서명 이상이 발생한 것도 아니었다. 다음 날 다시 확인해 보니 여러 공개 RPC가 모두 Cosmos Hub가 블록 높이 33,086,740에서 멈춰 있다고 표시했다.

새로운 블록이 생성되지 않으니, 당연히 이 거래를 담아 넣을 곳도 없었다.

약 하루가 지나 Cosmos Hub가 블록 생성을 재개하고 나서야, 계속 대기 상태에 있던 이 ATOM 전송이 마침내 성공했다.

일반 사용자에게 이번 사건은 블록체인 합의를 이해하는 가장 직관적인 수업이 될 수 있다.

우리는 흔히 '어떤 중앙 기관도 공공 블록체인을 끌 수 없다'고 말하지만, 현실은 분명히 훨씬 복잡하다. 충분히 탈중앙화된 블록체인이라도, 서버실에 있는 그 '종료 버튼'은 대개 존재하지 않지만, 그래도 멈출 수는 있다.

이번 Cosmos Hub의 정지는 평소에는 바닥에 숨어 있던 이 메커니즘을 일반 사용자 앞에 온전히 드러내 보여준 셈이다.

1. 코스모스는 왜 갑자기 '블록 생성을 멈췄나'?

먼저 혼동하기 쉬운 문제 하나를 분명히 해두자. 이번에 직접 공격을 받은 것은 Cosmos Hub가 아니다.

사건은 Neutron에서 처음 발생했다.

9월 22일, 'AIATO: AI Agent Takeover'라는 이름의 Neutron 거버넌스 제안이 통과됐다. 공격자는 체인 레벨 거버넌스 권한의 빈틈을 파고들어, wasmd 프레임워크가 기본 제공하는 특권 명령을 이용해 Astroport, Drop 등 애플리케이션의 컨트랙트 관리자를 공격자가 통제하는 주소로 바꿔버렸다.

이는 우리가 흔히 이해하는 '코드 취약점'이나 '프로토콜 결함'이 아니다.

간단히 말하면, 애플리케이션 자체에는 '문 잠금장치'가 있지만, Neutron의 체인 레벨 거버넌스는 그보다 권한이 더 높은 '마스터키'를 쥐고 있다. 공격자가 거버넌스 결과를 장악하면 곧 이 열쇠를 손에 넣은 셈이 되어, 관리자를 다시 지정하고 컨트랙트를 마이그레이션하며 그 안의 자산을 빼돌릴 수 있다.

그리고 Cosmos Hub가 실제로 휘말리게 된 것은, 그 뒤에 이어진 크로스체인 자금 이동 때문이었다.

Cosmos Labs의 사후 분석에 따르면, Neutron이 운영을 멈추기 전에 공격자는 이미 일부 자산을 여러 네트워크로 옮겼고, 그중 약 170만 개의 ATOM이 Cosmos Hub로 들어와 크로스체인 유동성을 통해 환전되기 시작했다.

즉, Cosmos Hub 자체는 직접적인 공격을 받지 않았고, 일반 Hub 사용자의 자금도 Neutron 취약점으로 인해 직접 도난당하지는 않았다.

하지만 공격으로 얻은 ATOM이 이미 Hub에 들어왔기 때문에, 남은 ATOM이 계속 빠져나가는 것을 막기 위해 일부 Cosmos Hub 검증인이 노드 운영을 중단하기 시작했다.

9월 22일 19:18경(SGT)까지 운영을 중단한 검증인은 이미 전체 voting power의 3분의 1 이상을 차지했고, 이에 Cosmos Hub는 더 이상 새로운 블록을 형성할 수 없게 되어 결국 33,086,740에서 멈췄다.

이 단계는 매우 중요하다.

이는 Cosmos Hub에 어떤 회사가 직접 클릭할 수 있는 'Pause' 버튼이 존재하지 않으며, 사전에 체인상 거버넌스 투표를 거친 것도 아니라는 뜻이다. 네트워크를 실제로 멈추게 한 것은, 충분히 많은 검증인이 더 이상 합의 형성에 참여하지 않은 것이다.

하지만 더 주목할 만한 것은 사실 그 뒤의 복구 과정이다.

체인이 멈춘 지 약 4시간 후, 검증자는 완전한 복구 방안을 받았다. 정지된 블록 높이에 대해 일회성 상태 변경을 실행해, 공격자 주소에 남아 있는 ATOM을 커뮤니티 검증자가 공동 관리하는 멀티시그 주소로 옮기는 것이다.

이후 Cosmos Labs는 검증자가 이미 합의한 방안에 따라 Gaia v28.3.0 패치를 제작해 테스트하고 검증자에게 배포했다.

이 버전의 Gaia는 지정된 복구 높이에서 일회성 상태 변경을 실행해, 공격자 주소에 있는 1,227,121 ATOM을 Nansen, Keplr, Enigma, Silknodes, Kiln, Polkachu 여섯 곳으로 구성된 4-of-6 멀티시그 주소로 옮긴다.

9월 23일 새벽까지 v28.3.0 설치를 확인한 검증자가 전체 voting power의 67%를 넘어섰고, 이에 당일 12:00 UTC에 Cosmos Hub가 조율된 재시작을 진행했다. 약 6분 후, 이 일회성 상태 변경이 블록 높이 33,086,741에서 실행되어 네트워크가 정상적으로 블록 생성을 재개했다.

결국 Cosmos가 블록 생성을 멈췄다가 운영을 재개하기까지의 전 과정에서, 검증자가 먼저 네트워크의 Liveness를 잃게 만들고, 이어서 voting power의 3분의 2 이상이 새로운 상태 전환 규칙을 수용했으며, 마침내 이 규칙이 복구 이후의 canonical state가 된 것이다.

여기서 겉보기에는 단순한 질문 하나가 떠오른다. 탈중앙화된 공공 블록체인인데, 왜 검증권의 3분의 1 이상만으로 멈출 수 있고, 네트워크를 복구하려면 충분히 많은 검증자가 같은 소프트웨어를 함께 수용하고 실행해야 하는가?

그 답은 사실 '합의'라는 두 글자 안에 숨어 있다.

2. 이른바 합의란, 애초에 '절대 멈추지 않는다'가 아니다

블록체인에서 가장 오해하기 쉬운 것 중 하나는 '탈중앙화'와 '무중단'을 동일시하는 것이다.

실제로 합의 메커니즘이 진짜 해결하는 문제는, 중앙의 장부 기록자가 없는 상황에서 많은 노드가 어떻게 거래 순서와 장부 상태에 대해 일치된 결론을 내리는가이다.

다만, 공공 블록체인마다 이를 구현하는 방법은 같지 않다.

Bitcoin의 가장 고전적인 방식은 PoW, 즉 작업 증명이다. 채굴자가 연산력으로 블록 생성을 경쟁하고, 네트워크에 잠시 두 개의 합법적인 분기가 나타나면 노드는 누적 작업량에 따라 그중 하나를 선택해 계속 구축한다.

따라서 Bitcoin에는 '67% 투표 후 이 블록이 영원히 Finalized 된다'는 명확한 시점이 존재하지 않는다. 이는 확률적 최종성에 더 가깝다. 뒤따르는 블록이 많을수록, 앞선 거래를 다시 재구성하려면 점점 더 높은 연산력 비용을 치러야 한다.

이것이 과거에 사람들이 Bitcoin 거래는 6개 블록 확인을 기다리는 것이 좋다고 말한 이유이기도 하다. 연산력이 아무리 높아도, 노드가 실행 중인 합의 규칙을 간단히 우회할 수는 없기 때문이다.

물론 이것이 Bitcoin의 상태가 어떤 경우에도 '절대 수정 불가능'하다는 뜻은 아니다. 이론적으로 전체 생태계가 새로운 클라이언트와 새로운 합의 규칙을 받아들인다면, 하드포크를 통해 과거 규칙에서는 무효였던 상태 변화를 유효하게 만들 수 있다.

하지만 문제는 바로 여기에 있다. 누가 충분히 많은 채굴자, 풀노드, 거래소, 지갑, 사용자가 함께 이런 새 규칙을 받아들이게 할 수 있는가?

거의 없다.

개발팀이 Bitcoin 네트워크 전체를 대신해 합의 규칙을 결정할 수 없고, 채굴자나 거래소도 어렵다. 넘어야 할 합의 문턱이 매우 높기 때문이다. 과거 바이낸스에서 7000 BTC가 도난당했을 때 누군가 CZ에게 대형 채굴자에게 연락해 조작하라고 권했지만, 결국 흐지부지됐다.

이더리움은 또 다른 매우 고전적인 표본을 제공한다.

PoS로 전환한 뒤, 현재 이더리움은 Casper FFG와 LMD-GHOST가 함께 구성하는 Gasper 합의를 사용한다. 간단히 이해하면, 일부 메커니즘은 '현재 어느 체인을 따라야 하는지'를 판단하고, 다른 일부는 블록이 진정한 의미의 Finality를 얻도록 한다.

전체 스테이킹 ETH의 최소 3분의 2를 대표하는 검증자가 해당 checkpoint에 대해 합의해야 블록이 최종 확정으로 나아갈 수 있다. 반대로, 스테이크의 3분의 1 이상이 오랫동안 올바른 투표에 참여하지 않으면 네트워크는 일시적으로 Finality를 형성하지 못할 수 있다. 다만 이더리움은 inactivity leak을 설계해, 오랫동안 finalizing하지 못할 때 오프라인 검증자의 유효 가중치를 점진적으로 낮춰 네트워크가 결국 Finality를 회복할 기회를 준다.

이런 결과를 진짜 바꾸려면 역시 프로토콜 규칙과 클라이언트를 변경해야 한다.

2016년 The DAO 사건에서 이더리움 커뮤니티가 결국 하드포크를 통해 블록 1,920,000에서, 당시 Ethereum Foundation이 irregular state change라고 직접 부른 특수 상태 변경을 실행해 관련 ETH를 복구 컨트랙트로 옮긴 것이 바로 그 예다.

다만, 업그레이드를 거부하고 기존 상태를 계속 유지한 일부 채굴자와 커뮤니티가 결국 Ethereum Classic(ETC)을 형성했고, 이는 널리 알려진 ETH와 ETC의 분기로 이어졌다. 모든 사람이 이 규칙을 받아들인 것은 아니라는 뜻이다.

Cosmos Hub는 또 다르다. CometBFT를 사용하며, 전형적인 BFT 합의에 더 가깝다.

이는 더 전형적인 BFT 합의로 이해할 수 있다. 즉, 블록 하나가 진짜 커밋되려면 voting power의 3분의 2를 넘는 Commit을 얻어야 한다.

그 장점은 Finality가 매우 명확하다는 것이다. 블록이 충분한 검증권 투표를 거쳐 커밋되면, PoW처럼 점점 더 많은 블록을 기다리며 확률로 안전감을 사들일 필요가 없다.

하지만 그 이면도 매우 직접적이다. voting power의 3분의 1 이상이 Commit 형성에 필요한 투표를 더 이상 제공하지 않으면, 남은 검증인이 아무리 노력해도 3분의 2를 넘길 수 없다.

이때 네트워크가 가장 안전하게 택하는 선택이 바로 이번의 '블록 생성 정지'다. 따라서 분산 시스템 관점에서 보면, 이번 Cosmos Hub의 짧은 정지는 사실 전혀 신비롭지 않다.

한마디로, 충분한 voting power를 쥔 검증인 집단이 참여를 중단한 뒤, 합의 프로토콜은 자신의 규칙에 따라, 충분한 합의가 없는 상태에서 새 블록을 확정하기보다는 가용성을 잃는 쪽을 택한 것이다.

그 이면에는 분산 시스템에서 일반 사용자가 자주 혼동하는 두 개념이 대응한다.

  • Safety: 서로 다른 노드가 서로 충돌하는 두 개의 최종 상태를 동시에 확정하게 해서는 안 된다.
  • Liveness: 네트워크가 계속 앞으로 나아가며 새로운 거래를 처리할 수 있는가.

BFT 시스템에서 합의에 참여하는 노드가 부족할 때, 일시 정지는 때로 Safety를 지키기 위해 치르는 대가이기도 하다. 솔직히 말하면, 이 탈중앙화 장부는 차라리 그 자리에 멈춰 있기를 택하지, 남은 사람들이 제각각 장부를 쓰도록 내버려두지 않는다.

이 관점에서 다시 돌아보면, 공공 블록체인 역사에서 겉보기에는 완전히 달라 보이던 많은 사고가 사실은 모두 같은 문제를 둘러싸고 벌어졌음을 알 수 있다.

분산 노드가 더 이상 '올바른 상태'에 대해 일치된 의견을 형성할 수 없을 때, 네트워크는 어떻게 해야 하는가?

3. Bitcoin에서 Solana까지, 공공 블록체인의 진짜 리스크 경계는 어디인가?

이 문제가 공론화된 것은 이번 Cosmos가 처음이 아니다.

이미 2013년에 Bitcoin에서 매우 고전적인 체인 분기 사고가 발생했다.

당시 Bitcoin 0.8은 기반 데이터베이스를 Berkeley DB에서 LevelDB로 전환했다. 이후 대량의 거래 입력을 포함한 블록 하나가 등장했는데, 신버전 노드는 정상적으로 처리할 수 있었지만 일부 구버전 노드는 Berkeley DB의 잠금 수 제한 때문에 이 블록을 무효로 판단했다.

그리하여 매우 난처한 상황이 벌어졌다. 모두가 Bitcoin을 실행하고 있었지만, 신구 클라이언트가 '이 블록이 과연 합법적인가'에 대해 서로 다른 답을 내놓기 시작한 것이다.

네트워크는 두 체인으로 갈라졌고, 신버전 0.8 쪽은 한때 약 60%의 해시레이트를 보유해 정상적인 연산력 경쟁만으로는 빠르게 수렴할 수 없었다.

결국 대형 채굴풀이 조율을 거쳐 구버전으로 되돌아가, 구규칙 쪽에서 다시 더 많은 해시레이트를 확보한 뒤에야 네트워크가 다시 수렴했다. Bitcoin은 이후 BIP 50으로 이 사고를 사후 분석하기도 했다.

2016년에는 이더리움의 The DAO 사건이 문제를 한 단계 더 앞으로 밀어냈다.

앞서 언급한 The DAO 사건에서, 이더리움 커뮤니티는 결국 하드포크를 통해 블록 1,920,000에서 Ethereum Foundation이 irregular state change라고 명시적으로 부른 특수 상태 변경을 실행해 관련 ETH를 복구 컨트랙트로 옮겼다.

하지만 모두가 이런 처리를 인정한 것은 아니었다. 상태 변경 수용을 거부한 일부 채굴자와 커뮤니티가 기존 규칙을 계속 유지했고, 그렇게 오랫동안 존재해 온 Ethereum Classic(ETC)이 생겨났다.

이번 DAO Fork 역시 고전적인 사건으로, 모든 사람에게 알려준 바와 같다. 극단적인 사건이 발생하면 코드 합의 밖에 사회적 합의도 존재하며, 충분히 일치된 의견을 형성하지 못하면 하나의 체인이 정말로 둘로 나뉠 수 있다.

2021년의 Solana는 또 완전히 다른 장애 경로를 보여줬다.

그해 9월, 대량의 봇 거래가 네트워크로 몰려들어 검증 노드의 메모리 고갈을 유발했고, 수많은 노드가 붕괴했다. 결국 전체 네트워크가 현재 상태에 대해 일치된 의견을 형성하지 못해 약 17시간 동안 새 블록 확정을 중단했고, 이후 검증자가 공동으로 조율해 네트워크를 복구했다.

이 사고들을 한데 모아 보면, 그것들이 결코 같은 일이 아님을 알 수 있다.

  • Bitcoin 2013년의 문제는 서로 다른 클라이언트가 서로 다른 유효성 규칙을 실행하기 시작한 것이다.
  • Solana 2021년의 문제는 수많은 검증 노드가 더 이상 정상적으로 합의에 참여하지 못해 네트워크가 Liveness를 잃은 것이다.
  • Ethereum DAO가 마주한 것은, 커뮤니티가 새로운 프로토콜 규칙을 통해 상태를 능동적으로 수정해야 하는지에 더 가까운 문제였다.
  • 그리고 이번 Cosmos Hub는 또 다른 특수성을 지닌다. 네트워크가 먼저 검증자 조율을 통해 능동적으로 Liveness를 잃어 공격 자산이 계속 이동하는 것을 막았고, 이후 충분히 높은 비율의 검증권이 새로운 소프트웨어와 복구 상태를 함께 수용해 네트워크가 다시 일치를 형성하게 했다.

따라서 이 사건들을 단순히 '블록체인도 결국 꺼질 수 있구나', '탈중앙화는 다 거짓이었구나'로 치부하기보다는, 더 진실에 가까운 사실 하나를 인정하는 편이 낫다.

합의 메커니즘은 결코 고장 나지 않는 기계가 아니다. 그것이 실제로 제공하는 것은 일련의 탈중앙화된 규칙이다. 예컨대 의견이 갈릴 때 누가 올바른 체인을 결정하는지, 얼마나 많은 참여자가 있어야 하나의 상태가 최종성을 얻는지, 장애가 발생했을 때 네트워크가 계속 운영할지 멈출지, 그리고 극단적인 상황에서 어떤 집단적 행동이 이후의 운영 규칙을 바꿀 수 있는지 같은 것들이다.

이것이 이번 Cosmos 사건이 '체인을 멈춰야 했는가'보다 일반 사용자가 더 깊이 생각해 볼 만한 질문 하나를 남긴 이유이기도 하다.

마치며

우리는 자주 'not your keys, not your coins'라고 말한다.

이 말은 물론 여전히 유효하다. 다만 그것이 강조하는 것은 자산 통제권이다. 개인키가 자신의 손에 있는 한, 지갑이나 거래소, 기타 제3자가 당신을 대신해 정상적으로 전송에 서명할 수는 없다.

전제는, 당신이 속한 블록체인이 언제든 이 서명을 처리할 능력을 갖추고 있어야 한다는 것이다.

Cosmos Hub가 블록 생성을 멈춘 그날, 사용자는 여전히 자신의 개인키를 보유하고 있었고, 자산도 그 때문에 허공으로 사라지지 않았다. 다만 당신이 거래에 올바르게 서명했더라도, 그것을 받아들일 새 블록이 없었을 뿐이다.

복구 과정은 한 걸음 더 나아가, 충분히 많은 합의 참여자가 새로운 상태 규칙을 받아들이면 특정 계정의 체인상 상태가 원래 주소의 개인키 서명 없이도 바뀔 수 있음을 보여준다.

이것이 'Not your keys, not your coins'를 무효로 만들지는 않지만, 개인키 자주권과 기반 합의권이 결코 같은 것이 아님을 일깨워 준다.

지갑의 경우도 마찬가지다.

지갑은 개인키와 서명권이 사용자 자신의 손에 있도록 보장할 수 있고, 체인 레벨 이상을 최대한 빨리 식별하고 거래 상태를 정확히 표시하며 RPC와 노드 이중화를 구축하고, 네트워크 복구 후 거래의 최종 결과를 다시 확인할 수 있다.

하지만 지갑은 공공 블록체인을 대신해 합의를 복구할 수 없고, 기반 네트워크가 영원히 중단되지 않을 것임을 보장할 수도 없으며, 체인상의 규칙과 상태가 합의 차원에서 결코 변하지 않을 것임을 보장할 수도 없다.

따라서 성숙한 탈중앙화 시스템이 진짜 추구해야 하는 것은, 아마도 '어떤 것도 절대 바꿀 수 없다'가 아닐 것이다. 오히려 이 불완전한 경계를 최대한 분명히 밝혀야 한다. 누가 합의를 멈출 수 있는가? 어느 정도의 가중치가 필요한가? 어떤 상황에서 긴급 개입이 허용되는가?

진정한 탈중앙화는 시스템이 결코 사고를 겪지 않게 만들 수 없다. 중요한 것은, 사고가 실제로 발생하더라도 우리가 여전히 누가, 어떤 규칙에 따라, 어느 정도의 합의로 이 장부를 앞으로 어떻게 기록할지 결정했는지를 알 수 있다는 점이다.

공유하기:

작성자: imToken

이 글은 PANews 입주 칼럼니스트의 관점으로, PANews의 입장을 대표하지 않으며 법적 책임을 지지 않습니다.

글 및 관점은 투자 조언을 구성하지 않습니다

이미지 출처: imToken. 권리 침해가 있을 경우 저자에게 삭제를 요청해 주세요.

PANews 공식 계정을 팔로우하고 함께 상승장과 하락장을 헤쳐나가세요
관련 특집
PANews APP
TheDAO 보안 펀드 2차 라운드 시작, 60만 달러로 Vyper 컴파일러 지원
PANews 속보