솔라나 온체인 프로그램의 179년 문제

온체인 프로그램을 작성하는 것은 까다로운 일입니다. 한편으로는 프로그램을 업그레이드할 수 있어야 하고, 다른 한편으로는 완전히 탈중앙화되도록 노력해야 합니다.

액세스 프로토콜
Access Protocol
4 min readJan 8, 2024

--

블라드(Vlad)는 액세스 프로토콜의 풀 스택 소프트웨어 엔지니어로, 솔라나 프로그램 개발과 백엔드 및 UI를 담당하고 있습니다. 블라드는 전통 핀테크 회사에서 대규모 시스템을 구축하였으며, 이후 웹3로 뛰어들었습니다. 엑스(트위터) 또는 이메일을 통해 블라드에게 연락하실 수 있습니다.

저는 온체인에 프로그램을 배포하는 모든 팀의 궁극적인 목표는 프로그램이 완성되면 주도적인 입장을 내려놓고 독립적인 관찰자 혹은 DAO의 일부로서 프로젝트의 성장 과정을 즐기는 것이라고 생각합니다.

여기에는 몇 가지 기술적 어려움이 따르는데, 오늘은 그중 하나에 관해 이야기 하고자 합니다.

정수 오버플로우(Integer overflow)

컴퓨터 프로그램에서 정수 오버플로우에 대해 들어보신 적이 있으시겠지만, 간단히 설명하겠습니다. 솔리디티(이더리움)나 솔라나의 러스트에는 부동소수점 숫자를 표현하는 방법이 내장되어 있지 않기 때문에 정수 오버플로우에 대해서만 집중적으로 다뤄보겠습니다.

컴퓨터에서 각 숫자(또는 다른 데이터)는 0과 1의 묶음으로 표현됩니다. 또한 프로그래밍 언어에서 일반적으로 사용되는 숫자를 살펴보면 숫자를 나타내는 데 사용되는 0과 1의 수는 주로 성능상의 이유로 고정되어 있습니다. 일반적으로 32비트 또는 64비트(0 또는 1)를 사용하지만, 매우 큰 숫자가 필요하거나 컴퓨터의 메모리가 제한되어 있는 경우에는 각각 더 많거나 적은 공간을 사용할 수 있습니다.

예를 들어, 음수가 아닌 정수를 저장하는 데 2비트만 사용하고 싶은 경우가 있습니다. 이때 두 비트를 설정할 수 있는 방법은 네 가지뿐입니다:

  • 00
  • 01
  • 10
  • 11

따라서 두 비트를 사용하여 4개보다 많은 숫자를 표현할 수 없습니다. 이 숫자들을 각각 0, 1, 2, 3이라고 가정하고 이진 표현이 컴퓨터 메모리에 저장하는 데 도움이 된다고 가정해 봅시다.

여기서 2+3을 더하려고 하면 어떻게 될까요? 결과는 5가 되어야 하지만 이 숫자를 표현할 방법이 없습니다. 따라서 많은 프로그램이 이 작업을 허용하지 않고 대신 충돌합니다. 실패가 뜨지 않는 프로그램은 결국 완전히 잘못된 결과를 표시합니다.

이를 정수 오버플로우라고 하며 과거에 여러 가지 심각한 하드웨어 오작동의 원인이었습니다. 가장 잘 알려진 사례는 아마도 컴퓨터로 제어되는 방사선 치료기인 Therac-25로, 여러 사람의 목숨을 앗아간 사건일 것입니다.

179년의 문제

하지만 이것이 179년과 무슨 관련이 있는지 궁금할 수도 있습니다. 저는 액세스 프로토콜을 위한 V2 솔라나 온체인 프로그램을 작업하던 중 풀에서 현재 날짜 인덱스를 표현하기 위해 u16 정수 형식을 사용하고 있다는 사실을 발견했습니다.

저희가 솔라나에 프로그램을 배포한 날은 0으로 표시하고 매일 1을 더합니다. 하지만 16비트에서 표현할 수 있는 가장 큰 숫자는 65,536입니다. 이를 365로 나누면 179년에 해당한다는 것을 알 수 있습니다. 그 이후에는 프로그램이 중단되지 않고는 1을 더할 수 없습니다.

우리가 할 일은?

언제든지 업그레이드할 수 있는 일반적인 오프체인 프로그램이라면 코드에 간단한 주석으로 다음 세대에게 문제가 있음을 알리는 정도면 괜찮을 것입니다. 하지만 온체인 프로그램을 작성하면서 주도권을 내려놓고 프로그램을 변경할 수 없도록 만들려는 경우, 아무도 이 문제를 해결할 수 없을 것입니다.

이것이 허용 가능한지 여부는 여러분이 직접 결정할 수 있습니다.

어쨌든, 이 문제에 대해 걱정하고 있다면 안심하세요. 저희가 이 문제를 훨씬 더 일찍 발견할 것이라고 확신할 수 있습니다. 2038년에 이미 몇몇 애플리케이션이 비슷한 문제에 직면할 것이라고 확신할 수 있습니다.

--

--

액세스 프로토콜
Access Protocol

전세계 모든 디지털 콘텐츠 크리에이터를 위한 새로운 수익 창출 레이어 https://accessprotocol.co