비트코인 캐시 하드포크 – 세 건의 상호 관련 사건

요약: 2019년 5월 15일에 시행된 비트코인 캐시 하드포크는 세 가지 중대한 상호 관련 문제로 인해 어려움을 겪은 것으로 보여집니다. “공격 거래”에 의해 악용된 취약점으로 인해 마이너들이 빈 블록을 생산하게 되었습니다. 빈 블록을 둘러싼 불확실성은 본래의 비 하드포크 체인에서 채굴 시도를 했을 수 있는 마이너들 사이에서 우려를 불러 일으켰을 수 있으며, 이는 합의된 체인 분할을 야기합니다. 실수로 세그윗 주소로 보내진 자금을 회수하기 위한 개발자와 마이너의 계획이 있었던 것으로 보이며, 위에서 언급한 취약점이 본 계획을 무산시켰을 수도 있습니다. 이 실패로 인해 의도적이고 조정된 2개 블록체인의 리오그를 초래했을 수 있습니다. 저희의 산출 방식에 따르면 약 3,392 개의 비트코인 캐시가 조정된 전환 거래에서 성공적으로 이중 지불되었을 수 있었습니다. 그러나 이렇게 이중 지불된 코인과 관련한 유일한 희생자는 원래의 “도둑”일 수도 있었습니다.

2019년 5월 15일에 시행된 비트코인 캐시 네트워크 분할 도표

(출처: BitMEX Research)
(공지사항: 분할을 도식화한 그림)

비트코인 캐시의 세 가지 문제점

2019년 5월에 시행된 비트코인 캐시의 하드포크 업그레이드는 세 가지 중요 문제로 인해 어려움을 겪었으며, 이 중 두 가지는 빈 블록을 초래한 버그 때문에 간접적으로 발생한 것일 수도 있습니다. 아래의 그림은 이 세 가지 사건 간의 잠재적 관계성을 보여주고 있습니다.

하드포크 업그레이드 과정에서 비트코인 캐시가 직면한 세 가지 문제 간의 관계성

(출처: BitMEX Research)

빈 블록 문제

비트코인 캐시에 대한 중요한 소프트웨어 구현체인 비트코인 ABC는 버그를 가지고 있는 것으로 보이며, 여기서 메모리 풀에 진입하기 위한 거래의 유효 조건은 합의된 유효 조건보다 덜 부담스러웠을 수 있습니다. 이는 비트코인 (및 비트코인 캐시)이 어떻게 운영될 것으로 예상되는 지와는 정반대이며 합의된 유효성 규칙은 메모리 풀보다 느슨해야 합니다. 이는 악성 지출자가 네트워크를 통해 전달하고 상업용 메모리 풀 진입에 있어 조건을 충족하는 거래를 생성하지 못하지만, 유효한 블록에 진입하기 위한 필요 조건을 충족하지 못하기 때문에 실제로 매우 중요한 특성입니다. 이는 본래 결제가 블록체인 상에서 이루어지지 않기를 바랄 필요 없이 제로 컨펌 이중지불공격 (0-confirmation double spend attacks)을 비교적 쉽게 수행할 수 있도록 허용합니다. 이러한 상황에서 공격자는 악의적으로 구성된 거래가 블록체인으로 연결되지 않을 것임을 상당히 확신할 수 있습니다.

공격자는 비트코인 캐시 ABC에서 이 버그를 발견한 후, 하드포크 시행 직후에 혼돈과 혼란을 일으키려는 시도로 해당 버그를 악용한 것으로 보입니다. 본 공격은 언제든지 수행될 수 있었습니다. 공격자는 메모리 풀 유효성 조건을 충족했지만 합의 검증에 실패한 거래 만을 전파할 수 밖에 없었습니다. 마이너들은 이러한 거래로 블록을 생성하려 했지만 결국 실패하고 말았습니다. 안전책으로 블록을 전혀 만들지 않는 대신, 적어도 대부분의 경우 마이너들은 빈 블록을 만든 것으로 보여집니다.

비트코인 캐시 – 블록 당 거래 수 – 하드포크를 나타내는 주황색 선

(출처: BitMEX Research)

비대칭 체인 분할

빈 블록을 둘러싼 불확실성이 최고조에 달했을 때, 저희 비트멕스의 사전 하드포크 비트코인 ABC 0.18.2 노드는 새로운 블록인 582,680을 받았습니다. 당시 많은 사람들이 빈 블록에 대해 우려했고, 일부 마이너들은 더 긴 체인은 문제가 되어 하드포크 이전으로 되돌아갈 수도 있다고 생각하여 이들 또한 하드포크 이전의 고객으로 되돌아갔을 가능성이 있습니다. 그러나 이는 저희의 추측일 뿐이며 빈 블록 버그는 체인 분할과 아무런 관련이 없었을 가능성이 있습니다. 본 버그는 너무 느려 업그레이드를 수행할 수 없는 마이너에 의해 야기되었을 수 있습니다.

