플라네타리움 엔지니어링 스낵

탈중앙과 온라인 게임이 교차하다

(한국어English)

안녕하세요! 지난 2개월 간 플라네타리움의 엔지니어링 인턴으로 일한 김무훈입니다. 저는 나인 크로니클 출시 직전의 베타 과정을 함께했는데요.

간단히 블록체인과 게임을 결합하며 특이하다고 생각한 기술적인 사례를 소개하겠습니다.

탈중앙

온라인 게임은 멀티 플레이와 사용자의 데이터를 저장하는 등 서비스를 운영하기 위한 용도로 서버를 이용합니다. 그러나 운영사가 폐업하는 등 여러 이유로 서비스가 중단되면 더 이상 게임을 즐길 수 없게 됩니다.

모두가 온라인 게임을 분업하여 유지할 수 있다면 사용자가 남아있는 한 서비스가 종료될 걱정은 없게 됩니다. 이 개념에 맞는 탈중앙은 전통적인 중앙 서버의 역할을 사용자에게 분담해두는 형태를 의미하는데요. 기술적으로는 P2P나, 분산화 기술이라고 아마 한 번쯤은 들어 보셨을 겁니다.

재구성 현상

플라네타리움은 여러 분산화 기술 중에 블록체인을 활용해서 게임 내 재화, 보유한 아이템, 달성한 퀘스트 등의 데이터를 보존합니다.

블록체인에 게임 플레이 데이터를 보관하면 간혹 이 정보가 몇시간 전으로 되돌아가는 문제가 있습니다. 블록체인 네트워크에서 일어나는 재구성 현상이라는 결함인데요.1 블록체인 커뮤니티에서는 이를 리오그(reorg)라 줄여서 부릅니다. 이 글에서도 편의상 리오그라 칭하겠습니다.

블록이 순서대로 연결되어 있는 것을 체인이라 한다.

블록이 순서대로 연결되어 있는 것을 체인이라 한다.

리오그 현상에 대해 설명하기 전에 블록체인 네트워크에는 언제나 하나의 체인을 정본으로 지목한다는 사실부터 짚고 넘어가야 합니다.

블록체인의 블록은 누구나 생성할 수 있습니다. 그러나 블록을 생성하는 여러 노드가2 같은 시점에 블록을 동시에 만든다면 시작은 같은데 끝 부분이 서로 다른 여러 체인이 나타납니다. 어떻게 하면 하나의 체인을 정본으로 지목할 수 있는 것일까요? 중앙의 누군가가 정해주는 것도 아닌데도 말입니다.

비슷한 시점에 더 많은 자원이 투입된 체인을 채택한다.

비슷한 시점에 더 많은 자원이 투입된 체인을 채택한다.

각 노드가 제멋대로 체인을 고르지는 않고, 모든 노드가 공유한 규칙에 따라 가장 규칙에 적합한 체인을 고릅니다. 나인 크로니클 및 Libplanet이 따르고 있는 작업 증명(PoW) 방식에서는 비슷한 시점에 블록을 생성하는데 더 많은 자원이 투자된 체인을 채택합니다.

5개의 길이를 가졌던 파란 블록의 체인이 빨간 블록으로 리오그된다. (깊은 리오그)

5개의 길이를 가졌던 파란 블록의 체인이 빨간 블록으로 리오그된다. (깊은 리오그)

그런데 기존의 주류 체인보다도 이 규칙에 더 부합하는 다른 체인이 네트워크에 나타날 경우, 이 순간 주류 블록체인이 뒤집히게 됩니다.

보통의 경우 블록 한두 개를 두고 얕은 리오그가 일어나지만 나누어진 블록의 깊이가 일정 개수보다 많다면 깊은 리오그가 일어납니다. 예를 들어,

  1. A, B 분기로 체인이 나뉘어져 다른 노드로 전파된다.
  2. 비슷한 비율로 점차 전파되는 노드가 늘어가며 체인의 길이도 늘어간다.
  3. 모든 노드가 A 분기와 B 분기 중 하나를 채택했고, A 분기의 체인이 더 길면서 채택된 비율이 높다.
  4. B 분기의 체인을 채택한 모든 노드의 체인이 A로 리오그 됩니다.
어제 10,000 골드를 보유했던 사용자가 1,000 미만의 골드를 보유하게 되었다고 제보를 했다.

어제 10,000 골드를 보유했던 사용자가 1,000 미만의 골드를 보유하게 되었다고 제보를 했다.

그래서 앞서 이야기했듯이, 리오그 현상 때문에 레벨이나 가진 아이템이 몇 분에서 몇 시간 전의 상태로 되돌아갔다는 이야기가 나인 크로니클 커뮤니티에서 자주 언급되었습니다.3 탈중앙 네트워크에서 발생한 일이기 때문에 운영진에게 되돌려달라고 할 수도 없는 노릇입니다.

