개요
2025년 3월 26일, 비트코인 개발자 앙투안 푸앵소는 새로운 비트코인 개선 제안을 발표했습니다. 이는 "그랜드 컨센서스 클린업"으로 알려진 소프트 포크 제안입니다. 이 업그레이드는 수년간 비트코인 프로토콜에 존재했던 여러 가지 취약점과 약점을 해결합니다. 이런 취약점 중 하나는 우리가 최근에 논의했던 중복 거래 문제 입니다. 이 정리 소프트 포크에서 수정될 또 다른 더 심각한 취약점은 "타임 워프 공격"이라고 하며, 이 글의 주제입니다.
비트코인 블록 타임스탬프 보호 규칙
시간 왜곡 공격에 대해 논의하기 전에 시간 조작 보호에 대한 현재 규칙을 살펴보겠습니다.
중간 과거 시간(MPT) 규칙 - 타임스탬프는 마지막 11개 블록의 중간 시간보다 이후여야 합니다.
미래 블록 시간 규칙 - MAX_FUTURE_BLOCK_TIME 상수를 기준으로 타임스탬프는 노드 피어의 중간 시간보다 2시간 이상 앞설 수 없습니다. 노드에서 제공하는 시간과 로컬 시스템 시계 사이에 허용되는 최대 차이는 90분이며, 이는 또 다른 안전 보장입니다.
MPT 규칙은 블록이 과거로 너무 멀리 가지 않도록 보장하도록 설계된 반면, 미래 블록 규칙은 블록이 미래로 너무 멀리 가지 않도록 방지합니다. 미래 블록 규칙과 유사한 규칙은 블록에 과거 타임스탬프가 있는 것을 방지하기 위해 구현할 수 없습니다. 이는 초기 블록체인 동기화에 영향을 미칠 수 있기 때문입니다. 시간 왜곡 공격은 타임스탬프를 위조해 먼 과거로 시간을 거슬러 올리는 것을 말합니다.
사토시 나카모토의 "하나 차이" 오류
비트코인의 경우 난이도 조정 주기는 2016개의 블록으로 구성되며, 10분 블록 목표를 기준으로 약 2주입니다. 채굴 난이도 조정을 계산하기 위해 프로토콜은 관련 2016 블록 창에서 첫 번째 블록과 마지막 블록 사이의 타임스탬프 차이를 계산합니다. 이 2016년 블록 창에는 2015년 블록(즉, 2016년에서 1을 뺀 값) 사이의 간격이 포함되어 있습니다. 따라서 해당 목표 시간은 60초 * 10분 * 2015개 간격, 즉 1,209,000초로 사용해야 합니다. 하지만 비트코인 프로토콜은 목표값을 계산하는 데 숫자 2016을 사용합니다. 60초 * 10분 * 2016 = 1,209,600초. 이는 오류 1개입니다. 이건 범하기 쉬운 실수이고, 사토시는 블록 사이의 간격을 혼동한 것 같습니다.
원래 사토시 코드
출처: https://sourceforge.net/p/bitcoin/code/1/tree//trunk/main.cpp#l687
이 오류는 목표 시간이 예상 시간보다 0.05% 더 길다는 것을 의미합니다. 따라서 비트코인의 목표 간격은 실제로 10분이 아니라 10분 0.3초입니다. 버그는 심각하지 않습니다. 실제로 비트코인이 출시된 이래로 평균 간격은 9분 36초로, 10분보다 훨씬 짧습니다. 이는 평균 해시레이트가 2009년 이후로 증가해 왔기 때문입니다. 이것이 최종 반감기가 2025년 1월이 아닌 2024년 4월에 발생하는 이유입니다. 우리는 일정보다 앞서 있습니다. 어쨌든 사토시의 0.3초 오차는 큰 그림에서 보면 아주 미미한 수준입니다. 어쩌면 먼 미래에 가격과 해시레이트가 더 이상 증가하지 않을 때 이 버그가 우리를 다시 올바른 길로 인도할지도 모릅니다.
0.3초 취약점 자체는 심각한 문제는 아니지만, 훨씬 더 심각한 취약점이 이와 관련되어 있습니다. 난이도 계산은 2016년 블록 창 내의 첫 번째 블록과 마지막 블록을 기준으로 합니다. 이 역시 잘못된 것입니다. 우리의 의견으로는, 관련 기간은 이전 2016년 블록 창의 마지막 블록과 현재 창의 마지막 블록의 차이여야 합니다. 이는 난이도 조정 기간의 길이를 계산하는 가장 합리적인 방법으로 보이는데, 중요한 점은 기간이 서로 다른 조정 기간을 포괄한다는 것입니다. 이렇게 하면 2016년은 목표를 계산하는 데 적합한 간격 숫자가 됩니다. 아마도 사토시가 이런 실수를 저지른 이유는 첫 번째 난이도 조정 주기를 고려해야 했기 때문일 것입니다. 이전 주기의 마지막 블록을 사용할 수 없었던 것입니다.
타임워프 공격
비트코인의 타임워프 공격은 2011년경에 처음 발견되었는데, 이는 사토시 나카모토가 난이도 계산에서 저지른 실수를 이용한 것입니다. 공격을 실행하려면 채굴이 100% 중앙화되어 있고 채굴자가 프로토콜에서 허용하는 모든 타임스탬프를 설정할 수 있다고 가정합니다. 이 공격에서 채굴자들은 거의 모든 블록에서 타임스탬프를 이전 블록보다 1초 앞당겨서 블록체인이 시간을 앞으로 이동하고 MTP 규칙을 따르도록 설정합니다. 가능한 한 천천히 시간을 흐르게 하기 위해, 채굴자는 6개 블록 연속으로 같은 타임스탬프를 유지한 다음, 다음 블록에서는 시간을 1초씩 늘리는 식으로 할 수 있습니다. 이는 블록 타임스탬프가 6개 블록마다 1초씩 앞으로 이동한다는 것을 의미합니다.
이 공격은 블록체인이 실시간에서 점점 더 뒤처지고 난이도가 증가하여 채굴이 점점 더 어려워진다는 것을 의미합니다. 그러나 공격을 더 효과적으로 만들기 위해, 각 난이도 조정 기간의 마지막 블록에서 채굴자들은 타임스탬프를 실제 시간으로 설정합니다. 다음 블록, 즉 각 난이도 조정 창의 첫 번째 블록은 이전 난이도 조정 창의 마지막에서 두 번째 블록보다 1초 앞당겨 시간을 설정합니다. 이는 여전히 MTP 규칙을 따르는 것입니다. 왜냐하면 이 경우 하나의 이상 현상이 11개 블록의 중간값에 영향을 미치지 않기 때문입니다.
이 공격을 수행하면, 첫 번째 사이클 이후의 난이도에는 영향을 미치지 않습니다. 하지만 공격이 시작된 후 2차 조정 주기가 지나면 난이도가 낮아집니다. 그러면 채굴자들은 매우 빠른 속도로 블록을 생성하여 엄청난 양의 비트코인을 생성할 가능성이 있고, 이를 판매하여 이익을 얻을 수도 있습니다.
간략한 설명
난이도 주기가 2016개 블록이기 때문에 이 공격을 차트로 설명하는 것은 어려울 수 있습니다. 따라서 우리는 이 공격을 설명하기 위해 다음과 같은 시나리오를 만들었습니다.
- 각 난이도 조정 창에는 5개의 블록이 있습니다.
- 목표 간격은 10분입니다
- MTP 규칙은 마지막 3개 블록을 기반으로 합니다.
- 각 블록의 타임스탬프는 1분씩 증가하지만, 각 주기의 마지막 블록은 실제 타임스탬프를 사용합니다.
예시 시간 왜곡 공격
위 그림에서 보듯이 곡선은 두 개가 있습니다.
- 각 난이도 조정 창에서 마지막 블록의 실시간을 나타내는 곡선입니다. 채굴자들이 블록을 점점 더 빨리 찾을수록 난이도는 낮아지고 이 곡선은 덜 가파르게 됩니다.
- 다른 블록 조작의 타임스탬프를 나타내는 라인
비트코인 타임워프 공격 계산
아래 차트는 채굴자가 이 공격을 가장 극단적인 형태로 사용하여 난이도를 낮추는 방법을 보여줍니다.
참고: 프로토콜이 허용하는 최대 난이도 조정은 모든 기간에 대해 4배이지만 위 표에서는 이 값에 도달하지 않았습니다.
난이도는 사이클마다 2.8배가 조금 넘게 점근적으로 낮아집니다. 이는 각 주기가 시간이 짧아질수록 난이도 조절 속도가 느려지는 속도가 감소하기 때문입니다.
위 표의 11번째 사이클에서는 공격 39일째에 초당 6개 이상의 블록이 생성되었습니다. 정확히 말하면 초당 10.9개의 블록이 생성된 것입니다. 이 시점에서 블록에 할당된 타임스탬프 제한이 다른 방식으로 적용됩니다. MTP 규칙에 따르면 시간은 6블록마다 진행되어야 하며, 최소 시간 증가는 1초입니다. 따라서 이 시점에서 타임스탬프는 우리의 이해에 따르면 실시간보다 더 빨리 진행되기 시작하고, 블록체인 시계는 앞으로 나아가 실제 세계 시간에 가까워지지만 여전히 훨씬 뒤처져 있습니다. 그럼에도 불구하고 공격은 계속될 수 있으며, 허용된 최소치에 도달할 때까지 난이도가 낮아집니다.
공격 가능성
이런 공격은 이론적으로는 파괴적이지만, 실제 실행하는 데는 몇 가지 어려움이 있습니다. 공격을 실행하려면 많은 양의 컴퓨팅 능력이 필요할 수 있습니다. 정직한 채굴자가 정직한 타임스탬프를 입력하면 공격은 훨씬 더 어려워집니다. MTP 규칙과 정직한 마이너의 타임스탬프는 악의적인 마이너의 타임스탬프가 얼마나 멀리까지 갈 수 있는지 제한할 수 있습니다. 더욱이 정직한 채굴자가 난이도 조정 창에서 첫 번째 블록을 생성하더라도 해당 기간 동안 공격은 작동하지 않습니다. 공격을 실행하기 어렵게 만들 수 있는 또 다른 완화 요소는 모든 사람이 볼 수 있다는 것입니다. 누구나 타임스탬프를 볼 수 있으며, 난이도가 낮아지려면 4주 분의 타임스탬프를 조작해야 하며, 그렇게 되면 긴급 소프트 포크 수정안을 내놓을 시간이 생길 가능성이 있습니다.
해결책
이 취약점을 해결하는 것은 비교적 간단하지만 소프트 포크 프로토콜을 변경해야 할 수도 있습니다. 이 문제를 직접 해결하는 것은 매우 복잡한데, 2016년의 여러 창에서 블록 간 시간 간격을 계산하는 난이도 조정 알고리즘을 변경하고 1차 차이 오류를 완전히 수정해야 하기 때문입니다. 이것도 하드 포크일 수 있습니다. 또 다른 해결책은 MTP 규칙을 없애고 대신 각 블록에서 시간이 항상 앞으로 이동하도록 하는 것입니다. 하지만 이렇게 하면 시간이 너무 앞서 고정될 수 있으며, 또한 채굴자들이 시스템 시계의 실시간을 사용하여 문제가 생길 수도 있는데, 다른 채굴자의 시계가 몇 초 앞서 있으면 잘못된 시간이 적용될 수 있습니다.
다행히도 더 간단한 해결책이 있습니다. 시간 왜곡 공격을 방지하려면 새로운 난이도 기간의 첫 번째 블록이 이전 기간의 마지막 블록보다 특정 분 앞서지 않도록 하면 됩니다. 이 새로운 제한에 대한 분 단위의 내용은 10분에서 2시간까지 다양한 범위로 논의되었습니다. 시간 왜곡 공격을 완화하는 것과 관련해서는 두 가지 모두 아마 괜찮을 겁니다.
푸앵소의 그랜드 컨센서스 정화 제안에서 그는 이제 정화 시간을 2시간 으로 정했습니다. 2시간은 난이도 조정 주기의 목표 시간의 약 0.6%에 불과하므로, 난이도를 낮추는 능력은 심각하게 제한됩니다. 다음 표에서는 사용해야 하는 유예 기간에 대한 논의를 요약했습니다.
10분 제한 | 2시간 제한 | |
긍정적인 측면 | 이는 "하나씩 틀리는" 오류의 효과를 상쇄하는 좋은 특성을 가지고 있습니다. 만약 공격이 실행된다면, 그 영향은 사토시의 실수로 정확히 상쇄될 것입니다. 이는 실수로 잘못된 블록을 생성할 위험을 최소화하기에 충분한 기간입니다. | 이는 실수로 잘못된 블록을 생성할 위험을 최소화하기에 충분한 기간입니다. 이는 Fabian Jahr가 이 기능을 테스트할 때 testnet4에 선택한 기간입니다. 이 2시간의 시간 기간은 미래 블록 타임스탬프 규칙과 일치하므로 채굴자는 항상 한 블록에서 허용되는 최대 미래 시간 오류를 수정할 수 있습니다. 이는 현재 규칙에 비해 보수적인 변경이며, 일반적인 상황에서는 MTP 규칙보다 덜 엄격할 수 있습니다. 0.6%는 꽤 작은 숫자입니다 |
부정적인 측면 |
| 이렇게 되면 공격적인 채굴자는 사이클당 약 0.6%씩 난이도를 낮출 수 있지만, 이는 한 번만 가능한 변경이며 복리로 계산되지 않습니다. |