비트코인 캐시 컨센서스 체인 분할

(출처: BitMEX Research)

본 체인 분할은 하드포크의 구조와 관련하여 저희에게 한 가지 문제를 부각시켰습니다. 저희 는 향후 하드포크 클라이언트인 ABC 0.19.0이 분할의 비 하드포크 측면을 유효한 것으로 간주할 지 여부를 시험했습니다. 본 분할이 “올바르게” 이루어지기 위해서는 분할의 각 측에서 다른 쪽을 유효하지 않은 것으로 간주해야 합니다.

더 짧은 사전 하드포크 체인의 유효성을 시험하기 위해 저희는 비트코인 ABC 0.19.0 노드의 관점에서 분할 이후 첫 번째 하드포크 블록을 무효화해야 했습니다. 그리고 나서 저희는 노드가 체인 분할을 따르는지 혹은 하드포크 지점에 고착되어 있는지를 살펴보았습니다. 놀랍게도 아래 스크린 샷에서 알 수 잇듯이 노드는 분할의 반대 쪽을 따랐습니다. 따라서 분할은 올바르게 이루어지지 않고 비대칭적이어서 공격자에게 더 많은 공격 기회를 제공했습니다.

비트멕스 비트코인 ABC 0.19.0 노드의 명령행 스크린 샷

(출처: BitMEX Research)

조정된 2개 블록의 리오그

하드포크 이후 몇 블록 후, 분할의 하드포크 측면에는 길이 2개의 블록체인 리오그가 존재했습니다. 당시 저희는 이것이 정상적인 블록 전파 문제에서 비롯된 것으로 간주했기에 크게 신경 쓰지 않았습니다. 예를 들어 비트코인 SV는 이보다 몇 주 전에 길이 6개 블록의 리오그를 경험했습니다. 비트코인 SV에 대한 리오그가 발생했을 때, 고아 체인 (orphaned chain)의 모든 거래는 결국 저희의 분석을 바탕으로 주요 성공적인 체인 (코인베이스 거래 제외)으로 진입하게 되었습니다. 그러나 본 비트코인 캐시 리오그에서 저희는 이 부분이 사실이 아닌 것을 확인하였습니다.

고아 블록 (the orphaned block)인 582,698은 137 건의 거래 (코인베이스 포함)를 포함하고 있었으며, 그 중 111건 만이 성공적인 체인으로 진입하였습니다. 따라서 25개의 거래와 관련하여 성공적인 2개 블록의 이중 지불이 발생한 것으로 보입니다. 아래 표에 나와 있는 바와 같이 이 25개의 거래의 산출값은 3,300 BCH (비트코인 캐시) 이상까지 합산됩니다.

주 체인으로 진입하지 못한 고아 블록 (582,698)의 거래 목록

거래 ID 산출량 합계 (BCH)
1e7ed3efb7975c06ca46598808e17c6f42c66a085fcb65356dc090e3c434d874 코인베이스 (집계되지 않음)
0cdd5afff40831199d78ac55116a94aaf4ea7d53e599ac44962c29861ef9f05e 79.9
1907e59313a5c2607f706e8439feb613ed3ff89530d17bd9deced7113928df79 358.9
27553ff15a9d58b10b33da69bef3ccd570c007fc0d695cf8b88817cfc4d49065 65.2
2ff74d9b244469dcd87f9c853b70f9bc72d4116c662ee12783a1c32a6825d45e 196.3
357e31bcf17b4d557954b2d69b7169559a64605a628c4bb9eb11adbd416967d1 117.4
3801dc4ee11ccaeda243ac287ee5e40afb0f07dc0ba26f534ea52f4bfde0d3da 161.2
83e6065dd31ef706f6a90669e460000741820c4dcb753290bd2b003a9f853211 71.2
8950cae069562893aa3583b75fd14f2aaef4f0db72292bd05e11f915ca38cd86 107.8
8e10f1f85d9707ca974ddabd9cb8188d0b890586781ef4161a9133dadefbe0e6 72.0
8fc0b3665f4734b56686ffec83f6b23000720af90102e20f39d9dddb5f1f5c25 183.0
99bd320fb7e3fc487b393c3b9afbc6a7bc765d7f9df5902201a70d3cb8fc5a63 57.8
a38b43f85cc592c4bd69b2b1f0f865df6d36f3b89dfa6119780197369e48192a 177.8
b091bf34d72444ff1669dd13b6c912d8801b94aad8a92d162a9680d46d4b727f 89.2
bd8ee13735dcbdad983fe9624c5b3fd3d257b15a62b269ddb40bb4be9d4a15cb 100.5
beae5bc9137beebddea6f5fbc6fe79b77f6d59f2aa2a5da675ccc39b2b2f8cb6 166.3
c47d1c18c39d28df21ce0e3c34021295658b56c7e669af3aebe685cea32462dc 210.3
c8031b2fd429d9e2838dccc7fa0631788139443a7609958c5d2ce195aec97f8a 85.7
cf3af954a7c3b327107aa42498ec31924075bd926a61428352695a696af8d6c4 114.8
cf8f47928c37bc24c88ff8ff8ea3c84419d4cedc907e74d113e681b055c566dc 162.0
dff4537328f2568db5b7f0fa81a57024fdeb9da23a432a893fb48eca1ab63079 115.9
e1398e628da1258db08f969efdade13e6daac6a53e5b43121dab3604c605af29 69.9
e926ce8ca0192b3ea7f971d93eec3f651e8a35839a76101512cb8c37f98caa89 126.8
e9e0482d61300d3b3d6a9340f9ee66bd6d098328cd7ced50416bb28eb8dc796e 307.4
ebc4392b27056b84a0337638f1257031172d842c148f9ffa10e80afc4080d8a1            82.7
f81267d65855040bf08bb5291a87733555067041ab611cd4e874368c8c1a2c2a 111.9
합계 3,391.7

