비트코인은 이중지불을 어떻게 해결했을까?
비트코인은 무엇을 해결한걸까?

We propose a solution to the double-spending problem using a peer-to-peer network.
비트코인은 p2p 네트워크에서 이중지불을 해결하는 방법을 백서에서 제시한다.
해시 체인 기반의 PoW, 가장 긴 체인만 인정하여 소수의 공격자들보다 더 많은 cpu 연산으로 쉽게 더 긴 체인을 생성으로 해결할 수 있다고 설명한다.
본 포스트는, 위 내용중 이중지불에 대해서 어떻게 해결했는지 간단히 설명하려고 한다.
P2P, Peer-to-Peer Network
peer 란 동료라는 뜻으로, 온라인에서는 인터넷에 연결된 컴퓨터(노드)이다.
peer-to-peer는 컴퓨터 <-> 컴퓨터로 다른 서버를 거치지 않고 직접 데이터를 주고 받는 네트워크 방식이다.
어? 카카오톡은 둘이 메세지를 주고 받는데 p2p 아님? 아니다.
내가 메세지를 보내면 카카오톡 서버에 전송되고 저장된 후 해당 메세지가 다른 유저에게 보여지는 방식이다. (자세한 원리는 스킵)
즉, 카카오라는 회사가 운영하는 중앙서버를 통해 해당 서비스가 중계되는 형태이다.
p2p의 핵심은 중앙 서버가 없이 정말 말단 peer끼리 통신하는 것을 말한다.
비잔틴 장군 문제 (BGP, Byzantine Generals Problem)
비잔틴 장군 문제란, p2p 시스템에서 신뢰할 수 없는 상황, 즉 누군가(노드) 배신할 수 있고, 실제로 배신하는 상황에서 전체 시스템이 어떻게 합의를 도출하고 정상적으로 동작할 수 있는지를 다루는 문제다. 1982년 레슬리 램포트의 논문에서 처음 언급되었다고 한다.
쉽게 말하면, 누군가 거짓말을 하고 있는데 어떻게 전체 시스템이 합의를 이루지?
또는, 거짓말쟁이가 있더라도 무시하고도 전체 시스템이 신뢰 가능한 상태로 나아갈 수 있는가?
이 질문들이 비잔틴 장군 문제다.
예시를 하나 보자
- 비잔틴 제국이 다른 제국 성을 공격하려고 한다.
- 다른 제국 성을 함락시키기 위해서 대부분의 부대가 한 번에 성을 공격해야 한다.
- 그들은 서로 직접 연락하기에는 먼 거리가 있어서 메세지는 전령을 통해 전달한다.
- 장군들은 이미 자신들 혹은 전령들 중 누군가가 적과 내통하고 있다는 것은 알지만, 누군지 모르는 상황이라, 딜레마에 빠진다.
따라서, 장군들은 배신자를 찾아내지 못하면, 공격에 실패하게 된다. - 아무튼 그들은 금요일 오후 1시에 도시를 한꺼번에 공성한다는 전략을 전달하려고 한다.
- 만약 6명의 장군이 있고, 1번 -> 2번, 2번 -> 3번 ... 5번 -> 6번 순으로 각 장군들이 도시를 공성한다는 전략을 전령들을 통해 공유한다. 4명 이상의 장군이 동시에 공격해야 이긴다고 가정해보자.
- 만약 4번 장군이 배신자라서 4,5,6 은 금요일 오후 1시에 공격을 하지 않았고 50%만 공격을 하여 실패로 돌아간다.
비트코인에서 비잔틴 장군 문제는 이중 지불 문제이다.
비트코인은 이를 해결하기 위해 비잔틴 결함 허용(BFT, Byzantine Fault Toleranace) 방식을 채택했다.
거짓말쟁이가 일정 수준 이하면 시스템이 파괴되지 않는 방식을 설계했다는 말이다.
이중 지불 문제
이중 지불이란, 말 그대로 내 돈을 2번 지불하는 것이다.
박지성은 총 1BTC를 갖고 있는데,
박지성이 손흥민에게 축구공을 1BTC에 샀다고 해보자.
그리고 바로 박지성이 차범근에게도 축구공을 1BTC에 사는 것이다.
물리 세계에서는 위 상황이 불가능하다. 직접 전달을 해야 거래가 성사되기 때문이다.
그러나 디지털 세상에서는, 전산 오류로 송금처리가 2번 될수도 있고, 사용했지만 아직 업데이트가 되기 전에 또 사용해버릴 수도 있는 등 이중지불 문제를 막는게 꽤 까다롭다.
현재 은행이나 카드사같은 중앙화 되어있는 시스템에서는, 정산과 대사라는 과정을 거쳐서 DB를 재검토 하는 시스템이 있다.
금액이 안맞으면 중앙에서 로그를 대조하며 수정하면 이중지불 문제를 해결할 수 있다.
카드사들이 대금 납부를 미루는 원인들 중 하나이다.
비트코인은 이를 어떻게 해결했는가?
중앙화된 시스템이 아닌 경우에 이중 지불을 막는 것은 훨씬 어렵다.
비트코인은 이중지불을 막는 방법으로 비잔틴 결함 허용 방식을 채택했다.
- 가장 긴 단 하나의 체인만 인정하고, 나머지는 인정 안한다.
맨 처음에 말했듯이 비트코인은 해시 기반의 PoW를 통해 채굴한다.
다른 게시글로 더 자세히 쓰겠지만, 간략히 설명하자면 CPU와 같은 컴퓨터 자원을 소모하여 일정값 이하의 해시값을 찾는 과정이 PoW이고, 이를 통해 비트코인 블록이 채굴된다.
이 블록들은, 이전 블록의 데이터를 포함하기 때문에 마치 아래 사진처럼 연결된다. 이렇기에 블록체인이라고 통상적으로 부르게 되었다.

