값 오버플로 버그
비트코인의 총량 한도는 2,100만 개로 정해져 있습니다. 그런데 초기 코드의 오류로 이 한도를 넘는 비정상 발행 거래가 받아들여진 적이 있습니다. 이후 오류를 고치고 문제 거래가 없는 체인으로 전환하는 대응이 이어졌습니다.
이 사건은 비트코인 규칙이 코드로 구현된다는 사실의 양면을 보여 줍니다. 사람의 재량이 개입하기 어려운 대신, 코드에 실수가 있으면 그 실수도 규칙처럼 작동할 수 있습니다.
값 오버플로란 무엇인가
값 오버플로는 숫자가 담을 수 있는 한도를 넘어섰을 때 값이 엉뚱한 숫자로 뒤집히는 문제입니다. 자동차의 주행 거리계가 정해진 자리 수를 모두 사용한 뒤 다시 0으로 돌아가는 경우와 비슷합니다. 표시되는 숫자는 달라지지만 실제로 달린 거리가 사라진 것은 아닙니다.
금액을 계산할 때도 비슷한 일이 생길 수 있습니다. 받은 돈과 낸 돈의 합계를 검산하는 과정에서 합계가 숫자의 한도를 넘으면, 실제로는 맞지 않는 값이더라도 계산 결과가 통과할 수 있습니다. 그러면 규칙에 없는 돈을 만든 거래가 유효한 것으로 처리될 수 있습니다.
초기 비트코인 코드에는 이런 허점이 남아 있었습니다. 누군가 이 허점을 실제로 이용하면서 문제가 드러났습니다.
2010년 8월에 일어난 사건
2010년 8월, 한 거래의 출력 금액 합계가 숫자가 담을 수 있는 한도를 넘어섰습니다. 값이 엉뚱한 숫자로 뒤집혔지만 검산 과정에서 걸러지지 않았고, 문제 거래를 담은 블록이 장부에 붙었습니다.
그 결과 비정상적으로 많은 양이 만들어졌습니다. 총량 한도를 늘리기로 한 것이 아니라, 한도를 어긴 거래를 코드가 걸러내지 못한 사건입니다. 당시 오류 보고와 수정 논의에는 출력 금액과 합계의 범위를 검사하도록 고치는 과정이 남아 있습니다.
몇 시간 만의 대응
개발자들은 문제를 곧바로 알아챘고, 몇 시간 안에 오류를 고친 소프트웨어를 내놓았습니다. 노드 운영자와 채굴자들은 새 소프트웨어로 옮겨 갔고, 문제 거래가 포함되지 않은 체인을 이어 갔습니다.
문제 거래가 포함된 가지는 채택된 전체장부에서 제외되었습니다. 해당 지점부터 문제 거래가 없는 기록을 다시 쌓아 올린 것입니다. 사토시의 수정 버전 배포 공지에는 정상 체인이 문제 체인을 앞선 뒤 업그레이드하면 자동으로 체인이 재구성된다는 설명이 남아 있습니다.
대응에는 코드 수정뿐 아니라 노드 운영자와 채굴자의 참여가 필요했습니다. 개발자가 공지를 올리는 것만으로 모든 참여자의 기록이 즉시 바뀐 것은 아닙니다.
이 사건이 보여 주는 것
한 번 구현 오류가 있었다는 사실만으로 총량 규칙이 언제든 무너진다고 볼 수는 없습니다. 해당 허점은 몇 시간 만에 수정되었고, 이후 총량은 여러 노드가 각자 검증하는 규칙으로 지켜져 왔습니다.
또한 누구나 마음대로 장부를 되돌릴 수 있었던 사건도 아닙니다. 오류를 고친 소프트웨어의 채택과 문제 거래가 없는 체인의 채굴이 함께 이루어져 가능한 대응이었습니다.
이 사건의 중요한 교훈은 코드에 대한 검증이 필요하다는 점입니다. 이후에는 금액 계산과 거래 검증을 더 주의 깊게 살피게 되었고, 여러 사람이 각자의 노드를 운영하며 이상을 발견하는 구조의 의미도 드러났습니다.
실수가 있었다는 사실과 그것을 고친 과정은 공개된 기록으로 남아 있습니다. 무결함을 주장하기보다 오류와 대응을 함께 기록하는 태도가 오히려 신뢰를 뒷받침할 수 있습니다.