
비트코인의 중복 거래: 위험이 극히 적은 흥미로운 버그

개요
정상적인 비트코인 거래는 이전 거래의 거래 ID(TXID)를 참조하여 최소한 하나 이상의 출력을 사용한다. 이러한 미사용 출력은 단 한 번만 사용될 수 있으며, 만약 두 번 사용 가능하다면 이중 지불이 가능해져 비트코인이 무가치해질 것이다. 그러나 실제로 비트코인에는 정확히 동일한 두 쌍의 거래가 존재한다. 이런 일이 가능한 이유는 코인베이스 거래(coinbase transaction)는 입력이 없고 새로 생성된 코인만 포함되기 때문이다. 따라서 서로 다른 두 개의 코인베이스 거래가 동일한 수량을 동일한 주소로 보내고, 완전히 동일하게 구성된다면, 그 거래들은 완전히 동일해질 수 있다. 거래가 동일하므로 TXID도 일치하는데, 이는 TXID가 거래 데이터의 해시 요약이기 때문이다. 해시 충돌 없이는 TXID가 복제되는 유일한 방법은 없다. 암호학적으로 안전한 해시 함수에서는 해시 충돌이 거의 불가능하며 달성할 수 없는 것으로 간주된다. SHA256과 같은 해시 충돌은 비트코인이나 그 어디에서도 지금까지 발생한 적이 없다.
이러한 중복 거래 두 쌍은 모두 2010년 11월 14일 08:37 UTC부터 2010년 11월 15일 00:38 UTC 사이 약 16시간 동안 가까운 시기에 발생했다. 첫 번째 중복 거래 쌍은 두 번째 쌍 사이에 낀 형태이다. 우리는 d5d2….8599를 첫 번째 중복 거래로 분류하는데, 비록 이상하게도 블록체인 상에서 다른 중복 거래 e3bf….b468보다 늦게 처음 나타났지만, 먼저 복제본이 된 거래이기 때문이다.
중복 거래 세부 정보
아래 이미지에서는 mempool.space 블록 탐색기의 스크린샷 두 장을 통해 첫 번째 중복 거래가 서로 다른 두 개의 블록에 반복되어 나타나는 것을 확인할 수 있다.


