Hello all, we’re delighted to announce that the 5th minor version of Libplanet—Version 0.5 along with patch versions, 0.5.1 and 0.5.2, has been released.
Libplanet is a common library that solves game implementation problems such as P2P communication and data synchronization when creating online multiplayer games that run on distributed P2P.
Version 0.5 includes extensive performance and reliability improvements addressed while testing games developed with Libplanet. This post will cover those major changes of Version 0.5.
IBD Speed Improvement
Previously, IBD used to take a long time to execute, even for a small number of blocks. This was because after downloading the blocks, you had to calculate the final state starting from the first block.
However, if you have a reliable node, it is quite possible to effectively reduce computing time by using precalculated results from that node.
So, from Version 0.5, by handing over trusted nodes as parameters to
Swarm<T>.PreloadAsync(), we’re now able to receive, store, and use the most recent state values already computed from those trusted nodes.
If there aren’t any trusted nodes or the process fails for another reason, IBD computes in the same process as previous versions.
Quoting from the System.Double section of .NET Standard Official Document, it states:
In addition, the result of arithmetic and assignment operations with
Doublevalues may differ slightly by platform because of the loss of precision of the
Doubletype. For example, the result of assigning a literal
Doublevalue may differ in the 32-bit and 64-bit versions of the .NET Framework.
As stated above, arithmetic operations and substitution of Double can cause indeterminant results. Because of this, we’ve decided not to provide
IRandom.NextDouble() from this version onwards.
Please refer to this article for further information.
In order to keep chains secure, we need miners to mine the blocks, and we need to reward miners to recruit and keep them.
Previously for miners to be rewarded, they had to add a transaction with reward actions to the block each time. But from this version, the new
IBlockPolicy<T>.BlockAction property, which is executed for every block, enables code implementation that rewards miners for each block action.
Libplanet had been providing an interface called
FileStore (a file-based implementation of
IStore), as well as
LiteDBStore (implementation based on LiteDB) since Version 0.4 to simplify the storage layer. Despite the benefits of its simplistic implementation, however,
FileStore also had the following limitations:
- There were just too many files created because every block, every transaction, and the status of every account block were stored as separate files.
- With no separate cache or buffer, I/O performance was significantly affected by what physical storage device were used.
As we started using LiteDB,
FileStore usage rate began to diminish. And so, considering the difficulty of continuously managing
FileStore, we decided not to provide
FileStore implementation from Version 0.5.
More Detailed Preload Progress
To carry out the IBD mentioned above, you can call the
Swarm<T>.PreloadAsync() method. And previously, sending
IProgress<BlockDownloadState> to this method’s parameter could tell us about the progress of the block download, but it couldn’t tell us about the specific progress from running actions to the final status after the block download (or from a trusted node).
Therefore, the waiting time of this previous method had to be quite boring for players since the loading message only showed either
100% and no specific progress of the block download.
However, from Version 0.5, by receiving the
IProgress<PreloadState> type parameter instead of
IProgress<BlockDownloadState>, this allows us to get a detailed view of the entire preload progress.
IProgress<PreloadState> object which receives
ActionExecutionState as parameters inherited from
PreloadState, users are provided with more detailed information.
You can learn more about additional changes in our 0.5.0, 0.5.1, 0.5.2 release notes.
And as always, if you have any questions about the new release or Libplanet in general, please visit our Discord chatroom and let’s chat!