블록체인 네트워크 초기화

나인 크로니클은 베타 기간 동안 체인 네트워크를 일곱 번 초기화했습니다. 체인 네트워크가 초기화되면 게임 플레이어가 일구었던 게임 데이터가 모두 사라지게 됩니다. 이런 위험을 감수하고도 초기화를 감행한 이유는 다음과 같습니다.

블록체인 네트워크 코어 Libplanet에서는 게임의 상태를 블록에 저장합니다. 사용자의 행동은 경우 액션이라는 이름의 자료 구조에 맞추어 저장됩니다.

{
  "stageId": "123",
  "id": "ntPSdIREOUOARaRYJHlGEg==",
  "equipments": ["KTm6cLkrtEWs6k4A821K3Q=="],
  "avatarAddress": "sGo0bo0VwrYA7ubq6yV8ctiU2vc=",
  "foods": [],
  "worldId": "3"
}

만약 게임 내에서 의상 요소가 업데이트된다면 costumes 같이 새로운 속성이 추가되고, 이 정보가 담긴 블록의 해시가4 이전 블록의 해시를 만드는 규약(protocol)과 맞지 않게 됩니다. 규약이 달라지면 이전의 블록 데이터를 이어서 사용할 수 없게 됩니다.5 이 외에도 유니크한 값이 다르게 되거나, Libplanet이나 그 SDK의 코드 중에 해시에 영향이 가는 수정이 생긴다면 달라집니다.

이런 경우의 대개 다른 블록체인에서는 몇 번째 블록 이후부터 블록을 다르게 해석하도록 규약을 추가합니다. 나인 크로니클도 그럴 수 있지만, 크고 작은 변경이 잦은 베타 기간에 이런 방법을 취하는 것은 무리라고 판단했습니다. 그래서 체인을 매번 초기화하는 것을 감행한 것입니다.

정식 출시 이후에는 체인을 유지할 예정입니다. 그러기 위한 여러 제안이 검토된 상황으로, 기회가 된다면 이후에 스낵에서 이를 소개하겠습니다.

마치며

플라네타리움은 “커뮤니티가 운영하는 온라인 게임"이라는 매력으로 새로운 형태의 게임 문화를 정착시키는 것에 큰 기대를 하고 있습니다. 간혹 온라인 게임의 운영사 직원이 게임의 자원을 횡령하여 게임의 생태계를 무너뜨리는 일이 언론에 보도되는데요. 나인 크로니클은 게임의 규칙이 프로토콜 수준으로 투명해져서 그런 일이 원칙적으로 일어날 수 없습니다.

이러한 장점에도 불구하고 Libplanet이 사용하는 블록체인 프로토콜이 진입 장벽으로 느껴질 수 있습니다. 작업 내역을 라인 단위로 분산하고 자동으로 병합이 되는 Git을 처음 보고 느낀 충격이랄까요. 그래서 여러분이 게임을 플레이하면 겪는 아쉬움, 개선점을 디스코드 채널과 GitHub6에서 받고 있습니다.

이 글은 앞으로 시리즈로 연재되며, 다음 발행 때에는 나인 크로니클이 리오그 현상과 체인 리셋을 어떻게 대처하였는지 소개하는 시간을 가질 예정입니다. 읽어주셔서 감사합니다.


  1. 엔지니어링 팀 내부에서는 플레이했던 기록이 꿈처럼 되어 버린다고 해서 신기루 현상으로 부릅니다. ↩︎

  2. 블록체인 네트워크에 참여하는 컴퓨터를 의미합니다. ↩︎

  3. 블록체인 코리빙·코워킹 커뮤니티 논스(nonce) 공동 창립자 하시은 님이 쓴 게임 후기에서 사용자 입장의 상황이 잘 설명되었습니다. ↩︎

  4. 블록체인은 그 이전 블록의 해시를 메타 정보 삼아 체인을 이읍니다. 연결 리스트를 떠오르면 이해하기 쉽습니다. ↩︎

  5. 확장한 명세가 들어간 게임 클라이언트가 이전 블록을 제대로 해석하지 못할 가능성이 있습니다. ↩︎

  6. P2P 온라인 게임을 위한 블록체인 코어 — libplanet, 나인 크로니클을 위한 Libplanet 기반의 SDK — Lib9c, 나인 크로니클 클라이언트 전용의 블록체인 노드 서비스 — NineChronicles.Standalone, 이 밖에도 나인 크로니클 론처와 게임 클라이언트의 저장소를 공개할 예정입니다. ↩︎

플라네타리움은 게임에 특화된 오픈 소스 P2P 라이브러리 Libplanet과, 그 위에서 중앙 서버 없는 온라인 게임 나인 크로니클을 만들고 있습니다. 저희와 흥미로운 기술적 도전을 함께 하실 분들을 모시고 있습니다. 지금 채용 페이지를 확인해주세요!