(출처: BitMEX Research)

위의 표에서 알 수 있듯이, 이 25개의 이중 지불 거래의 총 산출값은 3,391.7 BCH 이며 이는 경제적인 측면에서 상당한 규모의 금액입니다. 따라서 본 리오그는 우연히 발생한 것이 아닌 계획된 사건으로 결론 지을 수 있습니다. 만일 본 리오그가 우연히 발생했을 경우, 분할된 각 측의 거래 간에 불일치가 없을 가능성이 있습니다. 그러나 이와 같은 조정과 고의적인 리오그를 가정하는 것은 저희의 추측일 뿐입니다.

저희는 아래 두 가지 이중 지불 예를 포함하였습니다:

이중 지불 UTXO (Unspent Transaction Output, 미사용 거래 산출량) 중 첫 번째 예시 – “0014”

(출처: BitMEX Research)

위의 표는 리오그가 발생했을 시 5 BCH 상당의 유동량에 어떠한 일이 일어났는지를 보여줍니다. 5 BCH는 582,698 블록의 qzyj4lzdjjq0unuka59776tv4e6up23uhyk4tr2anm 주소로 처음 보내졌습니다. 이 체인은 연결이 끊겨 동일한 유동량은 결국 7개의 블록 후에 다른 주소인 qq4whmrz4xm6ey6sgsj4umvptrpfkmd2rvk36dw97y로 보내졌습니다.

이중 지불 UTXO (Unspent Transaction Output, 미사용 거래 유동량) 중 두 번째 예시 – “0020”

(출처: BitMEX Research)

위의 산출량에 발생한 건은 25개의 이중 지불 거래에서 거의 모든 자금과 특성을 공유합니다. 대부분의 산출량은 주요 체인에 위치한 582,705 블록을 중심으로 고아 블록 이후 약 7번 째 블록에서 두 배 지불된 것으로 보입니다.

거래 입력 값을 반환 받는 데에 사용되는 SigScript는 위의 예에서 강조 표시된 “0020” 혹은 “0014”로 시작합니다. 이는 분리된 증인 (Segregated Witness, 비트코인 거래처리 용량 해결을 위한 업그레이드)과 관련이 있을 수 있습니다. 분리된 증인의 사양에 따르면, “0014”는 P2WPKH (공개 키 해시를 증명하기 위해 지불)에서 푸시되고 “0020”은 P2WSH (스크립트 해시를 증명하기 위해 지불)에서 푸시됩니다. 따라서 이러한 입력 값 반환은 비트코인 업그레이드인 분리된 증인과 관련이 있을 수 있으며 그 중 일부만 비트코인 캐시에 채택되었습니다.

실제로 저희의 분석에 따르면, 고아 블록 582,698의 25개 거래에서 모든 입력값은 “0014” 혹은 “0020”으로 시작하는 스크립트를 통해 반환되었습니다. 따라서 이러한 세그윗 산출량을 반환 받은 “공격자” 혹은 “도난자” 외에는 아무도 본 체인 리오그와 관련된 자금을 손실하지 않았을 가능성이 있으며, 이는 애초에 우연한 산출량으로 보내졌을 수 있습니다.

2019년 5월에 이루어진 비트코인 캐시 하드포크의 일환으로, 실수로 세그윗 주소로 보내진 코인을 회수할 수 있도록 허용하는 변경사항이 적용되었습니다. 따라서 이번 사건에서 이와 같은 일이 발생했을 수도 있습니다.

세그윗 복구 허용

