저자: BitMEX 리서치
출처: https://blog.bitmex.com/bitcoins-duplicate-transactions/
요약: 비트코인 블록체인 온체인 2010년 11월 중순에 발생한 동일한 거래 쌍이 두 개 있는데, 하나는 다른 하나 사이에 끼어 있습니다. 거래가 겹치는 현상은 혼란을 야기할 수 있으며, 비트코인 개발자들은 수년간 이 문제와 씨름해 왔습니다. 이 문제는 아직 완전히 해결되지 않았으며, 다음 거래 중복은 2046년에 발생할 수도 있습니다. 현재 거래 중복과 관련된 리스크 작지만, 여전히 고려해 볼 만한 흥미로운 버그입니다.

개요
일반적인 비트코인 거래는 이전 거래의 출력값 중 하나 이상을 사용합니다. 이 출력값은 이전 거래를 참조하는 거래 식별자(TXID)입니다. 사용되지 않은 출력값은 한 번만 사용할 수 있습니다. 만약 두 번 사용할 수 있다면 동일한 비트코인을 반복해서 사용할 수 있게 되어 비트코인의 가치가 없어지게 됩니다. 그러나 실제로는 온체인 동일한 거래 쌍이 두 개 나타난 사례가 있습니다. 이는 블록 생성자에게 블록 보상을 제공하는 코인베이스 거래가 입력값을 사용하는 대신 새로운 통화를 생성하기 때문에 가능합니다. 따라서 서로 다른 두 개의 코인베이스 거래가 동일한 금액을 동일한 주소로 전송하고, 구성 방식이 완전히 동일할 수 있습니다. 거래가 동일하기 때문에 TXID(거래 데이터의 해시 다이제스트) 또한 동일합니다. TXID가 겹치는 다른 경우는 해시 충돌(서로 다른 두 개의 역상이 정확히 동일한 해시 값을 생성하는 경우)입니다. 하지만 암호학적으로 안전한 해시 함수를 사용한다면 이러한 충돌은 발생할 가능성이 매우 낮고 불가능하다고 여겨집니다. SHA256 해시 알고리즘에서는 비트코인을 포함한 그 어떤 곳에서도 해시 충돌이 발생한 적이 없습니다.
이 두 쌍의 동일한 거래는 2010년 11월 14일 08:37 UTC와 2010년 11월 15일 00:38 UTC 사이에 매우 짧은 시간 간격으로 발생했습니다. 첫 번째 거래 쌍이 두 번째 거래 쌍을 샌드위치처럼 끼고 있었습니다. d5d2….8599 거래를 첫 번째 중복 거래 쌍으로 간주하는 이유는 이것이 가장 먼저 중복되었기 때문입니다. 하지만 (이상하게도) 그보다 앞선 거래인 e3bf….b468 거래도 선물 거래와 중복되었습니다.
중복 거래에 대한 세부 정보
아래는 mempool.space 블록체인 익스플로러 의 스크린샷 두 장으로, 서로 다른 블록에서 발생한 첫 번째 중복 트랜잭션 쌍을 보여줍니다.


