[블록체인 용어 사전] 이중지불(Double Spending)문제란?
안녕하세요. 코투선 매니저입니다.
이중 지불 방지(Double-Spending)를 설명하기 앞서 비잔틴 장군의 문제라는 것을 알아 둘 필요가 있습니다.
비잔틴 장군 문제(Byzantine Generals Problem)는 여러 지점에 있는 병력들이 상호 협력하여 공격을 수행할 것인지, 혹은 철수하여 방어할 것인지를 결정하는 문제입니다.
이 문제에서 주요한 문제점은 일부 장군들이 반란을 일으켜 병력의 결정을 방해할 수 있다는 것입니다.
따라서 병력들이 어떤 결정을 내리든 각 지점의 상황을 파악하고, 자신들이 내린 결정이 다른 장군들에게 전달되었는지 확인하는 방법이 필요합니다.
이 문제는 컴퓨터 과학 분야에서 분산 시스템에서의 문제를 해결하기 위해 연구되었습니다.
분산 시스템에서는 여러 컴퓨터나 노드가 상호작용하여 작업을 수행하는데, 이때 일부 노드가 오작동하거나 해킹당할 가능성이 있습니다.
이러한 상황에서 안정적으로 작업을 수행하기 위해서는 각 노드의 결정이 전체 시스템에 영향을 미치므로, 각 노드가 자신의 결정이 다른 노드에게 전달되었는지 확인하고, 다른 노드들과 일치하는 결정을 내리는 것이 중요합니다.
따라서 비잔틴 장군 문제는 분산 시스템에서의 동기화 문제를 해결하는데 중요한 역할을 합니다.
이를 해결하기 위해서는 분산 시스템에서 각 노드가 안정적으로 상호작용하기 위한 프로토콜을 개발하고, 이를 통해 각 노드들이 자신들의 결정이 다른 노드들과 일치하도록 조율할 수 있어야 합니다.
이러한 프로토콜은 블록체인 기술에서도 매우 중요한 역할을 합니다.
블록체인에서는 여러 노드가 거래 내역을 검증하고, 이를 분산 시스템에 저장하는데, 이때 안정적으로 상호작용하여 작업을 수행하기 위해서는 비잔틴 장군 문제를 해결해야 합니다.
이중지불(double spending)이란?
이중지불, double spending(더블 스펜딩)은 결국, 두 번 소비한다는 의미입니다.
즉, 원본 파일에 저장한 가치를 지불하고, 해당 파일을 복사해서 다른 사람에게 또 지불하는 것을 의미합니다.
은행을 예를 들어볼까요? 요즘에는 인터넷 뱅킹, 폰 뱅킹이 돼서 앱으로 쉽게 계좌이체를 할 수 있죠.
A라는 사람의 본인 명의 핸드폰 X와 Y를 준비합니다.
은행에는 10,000원의 잔고가 들어있습니다.
X를 통해서 B라는 사람에게 10,000원을 송금할 준비를 합니다.
Y를 통해서 C라는 사람에게 10,000원을 송금할 준비를 합니다.
X와 Y에서 이체하기를 누른 상태에서 최종 비밀번호 입력을 거의 동시에 입력합니다.
10,000원이 20,000원으로 복사되어, B와 C에 동시에 송금이 가능할까요?
데이터에서 동시에 보내는 것은 사실상 불가능합니다.
0.0001초라도 차이가 있을 수밖에 없죠. 따라서 실제 은행에서는 이중 지불 문제가 발생할 수 없습니다.
한 쪽에 10,000원이 송금이 된다면, 잔고가 이미 0원이 되었기 때문에, 다른 쪽에 10,000원이 추가 송금이 될 수 없는 것이죠.
비트코인의 배경, 블록체인 기술로 이중지불 피하기
중앙에서 관리하지 않는, 안전한, 내 소유의 디지털 화폐를 만들 수 없을까? 이 생각에서 비트코인이 시작되었습니다.
하지만 컴퓨터, 인터넷에 들어가는 데이터는 복사가 가능하기 때문에, 이중 지불 문제를 피해 갈 수 없었던것입니다.
블록체인 기술 이전에는 이중지불 문제를 피해 가기 위해 신뢰할 수 있는 중개 기관에서 보관, 전송에 의존해야 했죠.
이 중개 기관 시스템이 은행이라고 생각하시면 편합니다.
중개 기관 없이 개인끼리, 이중 지불 문제없이 거래를 하려면 어떻게 해야 할까요?
내 가상화폐 만 원을 B에게 줬을 때, 내 가상화폐 만 원이 차감되었음을 모든 사람에게 알릴 수 있는 기술이 블록체인 기술의 일부이고, 비트코인의 탄생 배경이라고 볼 수 있답니다.
블록체인에서 모든 거래 내역은 해시(hash)로 변환되어 저장되는데, 하나의 블록 안에는 과거 모든 거래 내역이 담긴 이전 해시값을 포함하고 있어서 이중 지불이 불가능한 것이죠.
A가 B에게 10,000원을 보내면, 블록체인에 이 거래가 기록되고, 이 블록체인은 다른 사용자, 노드에게 공개됩니다.
바로 C에게 10,000원을 보내려고 할 때, B에게 보낸 10,000원의 기록까지 있어서 A는 10,000원이 없다는 것을 다른 노드가 알고 있어서 승인을 얻지 못하고 실패하게 되겠죠.
이렇게 다른 사람들이 같이 검증하게 하는 블록체인 기술이 생기면서 이중지불 문제를 해결하고, 코인이라는 암호화폐가 세상에 나올 수 있게 되었습니다.
블록체인에서 이중 지불 공격과 대안
이론 상 블록체인 시스템에서는 이중 지불이 발생하지 않을 것 같은데, 왜 한 번씩 이중 지불 공격이 허용되었다는 이슈가 보도되는 걸까요?
또 공격 피해를 받았다는 것은 취약하다는 것인데, 대처 방법이 있는 걸까요?
이중 지불 공격은 블록체인 시스템 전체를 공격하는 방법과 사용자 수준에서 공격하는 방법이 있습니다.
주로 현실적인 블록체인 프로젝트의 허점을 이용한 공격들이 많습니다.
이중 지불 공격이 허용되려면, 조작된 데이터가 승인이 되어야 하는데
블록체인 합의 의결권, 즉 이 블록은 정상적인 블록이라고 결정할 권한을 가진 노드의 51% 이상을 점유할 수 있다면, 조작이 가능해집니다.
가장 대표적인 51% 공격입니다.
세계의 모든 사람들이 이용하는 블록체인에서 이론상 51% 이상의 노드를 점유하기는 불가능하죠.
비트코인을 예시로, 만 개가 넘는 노드를 수 초 안에 모두 동시에 해킹을 하고, 해킹을 성공하자마자 조작된 내용을 덮어써야 하기 때문입니다.
하지만, 속도를 높이거나 수수료를 낮추거나 편의성을 높이기 위해
탈중앙화, 보안성, 확장성 3가지를 모두 만족 시킬 수 없는 블록체인 트릴레마를 극복하기 위해
많은 블록체인 시스템이 의도적인 허점을 만들어 놨습니다.
검증하는 노드 수를 줄인다거나, 검증 방법을 간소화하거나 하는 방법으로 말이죠.
그래서 작업 증명에서 지분 증명으로, 지분 증명에서 위임 지분 증명으로, 위임 지분 증명에서 이중 위임 지분 증명으로,
기타 다른 합의 알고리즘을 만들어 블록체인 트릴레마를 실생활에 사용할 수 있게 개선하면서 보안도 신경 쓰는 쪽으로 많이 발전을 하고 있습니다.
비트코인은 어떻게 이중지불을 방지할 수 있을까?
비트코인 블록체인은 공개적이고 투명한 원장으로 유통되는 비트코인이 관련된 모든 거래가 포함되어 있습니다.
각 거래는 합법적이고 거래를 전송한 사람이 그 값을 감당할 수 있을 정도의 충분한 잔액을 계좌에 보유하고 있다고 동의하는 사람들인 노드로 이루어진 탈중앙형 네트워크를 통해 검증됩니다.
따라서 거래가 유효하다고 우리 모두가 신뢰할 수 있습니다.
비트코인이 신규 유저에게 전송되면, 그 전 소유자는 더이상 해당 비트코인을 소비할 수 없습니다.
누구든 시간을 거슬러 거래를 역추적해보면 각 계좌의 잔액을 검증할 수 있습니다.
이 자체로 이중지불 실행은 굉장히 어려워집니다. 누구라도 무슨 일이 발생했는지 모두 볼 수 있기 때문입니다.
이중지불 공격 유형
이제, 앨리스가 악의적인 주체가 되어 자신이 보유한 0.1비트(BTC)를 이중지불하고자 한다고 상상해봅시다.
과연 어떻게 하면 될까요? 밥에게 진 부채를 헤쳐나가기 위해 이중지불을 실행할 방법 세 가지를 생각해볼 수 있습니다. 물론 세 가지 중 어느 하나도 쉽거나 간단하지는 않습니다.
▶ 51% 어택(51% Attack)
51% 어택은 누군가 전체 네트워크의 해시파워 중 50% 이상을 통제하고자 하는 시나리오를 말합니다.
앨리스가 이를 제대로 해낼 수 있다면, 거래를 그냥 삭제할 수 있습니다.
즉, 비트코인 원장만 본다면 0.1비트(BTC)는 계좌를 떠난 적이 없는 것처럼 보이는 겁니다.
비트코인 네트워크는 엄청난 해시파워를 바탕으로 한 높은 수준의 탈중앙형 네트워크이기 때문에, 이 공격이 발생한 적은 없습니다.
그러나 이더리움 클래식과 같은 다른 네트워크에서는 일어났었습니다.
▶ 레이스 어택(Race Attacks)
밥에게 0.1비트(BTC)를 전송한 후, 앨리스는 신속하게 자신이 보유한 다른 주소로 0.1비트를 전송하는 거래를 진행합니다.
밥에게 부채를 해결했다고 말하면서 두번째로 실행한 거래가 먼저 선택되고 검증되어 첫번째 거래가 유효하지 않다고 판명되게 만들고자 합니다.
그러면 밥은 해당 자금을 받지 못하게 됩니다. 밥은 이미 거래가 승인되었다고 짐작하고 앨리스가 가게를 떠나도록 두었지만, 해당 금액은 복구될 수 없습니다.
▶ 피니 어택(Finney Attacks)
앨리스는 0.1비트(BTC)를 자신의 다른 주소로 전송할 수 있는 거래를 사전 채굴하고 이를 네트워크에 알리지 않습니다.
그 후, 밥에게 0.1비트를 전송하지만 그 즉시 사전 채굴해 놓은 블록을 네트워크에 알리고 사전 채굴 당시에 했던 첫번째 거래를 확인받습니다.
네트워크는 앨리스가 밥에게 자금을 보냈던 거래는 거절하게 됩니다. 이번에도 밥이 앨리스가 가게를 떠나게 그냥 두었다면 이번 시나리오에서도 밥은 자금을 잃게되는 겁니다.
위의 두 사례 모두에서 밥은 단순히 채굴자가 거래를 확인할 때까지 기다린다면 부채를 상당히 줄일 수 있습니다.
첫번째 시나리오의 경우, 시간이 더 많이 흐르고 확인되는 블록이 늘어날수록 앨리스가 51% 어택을 실행하는 비용은 더 올라갑니다.
비트코인 백서에서, 사토시 나카모토는 블록이 6개가 넘어가면 51% 어택을 성공적으로 실행하는 것은 실질적으로 불가능하다고 계산했습니다.
그러므로 밥이 6블록정도까지만 기다릴 준비가 되었다면, 앨리스가 이중지불하지 않을 거라고 확신할 수 있었을 겁니다.
2021년 1월 22일, 비트코인 이중지불이 발생했는가?
2021년 1월 22일, 비트멕스의 “포크 모니터(Fork Monitor)” 기능에서 이중지불이 발생했음을 나타냈습니다.
비트멕스는 당시 상황에 대해 트위터로 알렸고, 크립토 언론은 그 즉시 그 뉴스를 전파했습니다.
BTC 가격은 20일만에 처음으로 3만달러 아래로 떨어졌습니다. 명확히 이중지불로 보이는 약 21달러 가량의 비트코인 때문이었습니다.
대체 무슨일이 일어났던 걸까요?
불행하게도, 비트코인 가동 과정에서 통상적으로 발생하는 이벤트에 너무 많은 사람들이 예민하게 반응했던 사례였습니다.
유저가 아주 낮은 수수료로 거래를 전송하려고 시도했고, 수 일간 멤풀에서 대기하게 된겁니다.
아무래도 채굴자들이 그 거래보다는 보다 수익이 많이 남는 거래를 선택하여 자신의 블록에 포함시켰을 가능성이 높습니다.
전송인은 그 후 다시 거래를 전송하려고 시도했지만, 수수료를 높인 걸 보니 채굴자가 이를 선택하도록 하려는 시도였을 것으로 보입니다.
이러한 시도가 소용이 없는 것으로 드러나자 수수료를 더욱 더 높였습니다. 그래서 멤풀에는 세 개의 거래가 대기하는 상황이었습니다.
결과적으로 이 중 첫번째와 마지막 거래를 두 개의 서로 다른 채굴 풀에서 선택했습니다.
이따금씩, 두 채굴자가 동시에 작업증명 퍼즐을 풀다가 블록체인에 두 개의 각기 다른 버전이 생성되어 채굴자가 그 중 어떤 버전을 계속 채굴할 지 결정해야하는 상황이 발생합니다.
비트코인 네트워크는 여러명의 채굴자로 구성되기 때문에 이는 꽤 흔한 일입니다.
이들은 일반적으로 가장 무거운 블록을 계속 채굴하기로 결정하는데, 바로 이번 사례도 그런 경우입니다.
블록 중 하나가 “탈락(stale)”하여 거절당하고, 두번째 블록은 채굴자가 유효하지 않다는 것을 깨닫는 순간 블록에 절대 포함될 수 없습니다.
결론
앞서 설명한 것 처럼 이중지불 어택은 불가능한 것은 아닙니다만, 비트코인 블록체인은 네트워크 내에 채굴자가 충분하다면 그러한 공격이 발생할 수 없도록 설계되었습니다.
일반적으로, 블록체인 네트워크 보안은 탈중앙화 정도에 달려있습니다.
이것만 보더라도 가상화폐 커뮤니티가 블록체인을 지배하는 가장 핵심적인 원칙 중 하나로 탈중앙화를 칭송하는 이유를 알 수 있습니다.
모든 사람이 자발적으로 공정하면 괜찮을 텐데 그럴 수가 없다는 것이 안타까운 현실인 것 같습니다.
반대로, 악한 의도를 가진 사람들이 있기 때문, 계속 새로운 기술이 발전하고 나올 수 있게 되는 것 같기도 하네요.
사람이 허용할 수 있는 공격에 대해 안전하고, 속도도 실생활에서 쓸 수 있을 만큼 빠르면서, 중개 단계 없이 모든 사람이 참여해 검증하는 탈중앙화 프로젝트가 많이 나오고 있답니다.
점점 발전하고 있는 블록체인 기술을 보고 있으면 중개 없이 탈중앙화로 블록체인으로 결제하는 상용화 시대가 곧 올 것 같네요.
감사합니다.