이중지불(Double Spending)이란 디지털 화폐 환경에서 동일한 금액을 두 번 지불할 수 있는 리스크를 말합니다. 명목화폐의 경우, 자금을 디지털 형태로 전송할 때 은행이 문지기 역할을 담당합니다. 은행 계좌 보유자가 예치나 출금을 할 때마다, 은행은 그에 따라 잔액을 업데이트합니다. 실질적으로 은행이 모든 유저 자금에 대한 원장을 기록하는 셈입니다.
인터넷이 진화하고 다양한 혁신가들이 무은행 디지털 현금 계획을 시도하면서 항상 동일한 당면과제에 맞딱드리게됩니다. 디지털 현금은 사실상 이미지나 PDF 문서와 다를 바 없는 디지털 파일입니다. 누군가 다른 누군가에게 전자 송금을 하고자 한다면, 양 측이 단순히 디지털 파일만 복사하고 자금을 두 번 지불하는 사태를 어떻게 방지할 수 있을까요?
사토시 나카모토가 비트코인을 발명했을 때, 이중지불 문제를 해결할 수 있는 현실적인 방법도 최초로 고안해 냈습니다. 비트코인이 출범한 지 12년이 되었습니다. 그리고 현재까지 그 누구도 성공적으로 이중지불 문제를 실행하고 관리하지 못했습니다.
명확히 하자면, 비트코인이 “B”라는 대문자로 지칭할 때는 블록체인이나 채굴자 네트워크를 지칭합니다. 비트코인을 소문자 “b”로 지칭하면, 이는 화폐를 뜻합니다.
비트코인은 어떻게 이중지불을 방지할 수 있을까?
비트코인 블록체인은 공개적이고 투명한 원장으로 유통되는 비트코인이 관련된 모든 거래가 포함되어 있습니다. 각 거래는 합법적이고 거래를 전송한 사람이 그 값을 감당할 수 있을 정도의 충분한 잔액을 계좌에 보유하고 있다고 동의하는 사람들인 노드로 이루어진 탈중앙형 네트워크를 통해 검증됩니다. 따라서 거래가 유효하다고 우리 모두가 신뢰할 수 있습니다. 비트코인이 신규 유저에게 전송되면, 그 전 소유자는 더이상 해당 비트코인을 소비할 수 없습니다.
누구든 시간을 거슬러 거래를 역추적해보면 각 계좌의 잔액을 검증할 수 있습니다. 이 자체로 이중지불 실행은 굉장히 어려워집니다. 누구라도 무슨 일이 발생했는지 모두 볼 수 있기 때문입니다.
이중지불 문제 톱아보기
앨리스가 지금 막 물건을 사고 가게 주인인 밥에게 0.1비트(BTC)를 전송했다고 가정합시다. 각 거래는 비트코인 블록체인에 포함될 때까지 멤풀이라고 불리는 대기실에서 대기합니다. 채굴자는 멤풀(Mempool)에서 거래 그룹을 선택하고, 네트워크 내 다른 채굴자와 경쟁하며 작업증명 문제를 해결합니다.
채굴자가 앨리스의 거래를 선택하고 작업증명 문제를 푼 첫번째 채굴자가 됩니다. 채굴자가 네트워크에 있는 모든 다른 채굴자에게 블록에 대한 정보를 전달하여, 블록의 현 상태를 바탕으로 해당 블록에서 이루어진 거래가 유효한지 확인받습니다. 채굴자가 거래 블록을 블록체인에 추가하고 비트코인으로 채굴보상을 받습니다. 앨리스의 거래가 비트코인 블록체인에 포함되면, 공개적으로 모두가 볼 수 있게 됩니다.
이중지불 공격 유형
이제, 앨리스가 악의적인 주체가 되어 자신이 보유한 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)”하여 거절당하고, 두번째 블록은 채굴자가 유효하지 않다는 것을 깨닫는 순간 블록에 절대 포함될 수 없습니다.
결론
앞서 설명한 것 처럼 이중지불 어택은 불가능한 것은 아닙니다만 비트코인 블록체인은 네트워크 내에 채굴자가 충분하다면 그러한 공격이 발생할 수 없도록 설계되었습니다. 일반적으로, 블록체인 네트워크 보안은 탈중앙화 정도에 달려있습니다. 이것만 보더라도 가상화폐 커뮤니티가 블록체인을 지배하는 가장 핵심적인 원칙 중 하나로 탈중앙화를 칭송하는 이유를 알 수 있습니다.