이중 지불 문제는 단일 화폐 단위가 두번(이중) 지출 되는것을 의미합니다.
기존의 중앙 제어 시스템을 가지고 있는 은행의 경우 거래가 발생한 순서대로 거래를 처리함으로써 이중 지불 문제를 아주 쉽게 해결할 수 있었습니다. 예를 들어 통장 잔액이 1,000원인 A가 B와 C에게 동시에 1,000원을 송금하였을 경우 중앙 처리 시스템에 먼저 도착한 거래를 처리하게 됩니다. 만약 B에게 송금한 거래가 먼저 들어왔다면, 해당 거래를 처리하고 잔액을 차감합니다. 그리고 C에게 송금한다는 내용은 잔금이 부족함으로 잔액 부족 오류를 출력함으로써 이중 지불 문제를 해결할 수 있었습니다.
하지만 탈 중앙화된 비트코인의 경우 전 세계적으로 연결된 네트워크에 의해 거래가 이루어짐으로 순차적으로 거래를 진행할 수 없습니다. 그렇기 때문에 동일한 화폐를 각자 다른 사용자에게 동시에 전송하였을 경우 하나의 거래만을 인정하는 방법이 필요했습니다.
비트코인은 이중 지불 문제를 방지하기 위하여 하나의 블록에 동일한 UTXO 정보를 가지고 있는 트랜잭션을 오직 하나만 담을 수 있도록 하였으며, 메인 체인에 새로운 블록이 연결되었을 경우 해당 블록에 포함된 트랜잭션 거래 정보만을 유효한 거래로 인정하고, 블록에 담기지 못한 트랜잭션의 거래 정보를 무효화 함으로써 동일한 화폐가 두 번 사용될 수 없도록 하였습니다.
피니 어택은 악의적인 채굴자와 협력하여 이중 지불이 발생하도록 유도하는 공격 방법이며, 비트코인 포럼에서 Hal Finney가 처음으로 언급한 공격 방식이기에 그의 이름을 따서 명명된 공격 방식입니다. 예를 들어 공격자 A, 마이너 B, 피해자 C가 있다고 가정해보겠습니다.
(1) 공격자 A는 악의적인 채굴자 B에게 10 BTC를 보낸다는 트랜잭션을 생성하고, 악의 적인 채굴자 B는 해당 트랜잭션을 블록에 포함하여 새로운 블록을 생성합니다. 이때 생성된 새로운 블록을 각 노드에 전파하지 않고 기다립니다.
(2) 공격자는 A는피해자 C에게 10 BTC를 전송하는 트랜잭션을 생성 후 전파합니다. 피해자 C는 정상적으로 트랜잭션이 전파된것을 확인 후 물건을 전달합니다. 공격자 A는 물건을 받은 뒤 자리를 떠납니다.
(3) 공격자 A가 C에게 비트코인을 전송하는 트랜잭션이 채굴자에의해 블록에 담기어 전파되는 속도보다, 악의적인 채굴자가 미리 생성한 블록이 더 빠르게 전파될 수 있음으로 피해자 C에게 전송한 트랜잭션은 무효화되어 피해자는 물건만 전달하고 비트코인을 얻지 못하는 결과가 나올 수 있습니다.
레이스 어택 또한 동일한 UTXO 정보를 토대로 생성된 트랜잭션이 동시에 전파되었을 경우 블록에 포함된 트랜잭션의 거래 정보만이 유효하고, 블록에 포함되지 못한 트랜잭션의 거래 정보를 무효화하는 블록체인의 특성을 활용한 공격 방법입니다.
(1) 공격자 A는 판매자 C에게 비트코인을 보내는 트랜잭션을 생성하여 전파함과 동시에 공격자 B에게도 동일한 UTXO 정보를 활용하여 비트코인을 보내는 트랜잭션을 생성합니다. 이때 공격자 B에게 전송하는 트랙잭션의 거래 수수료를 높게 설정한 후 전송합니다.
(2) 판매자 C는 공격자 A가 비트코인을 보내는 트랜잭션을 확인 후 물건을 전달하고 공격자 A는 자리를 떠납니다.
(3) 공격자 B에게 전송한 트랜잭션의 거래 수수료가 높음으로 채굴자는 더 많은 이득을 위해 해당 트랜잭션을 우선적으로 블록에 담아 블록을 생성함으로 피해자 C에게 전송한 트랜잭션의 거래가 무효화될 수 있습니다.
피니 어택 및 레이스 어택 공격과 같은 이중 지불을 유도하는 공격 방법을 해결하기 위한 방법은 아주 간단합니다. 거래의 승인이 충분히 이루어져 더 이상 해당 트랜잭션이 무효화되지 않은 시점에서 거래가 완전히 끝나다고 판단한 뒤 물건을 전달하면 레이스 어택 및 피니 어택과 같은 공격으로 부터 안전해질 수 있습니다. 이러한 이유때문에 대다수의 거래소 비트코인을 출금하였을 경우 거래 승인이 충분히 이루어진 후 출금이 진행되는것입니다.
https://namu.wiki/w/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8#s-3.2