흥미롭게도, 관련 URL을 블록체인 익스플로러 웹사이트에 입력하여 조회해 보면, mempool.space 블록체인 익스플로러 첫 번째 중복 거래 쌍( d5d2….8599 )을 표시할 때는 기본적으로 이전 블록(높이 91812)을 표시하고, 두 번째 중복 거래 쌍( e3bf….b468 )을 표시할 때는 기본적으로 이후 블록(높이 91880)을 표시합니다. Blockstream.info와 Btcscan.org의 결과도 동일합니다. 하지만 저희의 간단한 테스트 결과에 따르면 Blockchain.com과 Blockchair.com은 다릅니다. 이 두 사이트는 항상 더 최근 블록을 표시합니다.
관련된 네 개의 블록 중 코인베이스 거래 이외의 거래를 포함하는 블록은 91812 하나뿐이며, 이 거래는 1 BTC와 19 BTC를 결합하여 20 BTC 상당의 출력을 생성합니다.
이러한 산출물을 사용할 수 있습니까?
동일한 TXID 쌍이 두 개 존재하기 때문에 후속 거래는 이를 참조하는 데 어려움을 겪습니다. 중복되는 각 거래는 50 BTC의 가치를 지닙니다. 따라서 이러한 중복 거래는 총 4 * 50 BTC = 200 BTC, 또는 해석에 따라 2 * 50 BTC = 100 BTC에 해당합니다. 어떤 관점에서는 100 BTC는 존재하지 않는 것처럼 보일 수 있습니다. 현재까지 200 BTC가 모두 사용된 것은 아닙니다. 우리가 알고 있는 바로는 (반드시 정확한 것은 아니지만), 누군가 이러한 출력의 개인 키를 알고 있다면 해당 비트코인을 사용할 수 있습니다. 그러나 일단 사용되면 이러한 UTXO는 데이터베이스에서 삭제되고, 관련된 중복 거래의 50 BTC는 사용할 수 없게 됩니다(손실). 따라서 100 BTC만 복구 가능합니다. 사용된 거래가 어느 블록의 거래(이전 블록 또는 이후 블록)에서 나온 것인지는 명확하게 정의할 수 없으며 단정적으로 말할 수 없습니다.
중복 거래가 발생하기 전에 관련 당사자들은 거래에 사용된 모든 비트코인을 소비할 수 있습니다. 그런 다음 중복된 출력을 생성하여 데이터베이스(또는 미사용 출력 집합)에 새로운 항목을 추가할 수 있습니다. 만약 이런 일이 발생한다면, 중복 거래뿐만 아니라 사용된 출력이 겹치는 중복 거래까지 발생할 수 있습니다. 이는 출력이 소비됨에 따라 더 많은 중복 거래를 생성하고, 중복 거래의 연쇄 반응을 일으킬 가능성을 열어줍니다. 관련 당사자들은 중복 거래가 생성되기 전에 항상 소비되도록 일련의 과정을 매우 신중하게 계획해야 합니다. 그렇지 않으면 비트코인의 일부를 영원히 잃을 수도 있습니다. 이러한 새로운 중복 거래는 코인베이스 거래가 아니라 "일반" 거래가 될 것입니다. 다행히 이러한 일은 발생하지 않았습니다.
중복 거래로 인해 발생하는 문제점
중복 거래는 분명히 문제가 됩니다. 지갑과 블록체인 익스플로러 에 혼란을 야기하여 비트코인의 출처를 모호하게 만듭니다. 또한 수많은 공격 및 무차별 대입 공격의 기회를 제공합니다. 예를 들어, 동일한 사람에게 두 번 돈을 지불하기 위해 중복 거래를 사용할 수 있습니다. 그러면 그 사람이 자금을 사용하려고 할 때 절반만 사용할 수 있다는 것을 알게 됩니다. 또는 거래소 거래소 에 빠뜨려 파산으로 몰아넣을 수도 있습니다. 공격자는 자금을 입금한 후 즉시 인출을 요구할 수 있으므로 아무런 처벌도 받지 않습니다.
TXID가 중복되는 거래는 금지됩니다.
중복 거래 문제를 완화하기 위해 비트코인 개발자 피터 윌레는 2012년 2월 BIP30을 제안했습니다. 이 BIP는 이전 거래가 완전히 소진되지 않은 경우 기존 거래 ID(TXID)와 중복되는 거래 생성을 금지했습니다. 이 소프트 포크 2012년 3월 15일 이후의 모든 블록에 적용되었습니다.
2012년 9월, 비트코인 개발자 그렉 맥스웰은 BIP30 검사를 모든 블록(2012년 3월 15일 이후 생성된 블록뿐만 아니라)에 포함하도록 규칙을 수정했습니다 . 앞서 언급한 두 가지 중복 거래는 예외로 처리되었습니다. 이로써 일부 DoS 공격 취약점이 해결되었습니다. 엄밀히 말하면 이는 또 다른 소프트 포크 였지만, 규칙 변경이 6개월 이전에 생성된 블록에만 적용되었기 때문에 일반적인 프로토콜 규칙 변경과 관련된 리스크 없었습니다.
BIP30 검사는 계산 집약적입니다. 노드는 새 블록의 모든 트랜잭션 출력을 검사하여 출력 엔드포인트가 이미 UTXO 세트에 존재하는지 확인해야 합니다. 이것이 바로 Wuille이 미사용 출력만 검사하도록 설계한 이유일 가능성이 높습니다. 모든 출력(제네시스 블록 이후)을 검사하는 것은 계산 집약적이어서 가지치기 모드를 사용할 수 없게 됩니다. (참고: 가지치기 모드는 일부 과거 블록을 제거하지만 전체 UTXO 세트를 유지하여 노드가 새 블록을 검증할 수 있도록 합니다.)
비이프34
2012년 7월, 비트코인 개발자 개빈 앤드레슨은 BIP34를 제안했고, 이는 2013년 3월에 활성화된 소프트 포크 였습니다. 이 프로토콜 변경으로 코인베이스 거래에 블록 높이를 포함하도록 요구하고 블록 형식의 버전 구분을 가능하게 했습니다. 블록 높이는 코인베이스 거래의 스크립트 서명(scriptSig)에 추가되는 첫 번째 요소가 되었습니다. 코인베이스 거래 스크립트 서명의 첫 번째 바이트는 블록 높이 숫자에 사용된 바이트 수를 나타내고, 그 뒤에 블록 높이 숫자 자체가 옵니다. 처음 160년( 2 ^ 23 / (144 blocks/day * 356 day/year) ) 동안 첫 번째 바이트는 0x03이어야 했습니다. 이것이 오늘날 코인베이스 스크립트 서명(16진수 인코딩)이 항상 03으로 시작하는 이유입니다. 이 소프트 포크 중복 거래 문제를 완전히 해결한 것으로 보이며, 이제 모든 거래는 고유해야 합니다.
2015년 11월 BIP34가 채택된 후, 비트코인 개발자 알렉스 모르코스는 비트코인 코어 소프트웨어 저장소에 병합 요청을 추가했습니다. 이 변경으로 인해 노드는 BIP30 검사를 더 이상 수행하지 않게 되었습니다. BIP34에서 해당 문제가 해결되었으므로, 비용이 많이 드는 이 검사가 더 이상 필요하지 않게 된 것입니다. 당시에는 알려지지 않았지만, 기술적으로 이는 하드 포크 해당하며, 향후 발생할 가능성이 매우 낮은 블록들을 무효화하는 결과를 초래했습니다. 하지만 현재는 2015년 11월 이전에 출시된 노드 소프트웨어를 사용하는 사람이 거의 없기 때문에 이 잠재적인 하드 포크 더 이상 중요하지 않습니다. forkmonitor.info 에서는 2015년 10월에 출시된 비트코인 코어 0.10.3 버전을 사용하고 있습니다. 따라서 이는 하드 포크 이전의 규칙을 따르는 클라이언트이며, 여전히 비용이 많이 드는 BIP30 검사를 수행하고 있습니다.
블록 198 3702의 문제점
나중에 BIP34 활성화 이전 블록의 일부 코인베이스 거래에서 스크립트 서명이 향후 (BIP34를 준수하는) 유효 블록의 서명과 정확히 일치하는 것으로 밝혀졌습니다. 따라서 BIP34는 대부분의 경우 문제를 해결했지만 100% 해결한 것은 아니었습니다. 2018년 비트코인 개발자 존 뉴베리는 이러한 잠재적 중복 사례의 전체 목록을 다음과 같이 정리했습니다.
| 오래된 블록 | 새로운 블록 | 새 블록의 예상 도착일 |
|---|---|---|
| 209,920 | 209,921 | 2012년 11월 28일* |
| 176,684 | 490,897 | 2017년 10월 21일* |
| 164,384 | 1,983,702 | 2046년 1월 13일 |
| 169,895 | 3,708,179 | 2078년 10월 28일 |
| 170,307 | 3,709,183 | 2078년 3월 11일 |
| 171,896 | 3,712,990 | 2078년 11월 30일 |
| 172,069 | 3,713,413 | 2078년 3월 12일 |
| 172,357 | 3,714,082 | 2078년 7월 12일 |
| 172,428 | 3,714,265 | 2078년 9월 12일 |
| 183,669 | 3,761,471 | 2079년 2월 11일 |
| 196,988 | 4,275,806 | 2089년 12월 8일 |
| 174,151 | 5,208,854 | 2017년 11월 5일 |
| 201,577 | 5,327,833 | 2019년 8월 14일 |
| 206,039 | 7,299,941 | 2147년 11월 2일 |
| 206,354 | 7,299,941 | 2147년 11월 2일 |
- 출처: https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd -
"*" 표시 관련 참고 사항: 이 블록들은 2012년과 2017년에 채굴되었으며, 코인베이스 거래 내역은 서로 겹치지 않습니다. 블록 209921(첫 번째 반감 종료 시점으로부터 79번째 블록)은 당시 BIP30 검사가 여전히 적용 중이었기 때문에 거래 내역이 겹치지 않았습니다.
코인베이스 거래 중복 가능 건수 연간 표

