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

Libplanet 0.7 릴리스

(한국어English)

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

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

0.7 버전에서는 Libplanet의 안정성 및 성능 개선과 더불어 다양한 사용성 개선이 있었습니다. 이 글에서는 0.7 버전의 주요 변경 사항들에 대해 다루겠습니다.

액션 및 상태의 타입 제한

기존 Libplanet에서 상태 및 액션의 속성은 object 타입으로 표현되고 저장할 때는 알아서 .NET의 바이너리 직렬화 포맷으로 직렬화되었습니다. 이 방식은 .NET 객체를 그대로 직렬화할 수 있으므로 Libplanet을 쓰는 쪽에서도 만드는 쪽에서도 생각할 게 적다는 장점이 있습니다. 하지만 저희 팀은 이 방식을 처음 도입했을 때부터 여러 한계를 인식한 채 한시적으로 사용할 것을 의도했는데, 그 한계는 다음과 같은 것들이 있습니다.

그래서 이번 버전부터는 상태 및 액션의 속성은 BencodexIValue 타입을 통해서 표현하도록 바뀌었습니다. 따라서 게임 내부에서 정의해서 쓰는 타입들을 IValue 형식으로 변환하는 코드, 그리고 IValue 형식으로 표현된 것을 다시 게임 내 타입들로 해석하는 코드를 명시적으로 써야 합니다. 조금 귀찮아진 것도 사실이지만, 대신 직렬화하려는 타입의 내부 표현이 바뀌어도 직렬화 혹은 역직렬화 메서드에 해당 변경에 따른 처리 로직을 추가할 수 있게 되었고, 각기 다른 버전 사이의 호환을 좀 더 구현하기 쉽게 되었습니다.

BlockChain<T>IReadOnlyList<T> 구현 제거

이전 버전까지 BlockChain<T> 클래스는 IReadOnlyList<T> 인터페이스를 구현하고 있었고, 그에 따라 BlockChain<T> 객체에 직접 LINQ 확장 메서드들을 사용할 수 있었습니다. LINQ 확장 메서드는 선형적인 객체를 다룰 때 다양한 편리를 제공하지만, 사용 방법에 따라 상당한 성능상의 차이를 가져올 수 있습니다. 예를 들어 BlockChain<T> 객체에 10,000개의 블록이 있을 때 LINQ의 .Last() 메서드를 사용하여 10,000 번째 블록을 가져오고자 한다면 마지막 블록만을 저장소에서 바로 가져온다고 생각하기 쉽습니다. 하지만 실제로는 BlockChain<T>의 첫 블록부터 마지막 블록까지 조회하며 각 블록에 대해 스토리지에 저장된 내용을 메모리에 올리고 해석하는 작업이 이뤄지게 됩니다. 저장된 블록이 적을 때는 이런 점이 큰 문제가 되지 않지만, 블록이 많아질수록 이런 사용방식이 큰 성능 문제로 이어질 수 있습니다.

이번 버전부터는 BlockChain<T> 클래스에서 IReadOnlyList<T> 구현을 아예 제거함으로써 LINQ 확장 메서드를 잘못 사용해 생길 수 있는 문제를 방지하도록 했습니다. 대신 BlockChain<T>.Contains() 같이 자주 쓰이는 연산은 효율적인 구현을 직접 제공하기로 했습니다.

개인키를 안전하게 저장할 수 있는 키스토어 구현

이번 버전에서는 개인키를 암호화하여 안전하게 보호할 수 있도록 키스토어가 추가되었습니다. 키스토어 내 각각의 키 파일은 ProtectedPrivateKey 클래스로 표현되며, 사용자가 입력한 암호(passphrase)로 개인키를 암호화 하여 저장할 수 있습니다. 또한, ProtectedPrivateKey.WriteJson() 메서드를 이용해 이더리움Web3 Secret Storage Definition에 따라 JSON 형식으로 저장할 수 있습니다. 추후 키스토어 디렉터리를 통합적으로 관리하는 기능도 추가될 예정입니다.

현재 키 유도함수PBKDF2Scrypt가 구현되어있고, AES-128-CTR 암호화 알고리즘을 지원하고 있습니다. 이 중 Scrypt 구현은 minhoryang 님의 기여로 추가되었습니다. 🎉

그 외

이번 버전에는 Hacktoberfest 행사로 많은 분의 기여가 있었습니다. 해당 행사에 관한 내용은 문성원 님이 작성하신 Hacktoberfest를 돌아보며에서 자세히 보실 수 있고, 그 외 이번 버전의 모든 변경 사항은 전체 변경 내용에서 확인하실 수 있습니다.

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