안녕하세요. 저희 팀은 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()
메서드를 통해 이미 렌더링 된 액션을 되돌릴 수 있도록 했습니다.
계정 상태 접근 방법 개선
이전 버전에서는 계정의 상태를 가져오기 위해 해당 계정의 상태가 마지막으로 갱신된 블록을 찾을 때까지 이전 블록을 순회하는 방법을 사용했습니다. 이런 방식을 사용하면 해당 주소에 아직 아무런 상태가 기록된 적 없을 경우 최신부터 제너시스까지 모든 블록을 순회해야 하는 문제점이 있습니다. 상태가 마지막으로 업데이트된 지 오래되어 그사이 많은 블록이 추가된 주소의 상태를 구할 때도 마찬가지로 많은 블록을 순회해야 하고, 체인의 길이가 길면 길수록 상태를 확인해야 하는 시간이 늘어나게 됩니다.
이번 버전에서는 각 계정의 상태를 저장할 때 해당 주소의 상태를 가지고 있는 블록을 인덱싱하고, 상태를 조회할 때는 해당 블록을 바로 조회하는 방식으로 성능을 개선하였습니다.
블록 추가 성능 개선
블록체인에 블록을 추가할 때 수행되는 작업의 개선을 통해 블록 추가 성능을 개선했습니다.
- 이미 체인에 추가된 블록에 접근할 때 수행하던 불필요한 블록 검증을 제거했습니다.
- 블록이 추가될 때 전체 체인을 검증하던 방식에서 추가되는 블록만 검증하는 방식으로 변경했습니다.
- 블록 해시가 필요할 때마다 계산하는 대신 블록 생성 때 한번 계산하도록 변경했습니다.
- 블록의 해시를 계산할 때 전체 트랜잭션을 사용하는 대신 트랜잭션 ID를 사용하여 해시 계산 시간을 감소시켰습니다.
- 블록을 추가할 때 여러 번 수행되던 액션 평가를 한 번만 수행되도록 하여 블록 추가 시간을 감소시켰습니다.
그 외
그 외의 여러 가지 변경 사항은 전체 변경 내역에서 확인하실 수 있습니다.
이번 변경 사항이나 Libplanet에 대해 궁금한 점이 있으시다면 언제든 저희 팀이 상주해 있는 디스코드 대화방에 놀러 오세요!