- 출처: https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd -
따라서 잠재적으로 중복되는 거래가 있는 다음 블록은 높이 1983702에 있으며, 2046년 1월경에 생성될 것으로 예상됩니다. 2012년 1월에 생성된 블록 164384에는 170 BTC를 7개의 서로 다른 주소로 전송한 코인베이스 거래가 포함되어 있습니다. 따라서 2046년의 채굴자가 이러한 공격을 감행한다면, 해당 블록을 채굴해야 할 뿐만 아니라 거래 수수료로 거의 170 BTC를 소진해야 하므로 총 비용은 170 BTC보다 약간 더 높을 것입니다(블록 보조금 0.09765625 BTC의 기회비용 포함). 현재 비트코인 환율인 88,500달러를 기준으로 하면 약 1,500만 달러가 소요될 것입니다. 2012년 코인베이스 거래에 사용된 7개 주소의 소유자가 누구인지는 알려지지 않았으며, 해당 개인 키가 분실되었을 가능성이 높습니다. 이 코인베이스 거래의 7개 출력은 모두 사용되었으며, 그중 3개는 동일한 거래 에서 사용되었습니다. 저희는 이 자금이 파이럿40 폰지 사기와 관련이 있을 가능성이 있다고 생각하지만, 이는 단지 추측일 뿐입니다. 따라서 이번 공격은 막대한 비용이 들 뿐만 아니라 거의 무용지물인 것으로 보입니다. 31년 동안 소프트웨어를 실행해 온 네트워크 노드를 제거하는 데는 엄청난 비용이 소요될 것입니다.
(역자 주: 여기서의 논리는 BIP34는 중복 트랜잭션을 금지하지 않고, BIP30만 금지한다는 것입니다. 따라서, 198,3702번째 노드에서 중복 트랜잭션을 생성하면, BIP30 검사를 계속 실행하는 노드에만 문제가 발생하여, BIP30 검사를 더 이상 실행하지 않는 노드 네트워크에서 해당 노드가 포크. 물론, 현재로서는 중복 트랜잭션을 어떻게 처리해야 하는지에 대한 명확한 기준이 없다고도 할 수 있습니다.)
다음으로 잠재적으로 위험한 블록에는 2012년 3월의 블록 16,9985와 겹치는 코인베이스 거래가 포함될 수 있습니다. 역사적으로 이 코인베이스 거래의 출력은 50 BTC를 약간 넘는 수준에 그쳤으며, 170 BTC에는 훨씬 못 미쳤습니다. 50 BTC라는 수치는 당시의 블록 보조금과 관련이 있지만, 이 겹침 현상이 발생할 위험이 있는 미래, 즉 2078년에는 블록 보조금이 훨씬 낮아질 것입니다. 따라서 이 취약점을 악용하려면 채굴자들은 약 50 BTC에 달하는 거래 수수료를 소각해야 하는데, 이 수수료는 2012년 거래에 나타나는 출력으로 보내져야 하므로 복구가 불가능합니다. 2078년의 비트코인 가격은 아무도 알 수 없지만, 이러한 공격은 막대한 손실을 초래할 수 있습니다. 따라서 이 문제는 비트코인에 심각한 리스크 아닐지라도 여전히 우려할 만한 사항입니다.
2017년 Segregated Witness 업그레이드 이후, Coinbase 거래에는 블록 내 모든 거래에 대한 약정(commitment)이 포함될 수 있습니다. BIP34 이전의 블록에는 이러한 약정이 포함되지 않았습니다. 따라서 중복되는 Coinbase 거래를 생성하려면 채굴자는 Segregated Witness 출력을 사용하는 모든 거래를 블록에서 제거해야 하므로, 수수료를 지불하는 거래가 블록에 포함될 수 있는 기회가 줄어들어 공격의 기회비용이 더욱 증가합니다.
결론적으로
중복 거래 버그는 악용이 극히 어렵고 비용이 많이 들며 드물기 때문에 비트코인의 주요 보안 문제로 여겨지지는 않습니다. 하지만 이 문제는 시간적 범위와 중복 거래의 특성상 흥미로운 주제로 남아 있습니다. 그럼에도 불구하고 개발자들은 이 문제 해결에 대량 시간을 투자해 왔으며, 일부 개발자들은 2046년을 해결 시한으로 생각하고 있을 수 있습니다. 이 문제를 해결하는 방법은 여러 가지가 있으며, 소프트 포크 필요할 수도 있습니다. 한 가지 가능한 해결책은 코인베이스 거래에 포함된 것처럼 분리된 증인(SWC) 커밋먼트를 의무화하는 것입니다.
(위에)



