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

Libplanet 0.4 릴리스

(한국어English)

안녕하세요. 저희 팀은 Libplanet의 네 번째 마이너 버전인 0.4 버전을 릴리스했습니다.

Libplanet은 분산 P2P로 돌아가는 온라인 멀티플레이어 게임을 만들 때, 그러한 게임들이 매번 구현해야 하는 P2P 통신이나 데이터 동기화 등의 문제를 푸는 공용 라이브러리입니다.

이 글에서는 0.4 버전의 주요 변경 사항에 대해 다루겠습니다.

LiteDBStore 추가

Libplanet은 저장 계층을 간추리기 위해 IStore라는 인터페이스와 이를 파일 기반으로 구현한 FileStore를 기본으로 제공합니다. 이 FileStore는 작은 규모의 게임에서 사용하기엔 충분했지만, 더 큰 규모의 게임에 적용해보니 다음과 같은 문제가 있었습니다.

저희는 이런 문제를 해결하고자 별도의 스토리지 엔진을 사용하는 IStore 구현의 필요성을 검토하였고, 그 과정에서 선택한 것이 바로 LiteDB입니다. LiteDB는 순수 C#으로 작성되어 있어 .NET 환경에서 이식성이 뛰어나고, 전체 데이터를 단일 파일로 관리할 수 있기 때문에 관리가 쉽습니다.

이렇게 작성된 LiteDBStoreIStore를 구현하기 때문에, 기존 FileStore에서 객체 초기화 방법을 제외하곤 완전히 같은 방법으로 사용할 수 있습니다.

간편한 트랜잭션 생성

0.3 버전에 추가된 Transaction<T>.Nonce는 안전한 트랜잭션을 만들기 위한 중요한 장치였지만, 동시에 Libplanet을 사용하는 개발자에게는 골칫거리기도 했습니다. Transaction<T>를 만들기 위해서는 반드시 BlockChain<T>.GetNonce()를 통해 현재 서명하는 계정의 정확한 논스를 얻어와서 사용해야 했기 때문이죠. 이는 단순히 번거로운 절차일 뿐만 아니라, 트랜잭션을 언제 만드느냐에 따라 동시성 문제를 일으키기도 했습니다.

하지만 0.4 버전부터는 BlockChain<T>.MakeTransaction()를 통해 간편하면서 동시성 걱정 없이 트랜잭션을 만들 수 있습니다.

트랜잭션 전파 자동화

이전 버전까지의 Libplanet을 이용한 게임이 트랜잭션을 전파하기 위해선 Swarm.BroadcastTxs()를 직접 호출해야 했습니다. 그런데 네트워크 장애 등의 이유로 트랜잭션 전파에 실패할 수 있기 때문에, 게임 쪽에서 직접 재시도 로직을 구현해야 했었죠.

(여전히 .BroadcastTxs()를 쓸 수도 있지만) 게임은 이제 이를 직접 처리하지 않아도 됩니다. 그 대신에 Swarm<T>을 만들 때 자신의 체인을 넣고 그 체인에 (위에서 소개한 BlockChain<T>.MakeTransaction()을 사용해서) 트랜잭션을 만들기만 하면 되죠. 나머지는 전파 과정은 Swarm<T>가 알아서 수행합니다.

이 과정에서 Swarm이 직접 체인을 관리하기 때문에 BlockChain<T>처럼 타입 인자(T)를 가진 Swarm<T>으로 변경되었습니다.

그 외

그 외의 여러 가지 변경 사항은 전체 변경 내역에서 확인하실 수 있습니다.

이번 변경 사항이나 Libplanet에 대해 궁금한 점이 있으시다면 언제든 저희 팀이 상주해 있는 디스코드 대화방에 놀러 오세요!