이중 지불(Double Spending)은 블록체인에서 반드시 해결해야할 이슈입니다. 디지털 자산이 두명의 수신자에게 동시에 전송되는 문제를 의미합니다. 예를 들어 철수가 영희에게 100만원을 보내는데, 송금이 다 처리되기도 전에 민수에게 다시 100만원을 전송한다고 가정합니다. 철수는 자신이 가지고 있는 100만원이라는 자산을 단순 복사해서 2명에게 동시에 전달합니다. 정상적인 경우 트랜잭션의 ACID 특성을 가지므로 1개의 송금이 먼저 처리되면서 민수에게는 송금이 되지 않을 것입니다.
하지만 이중 지불이 가능한 공격에서는 몇번이고 자산을 복제해서 다른 계정으로 전송하는게 가능해집니다. 디지털 자산의 복제를 방지해야만 디지털 자산을 현금처럼 사용할 수 있습니다. 따라서 이중 지불 문제를 해결하기 위해 다양한 방법들이 논의되었고, 크게 중앙집권식, 탈중앙식, 비트코인에서 이중지불을 해결하는 방법을 알아봅니다.
중앙집중식 해결 방법
중앙화된 시스템에는 트랜잭션을 관리하는 관리자가 존재합니다. 중앙집중식 접근법으로 이중지불 문제를 해결하는 대표적인 예로는 암호학자 데이비드 차움(David Chaum)이 고안한 eCach가 있습니다. 차움은 고객의 익명성을 보장하면서 P2P 교환이 가능한 디지털 자산 발행을 위한 방법으로 은닉 서명(Blind Signature)을 제안합니다.
차움이 고안한 eCash는 디지털 숫자로 구성되고, 은행이 서명하기 때문에 사용자의 신원을 확인할 필요가 없다는 특징으로 비밀 송금에 유용하게 사용될 수 있습니다. 하지만 은행이 모든 트랜잭션을 검증하고 관리하기 때문에 단일 실패점이 될 수 있습니다. 만약 은행이 공격을 당하면 발행된 숫자는 무용지물이 됩니다. 은행의 통제를 벗어나 사용자간의 신뢰를 생성하고 거래가 가능하도록 만드는 것이 현재 암호화폐 플랫폼들이 지향하는 부분입니다.
ⓐ 만약 사용자가 자신의 법정화폐을 디지털 자산으로 교환하고자 하는 경우
- 은행에 100만원의 법정화폐와 디지털 자산과 교환을 희망한다고 은행에 알립니다.
- 은행은 사용자의 잔액을 확인 한 뒤 1개 혹은 여러개의 임의의 숫자를 생성합니다. 만약 1개의 숫자가 생성되면 100만원에 해당하고 2개를 발행했다면 숫자는 50만원을, 5개를 발행했다면 20만원의 가치를 가지게 됩니다. 이렇게 발행된 숫자는 디지털 현금 지폐와 같은 기능을 가집니다. 사용자는 은행이 자신의 숫자를 추적하지 못하도록 은닉 요소(Blind Factor)을 추가합니다.
- 사용자는 은닉 요소가 추가된 숫자를 은행에 넘깁니다.
- 은행은 사용자의 계좌로 부터 100만원을 인출한 후 숫자로 교환할 수 있음을 증명하는 메세지에 서명을 남깁니다.
- 최종적으로 사용자는 은행에서 발행된 자금을 사용할 수 있게 됩니다.
ⓑ 만약 사용자가 디지털 자산으로 결제하는 경우
- 사용자는 가맹점에서 식사를 하고 4만원의 식사비용을 디지털 자산으로 결제하고자 합니다. 사용자는 자신이 가진 숫자 중 비용을 지불하기 위한 숫자를 은닉 요소를 제거한 후 가맹점주에게 넘깁니다.
- 가맹점주는 이중 지불 문제를 방지하기 위해 숫자를 받자마자 은행에 알립니다.
- 은행은 가맹점주가 제시한 숫자에 서명이 유효한지 확인합니다. 이 후 가맹점주에게 숫자에 해당하는 금액을 입금합니다.
- 이렇게 사용된 숫자는 최종적으로 소각되어 다른 곳에서는 사용할 수 없게 됩니다.
탈중앙화 해결 방법
은행과 같은 중앙화된 객체가 존재하지 않는 상황에서 동일한 입장을 가진 사용자들이 서로 감시하고, 정직한 행동을 이끌어내기 위해서는 거버넌스가 존재해야 합니다. 비트코인 백서에서도 이중 지불 문제를 언급하고 있습니다. 이를최초로 해결하고 상용화까지 발전한 플랫폼이 바로 비트코인입니다.
일단 비트코인 코어나 geth 처럼 특정 소프트웨어를 실행하면 누구나 블록체인 네트워크에 참여가 가능합니다. 블록체인에 접속한 컴퓨터를 각각 노드(Node)라고 부릅니다. 네트워크에 참여한 노드들은 블록체인 DB 사본을 다운로드 받고 다른 노드들과 동기화 됩니다.
퍼블릭 블록체인의 경우 누구나 네트워크에 참여하고 제네시스 블록 부터 현재 까지 모든 블록 내의 트랜잭션을 확인할 수 있으므로 이중 지불 문제를 감시할 수 있습니다. Alice가 Bob에게 100BTC를 전송하는 트랜잭션이 발생되면 다수의 노드들로 부터 트랜잭션 검증이 이뤄지고, 블록에 추가됩니다. 이렇게 추가된 블록의 트랜잭션은 소유권이 이동한 경우이므로 이중 지불을 방지하게 됩니다.
블록체인에서도 레귤러 포크(Regular Fork)가 발생해서 기존에 생성된 블록이 고아 블록이 되는 경우가 있습니다. 따라서 트랜잭션이 승인되었고 신뢰할 수 있기 위해서는 블록이 생성된 후 6개의 블록이 추가로 생성된 시점을 안전하다고 표현할 수 있습니다. 이를 컨펌 횟수라고 합니다. 가장 긴 체인이 신뢰할 만한 체인으로 선정되고, 이미 생성된 체인들을 역주행하면서 데이터를 변조하기 위해서는 엄청난 해시 레이트가 필요하기 때문입니다. 비트코인의 블록이 생성되는 시간은 약 10분이므로 트랜잭션이 발생하고 약 1시간이 지나야 안전한 트랜잭션이라고 할 수 있게 됩니다.
철수가 밥값을 비트코인으로 결제하는 방법
- 철수는 맛집에서 즐겁게 식사를 한 후 Bitcoin으로 결제를 합니다. 식당의 비트코인 계정 주소로 밥값을 전송하는 트랜잭션을 생성합니다. 즉 밥값이 0.05BTC라고 하면 0.05BTC의 소유권이 식당이라고 주장하는 트랜잭션에 철수의 서명이 생성됩니다.
- 서명된 트랜잭션은 연결된 모든 노드들에게 브로드캐스팅 됩니다.
- 각 노드들은 트랜잭션의 서명을 확인하고 0.05BTC의 기존 소유자가 철수였으므로 정당하게 송금을 할 권한을 가지고 있다는 사실을 검증합니다.
- 검증이 완료된 트랜잭션은 블록에 추가되고, 이 후 블록이 뒤로 연결됩니다. 컨펌 횟수 6에 도달하면 안전한 트랜잭션으로 인정받게 됩니다.
이중 지불 공격
비트코인에서 PoW 방식으로 블록을 생성하고 트랜잭션들이 연결되는 방식은 데이터의 무결성을 보장합니다. 하지만 탈중앙화 해결 방법에도 문제는 존재합니다. ① 안전한 트랜잭션이 생성되기 까지 최대 1시간의 시간이 소요됩니다. 밥을 먹고 소화될 때 까지 기다려야 결제가 완료된다면 굉장히 불편한 결제 수단으로 현실에 적용되기 힘들 것입니다.
② 두번째 문제는 이중 지불 문제가 여전히 존재하는 것입니다. 트랜잭션이 블록에 올라가는 순서는 트랜잭션 생성 시간이 아닌 수수료에 의존합니다. 즉 식당 주인에게 보내는 트랜잭션 수수료 보다 더 많은 수수료를 가진 트랜잭션으로 다른 계정으로 보내면 식당 주인에게 보내는 전송은 취소되게 됩니다.
이중 지불 문제를 가진 공격으로는 51% 공격, 레이스 공격(Race Attacks), 핀니 공격(Finney Attacks)가 있습니다.
51% 공격
전체 블록체인 네트워크의 50% 이상 해시 레이트를 가진 단일 조직이 등장하게 되면 자신들에게 유리한 트랜잭션만 블록에 추가하거나 트랜잭션의 순서를 변조할 수 있습니다.
레이스 공격(Race Attack)
식당에서 철수가 밥값을 계산할 때 처럼 식당에게 보내는 트랜잭션과 다른 계정으로 보내는 트랜잭션이 동일한 금액을 전송할 때 가능한 공격입니다. 공격자는 자신에게 유리한 트랜잭션만 유효하게 만들어 공격을 가합니다. 레이스 공격이 가능하기 위해서는 수신자가 블록체인에 올라가지 않은 트랜잭션을 수용해야 합니다.
핀니 공격(Finney Attacks)
공격자는 트랜잭션을 네트워크에 바로 올리지 않고 다른 계정으로 보내는 트랜잭션을 미리 생성하고 블록을 미리 채굴해 둡니다. 이 후 이전에 채굴한 블록만 체인에 올리면서 식당에게 보내는 트랜잭션을 무효화 시킵니다.
'Blockchain' 카테고리의 다른 글
[Blockchain] W3C 데이터 탈중앙화 표준 DID란? (0) | 2022.07.25 |
---|---|
[Blockchain] 블록체인 샤딩(sharding) 이란? (0) | 2022.07.22 |
[Blockchain] Local 환경에서 NFT 민팅하는 방법 (0) | 2022.07.21 |
[Blockchain] OpenSea NFT 민팅 하는 방법 (0) | 2022.07.21 |
[Blockchain] NFT 만드는 법 (ERC-721 표준 사용) (0) | 2022.07.20 |
댓글