Libplanet 0.17.0
Released on September 28, 2021.
Backward-incompatible API changes
- Added
StateCompleterSet<T>.ComplementAll
property. [#1358, #1386] - Added
StateCompleterSet<T>.ComplementLatest
property. [#1358, #1386] BlockPerception
now implementsIBlockExcerpt
interface. [#1440]BlockPerception.Excerpt
property removed.
TotalDifficultyComparer
now implementsIComparer<IBlockExcerpt>
interface. [#1442]- Return type for
BlockDemandTable.Add()
is nowvoid
. [#1435, #1443] - Added
BlockInsufficientTxsException
. [#1445] PrivateKey()
constructor's parameter type becameIReadOnlyList<byte>
(wasbyte[]
). [#1464]PrivateKey.ByteArray
property's type becameImmutableArray<byte>
(wasbyte[]
). To get a mutable one, usePrivateKey.ToByteArray()
method instead. [#1464]PublicKey()
constructor's parameter type becameIReadOnlyList<byte>
(wasbyte[]
). [#1464]PublicKey.Verify()
method's both parameter types becameIReadOnlyList<byte>
(were bothbyte[]
). [#1464]HashDigest<T>.DeriveFrom()
method's parameter type becameIReadOnlyList<byte>
(wasbyte[]
). [#1464]IBlockPolicy<T>.GetMaxBlockBytes()
description changed for0
and negative values. [#1449, #1463]- Returned values from these will now be taken literally by
BlockChain<T>
.
- Returned values from these will now be taken literally by
- Removed
IBlockPolicy<T>.MaxTransactionsPerBlock
property. It is replaced byIBlockPolicy<T>.GetMaxTransactionsPerBlock(long index)
method. [#1447] - Added
IBlockPolicy<T>.GetMaxTransactionsPerBlock(long index)
method. [#1447] - Added
IBlockPolicy<T>.GetMinTransactionsPerBlock(long index)
method. [#1479] - Added
IBlockPolicy<T>.GetMaxTransactionsPerSignerPerBlock(long index)
method. [#1449, #1463] - Unused parameter
currentTime
removed fromBlockChain<T>.Append()
. [#1462, #1465] - Added an optional
maxTransactionsPerSigner
parameter toBlockChain<T>.MineBlock()
method. [#1449, #1463] - Added an optional
txPriority
parameter toBlockChain<T>.MineBlock()
method. [#1477] BlockHeader
's properties are now represented as richer types than before. [#1470]BlockHeader.Timestamp
property's type becameDateTimeOffset
(wasstring
).BlockHeader.Nonce
property's type becameNonce
(wasImmutableArray<byte>
).BlockHeader.Miner
property's type becameAddress
(wasImmutableArray<byte>
).BlockHeader.PreviousHash
property's type becameBlockHash?
(wasImmutableArray<byte>
).BlockHeader.TxHash
property's type becameHashDigest<SHA256>?
(wasImmutableArray<byte>
).BlockHeader.Hash
property's type becameBlockHash
(wasImmutableArray<byte>
).BlockHeader.StateRootHash
property's type becameHashDigest<SHA256>?
(wasImmutableArray<byte>
).- Removed
BlockHeader(int, long, string, ImmutableArray<byte>, ImmutableArray<byte>, long, BigInteger, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>)
constructor. UseBlockHeader(int, long, DateTimeOffset, Nonce, Address, long, BigInteger, BlockHash?, HashDigest<SHA256>?, BlockHash, ImmutableArray<byte>, HashDigest<SHA256>?)
constructor instead.
IStore
,IStateStore
, andIKeyValueStore
interfaces now inheritIDisposable
. [#1448, #1474]- Multiple changes for
IBlockPolicy<T>
interface. [#1485]bool DoesTransactionFollowsPolicy(BlockChain<T>, Transaction<T>)
changed toTxPolicyViolationException? ValidateNextBlockTx( BlockChain<T>, Transaction<T>)
.InvalidBlockException ValidateNextBlock(BlockChain<T>, Block<T>)
changed toBlockPolicyViolationException? ValidateNextBlock( BlockChain<T>, Block<T>)
.BlockPolicy<T>
, the default implementation forIBlockPolicy<T>
, has been updated accordingly.
- Removed
BlockPolicy<T>()
constructor withint blockIntervalMilliseconds
parameter. Use the one withTimeSpan? blockInterval
instead. [#1485] - Replaced
int maxBlockBytes
andint maxGenesisBytes
parameters fromBlockPolicy<T>()
constructor withFunc<long, int>? getMaxBlockBytes
. [#1485] - Removed
TxViolatingBlockPolicyException
class. [#1485] - Optional parameter name
difficultyBoundDivisor
forBlockPolicy<T>()
constructor changed todifficultyStability
. [#1495] - Type for optional parameter
difficultyStability
forBlockPolicy<T>()
constructor changed tolong?
fromint?
. [#1495]
Backward-incompatible network protocol changes
Message
became to serialize peer with Bencodex instead ofBinaryFormatter
. [#1455]
Added APIs
IBlockExcerpt.ExcerptEquals
extension method added. [#1440]- Added
PrivateKey.FromString()
method. [#1475] - Added
PrivateKey.Sign(ImmutableArray<byte>)
overloaded method. [#1464] - Added
PrivateKey.Decrypt(ImmutableArray<byte>)
overloaded method. [#1464] - Added
PrivateKey.ToByteArray()
method. [#1464] - Added
PublicKey.Encrypt(ImmutableArray<byte>)
overloaded method. [#1464] - Added
PublicKey.ToImmutableArray()
method. [#1464] - Added
Nonce(ImmutableArray<byte>)
overloaded constructor. [#1464] - Added
HashAlgorithmType.Digest(IEnumerable<byte[]>)
overloaded method. [#1480] - Added
HashAlgorithmType.Digest(IEnumerable<ImmutableArray<byte>>)
overloaded method. [#1480] - Added
BlockHeader(int, long, DateTimeOffset, Nonce, Address, long, BigInteger, BlockHash?, HashDigest<SHA256>?, BlockHash, ImmutableArray<byte>, HashDigest<SHA256>?)
constructor. [#1470] - Added
TxCompletion<TPeer, TAction>
class. [#1420, #1478] - Added
BlockPolicyViolationException
andTxPolicyViolationException
classes. [#1485] - Added
DifficultyAdjustment
static class. [#1495] - Added
BlockPolicy<T>.DifficultyStability
andBlockPolicy<T>.MinimumDifficulty
properties. [#1495]
Behavioral changes
StateCompleterSet<T>.Recalculate
now evaluates states even for those already inIStateStore
. Moreover, it also terminates early if possible after reaching theBlockHash
provided with a call. [#1358, #1386]TotalDifficultyComparer
no longer considers perceived time when comparingIBlockExcerpt
s. [#1442]- General logic for determining the canonical chain has been updated. [#1435, #1443]
- Perceived time is only used for marking a received header in
BlockDemandTable
in order to decide whetherBlockDemand
is stale or not. This should prevent a tip regression for a local node, as the tip of a chain is never considered as stale.
- Perceived time is only used for marking a received header in
- Block sync using
BlockDemand
became not to fill blocks from multiple peers. [#1459] BlockChain<T>.MineBlock()
now usesmaxTransactions
literally. [#1449, #1463]- Before,
maxTransactions
were internally automatically set to a value between1
andBlockChain<T>.Policy.MaxTransactionsPerBlock
.
- Before,
- Similarly,
BlockChain<T>.MineBlock()
now internally usesBlockChain<T>.Policy.GetMaxBlockBytes()
literally. [#1449, #1463] NetMQTransport
became to no more send CreatePermission to TURN client and require permission-less TURN server. See coturn's relevant configuration as well. [#1423]Swarm<T>
became to sync transactions from multiple peers at the same time. [#1420, #1478]
Bug fixes
- Improper sanity checks for
targetBlockInterval
(changed from the old nameblockInterval
),minimumDifficulty
, anddifficultyStability
(changed from the old namedifficultyBoundDivisor
) arguments given toBlockPolicy<T>()
constructor fixed. [#1495]- It was possible for
targetBlockInterval
to be zero, which would result in division by zero, when this makes no sense. - It was possible for
difficultyStability
not to be positive when this makes no sense. - Wrongly threw an
ArgumentOutOfRangeException
for the case whereminimumDifficulty
would equaldifficultyStability
. - It was possible for
minimumDifficulty
to be zero, which would allow difficulty to be stuck at zero indefinitely, when this does not make sense.
- It was possible for