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

Libplanet 0.3 릴리스

(English)

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

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

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

버전이 다른 노드를 만났을 때 반응하는 API

0.2 버전부터 Swarm 생성자에 appProtocolVersion이 추가되어 노드의 프로토콜 버전을 지정하도록 했습니다. 이번 0.3 버전에서는 Swarm.DifferentVersionPeerEncountered 이벤트 핸들러를 통해 버전이 다른 노드를 만났을 때의 행동을 지정해 줄 수 있습니다.

예를 들어 자신보다 높은 프로토콜 버전의 메시지를 받을 경우 게임 앱을 업그레이드하도록 하는 핸들러 등을 Swarm.DifferentVersionPeerEncountered로 넘겨줄 수 있습니다.

액션 렌더링 API

기존에는 게임에서 액션이 실제로 처리되었는지, 즉 액션의 실행 결과가 GetStates() 메소드의 결과에 언제 반영되는지 신호(이벤트)를 받을 수 없었습니다. 따라서 특정 주소의 액션이 처리되었다는 것을 확인하기 위해서는 폴링 등의 방법을 이용해 해당 주소의 상태가 액션 이후의 상태로 변경되었는지 확인해야 했습니다. 이런 방식은 구현이 복잡하고 번거로울 뿐 아니라 액션의 처리가 확인될 때까지 주소의 상태를 수차례 가져와야 하므로 성능적인 측면에서도 문제가 있습니다.

이런 문제를 해결하기 위해 이번 버전에서는 액션 렌더링 API가 추가되었습니다. IAction.Render() 메서드 구현을 통해 게임에서는 액션의 결과가 로컬 상태에 반영되는 순간을 이벤트로 받을 수 있게 됩니다. 또, 다수 체인(majority chain)이 변경되어 처리된 액션이 포함된 블록이 유효하지 않게 될 경우 IAction.Unrender() 메서드를 통해 이미 렌더링 된 액션을 되돌릴 수 있도록 했습니다.

계정 상태 접근 방법 개선

이전 버전에서는 계정의 상태를 가져오기 위해 해당 계정의 상태가 마지막으로 갱신된 블록을 찾을 때까지 이전 블록을 순회하는 방법을 사용했습니다. 이런 방식을 사용하면 해당 주소에 아직 아무런 상태가 기록된 적 없을 경우 최신부터 제너시스까지 모든 블록을 순회해야 하는 문제점이 있습니다. 상태가 마지막으로 업데이트된 지 오래되어 그사이 많은 블록이 추가된 주소의 상태를 구할 때도 마찬가지로 많은 블록을 순회해야 하고, 체인의 길이가 길면 길수록 상태를 확인해야 하는 시간이 늘어나게 됩니다.

이번 버전에서는 각 계정의 상태를 저장할 때 해당 주소의 상태를 가지고 있는 블록을 인덱싱하고, 상태를 조회할 때는 해당 블록을 바로 조회하는 방식으로 성능을 개선하였습니다.

블록 추가 성능 개선

블록체인에 블록을 추가할 때 수행되는 작업의 개선을 통해 블록 추가 성능을 개선했습니다.

그 외

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

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

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