비트코인은 가장 긴 체인만 인정하고 채굴 인센티브를 지급하기 때문에, 채굴자들은 가장 긴 체인에 붙어서 그 뒤에 블록을 잇기 위해 노력한다. 즉, 채굴자 본인의 이익을 위해 자발적으로 시스템을 더 견고하게 만들게 된다.
만약 박지성이 앞선 예시와 같은 비트코인 이중지불을 도전한다면 방법은 몇 가지가 있다
- 51% 공격: 전체 채굴하는 리소스의 51% 이상을 본인이 가져가서 longest chain을 컨트롤 할 수 있는 힘을 갖는 공격
- race attack: 손흥민한테 먼저 1BTC를 보냈는데, 손흥민이 해당 트랜잭션이 포함된 블록이 채굴되기 전에 박지성에게 축구공을 준 경우, 박지성은 자기 자신에게 다시 보내는 트랜잭션을 더 높은 수수료로 제시하여 손흥민과 한 거래보다 본인 다른 주소로 보내는 거래가 먼저 블록에 실리도록 하여 손흥민에겐 실질적으로 지불을 안하는 공격. (confirm 되기 전에 보내준 손흥민의 부주의로 생기는 공격)
- finney attack: 박지성이 이미 자신의 블록에 이중지불 트랜잭션을 포함해서 채굴을 해놓고!!, 그 다음에 손흥민한테 축구공을 사러간다음에 갑자기 오프라인에 있던 채굴된 더 긴 체인을 전파해버리는 공격. (사실상 51% 공격처럼 채굴 리소스가 매우 커야 가능함)
비트코인은 초기에 매우 취약했다. 특히 51% 공격은 초기일수록 성공 확률이 높다. 왜냐면 현재는 채굴자가 너무 많아서 개인이나 특정 집단이 51%의 해시 파워를 보유하는게 어렵다/불가능하다. (해시파워: PoW가 해시값을 찾는 과정이라 연산력을 의미함)

비트코인의 해시레이트는 꾸준히 우상향 중이고, 이제는 그 어느 집단도 51% 공격을 할 수 없다.
그리고 더 중요한건데, 그 어느 집단도 공격을 할 이유가 없다.
그 수많은 비용을 들여서 이중지불 공격에 성공하고 나면, 신뢰가 붕괴되어 가치가 0으로 수렴할 텐데 이중지불을 하는게 무슨 의미가 있겠는가?
차라리 그 돈이면 비트코인을 사서 보유하거나, 직접 채굴을 하는게 더 이득이다.
비트코인은 모두가 개인적 이득을 위해 움직일수록 더 견고해지도록 설계되었다.