흥미롭게도, 웹 브라우저에서 관련 URL을 입력할 때 mempool.space 블록 탐색기는 d5d2….8599의 경우 기본적으로 더 이른 블록을 표시하고, e3bf….b468의 경우 기본적으로 나중의 블록을 표시한다. Blockstream.info와 Btcscan.org 또한 mempool.space와 동일한 동작을 한다. 반면에 Blockchain.com과 Blockchair.com은 우리의 기초 테스트 결과에 따르면 다르게 동작하며, 브라우저에 URL을 입력할 때 항상 중복 거래의 최신 버전을 표시한다.
관련된 네 개의 블록 중 오직 하나의 블록(블록 91,812)만이 다른 거래를 포함하고 있다. 이 거래는 1 BTC와 19 BTC 출력을 합쳐서 하나의 20 BTC 출력을 만들었다.
이 출력들은 사용될 수 있는가?
동일한 TXID가 두 쌍 존재함에 따라 후속 거래에서 참조 문제가 발생한다. 각 중복 거래의 가치는 50 BTC이다. 따라서 이 중복 거래들로 인해 총 4 x 50 BTC = 200 BTC가 관련되거나, 해석에 따라 2 x 50 BTC = 100 BTC가 관련될 수 있다. 어느 정도로는 100 BTC가 실질적으로 존재하지 않는 셈이다. 오늘날까지 모든 200 BTC는 아직 사용되지 않았다. 우리가 알고 있는 바로는(여기서 우리가 틀릴 수도 있음), 누군가 이 출력들과 연결된 개인키를 소유하고 있다면, 그들은 해당 비트코인을 사용할 수 있을 것이다. 그러나 한 번 사용되면 UTXO는 데이터베이스에서 삭제되며, 중복된 50 BTC는 더 이상 사용할 수 없게 되어 사라지게 된다. 따라서 회수 가능한 것은 고작 100 BTC뿐이다. 그리고 만약 이 코인이 사용된다면, 그것이 어떤 블록에서 나오는지—더 이른 것인지 혹은 최근 것인지—는 정의되지 않았거나 결정할 수 없을 수 있다.
누군가는 중복 거래를 생성하기 전에 모든 비트코인을 사용한 다음, 중복 출력을 생성하여 미사용 출력 데이터베이스에 새 항목을 만들었을 수도 있다. 그러면 중복 거래뿐만 아니라, 사용된 출력의 중복도 존재할 가능성이 있다. 이런 일이 발생하면 출력이 사용될 때 더 많은 중복 거래가 생성되어 일종의 중복 체인을 형성할 수 있다. 사람은 사건의 순서에 주의해야 하며, 항상 중복 생성 전에 먼저 사용해야 한다. 그렇지 않으면 비트코인이 영원히 사라질 수 있다. 이러한 새로운 중복 거래들은 코인베이스 거래가 아니라 "정상적인" 거래가 될 것이다. 다행히도 이런 일은 결코 발생하지 않았다.
중복 거래의 문제점
중복 거래는 명백히 좋지 않다. 지갑과 블록 탐색기에 혼란을 초래하며 비트코인의 출처를 모호하게 만든다. 또한 많은 공격과 취약점을 야기한다. 예를 들어, 당신은 두 건의 중복 거래로 누군가에게 두 번 지불할 수 있다. 그런 다음 거래 상대방이 자금을 사용하려 할 때, 자금의 절반만 회수 가능하다는 것을 알게 될 수 있다. 예를 들어, 이것은 거래소를 파산시키려는 공격이 될 수 있으며, 공격자는 입금 후 즉시 자금을 인출함으로써 아무런 손실 없이 이를 수행할 수 있다.
중복 TXID 거래 금지
중복 거래 문제를 완화하기 위해 2012년 2월, 비트코인 개발자 피터 우일레(Pieter Wuille)는 BIP30 소프트포크 제안을 하였다. 이는 이전 TXID가 사용되었을 경우를 제외하고 중복 TXID를 사용하는 거래를 금지한다. 이 소프트포크는 2012년 3월 15일 이후의 모든 블록에 적용된다.
2012년 9월, 비트코인 개발자 그렉 맥스웰(Greg Maxwell)은 이 규칙을 수정하여 BIP30 검사를 2012년 3월 15일 이후 뿐 아니라 모든 블록에 적용하도록 하였다. 다만 본문 앞부분에서 언급된 두 개의 중복 거래는 예외로 둔다. 이를 통해 일부 DoS 취약점이 수정되었다. 기술적으로 이것은 또 한 번의 소프트포크였지만, 규칙 변경은 과거 6개월 이상 된 블록에만 적용되었기 때문에 일반 프로토콜 규칙 변경과 관련된 위험은 전혀 존재하지 않았다.
BIP30 검사는 계산 비용이 매우 높다. 노드는 새 블록의 모든 거래 출력을 확인하고, 이 출력들이 기존 UTXO에 존재하는지 여부를 점검해야 한다. 이것이 아마도 우일레가 미사용 출력에 대해서만 검사를 수행한 이유일 것이며, 모든 출력에 대해 검사를 한다면 계산 비용은 더욱 증가하고 프루닝(pruning)도 불가능해진다.
BIP34
2012년 7월, 비트코인 개발자 가빈 앤더슨(Gavin Andresen)은 BIP34 소프트포크 제안을 하였으며, 2013년 3월에 활성화되었다. 이 프로토콜 변경은 코인베이스 거래에 블록 높이를 포함하도록 요구하며, 이로 인해 블록 버전 관리도 가능해졌다. 블록 높이는 코인베이스 스크립트시그(scriptSig)의 첫 번째 항목으로 추가된다. 코인베이스 scriptSig의 첫 바이트는 블록 높이 숫자 표현에 사용되는 바이트 수를 나타내며, 그 다음 바이트들은 블록 높이 자체를 나타낸다. 처음 160년(223 / (일일 144블록 × 연간 365일)) 동안 첫 번째 바이트는 0x03이어야 한다. 그래서 오늘날의 코인베이스 ScriptSig(HEX)는 항상 03으로 시작한다. 이 소프트포크는 중복 거래 문제를 완전히 해결한 듯 보이며, 이제 모든 거래는 고유해야 한다.
BIP34가 이미 채택된 이후, 2015년 11월 비트코인 개발자 알렉스 모코스(Alex Morcos)는 비트코인 코어 소프트웨어 저장소에 풀 리퀘스트를 추가하였다. 이 변경은 노드가 더 이상 BIP30 검사를 수행하지 않도록 하는 것을 의미한다. 어차피 BIP34가 이 문제를 수정했으므로, 더 이상 이 비싼 검사는 필요하지 않기 때문이다. 당시에는 몰랐지만, 기술적으로 이것은 미래의 매우 드문 블록을 위한 하드포크였다. 그러나 잠재적 하드포크는 중요하지 않은 것으로 간주되는데, 거의 아무도 2015년 11월 이전의 노드 소프트웨어를 실행하지 않기 때문이다. forkmonitor.info에서는 2015년 10월에 출시된 Bitcoin Core 0.10.3을 운영 중이다. 그러므로 이것은 하드포크 이전의 규칙이며, 클라이언트는 여전히 비싼 BIP30 검사를 수행하고 있다.
블록 983,702 문제
결국 BIP34 활성화 이전의 블록들 중 일부 코인베이스 거래들은 당시 사용된 scriptSig의 첫 바이트가 마침내 미래의 유효한 블록 높이와 일치하는 경우가 있었다. 따라서 BIP34는 거의 모든 경우에서 이 문제를 해결했지만, 완벽한 100% 해결책은 아니었다. 2018년, 비트코인 개발자 존 뉴버리(John Newbery)는 아래 표와 같이 잠재적 중복의 전체 목록을 출력하였다.