마지막 업그레이드에서 실수로 세그윗 P2SH 주소로 보내진 코인은 CLEANSTAK 규칙에 따라 사용할 수 없게 되었습니다. 본 업그레이드는 이러한 코인에 대해 예외를 두고 사용 가능한 이전 상황으로 되돌릴 수 있습니다. 즉, P2SH 반환 스크립트의 사전 이미지가 공개되면 (예: 해당 비트코인 주소에서 코인 사용) 모든 마이너가 코인을 가져갈 수 있습니다.

(출처: https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/2019-05-15-upgrade.md)

이 2개의 블록 리오그는 빈 블록 버그와 관련이 없을 수 있습니다. 그러나 버그가 해결된 후 단 한 블록 만에 분할이 발생한 것으로 보여 관련성이 있을 수 있습니다. 아마도 “정직한” 마이너들은 분할 직후 이러한 산출량의 사용을 조정 혹은 본래 소유주들에게 반환하기 위한 시도를 했을 것이며, 빈 블록 버그는 이들의 시기를 망침으로써 공격자가 수익을 얻고 이로 인해 발생한 자금을 쓸 수 있게 되었을 것입니다.

반면에 본 공격은 상당히 복잡하기 때문에 공격자는 고도의 정교함을 갖출 가능성이 높으며 광범위한 계획에 관여해야 합니다. 따라서 본 공격은 빈 블록 버그가 존재하지 않더라도 효과적일 수 있습니다.

결론

비트코인 캐시 하드포크 업그레이드를 둘러싼 여러 사건에서 많은 교훈을 얻을 수 있습니다. 하드포크는 악의적인 해커가 불확실성을 공격 및 생성할 수 있는 기회를 제공하는 것으로 보이기 때문에 이에 대한 신중한 계획과 조정이 중요합니다. 반면에 다른 두 사건의 근본적 원인일 수 있는 본 블록 버그는 언제든지 발생할 수 있었으며, 이러한 버그를 방지하려는 노력은 하드포크 시도 여부와 관계없이 중요합니다.

이러한 사건에서 또 다른 중요한 교훈은 투명성의 필요성입니다. 사건 발생 당시, 개발자의 계획, 버그의 성격 혹은 마이너들이 지원하는 체인을 확인하기 어려웠습니다. 공개 채널에서 이러한 문제에 대한 자유로운 의사소통은 더 큰 도움이 될 수 있었습니다. 특히 많은 사람들은 개발자가 세그윗 주소로 보내진 손실된 자금을 조정하고 회수하려는 계획을 인지하지 못했습니다. 본 계획과 관련하여 겉보기에 의도적이고 조정된 리오그가 발생하고 있는 동안뿐만 아니라 보다 사전에 커뮤니티에서 논의되었다면 도움이 되었을 수 있습니다. 이는 물론 후자를 공개할 시간이 있었다는 가정 하에 추측한 결론 임을 참고해 주시기 바랍니다. 또한 사후에 관련자들이 이러한 사건에 대한 세부사항을 공개하는 것도 도움이 될 수 있습니다.

이 모든 부분에서 저희의 견해로 볼 때, 가장 큰 관심사는 의도적이고 조정된 리오그입니다. 논쟁의 한 측면에서는 자금이 손실되었고 따라서 단기적인 혼란을 야기하더라도 해당 자금을 “본래의 소유자”에게 반환하는 행동이 정당화되었습니다. 그러나 현금과 같은 거래 완결성은 많은 사람들 또는 일부가 이러한 블록체인 시스템의 유일한 특징으로 보고 있습니다. 거래를 번복할 수 있는 기능은 이 경우, 중요한 거래는 경제적인 측면에서 시스템의 전체적인 전제를 훼손할 수 있습니다. 이러한 행위은 자금을 적절하게 확보하기 위한 동기를 없애고 선례를 남길 뿐만 아니라, 기대치를 변화시킬 수 있기 때문에 추가적인 거래 번복을 일으킬 수 있습니다.

비트코인 캐시를 좋아하지 않는 비트코인 커뮤니티의 모든 사람들에게 이는 코인을 비웃는 기회로 볼 수 있습니다. 그러나 비트코인 캐시는 비트코인보다 해시래이트가 훨씬 낮기 때문에 이러한 거래 번복이 더 수월해졌지만, 비트코인 캐시에서 이렇게 경제적인 측면으로 중요한 거래 번복의 성공은 저희의 견해로썬 비트코인과 관련하여 긍정적인 소식은 아닙니다. 어떤 면에서 이러한 사건들은 위험한 선례가 될 수도 있습니다. 이는 비트코인으로도 가능할 수 있음을 보여줍니다. 이는 또한 비트코인 캐시가 직면한 위험을 소수 체인으로 설명할 수 있습니다.