신념.
블록체인 무결성이 정말 잘 보장된다고 믿으십니까? 그렇지 않습니다. 완벽한 건 세상에 없습니다.
The DAO에서 무결성을 깔아 뭉개서는 안 된다는 측과 뭉개야 한다는 측이 대립하다가 Ethereum과 Ethereum Classic으로 갈라선 것을 잘 기억하실 겁니다. 그래도 이때는 “Code is Law”를 주장하는 양심적인 사람들이 있었습니다. 물론, 버그는 버그고 돈을 날린 사람들의 억울함을 풀어주어야 한다는 또 다른 명분이 있었습니다.
그 전에 비트코인에서도 대형 사고가 터진 바 있습니다. 비트코인 여명기에 벌어진 일이라서 많은 사람들이 그 사고를 모를 수 있습니다.
비트코인은 다 채굴해야 2,100만 BTC가 세상에 나오게 됩니다. 그런데 2010년 8월 15일 광복절에 어느 해커가 0.5 BTC를 두 개의 주소에 각각 922억 BTC로 나누어 보냈습니다. 이게 말이 됩니까? 예, 말이 됩니다.
이 사건을 이해하려면 약간의 사전지식이 필요합니다. 먼저 비트코인 트랜잭션에는 입력 항이 있고 출력 항이 있습니다. 입력되는 비트코인 수량과 출력되는 비트코인 수량은 같아야 합니다. 예외가 하나 있습니다. 입력과 출력이 달라도 입력보다 출력이 작을 때는 그 차이가 수수료(fee)로 처리됩니다.
그리고 또 하나, 출력되는 비트코인 수량은 모두 양수라야 합니다. 출력되는 비트코인 수량이 모두 양수이면 그 합도 당연히 양수이겠지요? 꼭 그렇지 않습니다. 해커는 그 약점을 노렸습니다.
8비트 이진수로 처리되는 signed integer를 생각해 봅시다. 이때 0부터 127까지는 양수입니다. 128부터 255까지는 음수입니다.
이 오버플로우 오류를 비유를 들어 설명해 보겠습니다. Alice가 1 BTC를 Bob과 Charlie에게 각각 64 BTC씩 보내기로 했습니다. 이 송금은 거절되어야 합니다. 그런데 거절되지 않고 잘 처리되었습니다.
Bob에게 전송될 64 BTC는 양수입니다. Charlie에게 전송될 64 BTC도 양수입니다. 그런데 둘을 합치면 128 BTC이므로 음수입니다. 따라서 128 BTC는 1 BTC보다 작기 때문에 논리적으로 문제가 없습니다. 그래서 Alice의 비트코인 전송 시도는 성공했습니다.
그 결과 해커가 아주 적은 양의 0.5 비트코인을 두 주소에 각각 922억 BTC씩 전송하는 데 성공했습니다. 다행히 이 버그는 비트코인 개발자 Jeff Garzik에 의해 발견되었고 5시간 후 Satoshi Nakamoto가 패치를 올리고 그 블록을 무효화하는 소프트 포크를 단행했습니다.
무더위에 건강 잘 챙기십시요.
참고로 저 오버플로우 사건을 벌인 해커는 광복절과 아무 관련이 없습니다.
#비트코인 #김형중 #양수 #오버플로우 #해커
#소프트포크