*참고: 이 블록들은 2012년과 2017년에 코인베이스 거래를 생성하였으나 중복되지 않았다. 209,921번째 블록(BIP30이 시행된 기간 내에서 첫 번째 반감기까지 단 79블록 부족)은 중복될 수 없다.
출처:https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
연도별 잠재적 중복 코인베이스 거래 수

출처:https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
따라서 다음으로 중복 거래가 발생할 수 있는 블록은 약 2046년 1월에 생성될 블록 1,983,702이다. 2012년 1월 생성된 블록 164,384의 코인베이스 거래는 일곱 개의 서로 다른 출력 주소로 170 BTC를 보냈다. 따라서 2046년의 채굴자가 이 공격을 시도하려면, 운이 좋아 이 블록을 발견해야 할 뿐 아니라, 170 BTC 미만의 수수료를 소각해야 하며, 총 비용은 0.09765625 BTC의 블록 보상 기회비용을 포함해 약간 170 BTC를 초과한다. 현재 88,500달러의 비트코인 가격 기준으로 이는 1,500만 달러 이상의 비용이 든다. 2012년 코인베이스 거래의 일곱 주소가 누구에게 속해 있는지는 알려져 있지 않으며, 키는 이미 유실되었을 가능성이 크다. 현재 이 코인베이스 거래의 일곱 출력 주소는 모두 사용되었으며, 그 중 세 개는 동일한 거래에서 사용되었다. 우리는 이 자금이 Pirate40 다단계 사기와 관련이 있을 가능성이 있다고 생각하지만, 이는 추측일 뿐이다. 따라서 이 공격은 비용이 많이 들 뿐 아니라 공격자에게 거의 쓸모없어 보인다. 31년 전인 2015년 11월의 노드를 하드포크로 네트워크에서 제거하는 것은 상당한 비용이 든다.
다음으로 복제될 수 있는 취약한 블록은 2012년 3월의 169,985번 블록이다. 이 코인베이스 거래는 당시 보조금인 정확히 50 BTC를 약간 초과하여 사용하였다. 물론 이 보조금은 당시 것이며, 이 코인베이스 거래가 2078년에 중복되기 쉬운 상태가 되었을 때는 보조금이 훨씬 낮을 것이다. 따라서 이를 악용하기 위해 채굴자는 약 50 BTC의 수수료를 소각해야 하며, 이 수수료는 2012년의 오래된 출력으로 보내야 하므로 돌려받을 수 없다. 2078년 비트코인의 가격이 어떻게 될지는 아무도 모르지만, 이런 공격의 비용 역시 매우 높을 수밖에 없다. 따라서 이 문제는 비트코인의 주요 위험 요소는 아닐 수 있지만, 여전히 우려되는 부분이다.
2017년 SegWit 업그레이드 이후 코인베이스 거래는 블록 내 모든 거래에 대한 커밋(commitment)을 포함할 수도 있다. 그러나 이 BIP34 이전의 블록들은 위트니스 커밋(witness commitment)을 포함하지 않는다. 따라서 중복 코인베이스 거래를 생성하려면 채굴자는 블록에서 모든 SegWit 출력의 사용 거래를 제외해야 하며, 이는 기회비용을 더욱 증가시킨다. 왜냐하면 블록이 다른 수수료를 지불하는 많은 거래를 포함하지 못할 수 있기 때문이다.
결론
중복 거래의 난이도와 비용, 그리고 활용 기회의 드문 빈도를 고려하면, 이 중복 거래 취약점은 비트코인의 주요 보안 문제처럼 보이지 않는다. 그러나 관련된 시간 척도와 중복 거래의 독특함을 고려하면 흥미롭게 생각할 만하다. 그럼에도 불구하고 개발자들은 이 문제에 수년간 상당한 시간을 투자해 왔으며, 2046년이라는 날짜는 일부 개발자들에게 이 문제를 해결해야 할 최후의 기한으로 여겨질 수 있다. 이 오류를 수정하는 방법은 여러 가지가 있으며, 소프트포크가 필요할 수 있다. 가능한 수정 방안 중 하나는 위트니스 커밋을 강제 적용하는 것이다.
TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News














