루벤 솜센 지음
출처: https://gist.github.com/RubenSomsen/a02b9071bf81b922dcc9edea7d810b7c
비트코인 메일링 목록 게시물은 여기에 있으며, 팟캐스트 토론은 여기에 있습니다.
소개
최근 " SwiftSync "( 중국어 번역 )에 대한 연구를 진행하던 중 BIP30에서 해결되지 않은 합의 버그를 발견했습니다. 이 버그는 2010년처럼 심각한 블록체인 재구성 없이는 발생할 수 없는 것으로 보이므로 심각성에 대해서는 논란의 여지가 있습니다. 현재 저희 비트코인 클라이언트는 2013년으로 거슬러 올라가는 체크포인트를 포함하고 있어 이러한 심각한 재구성으로부터 보호됩니다. 그러나 모든 체크포인트를 제거하면 이 버그는 이론적으로 악용될 수 있습니다.
(역자 주: "체크포인팅"은 블록체인 네트워크에서 합의를 유지하는 특별한 방법입니다. 클라이언트 소프트웨어는 특정 높이의 블록 해시 값이 특정 값이어야 함을 강제합니다. 결과 블록 해시 값이 이 값이 아니면 거부됩니다. 작업 증명(PoW) 기반 블록체인 네트워크에서 이 방법은 네트워크에 새로 참여하는 노드가 저비용으로 생성 가능한 악성 블록체인 온체인 유인되는 것을 방지하는 데 사용될 수 있습니다(채굴 기의 성능이 향상됨에 따라 이전 블록과 동일한 난이도의 블록을 생성하는 비용이 점점 더 저렴해집니다). 이러한 긍정적인 이유에도 불구하고, 사람들은 이 메커니즘을 허용하면 클라이언트 개발자에게 너무 많은 권한을 부여할 수 있다고 생각하는 경향이 있습니다(개발자가 어떤 블록체인 사용자를 선택할지 본질적으로 결정할 수 있게 될 것이라는 우려). 따라서 클라이언트에서 이 메커니즘을 제거하려는 노력이 있었습니다.)
합의 검증 관점에서 볼 때, BIP30은 다소 특이합니다. 거래소 에 사용된 입력과 관련이 없더라도 전체 UTXO 집합을 반복해야 하기 때문입니다. 이는 비효율적이며, utreexo, SwiftSync와 같은 대체 검증 체계의 구현을 상당히 복잡하게 만들고, ZeroSync와 같은 영지식 증명 기반 시스템에도 영향을 미칠 가능성이 높습니다. BIP30이 완전히 폐기된다면 더욱 바람직할 것입니다.
반드시 행동을 옹호하기보다는(현 상태가 꽤 괜찮아 보임), 해결책을 제안하고 양측에 대한 논의를 시작하고 싶습니다.
1. 합의 버그
BIP30은 두 개의 중복 거래를 예외로 처리합니다. 후자의 거래는 블록 높이 91880의 코인베이스 거래입니다. 이 거래가 처리될 때, 블록 높이 91722의 코인베이스 거래가 덮어씌워졌습니다. 이와 유사한 또 다른 사례는 블록 91812와 91842에서 발생했습니다.
문제는 블록체인이 블록 91880과 91772 사이에서 재구성될 때 발생합니다. 블록체인을 롤백하면 블록 91880에서 생성된 출력이 UTXO 세트에서 제거됩니다. 결과적으로 덮어씌워진 출력은 UTXO 세트에서 완전히 사라집니다. 그러나 재구성을 경험하지 못한 다른 노드는 (덮어씌워지지 않았기 때문에) 이 출력을 자신의 세트에 여전히 보관합니다. 이 UTXO가 소진되면 체인 포크 발생합니다.
솔루션 A
블록 91722와 91880 사이에 정확히 재편이 발생할 수 없도록 강제할 수 있습니다. 즉, 블록 91722 이전에는 깊거나 블록 91880 바로 이후에는 얕아야 합니다. 이렇게 하면 재편을 겪은 블록이나 새로운 노드의 UTXO 세트에 이러한 문제가 있는 출력이 포함되지 않습니다. 2010년 채굴 난이도에서 약 160개 블록에 해당하는 것을 고려하면 이는 큰 제약이 아닙니다.
솔루션 B
Sjors Provoost와 제가 조사한 내용을 논의할 때, 그는 현재 고려 중인 체크포인트 제거(그 자체로 하드 포크 로 간주될 수 있음)가 체크포인트 이전에 합의 규칙을 변경할 수 있는 기회이기도 하다고 지적했습니다. 블록 91880과 91842에서 재편이 발생할 때 코인베이스 거래를 제거하지 않으면 이 버그를 해결할 수 있습니다. 나아가 Sjors의 관찰은 2013년 이전에 존재했던 다른 합의 규칙도 변경해야 할지에 대한 의문을 제기합니다.
2. BIP30 UTXO 세트 검사를 더 이상 사용하지 않도록 설정
현재 BIP30은 제네시스 블록부터 BIP34 (블록 높이 227931, 2013년 3월)가 활성화될 때까지 적용됩니다. 이 블록이 재구성될 경우 BIP30은 무기한으로 적용됩니다. BIP34에는 자체적인 문제도 있는데, 이는 " 합의 정리 BIP "에서 다룹니다. 자세한 내용은 직접 읽어보실 수 있으며, 여기서는 자세히 설명하지 않겠습니다.
기술적으로 BIP30은 단순히 중복된 미사용 출력(unspoken output)을 방지하기 위해 설계되었습니다. 기존 UTXO 세트의 모든 항목을 검사하여 중복된 항목이 있는 경우 중복 블록 생성을 거부함으로써 이를 구현합니다(이것이 BIP30의 비효율적인 이유입니다). 2010년에 발생한 두 건의 중복 거래는 예외적으로 하드코딩되었습니다. 이러한 규칙에 따라 출력을 사용한 후 동일한 출력을 다시 생성하는 것은 위반이 아닙니다. 하지만 이러한 사례는 발생하지 않은 것으로 보입니다.
마지막으로 해결해야 할 질문은 블록 227931이 재구성될 경우 BIP34가 왜 더 이상 사용되지 않는가입니다. 그 이유는 블록 227931이 더 이상 사용되지 않으면 BIP34가 활성화되기 전에 BIP34 규칙(코인베이스 거래 고유성 보장)을 위반하는 출력이 생성될 수 있기 때문입니다. 이는 바로 합의 정리 제안이 해결하려는 문제입니다.
이상적으로는 BIP30 검사를 완전히 폐기하는 것이 좋을 것입니다(블록 재구성이 발생하더라도 더 이상 필요하지 않도록 보장).
해결책
이 두 가지 예외를 제외하고는 중복되는 거래가 없으므로, 비효율적인 BIP30 UTXO 집합 검사를 코인베이스 거래 고유성 검사로 대체할 수 있습니다. 코인베이스 거래의 TXID를 캐시하고 해당 코인베이스 거래에 중복되는 거래가 없는지 확인하기만 하면 됩니다. 227931 블록까지 지속되는 이 검사는 약 7MB의 캐시만 필요합니다. 그러나 BIP34가 더 이상 지원되지 않을 수 있으므로 BIP30 검사가 무기한으로 계속되어 캐시가 계속 증가할 수 있습니다. 해결책은 다음과 같습니다.
코인베이스 거래의 고유성을 확인하는 것 외에도, 향후 코인베이스 거래와 충돌하지 않는지(즉, BIP34 및 합의 정리 BIP와 충돌하지 않는지) 확인합니다. 이를 통해 블록 재구성 발생 여부와 관계없이 BIP34가 블록 높이 227931에서 활성화될 수 있습니다.
결론
위 내용은 BIP30의 몇 가지 문제점과 가능한 해결책입니다. 이 글은 우리가 조치를 취할지 여부를 판단하는 데 참고 자료로 활용됩니다. 이 글이 게재되기 전에 논의에 참여해 주신 Antoine Poinsot, Pieter Wuille, Sjors Provoost께 감사드립니다.