Libplanet changelog
Version 0.53.4
Released on April 4, 2023.
- Fixed version resolution of typescript libraries for dependencies located in the monorepo. [#3050, #3052]
- Exported the omitted
signTx()andencodeSignedTx()functions in *@planetarium/tx*. [#3052]
Version 0.53.3
Released on April 3, 2023.
- Adjusted level of the consensus related logs. [#3046]
Version 0.53.2
Released on March 31, 2023.
- Ported changes from Libplanet 0.50.7 release. [#3022]
BlockChain<T>.Create()is now getIBlockChainStateandActionEvaluatoras parameters. [#3029]
Version 0.53.1
Released on March 28, 2023.
- Ported changes from Libplanet 0.50.6 release. [#3010]
- Introduced a new
Initializesystem action. [#3010
Version 0.53.0
Released on March 27, 2023.
Since 0.53.0, we officially provide @planetarium/account-web3-secret-storage
and @planetarium/account-aws-kms, which are npm packages that provides
KeyStore implementations that comply with @planetarium/account.
*@planetarium/account-web3-secret-storage*: An npm package for providing
Web3KeyStorewhich implements Ethereum Web3 Secret Storage (corresponds toLibplanet.KeyStore.Web3KeyStore).*@planetarium/account-aws-kms*: An npm package for providing
AwsKmsKeyStorewhich implementsAccountand uses AWS KMS as the backend.
Since 0.53.0, we do not provide Libplanet.Node package anymore. If you still need the package, use 0.52.0 or its patched versions.
Due to changes in [#2961] and [#2970], a network ran with Libplanet 0.51.0 or Libplanet 0.52.0 is not compatible with this version. Thus, it is recommended to skip Libplanet 0.51.0 and Libplanet 0.52.0 for deployment if possible.
Backward-incompatible API changes
- (Libplanet.Node) Removed
Libplanet.Nodenamespace. [#2971] - Removed state completion feature with related classes as below. [#2703]
StateCompleterStateCompletersTotalSupplyStateCompleterTotalSupplyStateCompletersValidatorSetStateCompleterValidatorSetStateCompleters
- Removed type parameter
TforIActionfromActionEvaluatorandIBlockChainStates. [#2703] - (@planetarium/tx) It now depends on @planetarium/bencodex instead of
disjukr/bencodex, so
Encodableis replaced byValue.- The return type of
encodeBlockHash()becameValue(wasEncodable). - The return type of
encodePublicKey()becameValue(wasEncodable). - The return type of
encodeAddress()becameKey(wasEncodable). - The return type of
encodeAddressSet()becameValue(wasEncodable). - The return type of
encodeSignedTx()becameDictionary(wasMap<string | Buffer, Encodable>). - The return type of
encodeUnsignedTxWithSystemAction()becameValue(wasEncodable). - The return type of
encodeUnsignedTxWithCustomActions()becameValue(wasEncodable). - The
CustomActiontype is now an alias ofValue(was an alias ofEncodable). - The return type of
encodeTxMetadata()becameDictionary(wasMap<string | Buffer, Encodable>). - The return type of
encodeSystemAction()becameValue(wasEncodable). - The return type of
encodeCurrency()becameValue(wasEncodable). - The return type of
encodeMint()becameValue(wasEncodable). - The return type of
encodeTransfer()becameValue(wasEncodable).
- The return type of
- (Libplanet.Net) Changed
ValidatorandValidatorSetto implementIBencodable. [#2954]- Changed
Validator(Dictionary)toValidator(IValue)andValidatorSet(List)toValidator(IValue). - Changed
Validator.EncodedtoValidator.BencodedandValidatorSet.EncodedtoValidatorSet.Bencoded.
- Changed
- Changed
BlockCommitto implementIBencodable. [#2955]- Changed
BlockCommit(Dictionary)toBlockCommit(IValue). - Changed
BlockCommit.EncodedtoBlockCommit.Bencoded.
- Changed
- Changed
BlockHashto implementIBencodable. [#2959]- Changed
BlockHash(Binary)toBlockHash(IValue). - Added
BlockHash.Bencodedproperty.
- Changed
- Removed
ITxMetadatainterface. [#2977]- The signature of
Transaction<T>(ITxMetadata, IAction, byte[])constructor becameTransaction<T>(TxMetadata, IAction, byte[]). - The signature of
Transaction<T>(ITxMetadata, IEnumerable<T>, byte[])constructor becameTransaction<T>(TxMetadata, IEnumerable<T>, byte[]). - The signature of
TxMetadata(ITxMetadata)constructor becameTxMetadata(ITransaction).
- The signature of
- Removed
ITxExcerptinterface. [#1997, #2977] - Removed
TxExcerptExtensionsstatic class. [#1997, #2977] - (Libplanet.Net) Changed
VoteMetadataandVoteto implementIBencodable. [#2961]- Changed
VoteMetadata(Dictionary)toVoteMetadata(IValue)andVote(Dictionary)toVote(IValue). - Changed
VoteMetadata.EncodedtoVoteMetadata.BencodedandVote.EncodedtoVote.Bencoded.
- Changed
- Removed
bytearray related APIs fromBlockCommit,Vote,VoteMetadata. [#2970]- Removed
BlockCommit(byte[]),BlockCommit.ByteArray, andBlockCommit.ToByteArray(). - Removed
Vote(byte[]),Vote.ByteArray, andVote.ToByteArray(). - Removed
VoteMetadata(byte[]),VoteMetadata.ByteArray, andVoteMetadata.ToByteArray().
- Removed
ActionEvaluator()constructor now explicitly requires a newfeeCalculatorparameter. [#2566]
Backward-incompatible storage format changes
- (Libplanet.Net) Changed
BlockCommit'sIValueencoding format. [#2961] - Changed
Block<T>'sIValueencoding format. [#2970]
Added APIs
- Added
TransactionExtensionsstatic class. [#2977] - (@planetarium/account) Added key store abstractions. [#2915]
- Added
AccountDeletiontype. - Added
AccountGenerationtype. - Added
AccountImportationtype. - Added
AccountMetadatatype. - Added
AccountRetrievaltype. - Added
ImportableKeyStoreinterface. - Added
KeyStoreinterface. - Added
MutableKeyStoreinterface.
- Added
- Added
IFeeCalculatorinterface. [#2566]
Behavioral changes
- (@planetarium/account)
Signature.fromBytes()andSignature.fromHex()no more accept signatures with high S. Signatures with high S need to be normalized first so that they get rid of high S. [#2962]
Dependencies
- Added @planetarium/account-web3-secret-storage npm package. [#2915]
- Added @planetarium/account-aws-kms npm package. [#2962]
- Removed Libplanet.Node package. Libplanet.Node 0.52.0 was its last minor release. [#2971]
Version 0.52.2
Released on March 28, 2023.
- Ported changes from Libplanet 0.50.6 release. [#2976]
- Introduced a new
Initializesystem action. [#2976]
Version 0.52.1
Released on March 15, 2023.
- Ported changes from Libplanet 0.51.2 release. [#2946]
Version 0.52.0
Released on March 3, 2022.
Due to changes in [#2894], under certain circumstances, a network ran with Libplanet 0.51.0 may have difficulty getting up and running after an update to this version. Thus, it is recommended to skip Libplanet 0.51.0 for deployment if possible.
Backward-incompatible API changes
BlockChain<T>()no longer accepts anIStorewhereIStore.GetCanonicalChainId()isnull. For on-the-flyBlockChain<T>creation from scratch, useBlockChain<T>.Create()factory method instead. [#2863]BlockChain<T>.Append()no longer accepts a genesisBlock<T>(i.e. anyBlock<T>with an index of0). [#2863]BlockChain<T>()now throws anArgumentExceptionif providedIStoredoes not have its canonical chain id set or provided chain id is not found. [#1486, #2585, #2889]- Added
IStore.GetChainBlockCommit()andIStore.PutChainBlockCommit()interface methods. [#2878, #2894]
Added APIs
- Added
BlockChain<T>.Create()factory method for creating aBlockChain<T>with an emptyIStore. [#2863]
Behavioral changes
- Changed
BlockChain<T>.Fork()to copyBlockCommitfor its newly forkedBlockChain<T>.Tip. [#2878, #2894]
Version 0.51.4
Released on March 28, 2023.
- Ported changes from Libplanet 0.50.6 release. [#2975]
- Introduced a new
Initializesystem action. [#2975]
Version 0.51.3
Released on March 17, 2023.
Bug fixes
- Ported changes from Libplanet 0.50.5 release. [#2956]
Version 0.51.2
Released on March 15, 2023.
- Ported changes from Libplanet 0.50.3 release. [#2937]
- Fixed
BlockCommit.Encodedto be more compact. [#2938] - Fixed
Vote.EncodedandProposal.Encodedto be more compact. [#2943]
Version 0.51.1
Released on March 13, 2023.
Bug fixes
- (Libplanet.Net) Fixed a bug where
ActionExecutionStatehadn't generated correctly because of wrongTotalBlockCount. [#2917]
Version 0.51.0
Released on March 7, 2023.
Since 0.51.0, we officially provide @planetarium/account, an npm package for providing measures to represent accounts for apps developed with Libplanet in JavaScript/TypeScript. Note that the feature set is being actively developed, and the specification might change in the near future.
Deprecated APIs
- Removed
TotalDifficultyComparerclass. [#2872] - Removed
IBlockPolicy<T>.GetNextBlockDifficulty()interface method and all its implementations. [#2872] - Removed
IBlockPolicy.TotalDifficultyinterface property and its implementations. [#2872] - Removed all total difficulty related parameters. [#2872]
- Removed
IBlockPolicy.Difficultyinterface property and its implementations. [#2872] - Removed
IPreEvaluationBlockHeader.Nonceinterface property and its implementations. [#2872] - Removed
InvalidBlockTotalDifficultyExceptionclass. [#2872] - Removed
InvalidBlockDifficultyExceptionclass. [#2872] - Removed
BlockChain<T>.MakeGenesisBlock()andBlockChain<T>.MineBlock()methods. [#2872] - Removed
HashAlgorithmTypeclass. [#2872] - Removed
PreEvaluationBlock<T>(IBlockContent<T>)constructor. [#2872] - Removed
IBlockPolicy.GetMinBlockProtocolVersion()interface method. [#2872]
Backward-incompatible API changes
- Added
LastCommitproperty toIBlockMetadata. [#2872] - Bumped
BlockMetadata.CurrentProtocolVersionto 4. [#2872] - Changed
IPreEvaluationBlockHeader.PreEvaluationHashtype fromImmutableArray<byte>toHashDigest<SHA256>. [#2872] - Added
IStore.GetBlockCommit(BlockHash)method. [#2872] - Added
IStore.PutBlockCommit(BlockCommit)method. [#2872] - Added
IStore.DeleteBlockCommit(BlockHash)method. [#2872] - Added
IStore.GetBlockCommitHashes()method. [#2872] BlockMetadata.MakeCandidateData()now uses a SHA256 hash ofLastCommitfor creating a candidate data forPreEvaluationBlockHeader<T>. Due to this change,PreEvaluationHashresults different with previous block hash computation if theBlockMetadata.LastCommitis not null. [#2872]- (Libplanet.Net) Removed
SwarmOptions.StaticPeers. [#2872] - Changed
BlockPolicy<T>()constructor not to takeFunc<long, int>type parameter namedgetMinBlockProtocolVersion. [#2872]
Backward-incompatible network protocol changes
- (Libplanet.Net) Values for
Message.MessageTypeare updated to use entirely different values. [#2872]
Added APIs
- Added
VoteFlagenum. [#2872] - Added
IVoteMetadatainterface. [#2872] - Added
VoteMetadataclass. [#2872] - Added
Voteclass. [#2872] - Added
BlockContent.Propose()method. [#2872] - Added
BlockCommitclass. [#2872] - Added
BlockChain.ProposeGenesisBlock()static method. [#2872] - Added
BlockChain.ProposeBlock()method. [#2872] - Added
BlockCommitExtensionsclass. [#2872] - Added
ContextTimeoutOptionclass. [#2872] - Added
BlockMarshaler.UnmarshalBlockHash()method. [#2872] - Added
BlockChain<T>.GetBlockCommit()method. [#2872] - Added
InvalidBlockCommitExceptionclass. [#2872] - Added
BlockChain<T>.ValidateBlockCommit()method. [#2872] - (Libplanet.Net) Added
IReactorinterface. [#2872] - (Libplanet.Net) Added
ConsensusReactorclass which inheritsIReactorinterface. [#2872] - (Libplanet.Net) Added
ConsensusContextclass. [#2872] - (Libplanet.Net) Added
Contextclass. [#2872] - (Libplanet.Net) Added
Stepenum. [#2872] - (Libplanet.Net) Added
ConsensusMessageabstract class which inheritsMessageabstract class. And added classes which implementsConsensusMessageabstract class. [#2872]- Added
ConsensusProposalclass. - Added
ConsensusVoteclass. - Added
ConsensusCommitclass.
- Added
- (Libplanet.Net) Added enumeration items to
MessageTypeenum. [#2872]- Added
ConsensusProposalof value0x40. - Added
ConsensusVoteof value0x41. - Added
ConsensusCommitof value0x42.
- Added
- (Libplanet.Net) Added
ConsensusReactorOptionstruct. [#2872] - (Libplanet.Net) Added
InvalidConsensusMessageExceptionclass. [#2872] - (Libplanet.Net) Added
InvalidHeightIncreasingExceptionclass. [#2872] - (Libplanet.Net) Added
Message.Idproperty. [#2872] - (Libplanet.Net) Added
Gossipclass. [#2872] - (Libplanet.Net) Added
Proposalclass. [#2872] - (Libplanet.Net) Added
ProposalMetadataclass. [#2872] - (Libplanet.Net) Added
NetMQMessageCodec.ParseMessageType(). [#2872] - (Libplanet.Explorer) Added
BoundPeerTypeclass. [#2872] - (Libplanet.Explorer) Added
BlockCommitTypeclass. [#2872] - (Libplanet.Explorer) Added
VoteFlagTypeclass. [#2872] - (Libplanet.Explorer) Added
VoteTypeclass. [#2872] - (Libplanet.Explorer) Added
BlockCommitTypeas a return ofBlockQuery. [#2872] - Added
PolymorphicAction<T>.ActionTypeLoaderstatic property to provide a way to configure action type loader to be used inPolymorphicAction<T>. [#2873] - (@planetarium/tx) Added
SignedTxtype. [#2882] - (@planetarium/tx) Added
signTxfunction. [#2882] - (@planetarium/tx) Added
encodeSignedTxfunction. [#2882]
Behavioral changes
PreEvaluationBlockHeader()constructor became to throwInvalidBlockLastCommitExceptionwhen its metadata'sLastCommitis invalid. [#2872]BlockChain<T>.Append()has new parameterBlockCommit blockCommit, which is a set of commits for given block.BlockCommitis used for checks whether a block is committed in consensus. [#2872]BlockChain<T>.Append()method became to throwInvalidBlockCommitExceptionwhen the givenBlockCommitis invalid with given block. [#2872]
Bug fixes
- (Libplanet.Explorer) Fixed a bug where
stateQueryhadn't work correctly in some situations. [#2872]
Dependencies
- Added @planetarium/account npm package. [#2848]
Version 0.50.7
Released on March 29, 2023.
- Optimized internal byte array to hex string conversion in several places. [#2989, #3007]
IValidatorSupportStateDeltais now public [#3017]- Optimized
BlockChainState.GetStates()by caching results. [#3018]
Version 0.50.6
Released on March 22, 2023.
Version 0.50.5
Released on March 17, 2023.
Bug fixes
- (Libplanet.Net) Fixed a bug where
DealerSocketcannot connect to peers because of IPv4 return ofResolveNetMQAddressAsync(). [#2956]
Version 0.50.4
Released on March 16, 2023.
- Fixed
Validator.Encodedto use a proper typeBencodex.Types.IntegerforValidator.Powerinstead ofBencodex.Types.Binary. [#2949]
Version 0.50.3
Released on March 14, 2023.
- Ported changes from Libplanet 0.49.3 release. [#2935]
Version 0.50.2
Released on March 9, 2023.
- Added
PolymorphicAction<T>.ActionTypeLoaderstatic property to provide a way to configure action type loader to be used inPolymorphicAction<T>. [#2875]
Version 0.50.1
Released on March 6, 2023.
- Ported changes from Libplanet 0.49.1 and Libplanet 0.49.2 release. [#2884]
Version 0.50.0
Released on February 27, 2023.
Backward-incompatible API changes
- Added
Message.Contentproperty. [#2772, #2831] - Some properties and enum of
Messageclass are removed and moved toMessageContentclass. [#2772, #2831]- Removed
Message.Typeproperty. - Removed
Message.DateFieldproperty. - Removed
Message.MessageTypeenum.
- Removed
ITransportinterface and its implementations overhauled. [#2772, #2831]ITransport.SendMessageAsync(BoundPeer, Message, TimeSpan?, CancellationToken)method has changed toITransport.SendMessageAsync(BoundPeer, MessageContent, TimeSpan?, int, bool, CancellationToken).ITransport.SendMessageAsync(BoundPeer, Message, TimeSpan?, CancellationToken)method has changed toITransport.SendMessageAsync(BoundPeer, MessageContent, TimeSpan?, int, bool, CancellationToken).ITransport.BroadcastMessage(IEnumerable<BoundPeer>, Message)method has changed toITransport.BroadcastMessage(IEnumerable<BoundPeer>, MessageContent).ITransport.ReplyMessageAsync(Message, CancellationToken)method has changed toITransport.ReplyMessageAsync(MessageContent, byte[], CancellationToken).
- Removed
InvalidMessageExceptionclass. Instead, addedInvalidMessageContentExceptionclass. [#2772, #2831]
Added APIs
- Added
MessageContentclass. [#2772, #2831]- All messages (e.g.
PingMsg) became to inheritMessageContent(wereMessage).
- All messages (e.g.
Behavioral changes
IBlockPolicyis no longer enforced for genesisBlock<T>s. [#2845]
Version 0.49.3
Released on March 14, 2023.
- Ported changes from Libplanet 0.48.1 release. [#2933]
Version 0.49.2
Released on March 3, 2023.
- General logging changes for better comprehension. [#2874]
Version 0.49.1
Released on February 24, 2023.
- (Libplanet.Net) Reduced logging due output being too verbose. [#2849]
Version 0.49.0
Released on February 20, 2023.
Backward-incompatible API changes
- (Libplanet.Net) Changed
BlockCandidateTable<T>.Add(BlockHeader, IEnumerable<Block<T>>)toBlockCandidateTable<T>.Add(BlockHeader, Branch<T>). [#2822] - (Libplanet.Net) Changed the return type of
BlockCandidateTable<T>.GetCurrentRoundCandidate()fromList<Block<T>>?toBranch<T>?. [#2822]
Added APIs
- Added
Branch<T>class to represent a sequence of consecutiveBlock<T>s. [#2822]
Behavioral changes
Swarm<T>became not to spawn multiple task for processBlockDemandfor the sameBoundPeer. [#2808, #2814]
Bug fixes
- Fixed a bug where
NetMQTransport's overall throughput had been dropped when hostname resolving for some peers was delayed. [#2817]
Version 0.48.1
Released on March 14, 2023.
- Ported changes from Libplanet 0.47.1 release. [#2931]
Version 0.48.0
Released on February 14, 2023.
Backward-incompatible API changes
- Removed
BlockCandidateTable<T>.Any()method. [#2794] - Changed the return type from
SortedList<long, Block<T>>?toList<Block<T>>?forBlockCandidateTable<T>.GetCurrentRoundCandidate()method. [#2794] - Changed the behavior of
BlockCandidateTable<T>.Add()method. [#2794] - Changed
TxIdto implementIBencodableinterface. [#2795]
Added APIs
- Added
Serializableattribute back toAddress. [#2798] - (Libplanet.Net) Added
Serializableattribute back toBoundPeer. [#2798] - (@planetarium/tx) Added
encodeUnsignedTxWithCustomActions()function. [#2805] - (@planetarium/tx) Added
CustomActiontype. [#2805] - (@planetarium/tx) Added
UnsignedTxWithCustomActionstype. [#2805]
Behavioral changes
- (Libplanet.Net) Changed
Swarm<T>to respond to aGetBlocksMsgrequest with an emptyBlocksMsgif no requestedBlock<T>s are found. [#2800, #2803]
Dependencies
- (@planetarium/tx) Because
globalThis.cryptoAPI is available since Node.js version 19.0.0, it now explicitly requires 19.0.0 or later. [#2805]
Version 0.47.1
Released on March 14, 2023.
- Ported changes from Libplanet 0.46.2 and Libplanet 0.46.3. [#2929]
Version 0.47.0
Released on February 6, 2023.
Backward-incompatible API changes
- The signature of
Address(ImmutableArray<byte>)constructor becameAddress(in ImmutableArray<byte>). [#2756] - The signature of
BlockHash(ImmutableArray<byte>)constructor becameBlockHash(in ImmutableArray<byte>). [#2756] - The signature of
Nonce(ImmutableArray<byte>)constructor becameNonce(in ImmutableArray<byte>). [#2756] - Removed
IAccountStateView.GetValidatorSet()method. [#2733] - Removed
IAccountStateDelta.SetValidator(Validator)method. [#2733] - (Libplanet.Extensions.Cocona) Dropped .NET Standard 2.0 and .NET Core 3.1 target assemblies. [#2732]
- (Libplanet.Extensions.Cocona) Added .NET 6 target assembly. [#2732]
- (Libplanet.Net) Added
ITransport.AppProtocolVersion,ITransport.TrustedAppProtocolVersionSigners, andITransport.DifferentAppProtocolVersionEncounteredproperties. [#2743] - (Libplanet.Net) Changed
Swarm<T>(BlockChain<T>, PrivateKey, AppProtocolVersionOptions, HostOptions, SwarmOptions)toSwarm<T>(BlockChain<T>, PrivateKey, ITransport, SwarmOptions). [#2743] - (Libplanet.Net) Changed the type for
AppProtocolVersionOptions.TrustedAppProtocolVersionSignersfromIImmutableHashSet<PublicKey>?toIImmutableHashSet<PublicKey>. [#2759] - (Libplanet.Net) Changed
BoundPeerto implementIBencodableinterface and removed[Serializable]attribute fromBoundPeer. [#2778] - (Libplanet.Net) Changed
BoundPeer(Dictionary)constructor's signature toBoundPeer(IValue). [#2778] - Changed
Addressto implementIBencodableinterface and removed[Serializable]attribute fromAddress. [#2778] - Changed
Address(Binary)constructor's signature toAddress(IValue). [#2778]
Added APIs
- Introduced Libplanet.Crypto.Secp256k1 package. [#2780]
- Many more types became serialized and deserialized better with
System.Text.Json.JsonSerializeras they now have their own custom converters. Note that these serializations are unavailable on Unity due to its incomplete reflection support. [#2756]- A
Noncebecame represented as a single hexadecimal string in JSON. - A
PublicKeybecame represented as a single hexadecimal string in JSON. - A
Block<T>became represented as an object with values in JSON.
- A
- Added
TxId(in ImmutableArray<byte>)constructor. [#2756] - Added
ByteUtil.ParseHexToImmutable()static method. [#2756]
Bug fixes
- Fixed a JSON serializer bug where a
Transaction<T>serialized into JSON had lacked the content of itsPublicKey. [#2756] - (Libplanet.Explorer) Fixed a bug where the query
stateQueryhadn't work correctly. [#2757] - Fixed a bug of
DefaultStore.PutTxExecution()where sometimesTxExecutiondata is in undefined state due to data corruption. [#2761] - (Libplanet.Node) Fixed a bug of
NodeUtils<T>.CreateGenesisBlock()where sometimes block data is in undefined state due to data corruption. [#2761] - Fixed where
Address(string)could accept 42 chars with a wrong prefix. [#2781] - Fixed where
VolatileStagePolicy<T>(TimeSpan)created withTimeSpan.MaxValueas its argument would not behave properly and throw anArgumentOutOfRangeException. [#2783, #2784]
Dependencies
- Upgrade Bencodex from 0.7.0-dev.20220923062845 to 0.8.0. [#2294]
- Upgrade Bencodex.Json from 0.7.0-dev.20220923062845 to 0.8.0. [#2294]
- Upgrade System.Text.Json from 6.0.6 to 6.0.7. [#2322]
CLI tools
- Added
planet blocksubcommand group. [#2758]- Added
planet block analyzesubcommand. - Added
planet block generate-genesissubcommand.
- Added
- Fixed a bug of
planet tx analyzesubcommand where a serialized transaction had lacked the content of its"publicKey". [#2756]
Version 0.46.3
Released on March 14, 2023.
- Fixed
Validator.Encodedto be more compact. [#2927]
Version 0.46.2
Released on February 16th, 2023.
- Fix memory issues when preloading. [#2804]
Version 0.46.1
Released on February 3, 2023.
- Ported changes from Libplanet 0.45.5 release.
- General changes to log output for readability. [#2769]
Version 0.46.0
Released on January 18th, 2023.
Backward-incompatible API changes
- Changed
BlockLocatorto throw anArgumentExceptionif an empty set ofBlockHashes are given during construction. [#2584] BlockChain<T>()now explicitly requires bothstoreandstateStorearguments to be notnull. [#2609]BlockChain<T>.Swap()now throws anInvalidOperationExceptionif called on a non-canonical chain. [#2619]- Added
actionsLogsListparameter toTxSuccessconstructor. [#2474, #2505] - Added
actionsLogsListparameter toTxFailureconstructor. [#2474, #2505] - Removed
BlockLocator(Func<long, BlockHash?>, Func<BlockHash, long>, int)constructor. UseBlockLocator.Create()static method instead. [#2580, #2584] - Replaced
IAction?-typedpolicyBlockActionparameter withPolicyBlockActionGetter-typedpolicyBlockActionGetterparameter inActionEvaluatorconstructor. [#2646] - Removed
IStore.GetCanonicalGenesisBlock<T>()interface method and all its implementations. [#2664] - Replaced
IPreEvaluationBlockHeader-typedblockHeaderparameter withIActionTypeLoaderContext-typedcontextparameter in the below methods. [#2653]IActionTypeLoader.Load().IActionTypeLoader.LoadAllActionTypes().
- Added
IAccountStateDelta.SetValidator(Validator)method. [#2716] - Added
IAccountStateView.GetValidatorSet()method. [#2716] - Added
IBlockChainStates.GetValidatorSet(BlockHash, ValidatorSetStateCompleter<T>)method. [#2716]- Added
BlockChain.GetValidatorSet(BlockHash, ValidatorSetStateCompleter<T>)method. - Added
BlockChainStates.GetValidatorSet(BlockHash, ValidatorSetStateCompleter<T>)method.
- Added
- Added
StateCompleterSet.ValidatorSetStateCompleterproperty. [#2716] - (Libplanet.Net) Removed
workersparameter fromNetMQTransport.Create()method andSwarm<T>()constructor. [#2690] - (Libplanet.Net) Changed
Swarm<T>()andNetMQTransport.Create()to takeAppProtocolVersionOptionsas a combined parameter instead of takingAppProtocolVersion,IImmutableSet<PublicKey>?, andDifferentAppProtocolVersionEncounteredseparately. [#2693] - (Libplanet.Net) Changed
Swarm<T>()andNetMQTransport.Create()to takeHostOptionsas a combined parameter instead of takingstring?,IEnumerable<IceServer>?, andint?separately. [#2701]
Added APIs
- Added
TxExecution.ActionsLogsListproperty. [#2474, #2505] - Added
ActionEvaluation.Logsproperty. [#2474, #2505] - (Libplanet.Explorer) Added
TxResult.ActionsLogsListproperty. [#2474, #2505] - (Libplanet.Explorer) Added
actionsLogsListfield toTxResultType. [#2474, #2505] - Added
BlockLocator.Create()static method. [#2584] - Added
PolicyBlockActionGetterdelegator type. [#2646] - Added
IActionTypeLoader.LoadAllActionTypes()method. [#2646]- Added
StaticActionTypeLoader.LoadAllActionTypes()method.
- Added
- Added
IActionTypeLoaderContextinterface. [#2653] - Added
AppProtocolVersionOptionsclass. [#2693] - Added
HostOptionsclass. [#2701] - Added
Validatorclass. [#2716] - Added
ValidatorSetclass. [#2716] - Added
SetValidatorclass. [#2716] - Added
ValidatorSetGetterdelegate. [#2716] - Added
ValidatorSetStateCompleter<T>delegate. [#2716] - Added
ValidatorSetStateCompleters<T>class. [#2716] - (Libplanet.Explorer) Added
ValidatorTypeclass. [#2716] - (Libplanet.Explorer) Added
validatorsquery inStateQuery. [#2716]
Behavioral changes
- Changed
BlockChain<T>.FindNextHashes()to return at mostcountnumber ofBlockHashes regardless of the result.BlockChain<T>. [#2581, #2584] - Changed
BlockChain<T>.FindNextHashes()to return zeroBlockHashes if no branch pointBlockHashis found instead of returningBlockHashes starting with the genesisBlockHash. [#2582, #2584] - Changed the behavior of
BlockLocatorindex selection and sampling when creating an instance. [#2583, #2584] - Changed the default
VolatileStagePolicy<T>.Lifetimefrom 3 hours to 10 minutes. [#2718]
Bug fixes
- (Libplanet.Net) Fixed a bug
NetMQTransportlog shows socket count wrongly. [#2708] - (Libplanet.Net) Fixed a bug where
NetMQTransport.SendMessageAsync()method hadn't disposed of internal sockets properly when connecting failed. [#2719]
CLI tools
- Fixed a bug
planet storehad not recognized RocksDB store (rocksdb+file:). [#2699] - Added
planet store chain-idssubcommand. [#2699, #2704] - Added
-P/--public-keyoption toplanet key derivesubcommand. [#2705]
Version 0.45.5
Released on January 19, 2023.
- Fixed a bug when
Web3KeyStore.Get()hadn't worked properly on IL2CPP environment. [#2727] - Back-ported below changes from Libplanet 0.46.0 release.
- (Libplanet.Net) Fixed a bug
NetMQTransportlog shows socket count wrongly. [#2708] - (Libplanet.Net) Fixed a bug where
NetMQTransport.SendMessageAsync()method hadn't disposed of internal sockets properly when connecting failed. [#2719] - (Libplanet.Net)
BoundPeer()constructor became to validate a hostname ofendPointparameter. [#2721]
- (Libplanet.Net) Fixed a bug
Version 0.45.4
Released on January 4, 2023.
- Ported changes from [Libplaent 0.44.7] release. [#2684]
Version 0.45.3
Released on December 26, 2022.
- Ported changes from Libplanet 0.44.6 release. [#2667]
Version 0.45.2
Released on December 21, 2022.
- Ported changes from Libplanet 0.44.5 release. [#2654]
Version 0.45.1
Released on December 15, 2022.
- Ported changes from Libplanet 0.44.4 release. [#2631]
- (Libplanet.Net) Fixed a bug where
NetMQTransport.SendMessageAsync()hadn't been canceled properly. [#2641]
Version 0.45.0
Released on December 3, 2022.
Deprecated APIs
- Removed
BlockChain<T>.MineBlock(PrivateKey, DateTimeOffset, bool, long, int, int, IComparer<Transaction<T>>, CancellationToken?)by making itinternal. [#2529] - Removed
IStore.SetBlockPerceivedTime()andIStore.GetBlockPerceivedTime()methods. [#2575] - Removed
BlockPerceptionstruct. [#2575] - Removed
BlockChain<T>.PerceiveBlock()method. [#2575]
Backward-incompatible API changes
- Changed
BlockChain<T>.MineBlock(PrivateKey, DateTimeOffset?, bool?, long?, int?, int?, IComparer<Transaction<T>>, CancellationToken?)toBlockChain<T>.MineBlock(PrivateKey, DateTimeOffset?, bool?, IComparer<Transaction<T>>, CancellationToken?)by removing policy controlled parameters. [#2529] - Changed
BlockPolicy<T>()constructor to take additionalFunc<long, int>type parameter namedgetMinBlockProtocolVersion. [#2593]
Added APIs
- Added
BlockChainStates<T>class. [#2507] - Added new constructors of
BlockChain<T>takesIBlockChainStates<T>andActionEvaluator<T>directly. [#2507] - Added non-generic interfaces. [#2539]
- Added
IPreEvaluationBlockinterface. - Added
IBlockContentinterface. - Added
ITransactioninterface.
- Added
- Added
IActionTypeLoaderinterface. [#2539] - Added
StaticActionTypeLoaderclass. [#2539] - (Libplanet.Explorer) Added a new GraphQL endpoint on
/graphql/explorer. [#2562] - Added
IBlockPolicy.GetMinBlockProtocolVersion()interface method. [#2593]
Bug fixes
- (Libplanet.Net) Fixed a bug where
AppProtocolVersion.GetHashCode()did not work as intended. [#2518, #2520]
Dependencies
- Replaced BouncyCastle.NetCore 1.8.6 with BouncyCastle.Cryptography 2.0.0. [#2571]
CLI tools
- Now
planetcan be installed using Homebrew on macOS:brew install planetarium/brew/planet. [#2555] - Now
planetsupports command-line completion for bash and zsh. See also Cocona's manual on configuring command-line completion. [#2586] - (Libplanet.Explorer) Added
servesubcommand. [#2563]- (Libplanet.Explorer) Deprecated primary command.
It will be obsoleted in 0.47.0 release.
You should use
servecommand instead. [#2563]
- (Libplanet.Explorer) Deprecated primary command.
It will be obsoleted in 0.47.0 release.
You should use
- (Libplanet.Explorer) Added
schemasubcommand. [#2563]
Version 0.44.7
Released on January 4, 2023.
- (Libplanet.Net) Fixed bugs where
NetMQTransporthadn't worked expected when not many threads were available. [#2684] - (Libplanet.Net) Fixed a bug where
NetMQTransport.ReplyMessageAsync()hadn't worked properly. [#2684]
Version 0.44.6
Released on December 26, 2022.
- (Libplanet.Net) Fixed a bug where
NetMQTransporthadn't worked properly on Windows. [#2667] - Fixed a scope of readlock on
BlockChain<T>.GetBlockLocator()method for sake of parallelism. [#2667]
Version 0.44.5
Released on December 21, 2022.
- Improved overall performance of
NetMQTransportandSwarm<T>classes. [#2654]
Version 0.44.4
Released on December 15, 2022.
- Improved overall performance of
NetMQTransportandTxCompletion<T>classes. [#2631]
Version 0.44.3
Released on December 1, 2022.
- Fixed a bug of
TxMetadata.ToBencodex()method where the encoded timestamp had differed fromTxMetadata.Timestampwhen it has non-zero time zone offset. [#2598]
Version 0.44.2
Released on November 29, 2022.
- Improved performance of
.Iterate()and.GetNextTxNonce()ofVolatileStagePolicy. [#2589]
Version 0.44.1
Released on November 7, 2022.
- (Libplanet.Net) Fixed a bug where
NetMQTransport.SendMessageAsnyc()had hung forever when given peer information isn't valid. [#2424, #2521]
Version 0.44.0
Released on November 2, 2022.
Backward-incompatible API changes
- Removed all
TxMetadata.ToBencodex()overload methods with parameters. Use newly introduced parameterlessTxMetadata.ToBencodex()instead. [#2457] - (Libplanet.Node) Changed
UntypedTransaction(ITxMetadata, IEnumerable<IValue>, ImmutableArray<byte>)toUntypedTransaction( ITxMetadata, IValue?, IValue?, ImmutableArray<byte>) to supportTransaction<T>.SystemAction. [#2456, #2457] - (Libplanet.Node) Renamed
UntypedTransaction.ActionValuestoUntypedTransaction.CustomActionsValueand changed its type fromIReadOnlyList<IValue>toIValue?. [#2456, #2457]
Added APIs
- (Libplanet.Explorer) Added
jsonfield toActionTypeGraphQL type. [#2418] - (Libplanet.Node) Added
IValue? SystemActionValueproperty toUntypedTransaction. [#2456, #2457]
Behavioral changes
Bug fixes
- (Libplanet.Explorer)
Libplanet.Explorer.Executablebecame to work again. [#2420]
CLI tools
- Added builds for Apple Silicon to releases. [#2365]
Version 0.43.3
Released on November 7, 2022.
- (Libplanet.Net) Fixed a bug where
NetMQTransport.SendMessageAsnyc()had hung forever when given peer information isn't valid. [#2424, #2521]
Version 0.43.2
Released on November 1, 2022.
- (Libplanet.RocksDBStore)
RocksDBStoreno more crashes with stack overflow during iterating block indices even if a chain is deeply nested (due to forks). [#2338, #2379]
Version 0.43.1
Released on October 17, 2022.
Added APIs
- (Libplanet.Explorer) Added
TxResultType.UpdatedStateTypeandTxResultType.FungibleAssetBalancesTypeGraphQL types. [#2405]
Version 0.43.0
Released on October 14, 2022.
Since 0.43.0, we officially provide @planetarium/tx, an npm package for creating unsigned transactions in JavaScript/TypeScript. Although it is still in experimental stage, which can build only unsigned transactions with a system action, its features will be added more in the future.
Backward-incompatible API changes
- Removed
DateTimeOffset?type parameter that allowed a creation of a genesisBlock<T>with specific timestamp fromBlockChain<T>.MakeGenesisBlock(). [#2321] - Overhauled constructors for
BlockMetadata,BlockContent<T>,PreEvaluationBlockHeader,PreEvaluationBlock<T>,BlockHeader, andBlock<T>. [#2321]- All unsafe constructors have been removed in order to prevent instantiation of invalid block related objects.
BlockMetadatahas constructorsBlockMetadata(IBlockMetadata)andBlockMetadata(long, DateTimeOffset, PublicKey, long, BigInteger, BlockHash?, HashDigest<SHA256>).BlockContenthas constructorsBlockContent<T>(IBlockMetadata, IEnumerable<Transaction<T>> transactions),BlockContent<T>(BlockMetadata)andBlockContent<T>(BlockMetadata, IEnumerable<Trnasaction<T>> transactions).PreEvaluationBlockHeaderhas constructorsPreEvaluationBlockHeader(IPreEvaluationBlockHeader)andPreEvaluationBlockHeader(BlockMetadata, (Nonce, ImmutableArray<byte>)).PreEvaluationBlock<T>has constructorsPreEvaluationBlock<T>(IPreEvaluationBlockHeader, IEnumerable<Transaction<T>>)andPreEvaluatoinBlock<T>(BlockContent<T>, (Nonce, ImmutableArray<byte>)).BlockHeaderhas constructorsBlockHeader(IBlockHeader)andBlockHeader(PreEvaluationBlockHeader, (HashDigest<SHA256>, ImmutableArray<byte>?, BlockHash)).Block<T>has constructorsBlock<T>(IBlockHeader, IEnumerable<Transaction<T>>)andBlock<T>(PreEvaluationBlock<T>, (HashDigest<SHA256>, ImmutableArray<byte>, BlockHash)).
BlockContent<T>no longer inheritsBlockMetadataandPreEvaluationBlock<T>no longer inheritsPreEvaluationBlockHeader. [#2321]- Both
BlockMetadataandBlockContent<T>are made immutable. Their properties can no longer be assigned to. [#2321] - Copy extension methods for
BlockMetadataandBlockContent<T>removed. [#2321] - (Libplanet.Extensions.Cocona) The return type of
Utils.DeserializeHumanReadable<T>()static method becameT?(wasT). [#2322]
Added APIs
- System actions now have methods to check equality. [#2294]
Mintnow implementsIEquatable<Mint>.Mintnow implementsIEquatable<IAction>.Transfernow implementsIEquatable<Transfer>.Transfernow implementsIEquatable<IAction>.
- (Libplanet.Net) Added
IRoutingTableinterface. [#2046, #2229] - (Libplanet.Net)
RoutingTablenow implementsIRoutingTableinterface. [#2046, #2229] - Added
ActionEvaluator<T>.GenerateRandomSeed()static method. [#2131, #2236] - Each
BlockMetadata,PreEvaluationBlockHeader, andBlockHeadercan be accessed from any "larger" type object through properties. [#2321]BlockMetadatacan be accessed throughBlockContent<T>.MetadataorPreEvaluationBlockHeader.Metadata.PreEvaluationBlockHeadercan be accessed throughPreEvaluationBlock<T>.HeaderorBlockHeader.Header.BlockHeadercan be accessed throughBlock<T>.Header(this has not changed, but only listed here for completeness in narrative).
- (Libplanet.Explorer) Added
updatedStates,updatedFungibleAssets,fungibleAssetsDeltaGraphQL fields toTxResultType. [#2353] - (Libplanet.Explorer) Added
nextNoncequery inTransactionQuery<T>. [#2356, #2366]
Behavioral changes
- Many types became serialized and deserialized better with
System.Text.Json.JsonSerializeras they now have their own custom converters. Note that these serializations are unavailable on Unity due to its incomplete reflection support. [#2294, #2322]- An
Addressbecame represented as a single hexadecimal string in JSON. [#2322] - A
BlockHashbecame represented as a single hexadecimal string in JSON. [#2322] - A
Currencybecame represented as an object with values in JSON. Note that it contains itsHashand it throwsJsonExceptionif a JSON object to deserialize has an inconsistentHashwith other field values. [#2322] - A
FungibleAssetValuebecame represented as an object with itsCurrencyobject andQuantitystring. [#2322] - A
HashDigest<T>became represented as a single hexadecimal string in JSON. [#2322] - A
Transaction<T>became represented as an object with values in JSON. [#2294] - A
TxIdbecame represented as a single hexadecimal string in JSON. [#2322] - System actions became represented as a Bencodex JSON Representation
of their
PlainValuewithtype_idfield. [#2294]
- An
- System actions'
GetHashCode()andEquals(object)methods now check value equality (rather than reference equality). [#2294] - A
ValidateAppProtocolVersionbecame allow validation of different extra. [#2380]
Bug fixes
- Interface methods
IComparable.CompareTo()andIComparable<T>.CompareTo()forAddressare now accessible. [#2384]
Dependencies
- Added @planetarium/tx npm package. [#2294]
- Now depends on Bencodex.Json 0.7.0-dev.20220923062846. [#2294]
- Upgrade Bencodex from 0.6.0 to 0.7.0-dev.20220923062845. [#2294]
- Upgrade System.Text.Json from 4.7.2 to 6.0.6. [#2322]
CLI tools
- Added
planet txsubcommand group. [#2294]- Added
planet tx analyzesubcommand. - Added
planet tx helpsubcommand.
- Added
Version 0.42.2
Released on September 29, 2022.
- (Libplanet.Explorer) Fixed a bug of
TransactionQuery<T>thatbindSignature()had errored ifunsignedTransactionhas a system action. [#2358]
Version 0.42.1
Released on September 23, 2022.
- Fixed a bug where
Transaction<T>.ToBencodex(bool)method had incorrectly serializedSystemAction. [#2339]
Version 0.42.0
Released on September 19, 2022.
Backward-incompatible API changes
- Renamed
BlockChain<T>.MakeTransaction(PrivateKey, IEnumerable<T>, IImmutableSet<Address>, DateTimeOffset?)method'sactionsparameter tocustomActions. [#2151, #2273] - Changed
IBlockPolicy.GetMaxBlockBytes()toIBlockPolicy.GetMaxTransactionBytes(). Behaviourally, this is now used as an upper limit for the encoded size ofBlock<T>.Transactionsinstead ofBlock<T>. [#2290, #2291]- (Libplanet.Explorer) Changed
Options.MaxBlockBytestoOptions.MaxTransactionsBytesandOptions.MaxGenesisBytestoOptions.MaxGenesisTransactionsBytes. - (Libplanet.Explorer) Changed executable argument
max-block-bytestomax-transactions-bytesandmax-genesis-bytestomax-genesis-transactions-bytes. - All public method parameter names
maxBlockByteschanged tomaxTransactionsBytes.
- (Libplanet.Explorer) Changed
Added APIs
Addressnow implementsIEquatable<Address>interface. [#2320]TxIdnow implementsIEquatable<TxId>interface. [#2320]- Added
BlockChain<T>.MakeTransaction(PrivateKey, IAction, IImmutableSet<Address>, DateTimeOffset?)overloaded method. [#2151, #2273] - Added
GetInnerActionTypeName()method. [#1910, #2189] - (Libplanet.Explorer) Added
LibplanetExplorerSchemaclass. [#2065, [#2198]]
Dependencies
Version 0.41.4
Released on September 29, 2022.
- (Libplanet.Explorer) Fixed a bug of
TransactionQuery<T>thatbindSignature()had errored ifunsignedTransactionhas a system action. [#2358]
Version 0.41.3
Released on September 23, 2022.
- Fixed a bug where
Transaction<T>.ToBencodex(bool)method had incorrectly serializedSystemAction. [#2339]
Version 0.41.2
Released on September 13, 2022.
- Fixed a bug where
NetMQTransportis not correctly disposed of due toNetMQTransport._routeralready being stopped in prior to_router.Unbind()call inNetMQTransport.Dispose(). [#2311]
Version 0.41.1
Released on August 31, 2022.
- Fixed a bug where
Transaction<T>.Create(long, PrivateKey, BlockHash?, IAction, IImmutableSet<Address>?, DateTimeOffset?)method had thrownArgumentNullExceptionwith valid arguments. [#2268, #2270]
Version 0.41.0
Released on August 26, 2022.
Deprecated APIs
- (Libplanet.Net) Removed
NetMQTransport()constructor. UseNetMQTransport.Create()instead. [#2215] - Unused
TcpMessageCodecclass removed. [#2216] - (Libplanet.Stun) Removed
TurnClient.IsConnectable()method. [#2219] - (Libplanet.Stun) Removed
TurnClient.BindProxies()method. [#2219] - (Libplanet.Stun) Removed
TurnClient()constructor. UseTurnClient.Create()instead. [#2219] - (Libplanet.Net) Removed
Peerclass. UseBoundPeerinstead. [#2233]
Backward-incompatible API changes
- Removed unused transaction related methods from
IStoreand its implementations. [#1538, #2201]IterateTransactionIds()DeleteTransaction()CountTransactions()
- Removed
Currency(string, byte, IImutableSet<Address>?)constructor. [#2200] - Removed
Currency(string, byte, Address?)constructor. [#2200] - Added static methods of
Currencythat defines different kinds ofCurrency. [#2200]- Added
Currency.Capped(string, byte, (BigInteger, BigInteger), IImutableSet<Address>?)static method which defines an instance ofCurrencywith a hard limit on the maximum minted supply. - Added
Currency.Capped(string, byte, (BigInteger, BigInteger), Address)static method which defines an instance ofCurrencywith a hard limit on the maximum minted supply. - Added
Currency.Uncapped(string, byte, IImutableSet<Address>?)static method which defines an instance ofCurrencywithout an enforced maximum supply limit. - Added
Currency.Uncapped(string, byte, Address)static method which defines an instance ofCurrencywithout an enforced maximum supply limit. - OBSOLETE, ONLY FOR LEGACY SUPPORT: Added
Currency.Legacy(string, byte, IImutableSet<Address>?)static method which defines a legacyCurrencyinstance which is compatible withCurrencyinstances defined before total supply tracking support was introduced. - OBSOLETE, ONLY FOR LEGACY SUPPORT: Added
Currency.Legacy(string, byte, Address)static method which defines a legacyCurrencyinstance which is compatible withCurrencyinstances defined before total supply tracking support was introduced. - NOTE: if you already have some
Currencyinstances defined in prior to the addition of total supply tracking on a live chain, you cannot modify the already-definedCurrencyinstances as a capped or uncappedCurrencybut have to define them withCurrency.Legacy()as the new Currency kinds are internally backwards-incompatible with the legacyCurrency.
- Added
- Added
IAccountStateDelta.TotalSupplyUpdatedCurrenciesproperty. [#915, #2200] - Added
IAccountStateView.GetTotalSupply(Currency)method. [#915, #2200] - Added
IBlockChainStates<T>.GetTotalSupply(Currency, BlockHash, TotalSupplyStateCompleter<T>method which gets the total supply of aCurrencyinFungibleAssetValuefrom the state, and if not found, returns null. [#915, #2200] - (Libplanet.Net)
ITransport.AsPeerandSwarm<T>.AsPeertype changed fromPeertoBoundPeer. [#2215] - (Libplanet.Net) All public return type, parameter type, and property type
of
Peerchanged toBoundPeer. [#2228] - (Libplanet.Net) Additional public return type, parameter type, and
property type of
Peerthat weren't handled by #2228 changed toBoundPeer. [#2233] - Reworked constructors of exception classes. Affected classes are:
- (Libplanet.Net)
PingTimeoutException CurrencyPermissionException,DuplicateActionTypeIdentifierException,InsufficientBalanceException,InvalidBlockPreEvaluationHashException,InvalidBlockProtocolVersionException,InvalidBlockPublicKeyException,InvalidBlockSignatureException,InvalidBlockStateRootHashException,InvalidBlockTotalDifficultyException,InvalidGenesisBlockException,InvalidTxException,InvalidTxGenesisHashException,InvalidTxIdException,InvalidTxNonceException,InvalidTxSignatureException,MissingActionTypeException,NoKeyException,SupplyOverflowException,TotalSupplyNotTrackableException,TxPolicyViolationException,UnexpectedlyTerminatedActionException. [#2239, #2241]
- (Libplanet.Net)
Added APIs
- Added
Currency.MaximumSupplyproperty. [#915, #2200] - Added
Currency.TotalSupplyTrackablefield. [#915, #2200] - Added
SupplyOverflowExceptionclass. [#915, #2200] - Added
TotalSupplyGetterdelegate. [#915, #2200] - Added
TotalSupplyStateCompleter<T>delegate. [#915, #2200] - Added
TotalSupplyStateCompleters<T>static class. [#915, #2200] - Added
StateCompleterSet<T>.TotalSupplyStateCompleterproperty. [#915, #2200] - (Libplanet.Net) Added
BoundPeer.PeerStringproperty. [#2187, #2232] - (Libplanet.Stun) Added
IIceServerinterface. [#2219] - (Libplanet.Stun) Added
TurnClient.Create()static method. [#2219] - (Libplanet.Explorer) Added
stateQueryfield to the root node of GraphQL endpoint. [#2149, #2227] - (Libplanet.Explorer) Added
blockPolicyfield to the root node of GraphQL endpoint. [#2149, #2227] - (Libplanet.Explorer) Added
CurrencyTypeclass. In GraphQL, it corresponds toCurrencytype. [#2149, #2227] - (Libplanet.Explorer) Added
FungibleAssetValueTypeclass. In GraphQL, it corresponds toFungibleAssetValuetype. [#2149, #2227] - (Libplanet.Explorer) Added
StateQuery<T>class. In GraphQL, it corresponds toStateQuerytype. [#2149, #2227] - (Libplanet.Explorer) Added
BlockPolicyType<T>class. In GraphQL, it corresponds toBlockPolicytype. [#2149, #2227]
Behavioral changes
- Bencodex related methods in
Currencynow accounts for the maximum supply and total supply tracking. [#915, #2200]- For capped currencies,
Currency.Serialize()method stores themajorandminorvalues of the maximum supply asIntegervalues under the keysmaximumSupplyMajorandmaximumSupplyMinor. For uncapped and legacy untracked currencies, the entries are omitted. Currency(IValue)constructor now looks for the maximum supply and total supply trackability in the given dictionary and restores them if found.
- For capped currencies,
Currency's implementation ofISerializablenow accounts for the maximum supply and total supply tracking. [#915, #2200]Currency's implementation ofISerializable.GetObjectDatanow stores the maximum supply if theCurrencyis capped.Currency(SerializationInfo, StreamingContext)constructor now looks for the maximum supply and total supply trackability and restores it if found.
IAccountStateDelta.MintAsset(Address, FungibleAssetValue)andIAccountStateDelta.BurnAsset(Address, FungibleAssetValue)methods now track the total supply if the total supply of theCurrencyis trackable. [#915, #2200]IAccountStateDelta.MintAsset(Address, FungibleAssetValue)method now throwsSupplyOverflowExceptionif the sum of current total supply and the value to be minted exceeds the maximum supply of theCurrencyinstance.
- (Libplanet.Net)
NetMQTransport's general behavior has changed. [#2215]NetMQTransportis now able to send requests and receive replies as soon as it is created throughNetMQTransport.Create()factory method.NetMQTransport.StartAsync()enables aNetMQTransportinstance to receive requests and send replies.NetMQTransport.StopAsync()only disables aNetMQTransportinstance to stop receiving requests and sending replies.
Version 0.40.3
Released on September 29, 2022.
- (Libplanet.Explorer) Fixed a bug of
TransactionQuery<T>thatbindSignature()had errored ifunsignedTransactionhas a system action. [#2358]
Version 0.40.2
Released on September 23, 2022.
- Fixed a bug where
Transaction<T>.ToBencodex(bool)method had incorrectly serializedSystemAction. [#2339]
Version 0.40.1
Released on August 31, 2022.
- Fixed a bug where
Transaction<T>.Create(long, PrivateKey, BlockHash?, IAction, IImmutableSet<Address>?, DateTimeOffset?)method had thrownArgumentNullExceptionwith valid arguments. [#2268]
Version 0.40.0
Released on August 12, 2022.
Deprecated APIs
Transaction<T>(long, Address, PublicKey, BlockHash?, IImmutableSet<Address>, DateTimeOffset, IEnumerable<T>, byte[])constructor is now deprecated. UseTransaction<T>(ITxMetadata, IEnumerable<T>, byte[])constructor orTransaction<T>.Create()static method instead. [#2175]Transaction<T>.Actionsproperty is now deprecated. UseTransaction<T>.SystemActionproperty orTransaction<T>.CustomActionsproperty instead. [#2149, #2151, #2175]IPreEvaluationBlockHeader.HashAlgorithmproperty and its implementations removed. [#2206, #2207]IBlockPolicy.GetHashAlgorithm(long)method and its implementations removed. [#2206, #2207]InvalidBlockHashAlgorithmTypeExceptionclass removed. [#2206, #2207]HashAlgorithmGetterdelegate removed. [#2206, #2207]
Backward-incompatible API changes
- The type of
Transaction<T>.Actionsproperty becameIImmutableList<IAction>(wasIImmutableList<T>whereT : IAction, new()). [#2149, #2151, #2175] - Renamed parameters named
actionsof many methods tocustomActions. [#2149, #2151, #2175]- Renamed
Transaction<T>(ITxMetadata, IEnumerable<T>, byte[])constructor's parameteractionstocustomActions. - Renamed
Transaction<T>(long, Address, PublicKey, BlockHash?, IImmutableSet<Address>, DateTimeOffset, IEnumerable<T>, byte[])constructor's parameteractionstocustomActions. - Renamed
Transaction<T>.Create(long, PrivateKey, BlockHash?, IEnumerable<T>, IImmutableSet<Address>?, DateTimeOffset?)static method's parameteractionstocustomActions. - Renamed
Transaction<T>.CreateUnsigned(long, PrivateKey, BlockHash?, IEnumerable<T>, IImmutableSet<Address>?, DateTimeOffset?)static method's parameteractionstocustomActions. - Renamed
TxMetadata.ToBencodex(IEnumerable<IValue>, IImmutableArray<byte>?)method's parameteractionstocustomActions.
- Renamed
- Added
IBlockPolicy<T>.NativeTokensproperty. [#2149, #2150, #2175] - Added option
IImmutableSet<Currency>? nativeTokenstoBlockPolicy<T>()constructor as its last parameter. [#2149, #2150, #2175] - Added
IActionContext.IsNativeToken(Currency)method. [#2149, #2150, #2175] - Added parameter
Predicate<Currency> nativeTokenPredicateto allPreEvaluationBlock<T>.Evaluate()method as its second parameter (parameterIStateStore stateStoreremains at the last). [#2149, #2150, #2175] - Added parameter
Predicate<Currency> nativeTokenPredicateto allPreEvaluationBlock<T>.DetermineStateRootHash()overloads as their second parameter (existing second and rest parameters were shifted). [#2149, #2150, #2175] - Added parameter
Predicate<Currency> nativeTokenPredicatetoBlockChain<T>.MakeGenesisBlock()method as its last parameter. [#2149, #2150, #2175] - Added parameter
Predicate<Currency> nativeTokenPredicatetoActionEvaluator<T>()constructor as its last parameter. [#2149, #2150, #2175] - Removed
ChainIdNotFoundExceptionclass. [#2047, #2156] - Added
IStore.GetCanonicalGenesisBlock(HashAlgorithmGetter)method. [#2162, #2171] - Parameter
HashAlgorithmType hashAlgorithmremoved fromBlockChain<T>.MakeGenesisBlock()method. [#2206, #2207] - Parameter
HashAlgorithmType hashAlgorithmremoved fromBlockContent<T>.Mine()method. [#2206, #2207] - Parameter
HashAlgorithmType hashAlgorithmremoved fromPreEvaluationBlock<T>()constructors. [#2206, #2207] - Parameter
HashAlgorithmType hashAlgorithmremoved fromPreEvaluationBlockHeader<T>()constructors. [#2206, #2207] - Parameter
HashAlgorithmType hashAlgorithmremoved fromBlockMetadata<T>.DerivePreEvaluationHash()method. [#2206, #2207] - Parameter
HashAlgorithmType hashAlgorithmremoved fromBlockMetadata<T>.MineNonce()methods. [#2206, #2207] - Return type for
BlockMarshaler .UnmarshalPreEvaluationBlockHeader(Dictionary)changed from(BlockMetadata, Nonce, ImmutableArray<bytes>?)toPreEvaluationBlockHeader. Removed overload methodBlockMarshaler .UnmarshalPreEvaluationBlockHeader(HashAlgorithm, Dictionary). [#2206, #2207] - Parameter
HashAlgorithmGetter hashAlgorithmGetterremoved fromBlockMarshaler.UnmarshalBlockHeader()method. [#2206, #2207] - Parameter
HashAlgorithmGetter hashAlgorithmGetterremoved fromIStore<T>.GetCanonicalGenesisBlock<T>()andIStore<T>.GetBlock<T>()interface methods and their implementations. [#2206, #2207] - Parameter
HashAlgorithmGetter hashAlgorithmGetterremoved fromBlockSet<T>()constructor. [#2206, #2207] - Parameter
HashAlgorithmGetter hashAlgorithmGetterremoved fromBlockDigest.GetHeader()method. [#2206, #2207] - Parameter
HashAlgorithmGetter hashAlgorithmGetterremoved fromDelayedRenderer<T>()constructor. [#2206, #2207] - Parameter
HashAlgorithmGetter hashAlgorithmGetterremoved fromDelayedActionRenderer<T>()constructor. [#2206, #2207] - (Libplanet.Node) Parameter
HashAlgorithmGetter hashAlgorithmremoved fromUntypedBlock()constructor. [#2206, #2207]
Added APIs
- (Libplanet.Explorer) Added
TransactionMutation<T>class. [#2130] - (Libplanet.Explorer) Added
unsignedTransaction,bindSignatureandtransactionResultGraphQL fields toTransactionQuery<T>. [#2130] - Added
Transaction<T>.SystemActionproperty. [#2149, #2151, #2175] - Added
Transaction<T>.CustomActionsproperty. [#2149, #2151, #2175] - Added overloads to take
systemActionbesides the existing constructors and methods takingcustomActions. [#2149, #2151, #2175]- Added
Transaction<T>(ITxMetadata, IAction, byte[])overloaded constructor. - Added
Transaction<T>.Create(long, PrivateKey, BlockHash?, IAction, IImmutableSet<Address>?, DateTimeOffset?)overloaded static method. - Added
Transaction<T>.CreateUnsigned(long, PrivateKey, BlockHash?, IAction, IImmutableSet<Address>?, DateTimeOffset?)overloaded static method. - Added
TxMetadata.ToBencodex(IValue, ImmutableArray<byte>?)overloaded method.
- Added
- Introduced new system built-in actions. [#2149, #2150, #2175]
- Added
Mintclass. - Added
Transferclass.
- Added
- Added
NonNativeTokenExceptionclass. [#2149, #2150, #2175] - Added
BlockLocatorclass. [#1762, #2140] - Added methods required for decoupling Libplanet.Net from
Libplanet. [#1762, #2140]
- Added
BlockChain<T>.FindNextHashes(BlockLocator, BlockHash?, int)method. - Added
BlockChain<T>.Fork(BlockHash, bool)method. - Added
BlockChain<T>.GetBlockLocator(int)method.
- Added
- Added
IActionContext.GenesisHashproperty. [#1972, #2179] - Added
ActionEvaluator<T>.GenesisHashproperty. [#1972, #2179] - Added
IAccountStateViewinterface. [#2183] IAccountStateDeltanow inheritsIAccountStateViewinterface. [#2183]- Added
BlockMetadata.HashAlgorithmTypestatic property. [#2206, #2207] - Added
BlockMarshaler.UnmarshalNonce(Dictionary)andBlockMarshaler.UnmarshalPreEvaluationHash(Dictionary)methods. [#2206, #2207]
Behavioral changes
BlockChain<T>.PerceiveBlock()method now uses millisecond precision for perceive time of newly perceived blocks. [#2155, #2159]- Nonexistent chain ids in
IStoreare now considered to be chain ids of empty chains. [#2047, #2156] Libplanet.Explorernow targets .NET 6.0. [#2173]- Behavior of
Block<T>.GetHashCode()changed. [#2206, #2207]
Version 0.39.0
Released on July 18th, 2022.
Deprecated APIs
- (Libplanet.Net) Removed
TcpTransportclass. [#2139] - (Libplanet.Net) Removed
InvalidMagicCookieExceptionclass. [#2139] - (Libplanet.Net) Removed
SwarmOptions.TransportTypeproperty. [#2139] - (Libplanet.Node) Removed
InitConfig.TransportTypeproperty. [#2139]
Added APIs
- Added
DuplicateActionTypeIdentifierExceptionclass. [#2142]
Behavioral changes
- (Libplanet.Net) Raised the default value for
Swarm<T>()constructor'sworkersparameter to 100. [#2128, #2134] - (Libplanet.Explorer) Raised the default value for
workersconsole argument to 100. [#2128, #2134] PolymorphicAction<T>now allows subclasses ofTto be declared in the entry assembly of the application besides the same assembly asT. [#2136, #2142]PolymorphicAction<T>now throwsDuplicateActionTypeIdentifierExceptionwhen multiple subtypes ofTare associated with the sameActionTypeAttribute.TypeIdentifier. [#2142]
Bug fixes
- Fixed a bug where
PrivateKey()constructor had returned an invalid key less than 32 bytes. [#1696, #2091] - (Libplanet.Net) Invalid
Uri.UserInfowith multiple colons is now rejected byIceServer(Uri url)constructor and exception is thrown. [#2058, #2116]
CLI tools
- (Libplanet.Extensions.Cocona) Upgraded Cocona.Lite from 1.6.* to 2.0.*. [#2101]
- Implemented planet key derive, now you can get public key and address from private key directly! [#2108]
- (Libplanet.Extensions.Cocona) Removed
DerivationCommandclass. [#2118]
Version 0.38.0
Released on June 7th, 2022.
Backward-incompatible API changes
- (Libplanet.Net) Removed
usernameandcredentialparameters fromIceServer(string, string?, string?)andIceServer(Uri, string?, string?). [#2048, #2049] - (Libplanet.Net) Properties
IceServer.UsernameandIceServer.Credentialare no longer nullable. [#2048, #2049]
Added APIs
- (Libplanet.Node) Added
NetworkConfigclass. [#1946, #2000] - (Libplanet.Node) Added
NodeConfigclass. [#1946, #2000] - (Libplanet.Node) Added
NodeUtilsclass. [#2013] - (Libplanet.Node) Added
SwarmConfig,InitConfig,BootstrapConfigPreloadConfig, andSyncConfigclasses. [#2021]
Behavioral changes
- Added
PrivateKey(string)constructor for hexadecimal string. [#2012, #2022] - Allow
0xprefix forAddressclass constructor.DeriveAddressmethod will remove0xprefix string. [#2015, #2018]
Version 0.37.0
Released on May 30th, 2022.
Backward-incompatible API changes
- (Libplanet.Net) Removed
SwarmOptions.BootstrapDialTimeout. UseSwarmOptions.BootstrapOptions.DialTimeoutinstead. [#2024] - (Libplanet.Net) Added
Swarm<T>.BootstrapAsync(CancellationToken)which utilizes values stored inBootstrapOptions. [#2024] - (Libplanet.Net) Parameter name
depthchanged tosearchDepthforSwarm<T>.BootstrapAsync(IEnumerable<Peer>, TimeSpan?, int, CancellationToken)and made non-optional. [#2024] - (Libplanet.Net)
Swarm<T>.BootstrapAsync(IEnumerable<Peer>, depth, CancellationToken)removed. [#2024] - (Libplanet.Net) Removed
SwarmOptions.PreloadDialTimeout. UseSwarmOptions.PreloadOptions.DialTimeoutinstead. [#2025] - (Libplanet.Net) Added
Swarm<T>.PreloadAsync(IProgress<PreloadState>, bool, CancellationToken). [#2025] - (Libplanet.Net) Changed the order of parameters from
Swarm<T>(TimeSpan, IProgress<PreloadState>, bool, long, CancellationToken)toSwarm<T>( TimeSpan?, long, IProgress<PreloadState>, bool, CancellationToken)with default value fortipDeltaThresholdremoved. [#2025] - (Libplanet.Net) Parameter name
Urlschanged toUrlforIceServerand no longer accepts multiple Urls for single instance. [#2026]
Added APIs
- (Libplanet.Net) Added
BootstrapOptionsclass. [#2024] - (Libplanet.Net) Added
BootstrapOptionsproperty toSwarmOptions. [#2024] - (Libplanet.Net) Added
PreloadOptionsclass. [#2025] - (Libplanet.Net) Added
PreloadOptionsproperty toSwarmOptions. [#2025]
Version 0.36.1
Released on May 26th, 2022.
- Fixed
Transaction<T>()constructor's bug that it had thrownKeyNotFoundExceptionwhen a Bencodex dictionary without signature. [#2005]
Version 0.36.0
Released on May 25th, 2022.
Backward-incompatible API changes
- Removed
InvalidTxPublicKeyExceptionclass. [#1164, #1978] - (Libplanet.Net) Property
SwarmOptions.BlockDownloadTimeoutremoved. [#1981, #1982] - (Libplanet.Net)
Swarm<T>.BootstrapAsync(IEnumerable<Peer>, TimeSpan?, TimeSpan?, int, CancellationToken)changed toSwarm<T>.BootstrapAsync( IEnumerable<Peer>, TimeSpan?, int, CancellationToken). ParameterdialTimeoutnow gets used for both oldpingSeedTimeoutandfindNeighborsTimeout. [#1990] - (Libplanet.Net)
IProtocol.BootstrapAsync(IEnumerable<BoundPeer>, TimeSpan?, TimeSpan?, int, CancellationToken)changed toIProtocol.BootstrapAsync( IEnumerable<Peer>, TimeSpan?, int, CancellationToken). ParameterdialTimeoutnow gets used for both oldpingSeedTimeoutandfindNeighborsTimeout. [#1990]
Added APIs
- Introduced Libplanet.Node package. [#1974, #1978]
- Added
ITxMetadatainterface. [#1164, #1974, #1978] - Added
TxMetadataclass. [#1164, #1974, #1978] - Added
ITxExcerptinterface. [#1164, #1974, #1978] - Added
TxExcerptExtensionsstatic class. [#1164, #1974, #1978] Transaction<T>now implementsITxExcerptinterface. [#1164, #1974, #1978]- Added
Transaction<T>(ITxMetadata, IEnumerable<T>, byte[])constructor. [#1164, #1978] - Added
TxId.FromString()static method. [#1978] - (Libplanet.Node) Added
UntypedTransactionclass. [#1974, #1978] - (Libplanet.Node) Added
UntypedBlockclass. [#1974, #1978]
Behavioral changes
Transaction<T>(long, Address, PublicKey, BlockHash?, IImmutableSet<Address>, DateTimeOffset, IEnumerable<T>, byte[])constructor became to ignore its second parameterAddress signer. Instead,Transaction<T>.Signerproperty is now automatically derived from itsPublicKey. [#1164, #1978]
Bug fixes
- Fixed
InvalidOperationExceptionthrown byPublicKey.Verify()method ifsignatureis adefault(ImmutableArray<byte>). Instead, it silently returnsfalsenow. [#1978] - Fixed
NullReferenceExceptionthrown byByteUtil.Hex(in ImmutabelArray<byte>)method if adefault(ImmutableArray<byte>)is present. Instead, it silently returns an empty string now. [#1978] - Fixed a
TxId(byte[])constructor's bug whereParamNameandMessageofArgumentOutOfRangeExceptionit had thrown had been reversed. [#1978]
Version 0.35.1
Released on May 23rd, 2022.
Bug fixes
- (Libplanet.Net) Wrongly assigned default value to
TimeoutOptions.PreloadDialTimeoutfixed. [#1983]
Version 0.35.0
Released on May 20th, 2022.
Deprecated APIs
- (Libplanet.Net) Unused property
SwarmOptions.PollIntervalremoved. [#1962]
Backward-incompatible API changes
BlockCompletion<TPeer, TAction>.Complete()no longer accepts neither parameterTimeSpan singleSessionTimeoutnorint millisecondsSingleSessionTimeoutto regulate a single session length. [#1961]- (Libplanet.Net) General API changes made to
Swarm<T>.BootstrapAsync(),Swarm<T>.PreloadAsync(), andSwarm<T>.StartAsync(). [#1962]Swarm<T>.BootstrapAsync(IEnumerable<Peer>, double, double, int, CancellationToken)replaced withSwarm<T>.BootstrapAsync(IEnumerable<Peer>, int, CancellationToken)which uses default values provided bySwarmOptionsforpingSeedTimeoutandfindPeerTimeout.Swarm<T>.StartAsync(int, int, int CancellationToken)replaced withSwarm<T>.StartAsync(CancellationToken)which uses default values provided bySwarmOptionsformillisecondsDialTimeout,millisecondsBroadcastBlockIntervalandmillisecondsBroadcastTxInterval.Swarm<T>.PreloadAsync(IProgress<PreloadState>, bool, long, CancellationToken)overload method added andSwarm<T>.PreloadAsync(TimeSpan?, IProgress<PreloadState>, bool long, CancellationToken)changed toSwarm<T>.PreloadAsync( TimeSpan, IProgress<PreloadState>, bool, long, CancellationToken)
- (Libplanet.Net)
TimeoutOptionsproperty added toSwarmOptionswith all timeout related options moved fromSwarmOptionstoTimeoutOptions. [#1957, #1962]
Added APIs
- Added
StoreLoaderdelegate. [#1359, #1953, #1955] - Added
StoreLoaderAttributeclass. [#1359, #1953, #1955] - Added
TrieStateStore.Secureproperty. [#1955] - Added
NameValueCollectionExtensionsstatic class. [#1955] - Type support for
Guidadded toDataModel. [#1959, #1960] TimeoutOptionsclass added. [#1957, #1962]SwarmOptions.BlockBroadcastIntervalandSwarmOptions.TxBroadcastIntervalproperties added. [#1962]TimeSpanExtensions.Multiply()method added. [#1966]
Behavioral changes
DefaultStoreandDefaultKeyValueStore-backedTrieStateStorenow can be instantiated with URI schemedefault+file:usingStoreLoaderAttribute.LoadStore()method. [#1359, #1953, #1955]MemoryStoreandMemoryKeyValueStore-backedTrieStateStorenow can be instantiated with URI schemememory:usingStoreLoaderAttribute.LoadStore()method. [#1359, #1953, #1955]- (Libplanet.RocksDBStore)
RocksDBStoreandRocksDBKeyValueStore-backedTrieStateStorenow can be instantiated with URI schemerocksdb+file:usingStoreLoaderAttribute.LoadStore()method. [#1359, #1953, #1955]
CLI tools
- The following store URI schemes are deprecated: [#1573, #1955]
default: Usedefault+fileinstead.rocksdb: Userocksdb+fileinstead.
Version 0.34.0
Released on May 13th, 2022.
Added APIs
- Class
DataModeladded. When inherited, this class assists in automatic encoding and decoding to and fromBencodex.Types.Dictionary. [#1932, #1935]
Behavioral changes
TxPolicyViolationExceptionandInvalidTxExceptionnow have a new constructor that takes anExceptionas theirException.InnerException. [#1830, #1912, #1916]
CLI tools
- Added
planet key signto sign a message. [#1920]
Version 0.33.1
Released on April 28th, 2022.
Behavioral changes
Transaction<T>'s relatively heavy policy validation is deferred until after its nonce validation in order to speed up gatheringTransaction<T>s when mining. [#1924]
Version 0.33.0
Released on April 19th, 2022.
Backward-incompatible API changes
- (Libplanet.Net)
IMessageCodecand its implementationsNetMQMessageCodecandTcpMessageCodecoverhauled. [#1906]AppProtocolVersiontype parameter added toIMessageCodec.Encode().- Both
NetMQMessageCodec()andTcpMessageCodec()constructors are made parameterless. IMessageCodec.Decode()no longer throwsInvalidMessageTimestampExceptionorDifferentAppProtocolVersionException.
- (Libplanet.Net) Irrelevant context related properties removed from
InvalidMessageTimestampExceptionandDifferentAppProtocolVersionException. [#1906]InvalidMessageTimestampException.Peerproperty removed.DifferentAppProtocolVersionException.Peerproperty removed.DifferentAppProtocolVersionException.Identityproperty removed.
- (Libplanet.Net) Both
MessageValidator.ValidateTimestamp()andMessageValidator.ValidateAppProtocolVersion()now only accepts singleMessagetype parameter. [#1906] - (Libplanet.Net)
SendMessageFailedExceptionchanged toSendMessageFailException. [#1911] - (Libplanet.Net)
ITransportexception handling overhauled. [#1911]ITransport.SendMessageAsync()now only throwsCommunicationFailExceptionfor a normal failure of sending and receivingMessages; old exceptions such asTimeoutException,InvalidMessageSignatureException, etc. are attached toInnerExceptionproperty to a thrownCommunicationFailException.InvalidCredentialException,InvalidMagicCookieException,InvalidMessageSignatureException,SendMessageFailExceptionno longer have public constructors.
Added APIs
- (Libplanet.Net)
InvalidCredentialExceptionclass added. [#1904, #1905] - (Libplanet.Net)
CommunicationFailExceptionclass added. [#1911]
Behavioral changes
- Inner logic of
ByteUtil.CalculateHashCode(byte[] bytes)has modified. [#1866, #1891] - (Libplanet.Net)
IMessageCodec.Encode()now requires a matchingPrivateKeyto be provided forPeer. [#1904, #1905]
Dependencies
Version 0.32.1
Released on April 8th, 2022.
Behavioral changes
- (Libplanet.Net)
ITransport's behavior rolled back to send replies withDifferentVersiontypeMessageto aPeerwith a differentAppProtocolVersionregardless of whether theAPVfromPeeris signed by a trusted source or not. [#1900]
Version 0.32.0
Released on April 8th, 2022.
Backward-incompatible API changes
- Added
IStore.PruneOutdatedChains(bool noopWithoutCanon)method. [#1874, #1878] IMessageCodecinterface and its implementations overhauled. [#1890]- Removed
AppProtocolVersion versionparameter fromIMessageCodec.Encode(). - Removed
Action appProtocolVersionValidatorparameter fromIMessageCodec.Decode(). - Both
TcpMessageCodec()andNetMQMessageCodec()now takes additional parameters for setting up itsMessageValidatorinstance for running context.
- Removed
DifferentAppProtocolVersionEncountereddelegate now returnsvoid. [#1885, #1890]
Added APIs
- (Libplanet.Net)
DifferentAppProtocolVersionExceptionis madepublic. [#1889] - (Libplanet.Net)
InvalidMessageSignatureExceptionandInvalidMessageTimestampExceptiongained additional properties. [#1889] - (Libplanet.Net)
MessageValidatorhelper class introduced. [#1890]
Behavioral changes
- (Libplanet.Net) Internal cache size of a
KBucketis now capped. [#1879] - (Libplanet.Net)
IMessageCodecnow never decodes aMessagewith a differentAppProtocolVersionfrom the local version. [#1885, #1890] - (Libplanet.Net)
ITransportno longer replies withDifferentVersiontypeMessageto aPeerwith a differentAppProtocolVersionthat is not signed by a trusted source. [#1890]
Bug fixes
- (Libplanet.Net) Internal dictionaries of a
KBucketare made to be concurrent. [#1872, #1879] - (Libplanet.Net)
DifferentAppProtocolVersionExceptionandInvalidMessageSignatureExceptioncan now be serialized and deserialized. [#1889]
Version 0.31.0
Released on March 31, 2022.
Backward-incompatible API changes
- (Libplanet.Net) Existing method name
Kademlia.CalculateDistance()changed toKademlia.CalculateDifference()to better indicate its behavior. [#1877] - (Libplanet.Net)
Kademlia.CalculateDistance()method reimplemented with return typeint. [#1877]
Bug fixes
- (Libplanet.Stun) Increased the number of internal proxies to increase
the inbound network traffic throughput of a node when using a
TurnClient. [#1864, #1876]
Version 0.30.0
Released on March 24, 2022.
Backward-incompatible storage format changes
- (Libplanet.RocksDBStore)
RocksDBStorebecame not to use column families to manage chain ids. Instead, chain id is concatenated into key prefix. [#1862]
CLI tools
- Added
planet store migrate-indexfor index database migration (from column families based to key-prefix). [#1862]
Version 0.29.0
Released on March 17, 2022.
Backward-incompatible API changes
- (Libplanet.Net)
SwarmOptions.MessageLifespanproperty changed toSwarmOptions.MessageTimestampBuffer. [#1828, #1831] - (Libplanet.Net) Unused parameter
dealerSocketLifetimeremoved fromNetMQTransport(). [#1832] - (Libplanet.Net) Old
ITransport.SendMessageAsync()method is deprecated.ITransport.SendMessageWithReplyAsync()methods are renamed asITransport.SendMessageAsync(). [#1849]
Behavioral changes
- (Libplanet.Net) Default value of
SwarmOptions.MessageTimestampBufferis set to 60 seconds instead ofnull. [#1828, #1831] - (Libplanet.Net) Acceptable timestamp range for
Messages, when non-nullSwarmOptions.MessageTimestampBufferis provided, has changed to allowMessages with future timestamps. [#1828, #1831] - (Libplanet.Net)
Swarm<T>now repliesPongs to receivedTxIdsandBlockHeaderMessagemessages. [#1845]
Version 0.28.2
Released on March 15, 2022.
- (Libplanet.RocksDBStore)
RocksDBStore.GetBlockDigest()became to silently returnnullwith no misleading error log when it's asked a non-existent block hash. [#1500, #1852]
Version 0.28.1
Released on March 3, 2022.
- Fixed an evaluation log to output
IPreEvaluationBlock<T>.PreEvaluationHashas a hex formatted string. [#1835, #1837] - (Libplanet.Net) Fixed a bug where some messages could not be sent using
NetMQTransportdue to prematureDealerSocketdisposal. [#1836, #1839]
Version 0.28.0
Released on February 23, 2022.
Deprecated APIs
Backward-incompatible API changes
- The return type of
MerkleTrieExtensions.DifferentNodes()becameIEnumerable<Tuple<KeyBytes, IValue, IValue>>fromIEnumerable<IGrouping<string, (HashDigest<SHA256> Root, IValue Value)>>. [#1729] - (Libplanet.Extensions.Cocona) Replaced
string? passphrase = nullparameter of methods belongingKeyCommandandApvCommandwithPassphraseParameters passphrase. [#1593, #1823] - (Libplanet.Extensions.Cocona) Replaced
KeyCommand.UnprotectKey(Guid keyId, string? passphrase = null)method withUnprotectedKey(Guid, PassphraseParameters, bool)method. [#1593, #1823] - (Libplanet.Net)
IMessageCodec<T>.Decode()now throwsInvalidMessageSignatureExceptionandInvalidMessageTimestampExceptioninstead ofInvalidMessageExceptionandInvalidTimestampExceptionrespectively. [#1771] - (Libplanet.Net) Added
long tipDeltaThreshold = 25Loption toSwarm<T>.PreloadAsync()method. [#1775, #1777, #1779]
Backward-incompatible network protocol changes
Backward-incompatible storage format changes
Added APIs
- (Libplanet.Extensions.Cocona) Added
PassphraseParametersclass. [#1593, #1823] - (Libplanet.Extensions.Cocona) Added
KeyCommand.UnprotectKey(Guid keyId, PassphraseParameters passphrase, bool ignoreStdin = false)method. [#1593, #1823] - (Libplanet.Net) Added
MessageSendFailedExceptionclass. [#1781, #1786]
Behavioral changes
Block<T>.Transactionsis ordered using a different scheme for evaluation due to protocol version bump. [#1322, #1323, #1518]- (Libplanet.Net)
NetMQTransport.SendMessageWithReplyAsync()should now complete its process within given timeframetimeoutargument instead of possibly taking longer on some edge cases when waiting for multiple replies. [#1734, #1789] ActionEvaluator<T>.Evaluate()method became to log message directly instead of other methods that use it. [#1773]- (Libplanet.Net)
NetMQTransport.DoBroadcastnow usesNetMQTransport.SendMessageAsync()internally instead of usingNetMQdirectly. [#1722, #1824]
Bug fixes
- (Libplanet.Net) Fixed a leak in handling
DealerSockets insideNetMQTransport.DoBroadcast()method. [#1819, #1825]
Dependencies
CLI tools
- All
planetsubcommands taking passphrase now have--passphrase-fileoption besides-p/--passphraseoption to read it from the specified file or standard input (-) instead. [#1593, #1823] - Fixed a bug where
planetsubcommands taking passphrase had unexpectedly terminated with an uncaughtInvalidOperationExceptionwhen it's not associated to any terminal device (tty), i.e., piped. [#1593, #1823] planet mpt diffcommand became to output the key and its values in one line as JSON whenever a different key is found, than it outputs all of the different nodes at once. [#1729]
Version 0.27.7
Released on February 18, 2022.
- Fixed
HashDigest<T>.DeriveFrom(ReadOnlySpan<byte>)method's bug where it had thrownIndexOutOfRangeExceptionfor the input longer or shorter thanHashDigest<T>.Sizeon .NET Standard 2.0. [#1706, #1815] - Fixed
HashDigest<T>.DeriveFrom(ReadOnlySpan<byte>)method's bug where it had returned the wrong digest on .NET Standard 2.0. [#1706, #1815]
Version 0.27.6
Released on February 18, 2022.
- (Libplanet.Net) Fixed a bug where
Swarm<T>.PreloadAsync()had not thrownOperationCanceledExceptioneven cancellation was requested. [#1547, #1796] - Fixed
ThreadStateExceptionthrown byNonblockRenderer<T>andNonblockActionRenderer<T>classes. [#1772, #1810]
Version 0.27.5
Released on February 16, 2022.
- Upgraded Planetarium.RocksDbSharp from 6.2.4-planetarium to 6.2.6-planetarium. [#1791, #1803]
- (Libplanet.Net) Additional logs tagged
Metricto monitorITransportbehavior. [#1802]
Version 0.27.4
Released on February 16, 2022.
- Fixed *@planetarium/cli* npm package's bug where installation had not worked since 0.27.0. [#1790, #1799]
- (Libplanet.Net) Return the fixed races between
Swarm<T>'s dual systems for block synchronization (polling and event-driven in parallel) on updating chain by serializing the post-download process which is common for both synchronization mechanisms. [#1731, #1798]
Version 0.27.3
Released on February 11, 2022.
- (Libplanet.Net)
Swarm<T>.CompleteBlockSync()changed back, reverting the behavior implemented in #1759 to fixed races betweenSwarm<T>'s dual systems for block synchronization (polling and event-driven in parallel) on updating chain [#1797]
Version 0.27.2
Released on February 8, 2022.
- (Libplanet.Net) Sending a
MessagethroughNetMQTransportnow fails immediately if theMessagecannot be queued to aDealerSocketright away. [#1753, #1778]
Version 0.27.1
Released on February 7, 2022.
- (Libplanet.Net)
Swarm<T>.PreloadAsync()method became to catch up recent blocks until the local tip is close enough to the topmost tip among peers. [#1775, #1777]
Version 0.27.0
Released on January 26, 2022.
Deprecated APIs
Backward-incompatible API changes
- Moved everything in
Libplanet.Netnamespace from Libplanet assembly to Libplanet.Net assembly. [#1421, #1760] - (Libplanet.Net) Parameters of
NetMQTransport()constructor has modified. [#1741, #1744]- Removed
RoutingTable tableandint minimumBroadcastTargetparameters. - Added
TimeSpan? dealerSocketLifetimeparameter.
- Removed
- (Libplanet.Net) Removed
RoutingTable tableandint minimumBroadcastTargetparameters fromTcpTransport()constructor. [#1741, #1744] - (Libplanet.Net) Removed
ITransport.BroadcastMessage(Address?, Message)method. Instead, addedITransport.BroadcastMessage(IEnumerable<BoundPeer>, Message)method. [#1741, #1744]
Added APIs
- Added
TrieStateStore.CopyStates()method. [#1653, #1691] - Added
NullBlockPolicy<T>class. [#1531, #1748] - (Libplanet.Net) Added classes which implements
Messageabstract class. [#1754, #1756]- Added
Pingclass. - Added
Pongclass. - Added
FindNeighborsclass. - Added
Neighborsclass. - Added
DifferentVersionclass.
- Added
Behavioral changes
MerkleTrie.Get()method now finds multiple states in parallel. [#1743]- (Libplanet.Net)
DealerSockets used for broadcasting messages inNetMQTransportbecame not to be disposed right after corresponding peer is removed from the routing table. Instead, it will be removed after a certain amount of time. [#1741, #1744] - (Libplanet.Net)
NetMQTransportno longer attempts to retry failed communications. [#1751, #1752] - (Libplanet.Net) Fixed races between
Swarm<T>'s dual systems for block synchronization (polling and event-driven in parallel) on updating chain by serializing the post-download process which is common for both synchronization mechanisms. [#1731, #1759] - New log output tagged with
Metricadded to measure evaluation time for individualTransaction<T>s. [#1755, #1758]
Dependencies
- Libplanet.Net assembly is now distributed as a separate NuGet package: Libplanet.Net. [#1421, #1760]
CLI tools
- Upgrade node-fetch for *@planetarium/cli* npm package. [CVE-2022-0235, #1747]
Version 0.26.6
Released on February 18, 2022.
- Fixed
HashDigest<T>.DeriveFrom(ReadOnlySpan<byte>)method's bug where it had thrownIndexOutOfRangeExceptionfor the input longer or shorter thanHashDigest<T>.Sizeon .NET Standard 2.0. [#1706, #1815] - Fixed
HashDigest<T>.DeriveFrom(ReadOnlySpan<byte>)method's bug where it had returned the wrong digest on .NET Standard 2.0. [#1706, #1815]
Version 0.26.5
Released on February 18, 2022.
- Fixed a bug where
Swarm<T>.PreloadAsync()had not thrownOperationCanceledExceptioneven cancellation was requested. [#1547, #1796] - Fixed
ThreadStateExceptionthrown byNonblockRenderer<T>andNonblockActionRenderer<T>classes. [#1772, #1810]
Version 0.26.4
Released on February 16, 2022.
- Upgraded Planetarium.RocksDbSharp from 6.2.4-planetarium to 6.2.6-planetarium. [#1791, #1803]
- Additional logs tagged
Metricto monitorITransportbehavior. [#1802]
Version 0.26.3
Released on February 7, 2022.
Swarm<T>.PreloadAsync()method became to catch up recent blocks until the local tip is close enough to the topmost tip among peers. [#1775]
Version 0.26.2
Released on January 26, 2022.
- Fixed a bug where
ActionEvaluator<T>'s logs had been ignored due to its initialization timings. [#1764] - The elapsed time taking for ordering
Transaction<T>s before evaluating them are now measured and logged. [#1764] - The time started and finished to calculate state root hashes are now logged. [#1764]
Version 0.26.1
Released on January 20, 2022.
- General logging overhaul in
NetMQTransport<T>for consistency and readability. [#1735]
Version 0.26.0
Released on January 18, 2022.
Backward-incompatible API changes
- Replaced
IValue StateCompleter<T>(BlockChain<T>, BlockHash, Address)delegate withIReadOnlyList<IValue?> StateCompleter<T>(BlockChain<T>, BlockHash, IReadOnlyList<Address>)delegate. [#1703] - Added
IAccountStateDelta.GetStates(IReadOnlyList<Address>)method. [#1703] - Replaced
IValue AccountStateGetter(Address)delegate withIReadOnlyList<IValue?> AccountStateGetter(IReadOnlyList<Address>)delegate. [#1703] - Removed
StateGetter<T>delegate. [#1703] - Removed
BalanceGetter<T>delegate. [#1703] - Removed
StateGetter<T> stateGetterandBalanceGetter<T> balanceGetterparameters fromActionEvaluator<T>()constructor. [#1703] - Added
IBlockChainStates<T> blockChainStatesparameter toActionEvaluator<T>()constructor. [#1703] - Replaced
ITrie.TryGet()withITrie.Get()method. [#1703] - Replaced
StateStoreExtensions.GetState()static method withGetStates()static method. [#1703] nullablecontext enabled forIProtocolinterface andKademlia,KademliaProtocol, andRoutingTableclasses. [#1692]RoutingTable.Neighbors(Peer, int, bool)changed toRoutingTable.Neighbors(BoundPeer, int, bool). As a result,RoutingTableclass now only explicitly deals withBoundPeers. [#1692]BlockChain<T>.StageTransaction(),IStagePolicy.Stage(), andIStagePolicy.Unstage()now all returnboolto indicate whether staging was successful or not. [#1710]
Added APIs
- Added
BlockChain<T>.GetStates()method. [#1703] - Added
IBlockChainStates<T>interface. [#1703]BlockChain<T>now implementsIBlockChainStates<T>.
- Added
StateStoreExtensions.GetStates()static method. [#1703]
Behavioral changes
- Improved performance of
Swarm<T>.FillBlocksAsync()'s block sync. [#1663, #1699]- The way
Swarm<T>synchronizes the attachedBlockChain<T>with peers became more performant by splitting downloading and appending blocks into two parallel tasks.
- The way
Bug fixes
- Fixed a bug where unnecessary additional attempts were made to
unresponsive
Peers when discovering aPeerthroughKademliaProtocol. [#1692]
Version 0.25.5
Released on February 18, 2022.
- Fixed
HashDigest<T>.DeriveFrom(ReadOnlySpan<byte>)method's bug where it had thrownIndexOutOfRangeExceptionfor the input longer or shorter thanHashDigest<T>.Sizeon .NET Standard 2.0. [#1706, #1815] - Fixed
HashDigest<T>.DeriveFrom(ReadOnlySpan<byte>)method's bug where it had returned the wrong digest on .NET Standard 2.0. [#1706, #1815]
Version 0.25.4
Released on January 18, 2022.
- Some additional logging to track down issues with staging
Transaction<T>s. [#1718] - (Libplanet.RocksDBStore) Fixed
RocksDBStore's inaccurate lock handling. [#1719]
Version 0.25.3
Released on January 14, 2022.
- Fixed a bug when message broadcasting on
Swarm<T>had been stopped suddenly. [#1715]
Version 0.25.2
Released on January 11, 2022.
- Fixed a bug where
TxCompletion<TPeer, TAction>failed to fetch transactions from other peers. [#1704] - In
TxCompletion<TPeer, TAction>, instead of maintaining singleRequestTxsFromPeerAsync()task for each peer, a newRequestTxsFromPeerAsync()task is spawned every time a new demand is received. [#1704]
Version 0.25.1
Released on January 6, 2022.
Behavioral changes
Swarm<T>changed back, reverting the behavior implemented in #1606 to append blocks to the canonical chain instead of using a forked chain while syncing recent blocks. [#1693]
Version 0.25.0
Released on January 5, 2022.
Backward-incompatible API changes
- Replaced
HashDigest<T>(ImmutableArray<byte>)constructor withHashDigest<T>(in ImmutableArray<byte>)constructor. [#1678] IKeyValueStore's key type becameKeyBytes(wasbyte[]). [#1678]- Replaced
IKeyValueStore.Get(byte[])method withGet(in KeyBytes)method. - Replaced
IKeyValueStore.Set(byte[], byte[])method withSet(in KeyBytes, byte[])method. - Replaced
IKeyValueStore.Set(IDictionary<byte[], byte[]>)method withSet(IDictionary<KeyBytes, byte[]>)method. - Replaced
IKeyValueStore.Delete(byte[])method withDelete(in KeyBytes)method. - Replaced
IKeyValueStore.Exists(byte[])method withExists(in KeyBytes)method. IKeyValueStore.ListKeys()method's return type becameIEnumerable<KeyBytes>(wasIEnumerable<byte[]>).
- Replaced
ITrie's key type becameKeyBytes(wasbyte[]). [#1689]- Replaced
ITrie.Set(byte[], IValue)method withSet(in KeyBytes, IValue)method. - Replaced
ITrie.TryGet(byte[], out IValue?)method withTryGet(in KeyBytes, out IValue?)method. - The return type of
MerkleTrieExtensions.ListAllStates()static method becameIEnumerable<KeyValuePair<KeyBytes, IValue>>(wasIEnumerable<KeyValuePair<ImmutableArray<byte>, IValue>>). [#1653]
- Replaced
- Added
IKeyValueStore.Get(IEnumerable<KeyBytes>)method. [#1678] - Added
IKeyValueStore.Delete(IEnumerable<KeyBytes>)method. [#1678] nullablecontext enabled forPeerandBoundPeerclasses. All public constructors now explicitly take non-nullable parameters. [#1679]- All publicly accessible properties of
PeerandBoundPeerare now non-nullable except forPeer.PublicIPAddress.
- All publicly accessible properties of
- Replaced
HashDigest<T>.DeriveFrom(ReadOnlySpan<byte>)overloaded static method with other new overloads. [#1680]
Backward-incompatible network protocol changes
- Removed
Senderproperty fromMessages.TxIdsandMessages.TxIds'sMessageTypevalue bumped to0x31. [#1681]
Added APIs
- Added
KeyBytesreadonly struct. [#1678] - Added
HashDigest<T>(in ImmutableArray<byte>)constructor. [#1678] - Added
HashDigest<T>.DeriveFrom(byte[])overloaded static method. [#1680] - Added
HashDigest<T>.DeriveFrom(ImmutableArray<byte>)overloaded static method. [#1680] - Added
HashDigest<T>.DeriveFrom(ReadOnlySpan<byte>)overloaded static method. [#1680] - Added
StateStoreExtensions.EncodeKey()static method. [#1689] - Added
StateStoreExtensions.DecodeKey()static method. [#1689]
Behavioral changes
- Improved performance of
Swarm<T>'s block propagation. [#1676] - (Libplanet.RocksDBStore) Improved performance of
RocksDBStore<T>.IterateIndexes()method. [#1676]
Version 0.24.2
Released on December 24, 2021.
- Fixed a bug of
NonblockRenderer<T>andNonblockActionRenderer<T>where they had thrownThreadStateExceptionwhen any render events occurred after disposed. [#1682] - Log output compacted by removing duplicate exception messages. [#1632, #1677]
Version 0.24.1
Released on December 16, 2021.
- Fixed a bug where
Transaction<T>s were unstaged when they were not supposed to. [#1672]
Version 0.24.0
Released on December 16, 2021.
Backward-incompatible API changes
IStagePolicy<T>'sinterfacemethods updated. Notably, allIStagePolicy<T>now acceptBlockChain<T>as its parameter. [#1648]Get(BlockChain<T> blockChain, TxId id, bool includeInstaged)changed toGet(BlockChain<T> blockChain, TxId id, bool filtered = true).Iterate()changed toIterate(BlockChain<T> blockChain, bool filtered = true).GetNextTxNonce(Address address, long minedTxs)changed toGetNextTxNonce(BlockChain<T> blockChain, Address address).
Behavioral changes
- Description of
IStagePolicy<T>and its default implementationVolatileStagePolicy<T>is overhauled. [#1648]IStagePolicy<T>.Iterate()no longer guarantees any kind of ordering.IStagePolicy<T>.Ignore()now also unstages theTransaction<T>.VolatileStagePolicy<T>now holds every previously known unconfirmedTransaction<T>regardless of its staging/unstaging history unless it is expired or ignored.
- New log output tagged with
Metricadded to measure execution time forBlockChain<T>.FindNextHashes(). [#1669]
Bug fixes
- Fixed a bug where
TxCompletionhad broadcasted invalid transactions. [#1661]
Version 0.23.4
Released on December 24, 2021.
- Fixed a bug of
NonblockRenderer<T>andNonblockActionRenderer<T>where they had thrownThreadStateExceptionwhen any render events occurred after disposed. [#1682]
Version 0.23.3
Released on December 13, 2021.
- Virtually disabled state fragmentation due to its critical negative impact on action evaluation performance. This will be enabled again after more practical tests in the future releases. [#1665]
Version 0.23.2
Released on December 13, 2021.
- Removed unnecessary a reader lock on
BlockChain<T>.GetState()method to improve parallelism. [#1657] - Improved performance of
Swarm<T>'s block synchronization. [#1657] - Fixed a bug where
Swarm<T>had swapped to improper chain. [#1657] - (Libplanet.RocksDBStore) Fixed a bug where
RocksDBStore.ForkBlockIndexes()had created temporary chains unnecessarily. [#1657]
Version 0.23.1
Released on December 10, 2021.
- Fixed
TrieStateStore.PruneStates()method's bug that it had thrownArgumentOutOfRangeException. [#1653, #1654]
Version 0.23.0
Released on December 8, 2021.
From this version Libplanrt can be built on arm64 machines including Apple Silicon (aarch64-apple-darwin).
Added APIs
- Added
PreEvaluationBlock<T>.DetermineStateRootHash(BlockChain<T>, StateCompleterSet<T>, out IImmutableDictionary<string, IValue>)overloaded method. [#1636] - Added
PreEvaluationBlock<T>.DetermineStateRootHash(IAction?, IStateStore, out IImmutableDictionary<string, IValue>)overloaded method. [#1636] - Parameter
exceptforKBucket.GetRandomPeer()now defaults tonull. [#1631] - Added
ArrayEqualityComparer<T>class. [#1636]
Behavioral changes
- States became to take up much less space than before by reducing unnecessary duplicate data. Although this guarantees the backward compatibility with the existing state store, in order to take complete effect of this optimization, please replay your existing blockchain from the genesis block with the empty store. [#1636]
- (Libplanet.Analyzers) Rule LAA1002 no more warns about enumerating sorted
sets/dictionaries:
System.Collections.Generic.SortedDictionary<TKey, TValue>System.Collections.Generic.SortedSet<T>System.Collections.Immutable.ImmutableSortedDictionary<TKey, TValue>System.Collections.Immutable.ImmutableSortedSet<T>Bencodex.Types.Dictionary(which became to guarantee enumeration order since Bencodex 0.4.0)
Bug fixes
KBucket.HeadandKBucket.Tailnow properly returnnullif the bucket is empty instead of faulting. [#1631]TxCompletion.Demand()no longer requestsTransaction<T>s already in storage. [#1649]
Dependencies
- Upgraded Bencodex from 0.4.0-dev.20211123080042+d7f6c810 to 0.4.0. [#1636]
- Upgraded Planetarium.RocksDbSharp from 6.2.3 to 6.2.4-planetarium. [#1635]
Version 0.22.1
Released on December 5, 2021.
- Compacted log output for convenience. [#1633]
- Removed
ITransport.MessageHistoryproperty due to memory leak. [#1639]
Version 0.22.0
Released on November 30, 2021.
Backward-incompatible API changes
- Removed
Transaction<T>.BytesLengthproperty. [#1609] - Removed
Block<T>.BytesLengthproperty. [#1609] - The types of
BlockChain<T>.MineBlock()overloaded methods'maxBlockBytesparameters becamelong?(wereint?). [#1609] - The type of
IBlockPolicy<T>.GetMaxBlockBytes(long)method becamelong(wasint). [#1609] - The type of
BlockPolicy<T>()constructor'sgetMaxBlockBytesparameter becameFunc<long, long>?(wasFunc<long, int>?). [#1609] - The type of
InvalidBlockBytesLengthException()constructor'sbytesLengthparameter becamelong(wasint). [#1609] - The type of
InvalidBlockBytesLengthException.BytesLengthproperty becamelong(wasint). [#1609] - Methods
IsEmpty()andIsFull()ofKBucketchanged to propertiesIsEmptyandIsFullrespectively. [#1610] MessageCodecclass renamed toTcpMessageCodec. [#1610]lifetimeparameter removed fromIMessageCodec.Decode().messageLifespanparameter added to constructors ofNetMQMessageCodecandTcpMessageCodec. [#1610]- Removed unused
PeerStatesproperty fromSwarm<T>. [#1610] - Method name
BoundPeer.QueryAppProtocolVersion()changed toBoundPeer.QueryAppProtocolVersionNetMQ(). [#1610]
Behavioral changes
Swarm<T>became to append blocks to forked chain to avoid locking the canonical chain while syncing recent blocks. [#1606]- More streamlined structured logging together with additional logs
tagged as
Metric. [#1627]
Bug fixes
InvalidMagicCookieExceptionandInvalidTimestampExceptioncan now be serialized and deserialized. [#1613]- Fixed a bug where
PolymorphicAction<T>had thrownInvalidCastExceptionwhen inner action's.PlainValuereturns other value thanBencodex.Types.Dictionary. [#1628]
Dependencies
- Libplanet.Stun assembly is now distributed as a seaprate NuGet package: Libplanet.Stun. [#813, #1279, #1625]
- Upgraded Bencodex from 0.3.0 to 0.4.0-dev.20211123080042+d7f6c810. [#1609]
- Now depends on Caching.dll 1.4.0.1.
Version 0.21.2
Released on November 25, 2021.
planet apv querycommand became to communicate withNetMQTransportinstead ofTcpTransport. [#1618]
Version 0.21.1
Released on November 25, 2021.
SwarmOptions.TipLifespanproperty' default value was changed. The default lifespan for a tip going stale is now60seconds instead of30seconds for the purpose of polling blocks. [#1614]Swarm<T>'s internal logic for determining when theBlockChain<T>.Tipbecomes stale is now fixed. [#1614]
Version 0.21.0
Released on November 16, 2021.
Backward-incompatible API changes
- (Libplanet.RocksDBStore) Removed
MonoRocksDBStoreclass. [#1513, #1579] - Removed
rehearsalparameter fromITrie.Commit()method. [#1554, #1570] - Removed
rehearsalparameter fromStateStoreExtensions.Commit()extension method. [#1554, #1570] - Removed
ITransport.RunAsync()method.ITransport.StartAsync()now conducts operation thatITransport.RunAsync()used to conduct. [#1523] - Removed
ITransport.ReplyMessage()method which was non-blocking. Instead, addedITransport.ReplyMessageAsync()asynchronous method which is awaited until the reply message is sent. [#1523] - The type of
ITransport.ProcessMessageHandlerbecameAsyncDelegate<T>(which wasEventHandler). [#1523] - Removed unused
BlockChain<T>type parameter fromIStagePolicy<T>.Iterate()method. [#1553, #1556] - Removed unused
HashAlgorithmTableclass. [#1600] BlockChain<T>.MineBlock()andBlockChain<T>.GatherTransactionsToMine()now additionally acceptsmaxBlockBytesparameter of typeint. [#1600]- Removed
BlockInsufficientTxsExceptionandBlockExceedingTransactionsExceptionclasses. [#1504, #1600]
Added APIs
- Added
ITransport.MessageHistoryproperty. [#1523] - Added
ITransport.WaitForRunning()method. [#1523] - Added
TcpTransportclass which implementsITransportinterface. [#1523] - Added
SwarmOptions.Typeproperty. [#1523] - Added
SwarmOptions.TransportTypeenum. [#1523] - Added
AsyncDelegate<T>class. [#1523] - Added
InvalidMagicCookieExceptionclass. [#1523] - Added
MessageCodecclass which inheritsIMessageCodec<T>. [#1523] - Added
IStagePolicy<T>.GetNextTxNonce()method. [#1553, #1556] - Added
InvalidBlockBytesLengthException,InvalidBlockTxCountException,InvalidBlockHashAlgorithmTypeException, andInvalidBlockTxCountPerSignerExceptionclasses. [#1504, #1600]
Behavioral changes
- Improved performance of
MerkleTrie.Commit()andBlockChain<T>.ExecuteActions()methods. [#1554, #1570] Swarm<T>.MineBlock()now throwsOperationCanceledExceptioninstead ofBlockInsufficientTxsExceptionwhen there are no sufficient number of blocks to mine. [#1600]- Default implementation
BlockPolicy<T>.ValidateNextBlock()ofIBlockPolicy<T>now validates the type forBlock<T>.HashAlgorithm, size forBlock<T>.BytesLength, and count forBlock<T>.Transactions. [#1504, #1600]
CLI tools
planet statscommand's-p/--pathoption no more supports the store typemonorocksdb. [#1513, #1579]- Subcommands under
planet storeno more supports the store typemonorocksdb. [#1513, #1579]
Version 0.20.2
Released on November 9, 2021.
- (Libplnaet.RocksDBStore) Fixed
DefaultStore.ForkBlockIndexes()method's bug that it had been thrownChainIdNotFoundExceptionwhen received a chain forked from already deleted. [#1591, #1592] - Fixed improper implementations of
BlockExceedingTransactionsExceptionInvalidBlockBytesLengthExceptionin regards to serialization and related tests. [#1594]
Version 0.20.1
Released on November 8, 2021.
Swarm<T>became to broadcast a new block to peers immediately afterSwarm<T>.BlockChain'sTipchanges while it isRunning. [#1582, #1586]
Version 0.20.0
Released on November 3, 2021.
Deprecated APIs
- (Libplanet.RocksDBStore)
MonoRocksDBStorewill be gone in the next minor release: 0.21.0. [#1513, #1574]
Backward-incompatible API changes
Added APIs
Version 0.19.3
Released on November 8, 2021.
Swarm<T>became to broadcast a new block to peers immediately afterSwarm<T>.BlockChain'sTipchanges while it isRunning. [#1582]
Version 0.19.2
Released on November 3, 2021.
PrivateKey(IReadOnlyList<byte>)overloaded constructor no more accepts a list shorter or longer than 32 bytes. [#1571, #1572]PrivateKey.FromString()method no more accept a hexadecimal digits shorter or longer than 64 characters. [#1571, #1572]- Fixed a bug where
HashAlgorithmType.Digest(byte[])andHashAlgorithmType.Digest(ImmutableArray<byte>)methods had returned a wrong hash digest afterHashAlgorithmType.Digest(IEnumerable<byte[]>)orHashAlgorithmType.Digest(IEnumerable<ImmutableArray<byte>>)methods had been once called. [#1575, #1576]
Version 0.19.1
Released on October 29, 2021.
BlockMetadata.MineNonce()method and other mining methods based on it now do not spawn a new thread if theworkersis less than 2. [#1564]BlockMetadata.MineNonce()method and other mining methods based on it now uses the half of the present logical processors (i.e.,Environment.ProcessorCount / 2) by default. If there is only one logical processor, uses one worker. [#1564]- Rolled back the order of the header of a
Messageso that it is compatible with nodes based on Libplanet pre-0.19.0. [#1565]
Version 0.19.0
Released on October 27, 2021.
Backward-incompatible API changes
- Removed
IStore.StageTransactionIds()method. [#1166, #1535] - Removed
IStore.UnstageTransactionIds()method. [#1166, #1535] - Removed
IStore.IterateStagedTransactionIds()method. [#1166, #1535] - Removed
Message.ToNetMQMessage()method. UseIMessageCodec<T>.Encode()method instead. [#1503] - Removed
Message.Parse()static method. UseIMessageCodec<T>.Decode()method instead. [#1503] - Removed unused
HashAlgorithmGettertype parameter fromActionEvaluator<T>()constructor. [#1537] Hashcash.Answer()method became to take randomseedvalue explicitly. [#1546]
Backward-incompatible network protocol changes
- The order of the header of a
Messagehas been modified. [#1503]
Added APIs
- Added
BlockMetadata.MineNonce(HashAlgorithmType, int, CancellationToken)overloaded method. [#1546] - Added
Message.MessageFrameenum. [#1503] - Added
Message.Typeproperty. [#1503] - Added
Message.DataFramesproperty. [#1503] - Added
IMessageCodec<T>interface. [#1503] - Added
NetMQMessageCodecclass which inheritsIMessageCodec<T>. [#1503] - Added
MemoryStoreclass. [#1544] - Added
MemoryKeyValueStoreclass. [#1544] - Added
BlockDemandTable.Remove()method. [#1549] - Added
BlockMetadata.MineNonce(HashAlgorithmType, int, CancellationToken)overloaded method. [#1546] - Added
SwarmOptions.TipLifespanproperty. [#1557]
Behavioral changes
BlockMetadata.MineNonce()method became to use multithreading when looking for the nonce. [#1546]IStore.ForkTxNonces()method became to throwChainIdNotFoundExceptionwhen a givensourceChainIddoes not exist. [#1544]Swarm<T>.StartAsync()method became to poll neighbor peers if they have any new blocks whetherSwarm<T>.BlockDemandTableis empty or not. The polling is triggered whenSwarm<T>.BlockChain'sTiphas been unchanged for a while. Expiration time for tips can be configured throughSwarmOptions.TipLifespanproperty. [#1557]
Bug fixes
- Fixed
DefaultStore.ForkBlockIndexes()method's bug that it had done silently no-op when a givensourceChainIdhad not existed, which had not been compliant withIStore.ForkBlockIndexes()method's specification. [#1544] - Fixed
Swarm<T>'s bug that it had thrownPingTimeoutExceptionif any peer in configuredSwarmOptions.StaticPeersis unreachable. [#1550, #1551] - (Libplanet.RocksDBStore) Fixed
RocksDBStore.ForkBlockIndexes()method's bug that it had done silently no-op when a givensourceChainIdhad not existed, which had not been compliant withIStore.ForkBlockIndexes()method's specification. [#1544] - (Libplanet.RocksDBStore) Fixed
MonoRocksDBStore.ForkBlockIndexes()method's bug that it had done silently no-op when a givensourceChainIdhad not existed, which had not been compliant withIStore.ForkBlockIndexes()method's specification. [#1544] - Fixed a bug where
Swarm<T>did not removed failed block demands from theBlockDemandTable. [#1549]
Version 0.18.5
Released on November 3, 2021.
- Fixed a bug where
HashAlgorithmType.Digest(byte[])andHashAlgorithmType.Digest(ImmutableArray<byte>)methods had returned a wrong hash digest afterHashAlgorithmType.Digest(IEnumerable<byte[]>)orHashAlgorithmType.Digest(IEnumerable<ImmutableArray<byte>>)methods had been once called. [#1575]
Version 0.18.4
Released on November 2, 2021.
PrivateKey(IReadOnlyList<byte>)overloaded constructor no more accepts a list shorter or longer than 32 bytes. [#1571]PrivateKey.FromString()method no more accept a hexadecimal digits shorter or longer than 64 characters. [#1571]
Version 0.18.3
Released on October 28, 2021. Mainly backported critical bug fixes from 0.19.0. [#1562]
Swarm<T>.StartAsync()method became to poll neighbor peers if they have any new blocks whetherSwarm<T>.BlockDemandTableis empty or not. The polling is triggered whenSwarm<T>.BlockChain'sTiphas been unchanged for a while. [#1557]- Fixed
Swarm<T>'s bug that it had thrownPingTimeoutExceptionif any peer in configuredSwarmOptions.StaticPeersis unreachable. [#1550, #1551] - Fixed a bug where
Swarm<T>did not removed failed block demands from theBlockDemandTable. [#1549]
Version 0.18.2
Released on October 22, 2021.
- Fixed a bug that
Swarm<T>had not responded toGetBlocksrequests when some of requested blocks fail to be loaded. It now sends aBlocksresponse with successfully loaded blocks for the same situation. [#1540]
Version 0.18.1
Released on October 21, 2021.
- Fixed a bug where
PublicKey.Verify()method had thrown exceptions for some invalid inputs. [#1520] BaseStore.GetBlock<T>()method now throwsInvalidOperationExceptionwhen it fails to load a requested block's transactions. [#1500, #1532]- (Libplanet.RocksDBStore) Operations on
RocksDBStorethat update data no longer suppress the internal failures. [#1500, #1532]
Version 0.18.0
Released on October 13, 2021.
Backward-incompatible API changes
Hashcash.Stamp(Nonce)delegate's return type becameIEnumerable<byte[]>(wasbyte[]). [#1492]- Moved
BlockDigeststruct toLibplanet.Storenamespace (fromLibplanet.Blocksnamespace). [#1492] - Removed
Block<T>.ToBlockDigest()method. UseBlockDigest.FromBlock<T>()static method instead. [#1492] ActionEvaluator<T>.Evaluate()method'sblockparameter became to takeIPreEvaluationBlock<T>(wasIBlock<T>). [#1146, #1164, #1492]Block<T>andBlockHeadernow guarantees that their every instance has integrity. [#1164, #1492]Block<T>became unable to be subclassed.- Remove
Block<T>(long, long, BigInteger, Nonce, Address, BlockHash?, DateTimeOffset, IReadOnlyList<Transaction<T>>, HashAlgorithmType, HashDigest<SHA256>, ImmutableArray<byte>?, int)overloaded constructor. Use other overloaded constructors instead. - Added
Block<T>(IBlockHeader header, IEnumerable<Transaction<T>>)overloaded constructor. - Added
Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>, ImmutableArray<byte>?)overloaded constructor. [#1457, #1507] BlockHeaderis no more readonly struct, but a sealed class.- Removed
BlockHeader(int, long, string, ImmutableArray<byte>, ImmutableArray<byte>, long, BigInteger, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>)constructor. Use other overloaded constructors instead. - Added
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?)overloaded constructor. [#1457, #1507] - Added
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?, BlockHash)overloaded constructor. [#1457, #1507]
Block<T>andBlockHeaderhave no more marshaling/unmarshalling methods.- Removed
Block<T>(Bencodex.Types.Dictionary)overloaded constructor. UseBlockMarshaler.UnmarshalBlock()static method instead. - Removed
Block<T>.Deserialize()static method. Instead, useBlockMarshaler.UnmarshalBlock()static method andBencodex.Codectogether. - Removed
Block<T>.ToBencodex()method. UseBlockMarshaler.MarshalBlock()static method instead. - Removed
Block<T>.Serialize()method. Instead, useBlockMarshaler.MarshalBlock()static method andBencodex.Codectogether. - Removed
BlockHeader(Bencodex.Types.Dictionary)overloaded constructor. UseBlockMarshaler.UnmarshalBlockHeader()static method instead. - Removed
BlockHeader.Deserialize()static method. Instead, useBlockMarshaler.UnmarshalBlockHeader()static method andBencodex.Codectogether. - Removed
BlockHeader.ToBencodex()method. UseBlockMarshaler.MarshalBlockHeader()static method instead. - Removed
BlockHeader.Serialize()method. Instead, useBlockMarshaler.MarshalBlockHeader()static method andBencodex.Codectogether.
- Removed
Block<T>andBlockHeadernow guarantee that their every instance has itsStateRootHash. [#1128, #1146, #1492]Block<T>.StateRootHashproperty's type becameHashDigest<SHA256>(wasHashDigest<SHA256>?).- Removed
Block<T>(Block<T>, HashDigest<SHA256>)overloaded constructor. UseBlock<T>(PreEvaluationBlock<T>, HashDigest<SHA256>)overloaded constructor instead. - Removed
Block<T>.Mine()static method. UseBlockContent<T>.Mine()andPreEvaluationBlock<T>.Evaluate()methods instead. BlockHeader.StateRootHashproperty's type becameHashDigest<SHA256>(wasHashDigest<SHA256>?).- The type of
InvalidBlockStateRootHashException()constructor'sexpectedStateRootHashparameter becameHashDigest<SHA256>(wasHashDigest<SHA256>?). [#1507] InvalidBlockStateRootHashException.ExpectedStateRootHashproperty's type becameHashDigest<SHA256>(wasHashDigest<SHA256>?). [#1507]
Block<T>andBlockHeaderbecame aware ofHashAlgorithmTypeused for proof-of-work mining. [#1492]- Added
Block<T>.HashAlgorithmproperty. - Added
BlockHeader.HashAlgorithmproperty. - Removed
BlockHeader(int, long, DateTimeOffset, Nonce, Address, long, BigInteger, BlockHash?, HashDigest<SHA256>?, BlockHash, ImmutableArray<byte>, HashDigest<SHA256>?)constructor. UseBlockHeader(int, long, DateTimeOffset, Nonce, Address, long, BigInteger, BlockHash?, HashDigest<SHA256>?, BlockHash, ImmutableArray<byte>, HashDigest<SHA256>, HashAlgorithmType)constructor instead. - Added
HashAlgorithmGetter hashAlgorithmGetterparameter toIStore.GetBlock<T>()method. - Removed
BlockDigest.Headerproperty. UseBlockDigest.GetHeader()method instead. - Added
BlockDigest.GetHeader()method. - Added
HashAlgorithmGetter hashAlgorithmGetterparameter toDelayedRenderer<T>()constructor. - Added
HashAlgorithmGetter hashAlgorithmGetterparameter toDelayedActionRenderer<T>()constructor. - Added
DelayedRenderer<T>.HashAlgorithmGetterproperty.
- Added
- Blocks became signed by the miner since the protocol version 2.
[#1457, #1507]
- Added
Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>, ImmutableArray<byte>?)overloaded constructor. [#1164, #1492] - Added
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?)overloaded constructor. [#1164, #1492] - Added
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?, BlockHash)overloaded constructor. [#1164, #1492] - Added
Block<T>.Signatureproperty. - Added
Block<T>.PublicKeyproperty. - Added
BlockHeader.Signatureproperty. - Added
BlockHeader.PublicKeyproperty. - Added
InvalidBlockPublicKeyExceptionclass. - Added
InvalidBlockSignatureExceptionclass.
- Added
IStateStorenow requires implementations to be trie. [#1128, #1146, #1492]- Added
IStateStore.GetStateRoot()method. - Added
IStateStore.PruneStates()method. - Removed
IStateStore.SetStates<T>()method. - Removed
IStateStore.GetState()method. - Removed
IStateStore.ContainsBlockStates()method. - Removed
IStateStore.ForkStates<T>()method.
- Added
TrieStateStoreno more stores associations betweenBlock<T>.Hash/Block<T>.PreEvaluationHashandBlock<T>.StateRootHash, becauseBlock<T>.StateRootHashbecame mandatory. [#1128, #1146, #1492]- Added
ITrie.Recordedproperty. - Removed
IKeyValueStore stateHashKeyValueStoreparameter fromTrieStateStore()constructor. - Removed
TrieStateStore.GetTrie()method. - Removed
TrieStateStore.GetRootHash()method. - Replaced
TrieStateStore.PruneStates(IImmutableSet<BlockHash>)method withTrieStateStore.PruneStates(IImmutableSet<HashDigest<SHA256>>)method.
- Added
- The types of
BlockChain<T>.MineBlock()overloaded methods'minerparameter becamePrivateKey(wereAddress). [#1457, #1507]
Backward-incompatible network protocol changes
- The
Block<T>.CurrentProtocolVersionis bumped from 1 to 2: [#1507]- Block's total difficulty value became included to the input of block hashes and pre-evaluation hashes since the protocol version 2.
- Blocks became to have miner's public key as well since the protocol version 2. [#1457]
- Blocks became to have no miner's address since the protocol version 2, because it can be derived from miner's public key. [#1457]
- Blocks became to have a signature made using miner's private key since the protocol version 2. Block signatures affect block hashes. [#1457]
Added APIs
- Added
BlockMetadataclass. [#1164, #1457, #1492, #1507] - Added
BlockContent<T>class. [#1164, #1492] - Added
PreEvaluationBlockHeaderclass. [#1146, #1164, #1457, #1492, #1507] - Added
PreEvaluationBlock<T>class. [#1146, #1164, #1457, #1492, #1507] - Added
BlockDigest.FromBlock<T>()static method. [#1492] - Added
Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>)overloaded constructor. [#1146, #1164, #1492] - Added
Block<T>.HashAlgorithmproperty. [#1492] - Added
Block<T>.PublicKeyproperty. [#1457, #1507] - Added
Block<T>.Signatureproperty. [#1457, #1507] - Added
Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>, ImmutableArray<byte>?)overloaded constructor. [#1164, #1457, #1492, #1507] - Added
Block<T>(IBlockHeader, IEnumerable<Transaction<T>>)overloaded constructor. [#1164, #1492] - Added
BlockHeader.HashAlgorithmproperty. [#1492] - Added
BlockHeader.PublicKeyproperty. [#1457, #1507] - Added
BlockHeader.Signatureproperty. [#1457, #1507] - Added
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?)overloaded constructor. [#1164, #1457, #1492, #1507] - Added
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?, BlockHash)overloaded constructor. [#1164, #1457, #1492, #1507] - Added
IBlockMetadatainterface. [#1164, #1457, #1492, #1507]Block<T>became to implementIBlockMetadatainterface.BlockHeaderbecame to implementIBlockMetadatainterface.BlockMetadatabecame to implementIBlockMetadatainterface.BlockContent<T>became to implementIBlockMetadatainterface.PreEvaluationBlockHeaderbecame to implementIBlockMetadatainterface.PreEvaluationBlock<T>became to implementIBlockMetadatainterface.BlockDigestbecame to implementIBlockMetadatainterface.
- Added
IBlockContent<T>interface. [#1164, #1492]Block<T>became to implementIBlockContent<T>interface.BlockContent<T>became to implementIBlockContent<T>interface.PreEvaluationBlock<T>became to implementIBlockContent<T>interface.
- Added
IPreEvaluationBlockHeaderinterface. [#1164, #1492]Block<T>became to implementIPreEvaluationBlockHeaderinterface.BlockHeaderbecame to implementIPreEvaluationBlockHeaderinterface.PreEvaluationBlockHeaderbecame to implementIPreEvaluationBlockHeaderinterface.PreEvaluationBlock<T>became to implementIPreEvaluationBlockHeaderinterface.
- Added
IPreEvaluationBlock<T>interface. [#1164, #1492]Block<T>became to implementIPreEvaluationBlock<T>interface.PreEvaluationBlock<T>became to implementIPreEvaluationBlock<T>interface.ActionEvaluator<T>.Evaluate()method'sblockparameter became to takeIPreEvaluationBlock<T>(wasIBlock<T>).
- Added
IBlockHeaderinterface. [#1146, #1164, #1492]Block<T>became to implementIBlockHeaderinterface.BlockHeaderbecame to implementBlockHeaderinterface.
- Added
BlockMetadataExtensionsstatic class. [#1164, #1492] - Added
BlockContentExtensionsstatic class. [#1164, #1492] - Added
BlockMarshalerstatic class. [#1164, #1492] - Added
BlockDigest.GetHeader()method. [#1492] - Added
StateStoreExtensionsstatic class. [#1128, #1146, #1492] - Added
StoreExtensions.GetStateRootHash()extension method. [#1128, #1146, #1492] - Added
DelayedRenderer<T>.HashAlgorithmGetterproperty. [#1492] BlockDigestbecame to implementIBlockExcerpt. [#1492]- Added
InvalidBlockPublicKeyExceptionclass. [#1457, #1507] - Added
InvalidBlockSignatureExceptionclass. [#1457, #1507]
Behavioral changes
Block<T>.Transactionsproperty is now ordered byTransaction<T>.Idso that it's consistent withIBlockContent<T>'s other implementations. As this behavior can be changed in the later releases, do not depend on its ordering, but explicitly sort them before use when the order needs to b guaranteed. [#1492]- Blocks and block metadata became to have their miners' public keys too.
Although it is backward compatible to the earlier protocol version than 2,
blocks with the protocol version 2 or later must have public keys.
If a block lacks public key,
InvalidBlockPublicKeyExceptionis thrown. [#1457, #1507] PublicKey.ToString()method now returns its hexadecimal representation in compressed form. [#1507]
Bug fixes
- Fixed
NullReferenceExceptionthatPublicKey.Verify()method had thrown with a non-null emptysignature. [#1507] - Fixed
TxExecutionnot updating during preload. [#1508, #1509]
Version 0.17.0
Released on September 28, 2021.
Backward-incompatible API changes
- Added
StateCompleterSet<T>.ComplementAllproperty. [#1358, #1386] - Added
StateCompleterSet<T>.ComplementLatestproperty. [#1358, #1386] BlockPerceptionnow implementsIBlockExcerptinterface. [#1440]BlockPerception.Excerptproperty removed.
TotalDifficultyComparernow 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.ByteArrayproperty'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 for0and 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>.MaxTransactionsPerBlockproperty. 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
currentTimeremoved fromBlockChain<T>.Append(). [#1462, #1465] - Added an optional
maxTransactionsPerSignerparameter toBlockChain<T>.MineBlock()method. [#1449, #1463] - Added an optional
txPriorityparameter toBlockChain<T>.MineBlock()method. [#1477] BlockHeader's properties are now represented as richer types than before. [#1470]BlockHeader.Timestampproperty's type becameDateTimeOffset(wasstring).BlockHeader.Nonceproperty's type becameNonce(wasImmutableArray<byte>).BlockHeader.Minerproperty's type becameAddress(wasImmutableArray<byte>).BlockHeader.PreviousHashproperty's type becameBlockHash?(wasImmutableArray<byte>).BlockHeader.TxHashproperty's type becameHashDigest<SHA256>?(wasImmutableArray<byte>).BlockHeader.Hashproperty's type becameBlockHash(wasImmutableArray<byte>).BlockHeader.StateRootHashproperty'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, andIKeyValueStoreinterfaces 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 blockIntervalMillisecondsparameter. Use the one withTimeSpan? blockIntervalinstead. [#1485] - Replaced
int maxBlockBytesandint maxGenesisBytesparameters fromBlockPolicy<T>()constructor withFunc<long, int>? getMaxBlockBytes. [#1485] - Removed
TxViolatingBlockPolicyExceptionclass. [#1485] - Optional parameter name
difficultyBoundDivisorforBlockPolicy<T>()constructor changed todifficultyStability. [#1495] - Type for optional parameter
difficultyStabilityforBlockPolicy<T>()constructor changed tolong?fromint?. [#1495]
Backward-incompatible network protocol changes
Messagebecame to serialize peer with Bencodex instead ofBinaryFormatter. [#1455]
Added APIs
IBlockExcerpt.ExcerptEqualsextension 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
BlockPolicyViolationExceptionandTxPolicyViolationExceptionclasses. [#1485] - Added
DifficultyAdjustmentstatic class. [#1495] - Added
BlockPolicy<T>.DifficultyStabilityandBlockPolicy<T>.MinimumDifficultyproperties. [#1495]
Behavioral changes
StateCompleterSet<T>.Recalculatenow evaluates states even for those already inIStateStore. Moreover, it also terminates early if possible after reaching theBlockHashprovided with a call. [#1358, #1386]TotalDifficultyComparerno longer considers perceived time when comparingIBlockExcerpts. [#1442]- General logic for determining the canonical chain has been updated.
[#1435, #1443]
- Perceived time is only used for marking a received header in
BlockDemandTablein order to decide whetherBlockDemandis 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
BlockDemandbecame not to fill blocks from multiple peers. [#1459] BlockChain<T>.MineBlock()now usesmaxTransactionsliterally. [#1449, #1463]- Before,
maxTransactionswere internally automatically set to a value between1andBlockChain<T>.Policy.MaxTransactionsPerBlock.
- Before,
- Similarly,
BlockChain<T>.MineBlock()now internally usesBlockChain<T>.Policy.GetMaxBlockBytes()literally. [#1449, #1463] NetMQTransportbecame 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
targetBlockIntervalto be zero, which would result in division by zero, when this makes no sense. - It was possible for
difficultyStabilitynot to be positive when this makes no sense. - Wrongly threw an
ArgumentOutOfRangeExceptionfor the case whereminimumDifficultywould equaldifficultyStability. - It was possible for
minimumDifficultyto be zero, which would allow difficulty to be stuck at zero indefinitely, when this does not make sense.
- It was possible for
Version 0.16.0
Released on August 25, 2021.
Backward-incompatible API changes
- Removed
Swarm<T>.BlockDemandproperty. [#1419, #1425] BlockChain<T>.Tipproperty is now non-nullable. [#1430]
Added APIs
- Added
BlockDemandTable<T>class. [#1419, #1425] - Added
Swarm<T>.BlockDemandTableproperty. [#1419, #1425] - Added
SwarmOptions.PollIntervalproperty. [#1419, #1425] - Added
SwarmOptions.MaximumPollPeersproperty. [#1419, #1425]
Behavioral changes
Bug fixes
- Fixed a bug where
Swarm<T>.PreloadAsync()failed to sync blocks from the peer that has chain with higher difficulty, but lower index. [#1419, #1425]
Version 0.15.4
Released on September 14, 2021.
- Fixed a bug where
BlockChain<T>.MineBlock()had created a block that includes both transactions when there are two or more transactions with the same nonce on the stage. [#1491]
Version 0.15.3
Released on September 10, 2021.
- Fixed a bug where
Swarm<T>fails to reply transaction when any of the requested transactions id inGetTxsmessage does not exist in the storage. [#1481]
Version 0.15.2
Released on September 3, 2021.
- Removed
ITransport.SendMessageWithReplyAsync(BoundPeer, Message, TimeSpan?, int, CancellationToken)method. Instead, addedITransport.SendMessageWithReplyAsync(BoundPeer, Message, TimeSpan?, int, bool, CancellationToken)method. [#1458, #1461] - Fixed a bug where
GetTxsrequest failed to receive transactions if any messages are missing. [#1458, #1461]
Version 0.15.1
Released on August 28, 2021.
NetMQTransportbecame to process message in non blocking way. [#1451]
Version 0.15.0
Released on August 18, 2021.
Backward-incompatible API changes
- Added
IRandom.Seedproperty. [#1431]
Version 0.14.1
Released on August 18, 2021.
- Added additional tags to logging. [#1433]
Version 0.14.0
Released on Aug 5, 2021.
Added APIs
- Added
NonblockRenderer<T>class. [#1402, #1422] - Added
NonblockActionRenderer<T>class. [#1402, #1422]
Version 0.13.2
Released on Aug 5, 2021.
- When a reorg happens,
Swarm<T>now broadcasts a reorged chain tip first before rendering. [#1385, #1415] - Fixed a bug where
TurnClienthadn't been recovered when TURN connection had been disconnected. [#1424]
Version 0.13.1
Released on July 29, 2021.
- Fixed
HashAlgorithmType.Digest()method's bug that it returns an incorrect digest bytes when it is called by multiple threads at a time. [#1411]
Version 0.13.0
Released on July 28, 2021.
Backward-incompatible API changes
- Added
bool render = falseoption toSwarm<T>.PreloadAsync(). Blocks and actions in preloaded blocks will be rendered if the switch is set totrue. [#1391]
Added APIs
- Added
Transaction<T>.CreateUnsigned()method. [#1378] - Added
SwarmOptions.TableSizeproperty. [#1401] - Added
SwarmOptions.BucketSizeproperty. [#1401]
Behavioral changes
Transaction<T>.Validate()became to throwInvalidTxSignatureExceptionif the transaction was not signed. [#1378]
Bug fixes
- Fixed a bug where
Swarm<T>had stopped whenObjectDisposedExceptionis thrown duringNetMQTransport.DoBroadcast(). [#1362, #1365]
Version 0.12.1
Released on July 28, 2021.
Swarm<T>.PreloadAsync()now checks the existence of blocks in the storage (was in the blockchain). [#1324]
Version 0.12.0
Released on July 23, 2021.
Backward-incompatible API changes
- Block hashes are now represented as
BlockHash, which was introduced in this release, which has been done asHashDigest<SHA256>. [#1192, #1197]- The type of
Block<T>.Hashproperty becameBlockHash(wasHashDigest<SHA256>). - The type of
Block<T>.PreviousHashproperty becameBlockHash?(wasHashDigest<SHA256>?). - The types of
Block<T>()constructors'hashparameter becameBlockHash(wereHashDigest<SHA256>). - The types of
Block<T>()constructors'previousHashparameter becameBlockHash?(wereHashDigest<SHA256>?). - The type of
Block<T>.Mine()method'spreviousHashparameter becameBlockHash?(wasHashDigest<SHA256>?). - The return type of
HashCash.Hash()method becameBlockHash(wasHashDigest<SHA256>). - The type of
Transaction<T>()constructor'sgenesisHashparameter becameBlockHash?(wasHashDigest<SHA256>?). - The type of
Transaction<T>.Create()method'sgenesisHashparameter becameBlockHash?(wasHashDigest<SHA256>?). - The type of
Transaction<T>.GenesisHashproperty becameBlockHash?(wasHashDigest<SHA256>?). - The type of
Transaction<T>.EvaluateActionsGradually()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
Transaction<T>.EvaluateActions()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
BlockChain[]indexer's parameter becameBlockHash(wasHashDigest<SHA256>). - The type of
BlockChain.BlockHashesproperty becameIEnumerable<BlockHash>(wasIEnumerable<HashDigest<SHA256>>). - The type of
BlockChain.ContainsBlock()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
BlockChain.GetState()method'soffsetparameter becameBlockHash?(wasHashDigest<SHA256>?). - The type of
BlockChain.GetBalance()method'soffsetparameter becameBlockHash?(wasHashDigest<SHA256>?). - The type of
StateCompleter<T>delegate'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
FungibleAssetStateCompleter<T>delegate'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). BlockSet<T>no more implementsIDictionary<HashDigest<SHA256>, Block<T>>, but now implementsIDictionary<BlockHash, Block<T>>.- The type of
ActionExecutionState.ExecutedBlockHashproperty becameBlockHash(wasHashDigest<SHA256>). - The type of
BlockDownloadState.ReceivedBlockHashproperty becameBlockHash(wasHashDigest<SHA256>). - The type of
BlockVerificationState.VerifiedBlockHashproperty becameBlockHash(wasHashDigest<SHA256>). - The type of
IncompleteBlockStatesException()constructor'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
IncompleteBlockStatesException.BlockHashproperty becameBlockHash(wasHashDigest<SHA256>). - The types of
InvalidGenesisBlockException()constructor'snetworkExpectedandstoredparameters becameBlockHash(wereHashDigest<SHA256>). - The type of
InvalidGenesisBlockException.NetworkExpectedproperty becameBlockHash(wasHashDigest<SHA256>). - The type of
InvalidGenesisBlockException.Storedproperty becameBlockHash(wasHashDigest<SHA256>). - The type of
InvalidTxGenesisHashException()constructor'sexpectedGenesisHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
InvalidTxGenesisHashException()constructor'simproperGenesisHashparameter becameBlockHash?(wasHashDigest<SHA256>?). - The type of
InvalidTxGenesisHashException.ExpectedGenesisHashproperty becameBlockHash(wasHashDigest<SHA256>). - The type of
InvalidTxGenesisHashException.ImproperGenesisHashproperty becameBlockHash?(wasHashDigest<SHA256>?). - The return type of
IStore.IndexBlockHash()method becameBlockHash?(wasHashDigest<SHA256>?). - The type of
IStore.AppendIndex()method'shashparameter becameBlockHash(wasHashDigest<SHA256>). - Replaced
IStore.ForkBlockIndexes()method'sHashDigest<SHA256> branchPointparameter withBlockHash branchpoint. - The return type of
IStore.IterateIndexes()method becameIEnumerable<BlockHash>(wasIEnumerable<HashDigest<SHA256>>). - The return type of
IStore.IterateBlockHashes()method becameIEnumerable<BlockHash>(wasIEnumerable<HashDigest<SHA256>>). - The type of
IStore.GetBlock<T>()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
IStore.GetBlockIndex()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
IStore.GetBlockDigest()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
IStore.DeleteBlock()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
IStore.ContainsBlock()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
IStateStore.GetState()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
IStateStore.ContainsBlockStates()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
TrieStateStore.GetRootHash()method'sblockHashparameter becameBlockHash(wasHashDigest<SHA256>). - The type of
TrieStateStore.PruneStates()method'sexcludeBlockHashesparameter becameIImmutableSet<BlockHash>(wasImmutableHashSet<HashDigest<SHA256>>).
- The type of
- Hash algorithm for PoW (Hashcash) became
configurable. #1314, #1352
- Added
IBlockPolicy<T>.GetHashAlgorithm()method. - Added an optional
HashAlgorithmType? hashAlgorithmparameter toBlock<T>(long, long, BigInteger, Nonce, Address?, BlockHash?, DateTimeOffset, IReadOnlyList<Transaction<T>>, ImmutableArray<byte>?, HashDigest<SHA256>?, int protocolVersion)constructor. - Added
HashAlgorithmType hashAlgorithmparameter toBlock<T>.MineBlock()method. - The type of
Block<T>.PreEvaluationHashproperty becameImmutableArray<byte>?(wasHashDigest<SHA256>?). [#1192, #1197] - The types of
Block<T>()constructors'preEvaluationHashparameter becameImmutableArray<byte>?(wereHashDigest<SHA256>?). [#1192, #1197] - The type of
InvalidBlockPreEvaluationHashException.ActualPreEvaluationHashandExpectedPreEvaluationHashproperties becameImmutableArray<byte>(wereHashDigest<SHA256>). [#1192, #1197] - The type of
InvalidBlockPreEvaluationHashException()constructor'sactualPreEvaluationHashand andexpectedPreEvaluationHashparameters becameImmutableArray<byte>(wereHashDigest<SHA256>). [#1192, #1197] - Replaced
UnexpectedlyTerminatedActionException()constructor'sHashDigest<SHA256>? blockHashparameter withImmutableArray<byte>? preEvaluationHash. [#1192, #1197] - Replaced
UnexpectedlyTerminatedActionException.BlockHashproperty withPreEvaluationHash.[#1192, #1197] - Replaced
Hashcash.Answer(Stamp, long, CancellationToken)method withHashcash.Answer<T>(Stamp, HashAlgorithm, long, CancellationToken)method. - Removed
Hashcash.Hash()method. - Removed
HashDigest<T>.Satisfies()method. This was replaced byByteUtil.Satisfies()method instead. [#1192, #1197] - Added
hashAlgorithmGetterparameter toBlockSet<T>()constructor. - Added
hashAlgorithmparameter toBlockChain<T>.MakeGenesisBlock()method. - Added an optional
hashAlgorithmGetterparameter toBlockPolicy<T>()constructor.
- Added
- Added
IActionContext.TxIdproperty. [#1275] - Added
IStore.PutTxExecution(TxSuccess)method. [#1156, #1289] - Added
IStore.PutTxExecution(TxFailure)method. [#1156, #1289] - Added
IStore.GetTxExecution()method. [#1156, #1289] - Removed the optional parameter
Guid? chainId = nullfromIStateStore.GetState()method. [#1289] - Removed
compressparameter fromDefaultStore()constructor. [#1289] - Removed
statesCacheSizeparameter fromDefaultStore()constructor. [#1289] - Removed
StunMessage.Parse(Stream)method. [#1228] - Moved
ITransportandNetMQTransportfromLibplanet.NettoLibplanet.Net.Transports. [#1235] Block<T>now enforces a collection ofTransaction<T>s to be less mutable. [#1274]- The type of
Block<T>()constructor'stransactionsparameter becameIReadOnlyList<T>(wasIEnumerable<T>). - The type of
Transactionsproperty ofBlock<T>becameIReadOnlyList<T>(wasIEnumerable<T>).
- The type of
- Types of following properties became
IReadOnlyList<T>(wasIEnumerable<T>). [#1230, #1271]RoutingTable.PeersRoutingTable.PeerStatesSwarm<T>.PeersSwarm<T>.PeerStates
- Return type of
RoutingTable.Neighbors()becameIReadOnlyList<BoundPeer>(wasIEnumerable<BoundPeer>). [#1230, #1271] - All methods pertaining to evaluating
IActions are moved to a newActionEvaluatorclass. [#1301, #1305]- Removed
Block<T>.Evaluate()method. UseActionEvaluator.Evaluate()method instead. - Removed
Block<T>.EvaluateActionsPerTx()method. - Removed
Transaction<T>.EvaluateActionsGradually()method. - Removed
Transaction<T>.EvaluateActions()method.
- Removed
- Parameters
action,inputContext, andoutputStatesforActionEvaluation()constructor can no longer benull. [#1305] - Added
IStore.PutTxIdBlockHashIndex(TxId, BlockHash)method. [#1294, #1328] - Added
IStore.GetFirstTxIdBlockHashIndex(TxId)method. [#1294, #1328] - Added
IStore.DeleteTxIdBlockHashIndex(TxId, BlockHash)method. [#1294, #1328] - Added
IStore.IterateTxIdBlockHashIndex(TxId)method. [#1294, #1328] - Parameter
minerforBlock<T>()andBlock<T>.Mine()can no longer benull. [#1341] Swarm<T>.StartAsync()method became to receivebroadcastBlockInterval(ormillisecondsBroadcastBlockInterval) parameter. [#1351]- Added the parameter
minimumBroadcastTargettoNetMQTransport()constructor. [#1379] - Removed
InvalidTxUpdatedAddressesException. [#368, #1389]
Added APIs
- Added
ActionEvaluatorclass. [#1301, #1305] - Added
BlockHashstruct. [#1192, #1197] - Added
HashDigest<T>.DeriveFrom()method. [#1197] - Added
HashAlgorithmTypeclass. [#1314, #1352] - Added
HashAlgorithmGetterdelegate. [#1314, #1352] - Added
HashAlgorithmTablestatic class. [#1314, #1352] - Added
BlockChain<T>.GetTxExecution()method. [#1156, #1289] - Added
StunMessage.ParseAsync(Stream, CancellationToken)method. [#1228] - Added
Swarm<T>.AddPeersAsync()method. [#1234] - Added
NetMQTransport.QueryAppProtocolVersion()static method. [#1235] - Added
BoundPeer.Parse()static method. [#1240] - Added
TransportExceptionclass. [#1242] - Added
SwarmOptions.StaticPeersproperty. [#1230, #1271] - Added
SwarmOptions.StaticPeersMaintainPeriodproperty. [#1230, #1367] - Added
SwarmOptions.BranchpointThresholdproperty. [#1348] - Added
AtomicActionRenderer<T>class. [#1267, #1275] - Added
TxExecutionabstract class. [#1156, #1289] - Added
TxSuccessclass. [#1156, #1289] - Added
TxFailureclass. [#1156, #1289] - Added
IExtractableExceptioninterface. [#1156, #1289] - Added
ExtractableExceptionstatic class. [#1156, #1289] - Added
Address(Binary)overloaded constructor. [#1289] - Added
Currency(IValue)overloaded constructor. [#1289] - Added
Currency.Serialize()method. [#1289] - Added
ByteUtil.TimingSafelyCompare()method. [#1314, #1352] - Added
ByteUtil.Satisfies()method. [#1314, #1352] - Added
BlockChain<T>.ExecuteActions()method. [#1368] - Added
SwarmOptions.MinimumBroadcastTargetproperty. [#1379]
Behavioral changes
BlockChain<T>.Append()now records aTxExecutionfor every single transaction in the appendedBlock<T>, whether a transaction is successful (TxSuccessis recorded for this case) or not (TxFailureis recorded for this case). [#1156, #1289]ITransport.StartAsync()andITransport.RunAsync()became to throwTransportExceptioninstead ofSwarmException. [#1242]NetMQTransportbecame to enforce NetMQ/AsyncIO to use its pure .NET implementation instead of Windows' IOCP when it is running on Mono, which powers Unity engine, since Unity does not properly implement the IOCP even on Windows. It had been done bySwarm<T>, but as theITransportis now separated from it, this became done byNetMQTransportinstead ofSwarm<T>. [#247, #1278]- (Libplanet.RocksDBStore)
RocksDBStore.ForkBlockIndexes()became to share common ancestors between forks rather than duplicating them so that much less space is used. [#1280, #1287] BlockChain<T>.Append()cumulates indexes for pairs (TxId and BlockHash). A transaction inclusion for a block is retrievable by using this index. [#1315, #1329]ActionEvaluator<T>.EvaluateActions()now throws an unmanaged exception ifOutOfMemoryExceptionis caught fromIAction.Execute(). [#1320, #1343]- Improved performance of broadcasting using
Swarm<T>. [#1334] Swarm<T>now maintains static peers provided viaSwarmOptions.StaticPeersperiodically. [#1230, #1367]Block<T>.Headeris now cached instead of creating a new instance every call. [#1347]BlockChain<T>.ExecuteActions()became no longer throwInvalidTxUpdatedAddressesException. [#368, #1389]
Bug fixes
- Fixed a bug where executing
Transaction<T>.Actionshad not been atomic.Actionsin aTransaction<T>now became executed all or nothing at all. [#1267, #1275]Transaction<T>.EvaluateActions()method became atomic.Transaction<T>.EvaluateActionsGradually()method had returned the same number ofActionEvaluations toTransaction<T>.Actions, but now became to omit the evaluations after the first action throwing an exception. If no action throws any exception, it still returns the same number ofActionEvaluations toTransaction<T>.Actions.- State-wise,
Transaction<T>s having any exception-throwing action now do not commit any changes at all toIStateStore. - Rendering-wise, for actions following the first exception-throwing
action, action rendering methods in
IActionRenderer<T>(RenderAction(),RenderActionError(),UnrenderAction(), andUnrenderActionError()) became not invoked. If you want to dismiss all actions in unsuccessful transactions at all, wrap your action renderer withAtomicActionRenderer<T>.
- Fixed a bug where
KademliaProtocol.BootstrapAsync()has sent multiplePingmessages to other peers. [#1219] - Fixed a bug where
KademliaProtocol.CheckReplacementCacheAsync()has updated cached peers multiple times. [#1219] - Fixed memory leak due to undisposed
CancellationTokenRegistrations. [#1228] - Fixed a bug where
DefaultStore.Dispose()andTrieStateStore.Dispose()had not been idempotent. [#1272] - (Libplanet.RocksDBStore) Fixed a bug where
RocksDBStore.Dispose(),MonoRocksDBStore.Dispose(), andRocksDBKeyValueStore.Dispose()had not been idempotent. [#1272, #1289] - Fixed a bug where
NetMQTransporthad hung forever within Mono runtime. [#1278] - Fixed a bug where
DefaultStore.ForkBlockIndexes()hadn't copied genesis block. [#1325] - (Libplanet.RocksDBStore) Fixed a bug where
RocksDBStore.GetBlock<T>()andRocksDBStore.GetTransaction<T>()handn't returned expected values in multithreading environment. [#1339, #1342] - Fixed a bug where chain synchronization had been incorrectly updated with an improper chain. [#1349, #1350]
- Fixed a bug where
Swarm<T>hadn't respond immediately under load. [#1360]
CLI tools
- Added the option
--jsontoplanet apv analyzecommand to print result as JSON format. [#1240] - Added
planet apv querysubcommand to query app protocol version of specific peer. [#1240] - Added the option
--no-passphrasetoplanet key removecommand to remove key without asking passphrase. [#1213, #1265] - Added
planet key derivesubcommand to derive the address or public key from a private. [#1268] - Added
planet store [block-by-hash|block-by-index|tx-by-id]commands to retrieve the data from the store. [#1284, #1285, #1298] - Added
planet store block-by-tx-idcommands to retrieve the data from the store. [#1316, #1340] - Added
planet store build-index-tx-blockcommands to build index from TxId to BlockHash. [#1316, #1340] - Added
planet stats summarycommand to retrieve a state summary of a stored chain in a CSV format. [#1353]
Version 0.11.1
Released on April 22, 2021.
- Fixed a bug where block synchronization had stopped due to internal errors. [#1259]
Version 0.11.0
Released on March 30, 2021.
Backward-incompatible API changes
- Added the parameter
protocolVersiontoBlock<T>(long, long, BigInteger, Nonce, Address?, HashDigest<SHA256>?, DateTimeOffset, IEnumerable<Transaction<T>> transactions, HashDigest<SHA256>?, HashDigest<SHA256>?)constructor. [#1142, #1147, #1162] - Added the parameter to
protocolVersiontoBlock<T>.Mine()method. [#1142, #1147, #1162] - Added the first parameter
protocolVersiontoBlockHeader()constructor. [#1142, #1147, #1162] - Added
stagePolicyas the second parameter toBlockChain<T>()constructor. [#1130, #1131] - Added
IBlockPolicy<T>.CanonicalChainComparerproperty to make the canonical chain. [#1155, #1165, #1184] - Added
canonicalChainCompareras the last parameter toBlockPolicy()constructors. [#1155, #1165, #1184] - Added
canonicalChainCompareras the second parameter toDelayedRenderer()constructor. [#1155, #1165, #1184] - Added
canonicalChainCompareras the second parameter toDelayedActionRenderer()constructor. [#1155, #1165, #1184] - Added
reorgResistantHeightparameter intoDelayedActionRenderer<T>()constructor. [#1163] - Added
IStore.SetBlockPerceivedTime()method. [#1184] - Added
IStore.GetBlockPerceivedTime()method. [#1184] - Removed
TransactionSet<T>class. [#1165] - Removed
IBlockStatesStoreinterface. [#1117] - Removed
BaseBlockStatesStoreabstract class. [#1117] - Removed
Swarm<T>.GetTrustedStateCompleterAsync()method. [#1117] - Removed
trustedStateValidatorsparameter fromSwarm<T>.PreloadAsync()method. [#1117] - Removed
Swarm<T>.TraceTable()method. [#1120] - Added
IActionContext.BlockActionproperty. [#1143] - Added nullable
TimeSpan-typedmessageLifespanparameter intoNetMQTransport()constructor. [#1171] - Added
IStore.ForkTxNonces()method. [#1198] - Removed
PeerState.AddressProperty. [#1215] IProtocol.RebuildConnectionAsync(CancellationToken)method was replaced by,IProtocol.RebuildConnectionAsync(int, CancellationToken)method. [#1215]
Backward-incompatible network protocol changes
Swarm<T>became no longer retry whenSwarm<T>receives less than 500 blocks. [#1112]- The existing
ChainStatusmessage type (with the type number0x24) was replaced by a newChainStatusmessage type (with the type number0x25). [#1155, #1165] - Removed the message types depended on features of
IBlockStatesStoreinterface. [#1117]GetRecentStatesmessage type (with the type number0x0b)RecentStatesmessage type (with the type number0x13)GetBlockStatesmessage type (with the type number0x22)BlockStatesmessage type (with the type number0x23)
Swarm<T>became to ignore messages made earlier than a certain amount of time, which is configured bySwarmOptions.MessageLifespan. [#1160, #1171]
Backward-incompatible storage format changes
- (Libplanet.RocksDBStore) The blocks and transactions became stored in
multiple databases. Each block and transaction belongs to a partition
of the database, according to its epoch unit, which is its Unix timestamp.
Every epoch is divided by certain seconds, configured by
RocksDBStore()constructor'stxEpochUnitSecondsandblockEpochUnitSecondsparameters (86,400 by default). [#1183, #1194] - (Libplanet.RocksDBStore) Continue on partitioning of database,
RocksDBStore()is manage database connection by LRU Cache. The max size of connection cache is configured byRocksDBStore()constructor'sdbConnectionCacheSizeparameters (100 by default). [#1183, #1194] - (Libplanet.RockDBStore) The
RocksDBStorethat was previously used has been separated into a class calledMonoRocksDBStore. Please use this class if you need to migrate. [#1183, #1204]
Added APIs
- Added
Block<T>.CurrentProtocolVersionconstant. [#1142, #1147] - Added
Block<T>.ProtocolVersionproperty. [#1142, #1147] - Added
Block<T>.Headerproperty. [#1070, #1102] - Added
BlockHeader.ProtocolVersionproperty. [#1142, #1147] - Added
IBlockExcerptinterface. [#1155, #1165, #1170] - Added
BlockExcerptstatic class. [#1155, #1165, #1170, #1184] Block<T>became to implementIBlockExcerptinterface. [#1155, #1165, #1170]BlockHeaderbecame to implementIBlockExcerptinterface. [#1155, #1165, #1170]- Added
BlockPerceptionstruct. [#1155, #1184] - Added
BlockChain<T>.PerceiveBlock()method. [#1155, #1184] - Added
DelayedRenderer<T>.CanonicalChainComparerandDelayedActionRenderer<T>.CanonicalChainComparerproperties. [#1155, #1165, #1184] - Added
TotalDifficultyComparerclass. [#1155, #1165, #1170, #1184] - Added
IStagePolicy<T>interface. [#1130, #1131, #1186] - Added
VolatileStagePolicy<T>class. [#1130, #1131, #1136, #1186] - Added
ITransportinterface. [#1052] - Added
NetMQTransportclass which implementsITransport. [#1052] - Added
Messageabstract class. [#1052] - Added
BlockExceedingTransactionsExceptionclass. [#1104, #1110] - Added
BlockChain<T>.GetStagedTransactionIds()method. [#1089] - (Libplanet.RocksDBStore) Added
maxTotalWalSize,keepLogFileNumandmaxLogFileSizeparameters intoRocksDBStore()constructor. [#1065, #1102, #1132] - Added
Swarm<T>.BlockDemandproperty. [#1068, #1102] - Added
BlockDemandstruct. [#1068, #1102] - Added
TurnClient.PublicAddressproperty. [#1074, #1102] - Added
TurnClient.EndPointproperty. [#1074, #1102] - Added
TurnClient.BehindNATproperty. [#1074, #1102] - Added
TurnClient.InitializeTurnAsync(int, CancellationToken)method. [#1074, #1102] - Added
TurnClient.StartAsync(int, CancellationToken)method. [#1074, #1102] - Added
TurnClient.ReconnectTurn(int, CancellationToken)method. [#1074, #1102] - Added
TurnClient.IsConnectable(CancellationToken)method. [#1074, #1102] - Added
TurnClient.ReconnectTurn(CancellationToken)method. [#1074, #1102] - Added
Libplanet.Blockchain.Renderers.Debug.RenderRecord<T>abstract class and its subclasses: [#1119]RenderRecord<T>.ActionBaseabstract classRenderRecord<T>.ActionSuccessclassRenderRecord<T>.ActionErrorclassRenderRecord<T>.BlockBaseabstract classRenderRecord<T>.BlockclassRenderRecord<T>.Reorgclass
- Added
Libplanet.Blockchain.Renderers.Debug.RecordingActionRenderer<T>class. [#1119] - Added
Libplanet.Blockchain.Renderers.Debug.ValidatingActionRenderer<T>class. [#1119] - Added
Libplanet.Blockchain.Renderers.Debug.InvalidRenderException<T>class. [#1119] - Added
InvalidBlockProtocolVersionExceptionclass. [#1142, #1147] - Added
InvalidBlockTxHashExceptionclass. [#1116] - Added
Swarm<T>.PeerStatesproperty. [#1120] - Added
IProtocolinterface. [#1120] - Added
KademliaProtocolclass which implementsIProtocol. [#1120, #1135] - Added
reorgResistantHeightparameters intoDelayedActionRenderer<T>()constructor. [#1163] - Added
InvalidBlockPreEvaluationHashExceptionclass. [#1148] - Added the parameter
validatewhich istrueby default, toTransaction<T>.Deserialize(). [#1149] - Added
SwarmOptions.MessageLifespanproperty. [#1171] - Added
InvalidTimestampExceptionclass. [#1171] - Added
PeerState.PeerProperty. [#1215] - Added
SwarmOptions.RefreshPeriodproperty, which is 10 seconds by default. [#1215] - Added
SwarmOptions.RefreshLifespanproperty, which is 60 seconds by default. [#1215]
Behavioral changes
- Upgraded Bencodex package (which is a dependency) so that Libplanet gets benefits from its recent optimizations. [#1081, #1084, #1086, #1101]
- Introduced the protocol versioning scheme. This purposes to change the protocol without breaking backward compatibility. Even the protocol is changed, the existing blocks made before the new protocol are guaranteed to behave as it had done. [#1142, #1147, #1155 #1162, #1170, #1184]
- Since
BlockHeader.ProtocolVersionwas added, the existing blocks are considered protocol compliant with the protocol version zero. [#1142, #1147, #1162] - When a
BlockChain<T>followsVolatileStagePolicy<T>, which is Libplanet's the only built-inIStagePolicy<T>implementation at the moment, as itsStagePolicy, its staged transactions are no longer persistent but volatile instead. It also automatically purges staged transactions after the givenLifetime, which is 3 hours by default. [#1130, #1131, #1136, #1186] Swarm<T>became not to receive states from trusted peers. [#1061, #1102]Swarm<T>became not to retry when block downloading. [#1062, #1102]- Improved performance of
BlockChain<T>.MineBlock(). [#1116, #1124] - Improved performance of
Block<T>.Deserialize(). [#1116] Swarm<T>became not to fill states from trusted peers, because now states can be validated rather than trusted due to MPT. [#1117]HashDigest<SHA256>became serializable. [#795, #1125]Transaction<T>()constructors became not to validate itself. [#1149]BlockChain<T>.Append()became to validate the givenBlock<T>before storing itsStateRootHash. [#1172]Blockchain<T>became not to stage transactions having nonce less than or equal to the nonce of the same signer's latest transaction in already mined blocks. [#1173, #1180, #1186]- Improved security of
Message.Parse(). [#1161, #1181] - Improved performance of
BlockChain<T>.Fork(). [#1198] Swarm<T>became not to callKademliaProtocol.RebuildConnectionAsync()right afterSwarm<T>.StartAsync(). If you calledSwarm<T>.BootstrapAsync()beforeSwarm<T>.StartAsync(), peers in your table may not have you in their table right afterSwarm<T>.StartAsync()(which was almost guaranteed before). [#1208]- Peers added during
Swarm<T>.BootstrapAsync()beforeSwarm<T>.StartAsync()are now marked as stale so thatSwarm<T>.RefreshTableAsync()will update. [#1215] - Following classes became to leave log messages with its class as logging
context. [#1218]
TrieStateStoreclassTurnClientclassActionEvaluationclass
Bug fixes
- Fixed a bug where
BlockChain<T>.MineBlock()was not automatically cancelled when the tip of the chain was changed occasionally. [#1141] - Fixed a bug where blocks with invalid
PreEvaluationHashwas considered as a valid block. [#1148, #1202] - Fixed a vulnerability of the
IAccountStateDelta.TransferAsset()'s internal implementation that it had doubled recipient's balance when a sender and a recipient is the same. *Since this changes the protocol, for backward compatibility, the actions belonging to the existing block, which was mined before the protocol v1, are guaranteed to still behave as it had done. [#1152] - Fixed a bug where
Block<T>.Evaluate()hadn't validate its hash. [#1168] - Fixed memory leak due to undisposed
CancellationTokenSources. [#1182, #1212] - Fixed a bug where
TurnClienthadn't released its relay connections after reconnecting. [#1185]
CLI tools
planet mpt diffcommand became to take 4 arguments (which was 3) so that it can compare state root hashes from two different KV stores. The existing commands likeplanet mpt diff STORE A Bdo not work anymore, and these should be instead likeplanet mpt diff STORE A STORE B. [#1129]- Store aliases used by
planet mptbecame to disallow names looking like URIs to disambiguate aliases from the literal store URIs. [#1129] - Added new subcommands
planet mpt listandplanet mpt query. [#1137] planet mpt diffcommand became to print the differences between other state root hashes into stdout as JSON format. [#1138, #1191, #1233]
Version 0.10.3
Released on January 28, 2021.
BlockChain<T>.MineBlock()became to unstage transactions that have lower nonce than expected. [#1174]
Version 0.10.2
Released on November 25, 2020.
- Fixed
BlockChain<T>.Append()method's bug that it had accepted aBlock<T>having moreTransactionsthan the number specified by theIBlockPolicy<T>.MaxTransactionsPerBlockproperty. Now it throwsInvalidBlockExceptioninstead for such case. [#1104]
Version 0.10.1
Released on November 24, 2020.
Transaction<T>.Idproperty became lazy-loaded and cached if it's once loaded. (It had been loaded when the object is instantiated.) [#1079, #1080]- The result bytes of
Transaction<T>.Serialize()became cached under the hood. [[#1079, #1080]] - Fixed
BlockChain<T>.MineBlock()method's bug which excludes one's all transactions virtually forever after a signer's transactions once have been staged without the ascending order of nonce (usually due to their inconsistent propagation latency on the network). [#1057, #1059] BlockChain<T>.MineBlock()method became to cut off staged transactions to mine if it takes longer than 4 seconds to collect and validate them. Those rest staged transactions are postponed until next block mining. [#1057, #1059]BlockChain<T>.ContainsBlock()method was optimized so that it does not needlessly load an entire block, but looks up only an index instead. [#1057, #1059]BlockChain<T>became not to validate genesis block during fork, where the state store is not an implementation ofIBlockStatesStore. [#1063]- Fixed a bug where
Swarm<T>.GetPeerChainStateAsync()has thrownNullReferenceExceptionwhen peers in table does failed to respond. [#1066] - Fixed a bug where
BlockChain<T>had not locked readers–writer lock for state changes duringMineBlock(). [#1077, #1087] PolymorphicAction<T>.ToString()became more human-readable. [#1085, #1087]- Fixed a bug where
MerkleTriehad hadMrrkleTrie.EmptyRootHashas root node, which had been unable to insert new nodes. [#1087, #1091]
Version 0.10.0
Released on October 27, 2020.
Backward-incompatible API changes
- Extracted rendering methods from
IActiontoIRenderer<T>, which is introduced in this version. From now on, rendering logic needs to be injected from outside throughBlockChain<T>.Renderers, rather thanIActions knowing how to render themselves.IRenderer<T>also unifiedBlockChain<T>.TipChangedevent, and introduced new events likeIActionRenderer<T>.RenderActionError(),IActionRenderer<T>.RenderBlockEnd(),IRenderer<T>.RenderReorg(), andIRenderer<T>.RenderReorgEnd(). [#860, #875, #959, #963]- Removed
IAction.Render()method, which was replaced byIActionRenderer<T>.RenderAction(). - Removed
IAction.Unrender()method, which was replaced byIActionRenderer<T>.UnrenderAction(). - Removed
BlockChain<T>.TipChangedevent, which was replaced byIRenderer<T>.RenderBlock(). - Removed
PolymorphicAction<T>.Render()andUnrender()methods. - Removed
BlockChain<T>.TipChangedEventArgsclass.
- Removed
- Added methods related fungible asset states to
IAccountStateDelta: [#861, #900, #954]UpdatedFungibleAssetsAccountspropertyMintAsset(Address, Currency, BigInteger)methodTransferAsset(Address, Address, Currency, BigInteger)methodBurnAsset(Address, Currency, BigInteger)methodGetBalance(Address, Currency)method
- Added
IAccountStateDelta.StateUpdatedAddressesproperty in order to distinguish state updates from asset states. [#861, #900] - Added an optional parameter
AccountBalanceGetter accountBalanceGettertoBlock<T>.EvaluateActionsPerTx()method. [#861, #900] BlockChain<T>.StageTransaction()became to throwInvalidTxGenesisHashExceptionwhen it takes aTransaction<T>from a heterogeneousBlockChain<T>with a different genesis block. [#796, #878]- Added
renderersoptional parameter toBlockChain<T>()constructor. [#883, #959, #963] - Added
BigInteger-typedtotalDifficultyparameter toBlock<T>()constructor. [#666, #917] - Added
BigInteger-typedpreviousTotalDifficultyparameter toBlock<T>.Mine()static method. [#666, #917] - Added
optionsoptional parameter toSwarm<T>()constructor. [#926] ICryptoBackendbecame toICryptoBackend<T>. [#932]ICryptoBackend.Verify(HashDigest<SHA256>, byte[], PublicKey)became toICryptoBackend<T>.Verify(HashDigest<T>, byte[], PublicKey)[#932]- Added
ICryptoBackend<T>.Sign(HashDigest<T>, PrivateKey)method. [#932] DefaultCryptoBackendbecame toDefaultCryptoBackend<T>. [#932]- Added
ImmutableArray<byte>-typedpreEvaluationHashparameter toBlockHeaderconstructor. [#931, #935] - Added
HashDigest<SHA256>-typedpreEvaluationHashparameter toBlock<T>()constructor. [#931, #935] - Replaced
SerializationInfoExtensions.GetValueOrDefault<T>()toSerializationInfoExtensions.TryGetValue<T>(). [#940] - Added
bool append = trueoption to bothBlockChain<T>.MineBlock()overloaded methods. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option is turned on by default. [#946] - Added
int? maxTransactionsoption to bothBlockChain<T>.MineBlock()overloaded methods. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option is turned on by default. [#1037, #1039, #1050] - Added
StateCompleterSet<T>? stateCompletersoption to twoBlockChain<T>.Append()overloaded methods. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option has the default value (StateCompleterSet<T>.Recalculate). [#946] - Added
CancellationToken cancellationToken = default(CancellationToken)option toBlockChain<T>.MineBlock(Address miner)overloaded method. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option has the default value. [#946] - Added
IImmutableSet<Address> trustedStateValidators = nulloption to bothSwarm<T>.StartAsync()overloaded methods. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option is turned on by default. [#946] - Removed
Peer.AppProtocolVersionproperty. [#949] - Removed
Peer.IsCompatibleWith()method. [#949] - Replaced
Peer(PublicKey, AppProtocolVersion)constructor withPeer(PublicKey)constructor. [#949] - Replaced
BoundPeer(PublicKey, DnsEndPoint, AppProtocolVersion)constructor withPeer(PublicKey, DnsEndPoint)constructor. [#949] - Extracted
IStore's some methods dedicated to block states intoIBlockStatesStore. [#950]ListStateKeys()method.ListAllStateReferences()method.LookupStateReference()method.IterateStateReferences()method.StoreStateReference()method.ForkStateReferences()method.GetBlockStates()method.SetBlockStates()method.PruneBlockStates()method.
- The signature of
IStore.LookupStateReference<T>(Guid, string, Block<T>)method was changed toLookupStateReference(Guid, string, long). [#950] - Added
IStateStore-typedstateStoretoBlockChain<T>constructor. [#950] - Replaced
Swarm<T>.FindSpecificPeerAsync(Address, Address, int, BoundPeer, TimeSpan?, CancellationToken)method withSwarm<T>.FindSpecificPeerAsync(Address, int, TimeSpan?, CancellationToken). [#981] - Added
IActionContext.GetUnconsumedContext()method. [#980] - Added
ImmutableArray<byte>-typedstateRootHashparameter toBlockHeaderconstructor. [#986] - Added
HashDigest<SHA256>-typedstateRootHashparameter toBlock<T>()constructor. [#986] - Added
IBlockPolicy<T>.MaxTransactionsPerBlockproperty. [#1037, #1050] - Added
IBlockPolicy<T>.GetMaxBlockBytes()method. [#201, #1050] IBlockPolicy<T>.DoesTransactionFollowPolicy()method became to take additionalBlockChain<T>parameter as its context. [#1012]- Methods in
BlockPolicy<T>class becamevirtual. [#1010] - Added
int maxTransactionsPerBlockoption to bothBlockPolicy<T>()overloaded constructors. [#1037, #1050] - Added
int maxBlockBytesandint maxGenesisBytesoptions to bothBlockPolicy<T>()overloaded constructors. [#201, #1050] BlockPolicy<T>()constructor'sdoesTransactionFollowPolicyparameter becameFunc<Transaction<T>, BlockChain<T>, bool>on . [#1012]- Added
cacheSizeoptional parameter toBlockSet<T>()constructor. [#1013] - Removed
Address(SerializationInfo, StreamingContext)constructor. [#1022] - Removed constructors from
InvalidMessageExceptionclass. [#1021]
Backward-incompatible network protocol changes
- The message field
RecentStates.StateReferencesbecame toIImmutableDictionary<string, IImmutableList<HashDigest<SHA256>>>fromIImmutableDictionary<Address, IImmutableList<HashDigest<SHA256>>>. [#912] - The existing
RecentStatesmessage type (with the type number0x0f) was replaced by a newRecentStatesmessage type (with the type number0x13). [#912] - Added
BlockHeader.TotalDifficultyproperty. [#666, #917] - The existing
Pongmessage type (with the type number0x02) was replaced by a newPongmessage type (with the type number0x14). [#459, #919, #920, #930] - The
TimestampThresholdbetweenBlock<T>s was changed from 15 minutes to 15 seconds. [#922, #925] Swarm<T>became to have 5 more message types:- Every message now contains app protocol version in its header. [#949]
- The existing
BlockHeaderMessagemessage type (with the type number0x0d) was replaced by a newBlockHeaderMessagemessage type (with the type number0x0c). [#1003, #1004] - Removed
PreloadBlockDownloadFailEventArgsclass. [#1002] - Removed
blockDownloadFailedparameter fromSwarm<T>.PreloadAsync()method. UseSwarmOptions.BlockDownloadTimeoutinstead. [#1002]
Backward-incompatible storage format changes
- Added
RawTransaction<T>.GenesisHashproperty. [#796, #878] - Added
BlockHeader.TotalDifficultyproperty. [#666, #917]
Added APIs
- Added
Currencystruct. [#861, #900, #954] - Added
FungibleAssetValuestruct. [#861, #944, #954] - Added
AccountBalanceGetterdelegate. [#861, #900, #954] - Added
TurnClient.BindProxies()method. [#756, #868] - Added
ActionEvaluation.Exceptionproperty. [#860, [#875]] - Added
InvalidTxGenesisHashExceptionclass. [#796, #878] - Added
InvalidBlockBytesLengthExceptionclass. [#201, #1050] - Added
CurrencyPermissionExceptionclass. [#861, #900] - Added
InsufficientBalanceExceptionclass. [#861, #900, #954] - Added
BlockChain<T>.GetBalance()method. [#861, #900] - Added
Block<T>.TotalDifficultyproperty. [#666, #917] - Added
Block<T>.BytesLengthproperty. [#201, #1050] - Added
SwarmOptionsclass. [#926] - Added
PeerChainStatestruct. [#936] - Added
Swarm<T>.GetPeerChainStateAsync()method. [#936] - Added
Swarm<T>.LastMessageTimestampproperty. [#964] - Added
Block<T>.PreEvaluationHashproperty. [#931, #935] - Added
BlockHeader.PreEvaluationHashproperty. [#931, #935] - Added
Transaction<T>.BytesLengthproperty. [#201, #1050] - Added
HashDigest(ImmutableArray<byte>)constructor. [#931, #935] - Incomplete block states became able to be handled in more flexible way.
[#929, #934, #946, #954]
- Replaced
BlockChain<T>.GetState(Address, HashDigest<SHA256>?, bool)method withGetState(Address, HashDigest<SHA256>?, StateCompleter<T>)method. SpecifyingcompleteStates: trueandfalsecan be replaced bystateCompleter: StateCompleters<T>.RecalculateandStateCompleters<T>.Reject, respectively. - Replaced
BlockChain<T>.GetBalance(Address, Currency, HashDigest<SHA256>?, bool)method withGetState(Address, Currency, HashDigest<SHA256>?, StateCompleter<T>)method. SpecifyingcompleteStates: trueandfalsecan be replaced bystateCompleter: FungibleAssetStateCompleters<T>.RecalculateandFungibleAssetStateCompleters<T>.Reject, respectively. - Added
StateCompleter<T>delegate. - Added
FungibleAssetStateCompleter<T>delegate. - Added
StateCompleterSet<T>struct. - Added
StateCompleters<T>static class. - Added
FungibleAssetStateCompleters<T>static class. - Added
Swarm<T>.GetTrustedStateCompleterAsync()method.
- Replaced
- Added
IRenderer<T>interface. [#959, #963] - Added
IActionRenderer<T>interface. [#959, #967, #970] - Added
AnonymousRenderer<T>class. [#959, #963] - Added
AnonymousActionRenderer<T>interface. [#959, #967, #970] - Added
DelayedRenderer<T>class. [#980, #1029] - Added
DelayedActionRenderer<T>class. [#980, #1029] - Added
LoggedRenderer<T>class. [#959, #963] - Added
LoggedActionRenderer<T>interface. [#959, #967, #970] - Added
BlockChain<T>.Renderersproperty. [#945, #959, #963] - Added
BlockChain<T>.ActionRenderersproperty. [#959, #967, #970] - Added
Swarm<T>.AppProtocolVersionproperty. [#949] DefaultStorebecame to implementIBlockStatesStore. [#950]- Added
IStateStoreinterface. [#950] - Added
IBlockStatesStoreinterface. [#950] - Added
TrieStateStoreclass. [#939] - Added
ITrieinterface. [#939, #1023] - Added
MerkleTrieclass. [#939, #1023] - Added
IKeyValueStoreinterface. [#939] - Added
DefaultKeyValueStoreclass. [#939] - Added
CacheableKeyValueStoreclass. [#939] - (Libplanet.RocksDBStore)
RocksDBStorebecame to implementIBlockStatesStore. [#950] - (Libplanet.RocksDBStore) Added
RocksDBKeyValueStore. [#939] - Added
InvalidBlockStateRootHashExceptionclass. [#986] - Added
Block<T>.StateRootHashproperty. [#986] - Added
BlockHeader.StateRootHashproperty. [#986] - Added
MerkleTrieExtensionsstatic class. [#1023] - Added
IAccountStateDelta.PreviousStateRootHashproperty to calculate states until previous action as state root hash. [#1030] - Added
UnexpectedlyTerminatedActionException.PreviousStateRootHashproperty. [#1032]
Behavioral changes
- Improved performance of
Swarm<T>. Transaction<T>.Create(),Transaction<T>.EvaluateActions()andTransaction<T>.EvaluateActionsGradually()no longer throwUnexpectedlyTerminatedActionExceptiondirectly. Instead, it records an exception toActionEvaluations. [#860, #875]- Added
Transaction<T>.GenesisHashproperty. [#796, #878] - Added
IAccountStateDelta.UpdatedAddressesproperty contains asset updates besides state updates. [#861, #900] BlockChain<T>.Append()method became to throwInvalidBlockBytesLengthExceptionif the given block's serialized bytes is longer than the limitation configured byIBlockPolicy.GetMaxBlockBytes(). [#201, #1050]BlockChain<T>.MineBlock()method became to cut off transactions to include to fit into the limitation configured byIBlockPolicy.GetMaxBlockBytes(). [#201, #1050]Swarm<T>became to ignore received transaction with different genesis hash. [#796, #878]Swarm<T>became to ignore invalidBlockHeaders immediately. [#898]Swarm<T>.PreloadAsync()became to clean up only temporary chains. [#902]BlockPolicy<T>became to validateBlock<T>.TotalDifficultyproperty of aBlock<T>. [#666, #917]Swarm<T>became to preload from peer that has the most difficult chain. [#459, #919]Swarm<T>became to promote the most difficult chain as a canonical chain instead of the longest chain. [#459, #919]Swarm<T>.BootstrapAsync()method became not to throwTimeoutExceptionwhen it fails to connect to all neighbors. [#933]Swarm<T>became to respond to the messages with different app protocol version. [#949]Swarm<T>.PreloadAsync()became to execute the actions from the branchpoint rather than the genesis block when there is a branch point. [#991]BlockPolicy<T>became to validateBlock<T>.StateRootHashproperty of aBlock<T>. [#986]Swarm<T>became not to syncBlock<T>s from the peers with different genesis block. [#1003, #1004]Swarm<T>became to ignoreBlockHeaderMessagefrom the peers with different genesis block. [#1003, #1004]BlockChain<T>instead ofBlockPolicy<T>became to validateBlock<T>s to append so that even if an empty implementation ofIBlockPolicy<T>is usedBlock<T>s are unable to be appended toBlockChain<T>. [#1010]BlockSet<T>[HashDigest<SHA256>]andBlockChain<T>.Genesisbecame cached so that they become faster to get. [#1013]Swarm<T>.PreloadAsync()became to do not render blocks. [#1029]
Bug fixes
- Fixed a bug that
Swarm<T>had failed to receive a request from TURN relay connections. [#404, #871, #890] - Fixed a bug where
Swarm<T>had been terminated and never reconnected when it had been once disconnected from TURN (mostly due to sleep mode, etc.). [#909] - Fixed a bug in which pre-computed state delivery had failed when a state
key is not an
Addresswhen preloading. [#912] - Fixed a bug where
UnexpectedlyTerminatedExceptionhadn't been serialized withBinaryFormatter. [#913] - Fixed a bug where
TurnClienthadn't applied cancellation token to its connections. [#916] - Fixed a bug where
BlockChain<T>.GetRawState()had overwritten block states without read lock. [#927] - Fixed a bug that
Swarm<T>had not respond toGetRecentStatesmessage when the target block does not exist in the chain. [#941] - Fixed a bug that
Swarm<T>.StartAsync()had not worked afterSwarm<T>.StopAsync()was once called. [#965] - Fixed a bug that
TurnClienthad thrownInvalidOperationExceptionwhen reconnecting. [#957, #972] - Fixed a bug that
Swarm<T>had not received block headers after failing to receive previous blocks. [#996] - Fixed a bug that
Swarm<T>had thrownInvalidGenesisBlockExceptionwhen reorg its chain repeatedly. [#996] - Fixed a bug that
Swarm<T>had propagated invalid transactions. [#1043]
Static analyzer
- Introduced the Libplanet.Analyzers package, a Roslyn Analyzer, which
checks if code has common mistakes prone to made with Libplanet-powered
game apps, e.g., breaking determinism in
IActionimplementations. [#1034]
CLI tools
- The
planetcommand became installable usingnpm. [#923, #982] - Fixed a bug that ^H had not removed the rightmost character in passphrase prompts. [#983, #984]
- Added a new sub-command
planet mpt. [#1023, #1026] - Introduced a configuration file. It's placed in: [#1023, #1026]
- Linux/macOS: $XDG_CONFIG_HOME/planetarium/cli.json
- Windows: %AppData%\planetarium\cli.json
Version 0.9.5
Released on June 12, 2020.
Version 0.9.4
Released on June 2, 2020.
- (Libplanet.RocksDBStore) Fixed a bug that
RocksDBStore.DeleteChainId()method had thrownKeyNotFoundExceptionwhen there's no such chain ID. [#891] - (Libplanet.RocksDBStore) Fixed a bug that
RocksDBStorehad written logs into the incorrect contextDefaultContext, notRocksDBStorethe correct one. [#891]
Version 0.9.3
Released on May 29, 2020.
- Fixed a
Swarm<T>.PreloadAsync()method's bug that had hanged in a state downloading block hashes and finally unexpectedly terminated when a peer's chain had gotten reorged. [#880, #884]
Version 0.9.2
Released on May 20, 2020.
- (Libplanet.RocksDBStore) Fixed a memory leak bug in
RocksDBStore. [#870]
Version 0.9.1
Released on May 7, 2020.
- Fixed a bug where the canonical chain had changed if any actions had thrown
an exception during
Swarm<T>.PreloadAsync(). [#862] - Fixed a
Swarm<T>.PreloadAsync()method's bug that it had hung forever and raisedInvalidOperationException. [#847, #864]
Version 0.9.0
Released on April 27, 2020.
Backward-incompatible API changes
BaseStoreclass became to implementIDisposable. [#789]- Removed
IStore.DeleteIndex(Guid, HashDigest<SHA256>)method. [#802] - Extension classes was renamed. However, it would not be affected
if you have called it by using instance method syntax. [#803]
- Renamed
StunAddressExtensionclass toStunAddressExtensions. - Renamed
BytesConvertExtensionclass toBytesConvertExtensions. - Renamed
RandomExtensionclass toRandomExtensions. - Renamed
AddressExtensionclass toAddressExtensions. - Renamed
HashDigestExtensionclass toHashDigestExtensions. - Renamed
NetMQFrameExtensionclass toNetMQFrameExtensions. - Renamed
NetMQSocketExtensionclass toNetMQSocketExtensions. - Renamed
SerializationInfoExtensionclass toSerializationInfoExtensions. - Renamed
StoreExtensionclass toStoreExtensions.
- Renamed
- All parameters, fields, property, and method return values that had been
represented as an
Int32became retyped toAppProtocolVersion. [#266, #815]Swarm()constructor's parameterappProtocolVersionbecameAppProtocolVersion(wasInt32).Peer()andBoundPeer()constructors' parameterappProtocolVersionbecameAppProtocolVersion(wasInt32).Peer.AppProtocolVersionproperty becameAppProtocolVersion(wasInt32).DifferentProtocolVersionEventArgs.ExpectedVersionandDifferentProtocolVersionEventArgs.ActualVersionproperties becameAppProtocolVersion(wasInt32).- Removed
DifferentAppProtocolVersionExceptionclass.
Swarm()constructor'sEventHandler<DifferentProtocolVersionEventArgs> differentVersionPeerEncountered = nullparameter became replaced byDifferentAppProtocolVersionEncountered differentAppProtocolVersionEncountered = nullparameter. [#266, #815]- Added
IEnumerable<PublicKey> trustedAppProtocolVersionSigners = nullparameter toSwarm()constructor. [#266, #815] - Removed
DifferentProtocolVersionEventArgsclass. [#266, #815] - Removed
createdAtparameter fromSwarm()constructor. [#838] - Replaced
BlockChain<T>.StageTransactions()with.StageTransaction()that receives only one transaction. [#820] - Replaced
BlockChain<T>.UnstageTransactions()with.UnstageTransaction()that receives only one transaction. [#820] - Added
IBlockPolicy.DoesTransactionFollowPolicy()method which is a method to determine if a transaction follows the block policy. [#827]
Backward-incompatible network protocol changes
- The existing
BlockHashesmessage type (with the type number0x05) was replaced by a newBlockHashesmessage type (with type number0x0e) in order to include an offset block index besides block hashes so that a receiver is able to determine their block indices too. [#707, #798] Peerbecame to have 3 more fields to represent the whole fields ofAppProtocolVersion, which is newly introduced. [#266, #815]- The existing
RecentStatesmessage type (with the type number0x0c) was replaced by a newRecentStatesmessage type (with type number0x0f) in order to compress its states. [#700, #850]
Added APIs
- Added
AddressExtensions.ToAddress(this PrivateKey)overloaded extension method. [#825] - Added
BlockHashDownloadStateclass, a subclass ofPreloadState. [#707, #798] - Added
BlockVerificationStateclass, a subclass ofPreloadState. [#798] - Added
AppProtocolVersionstruct. [#266, #815] - Added
IKeyStoreinterface. [#831] - Added
Web3KeyStoreclass. [#831] - Added
BlockDigeststruct. [#785] - Added
BlockHeaderstruct. [#785] - Added
IStore.GetBlockDigest(HashDigest<SHA256>)method. [#785] - Added
Block<T>.ToBlockDigest()method. [#785] - Added
ByteArrayExtensionsclass. [#803] - Added
IStore.PruneBlockStates<T>(Guid, Block<T>)method. [#790] - Added
DifferentAppProtocolVersionEncountereddelegate. [#266, #815] - Added
Swarm<T>.TrustedAppProtocolVersionSignersproperty. [#266, #815] - Added
Peer.IsCompatibleWith()method. [#266, #815] - Added
TxViolatingBlockPolicyExceptionclass. [#827] - Added
KeyStoreExceptionclass. [#831] - Added
NoKeyExceptionclass. [#831]
Behavioral changes
BlockChain.MineBlock()method became to ignore transactions having lower nonce than the expected nonce in the chain. [#791]Swarm<T>.PreloadAsync()andSwarm<T>.StartAsync()became to download only a list of block hashes first and then download blocks from simultaneously multiple peers. [#707, #798]- Improved performance of
Swarm<T>by preventing unnecessary task creation. [#817, #837] - Improved performance of
Swarm<T>.PreloadAsync()by parallelizing connections. [#846] - Improved response throughput of
Swarm<T>. [#849]
Bug fixes
Swarm<T>became not to sync the sameBlock<T>s orTransaction<T>s multiple times. [#784]- Fixed a
Swarm<T>'s bug that had broadcasted a message to its source peer when the number of peers is not enough (less than the minimum number). [#788] - Fixed a bug where
BlockChain.MineBlock()had produced an invalid block when there is any staged transaction which has lower nonce than the expected nonce, that means, shares an already taken nonce by the same signer. [#791] - Fixed a
Swarm<T>.PreloadAsync()method's bug that temporary chain IDs in the store had been completely cleaned up in some corner cases ifcancellationTokenwas requested. [#798] - Fixed a bug where
Swarm<T>had crashed if it received invalidTransaction<T>from the nodes. [#820] - Fixed a bug where
Swarm<T>hadn't reportedIProgress<PreloadState>s correctly.[#839] - Fixed a
Swarm<T>.PreloadAsync()method's bug that it had hung forever when a block failed to be fetched due to an unexpected inner exception. [#839] - Fixed a bug where actions had been evaluated twice when receiving blocks. [#843, #844]
- Fixed
OverflowExceptionbeing thrown when apassphrasecontaining any non-ASCII characters was passed toPbkdf2.Derive()method orProtectedPrivateKey.Protect()method. [#845]
CLI tools
- Added the
planetcommand and its aliasdotnet planet.
Version 0.8.0
Released on February 4, 2020.
Backward-incompatible API changes
- The internal representation for state keys became
string(wasAddress). [#368, #774]- The return type of
IStore.GetBlockStates()method becameIImmutableDictionary<string, IValue>(wasAddressStateMap, which was removed too). [#368, #774] - The type of the second parameter of
IStore.SetBlockStates()method becameIImmutableDictionary<string, IValue>(wasAddressStateMap, which was removed too). [#368, #774] - The second parameter of
IStore.IterateStateReferences()method becamestring key(wasAddress address). [#368, #774] - The second parameter of
IStore.StoreStateReference()method becameIImmutableSet<string> keys(wasIImmutableSet<Address> addresses). [#368, #774] IStore.ListAddresses()method was replaced byIStore.ListStateKeys()method. [#368, #774]
- The return type of
- Added
Swarm<T>.FindSpecificPeer()method to find a specific peer given the address. [#570, #580] - Removed
LiteDBStoreclass. UseDefaultStoreinstead. [#662] - Removed
BlockChain<T>.Contains(TxId)method. UseIStore.ContainsTransaction(TxId)instead. [#676] - Renamed
BlockChain<T>.Contains(HashDigest<SHA256>)method toBlockChain<T>.ContainsBlock(HashDigest<SHA256>). [#678] - Removed
BlockChain<T>.Contains(Block<T>)method. [#678] - Changed semantics of
BlockChain<T>.ContainsBlock(HashDigest<SHA256>)method andBlockChain<T>[HashDigest<SHA256>]indexer as lookups only the current chain, not entire storage. [#678] - Added
IStore.ContainsBlock(HashDigest<SHA256>)method. [#678] - Removed
AddressStateMapclass. [#98, #368, #692, #774]- The return type of
BlockChain<T>.GetState()method becameIValue(wasAddressStateMap). - The return type of
IStore.GetBlockStates()method becameIImmutableDictionary<string, IValue>(wasAddressStateMap). IStore.SetBlockStates()method became to takeIImmutableDictionary<string, IValue>instead ofAddressStateMap.
- The return type of
Swarm<T>.PreloadAsync()method andSwarm<T>.StartAsync()method became to takepreloadBlockDownloadFailedevent handler as an argument. [#694]- Added the
genesisBlockparameter toBlockChain<T>()constructor. [#688] - Removed
StateReferenceDownloadStateclass. [#703] - Removed
BlockStateDownloadStateclass. [#703] - Removed
TxReceivedandBlockReceivedAsyncAutoResetEvents fromSwarm<T>. [#705, #725] - Added
workersoptional parameter intoSwarm<T>()constructor. [#613, #727] Block<T>class became not to implementISerializable. [#751]Transaction<T>class became not to implementISerializable. [#751]Block<T>.ToBencodex()became to returnBencodex.Types.Dictionary. [#751]Transaction<T>.ToBencodex()became to returnBencodex.Types.Dictionary. [#751]- Removed
Block<T>.FromBencodex(byte[])method. [#751] - Removed
Transaction<T>.FromBencodex(byte[])method. [#751] Block<T>.ToBencodex()became to take no arguments. [#749, #757]- Removed
Swarm<T>.BroadcastBlocks(IEnumerable<Block<T>>)method. [#764] StoreExtension.LookupStateReference<T>()method was replaced byIStore.LookupStateReference<T>()method. [#722, #774]
Backward-incompatible network protocol changes
- Added
long-typedoffsetparameter toRecentStatesandGetRecentStatesmessages. [#703] - Added
int-typediterationparameter toRecentStatesmessage. [#703] - Added
BlockHeaderMessagemessage. [#764]
Backward-incompatible storage format changes
- The introduced
DefaultStoreis incompatible at the file-level with theLiteDBStorewhich had existed.DefaultStorebecame to take a directory instead of a single file, and it consists of multiple subdirectories and a LiteDB file for indices. [#662, #680]
Added APIs
- Added
DefaultStoreclass to replaceLiteDBStore. [#662] - Added
IStore.ListAllStateReferences<T>()method. [#701, #703] - Added
IStore.ListStateKeys()method to replaceIStore.ListAddresses()method. [#368, #774] - Added
IStore.LookupStateReference<T>()method to replaceStoreExtension.LookupStateReference<T>()method. [#368, #722, #774] - Added
BlockChain<T>.Genesisproperty. [#688] - Added
BlockChain<T>.MakeGenesisBlock()static method. [#688] - Added
InvalidGenesisBlockExceptionclass. [#688] - Added
StateDownloadStateclass, a subclass ofPreloadState, which reports state preloading iteration progress. [#703] - Added
PeerDiscoveryExceptionclass which inheritsSwarmExceptionclass. [#604, #726] - Added
Swarm<T>.Peersproperty which returns an enumerable of peers inSwarm<T>'s routing table. [#739] - Added
Block<T>.Serialize()method which returnsbyte[]. [#751] - Added
Transaction<T>.Serialize()method which returnsbyte[]. [#751] - Added
Block<T>(Bencodex.Types.Dictionary)constructor. [#751] - Added
Transaction<T>(Bencodex.Types.Dictionary)constructor. [#751] - Added
Block<T>.Deserialize(byte[])method. [#751] - Added
Transaction<T>.Deserialize(byte[])method. [#751] - Added
StoreExtension.Copy(this IStore, IStore)extension method. [#753] - Added a
HashDigest<SHA256>?-typedTxHashproperty which digests all transactions in the block toBlock<T>class. [#749, #757] - Added
CryptoConfigclass. [#758] - Added
ICryptoBackendclass. [#758] - Added
DefaultCryptoBackendclass. [#758] - Added
Swarm<T>.BroadcastBlock(Block<T>)method. [#764] - Added
Swarm<T>.PeerStatesproperty. [#772] - Added
PeerStateclass which represents aPeers state in the routing table. [#772] - Added
Swarm<T>.CheckAllPeersAsync()method. [#772]
Behavioral changes
Swarm<T>became to compare only peer's addresses instead of public keys to determine if a peer is in routing table or not. [#665]- When
Swarm<T>.PreloadAsync()method fails to download blocks,Swarm<T>became to callpreloadBlockDownloadFailedevent handler taken as an argument. If the event handler is not present,Swarm<T>throwsSwarmException. [#694] Swarm<T>.PreloadAsync()became not to sync state references and block states at once. [#703]Swarm<T>became to print less logs on debug level during sending states. [#706]- Increased
Swarm<T>'s network timeout value, in order to be stable a high latency internet connection. [#709] Swarm<T>.BootstrapAsync()became to reportPeerDiscoveryExceptioninstead ofSwarmExceptiondirectly. [#604, #726]BlockChain<T>.Append()became to unstage the stagedTransaction<T>s that have lower nonce than the highest nonce of the same signer's transactions in the same chain, since these virtually never become valid. [#721, #728]Swarm<T>became not to fill blocks if received block hashes are continuous. [#732]Swarm<T>became to can process more requests at once by creating TURN relaying proxy concurrently. [#744]Swarm<T>became to throwInvalidGenesisBlockExceptionwhen receiving block from the nodes that have a different genesis block. [#746]Swarm<T>became to distinguish the starting stages clearly. In other words,Swarm<T>.StartAsync()became not to callSwarm<T>.PreloadAsync(). [#735, #760]- The hash of
Block<T>has changed due to the change in the method of serialization. [#762] Swarm<T>became to ignore broadcasted block that has lower index than the current tip. [#764]- The way
Swarm<T>chose peers to spread messages has changed. [#765, #767]- If there are less than 10 peers in the routing table, select all peers.
- If there are more than 10 peers in the routing table, choose one from each bucket, and if the number is less than 10, then select an additional peers so that the total is 10.
Bug fixes
- Fixed a bug where the canonical chain could be deleted if
Swarm<T>failed to download blocks due to network connection. [#675] - Fixed bug that re-download block from scratch in preloading. [#685]
- Fixed a bug where state references become outdated if a chain is forked and then adding existing blocks into it. [#704]
- Fixed a bug where
Swarm<T>had exhausted all available sockets. [#709] - Fixed a bug where
Swarm<T>had infinitely repeated failed requests. [#709] - Fixed a bug where
Swarm<T>hadn't stopped properly. [#709] - Fixed a bug where
Swarm<T>.BootstrapAsync()had stopped due to trivial (recoverable)TimeoutExceptions. [#715, #716] - Fixed a bug where
BlockChain<T>.GetNextTxNonce()had returned invalid tx nonce. [#718] - Fixed a bug where mined transactions were staged again. [#719]
- Fixed a bug where
Block<T>.Hashproperty,Block<T>.Mine()method,Block<T>.FromBencodex()method,Block<T>.ToBencodex()method,Transaction<T>.Idproperty,Transaction<T>.Signatureproperty,Transaction<T>.Create()method,Transaction<T>.FromBencodex()method, andTransaction<T>.ToBencodex()method had been non-deterministic on someCultureInfo.CurrentCulture(e.g.,ar_SA,fr_FR,th_TH) so that it had caused network protocol incompatibilities. [#734] - Fixed a bug where the states became empty between the tip of the peer to receive the states and the tip of the downloaded block. [#736]
- Fixed a bug where
Swarm<T>.StartAsync()had thrownNullReferenceExceptionwhenhostparameter is present on the outside of NAT. [#744] - Fixed a bug where
Swarm<T>had failed to request a TURN relay when it has an IPv6 address. [#744] - Fixed a bug where
DefaultStorehad invalid state references cache after fork. [#759] - Fixed a bug where
BlockChain<T>had rendered and evaluated actions in the genesis block during forking. [#763] - Fixed a
Swam<T>'s bug that someTransaction<T>s had become excluded from miningBlock<T>s after reorg from α to β where aTransaction<T>was once included by aBlock<T>(α) and not included by an otherBlock<T>(β) for the sameIndexdue to the latency gap between nodes. [#775] - Fixed a bug where
TransactionSetandBlockSethas halt whole process when runTrace.Assert(). [#806, #833]
Version 0.7.0
Released on November 8, 2019.
Backward-incompatible interface changes
- Renamed
minValue/maxValueparameters tolowerBound/upperBoundofIRandom.Next()methods. [#555, #558] - Renamed
IStore.IterateIndex()method toIterateIndexes(). [#462, #560] Swarm<T>class became to implementIDisposableagain and should be disposed to clean up its internal resources. [#485]IStore.IterateStateReferences()method became to receivehighestIndex,lowestIndex, andlimitparameters. [#447, #545]- Reworked
BlockChain<T>.GetStates()intoGetState()which takes only oneAddressinstead ofIEnumerable<Address>. [#510, #563] - Types of
IAction.PlainValueand states became restricted toBencodex.Types.IValue. [#541, #552]IAction.LoadPlainValue(IImmutableDictionary<string, object>)method became replaced byLoadPlainValue(IValue).AccountStateGetterbecame to returnIValue, notobject.- Added
BencodexExtensionstatic class.
- Removed
BlockChain<T>.Blocks. [#409, #583] - Removed
BlockChain<T>.Transactions. [#409, #583] - Removed the
lingerparameter from theSwarm<T>()constructor, and added thewaitForparameter toSwarm<T>.StopAsync()method instead. [#581] - Removed the
dialTimeoutparameter from theSwarm<T>() constructor, and added it toSwarm<T>.PreloadAsync()&Swarm<T>.StartAsync()methods. [#581] - Removed
broadcastparameter fromBlockChain<T>.MakeTransaction()method. [#609] BlockChain<T>does not implementIReadOnlyList<T>anymore. [#630]- Added
BlockChain<T>.Countproperty. [#630] - Removed
BlockChain<T>.LongCount()method. [#630] - Removed
BlockChain<T>.Validate()method. [#630] - Removed
BlockChain<T>.GetEnumerate()method. [#630] - Removed
BlockPolicyExtension.ValidateBlocks()method. [#630] IBlockPolicy<T>.GetNextBlockDifficulty()method became to receiveBlockChain<T>instead ofIReadOnlyList<Block<T>>. [#630]IBlockPolicy<T>.ValidateNextBlock()method became to receiveBlockChain<T>instead ofIReadOnlyList<Block<T>>. [#630]
- Added
Added interfaces
- Added
ProtectedPrivateKeyclass. [#577, #614] - Added
IncorrectPassphraseExceptionclass. [#577, #614] - Added
MismatchedAddressExceptionclass. [#577, #614] - Added
KeyJsonExceptionabstract class. [#577, #614] - Added
InvalidKeyJsonExceptionclass. [#577, #614] - Added
UnsupportedKeyJsonExceptionclass. [#577, #614] - Added
ICipherinterface. [#577, #614] - Added
Aes128Ctrclass. [#577, #614] - Added
IKdfinterface. [#577, #614] - Added
Pbkdf2class. [#577, #614] - Added
Scryptclass. [#642, #654] - Added
BlockChain<T>.LongCount()method. [#575] - Added
BlockChain<T>[HashDigest<T>]indexer. [#409, #583] - Added
BlockChain<T>.Contains(HashDigest<T>)method. [#409, #583] - Added
BlockChain<T>.GetTransaction(TxId)method. [#409, #583] - Added
BlockChain<T>.Contains(TxId)method. [#409, #583] - Added
ByteUtil.Hex(ImmutableArray<byte>)overloaded method. [#614] - Added
BlockChain<T>.Contains(Block<T>)method. [#630] - Added
BlockDownloadState.SourcePeerproperty. [#636]
Behavioral changes
- Changed to send
Pongbefore updating the message sender to the routing table whenPingis received. [#566] - Improved performance of
StoreExtension.LookupStateReference<T>()method. [#447, #545] - Added .NET Core 2.2 as a targeted framework. [#209, #561]
TurnClient.AcceptRelayedStreamAsync()became to ignore disconnected connections. [#469]Swarm<T>.PreloadAsync()became to ignore peers with lower tip. [#592]Swarm<T>became to validate only stale peers. [#568, #593]Swarm<T>became not to check cached peers immediately after removing peers from its routing table. Instead, it checks cached peers periodically. [#608]- Marked
AddressandHashDigestas readonly. [#610] IceServer.CreateTurnClient()became to throwArgumentExceptionwhen received invalid url. [#622]Swarm<T>became to update peer table when receiving messages that are not related with Kademlia protocol. [#594, #627]Swarm<T>became not to check least recently used peer every time when new peer is fetched. [#627]IActionbecame guaranteed that the givenIActionContext.PreviousStates.GetState()never throwsIncompleteBlockStatesException. Instead, now it may calculate the incomplete states from the beginning if necessary. [#645]IStore.PutBlock<T>()became to do nothing when it takes theBlock<T>more than once. [#647]Swarm<T>.PreloadAsync()became to try downloading blocks from all neighbor peers, even if any peer among them is unavailable to send blocks. [#636]
Bug fixes
- Fixed a bug where
Swarm<T>had tried to update a peer infinitely when the peer is evicted from its table. [#566] - Fixed a bug where
Swarm<T>.AppendBlocksAsync()re-requests blocks that already received when blockchain is empty. [#550, #562] - Fixed a bug that
Swarm<T>had thrownSocketExceptionwith a messageOperation on non-blocking socket would block. [#405, #485] - Fixed a bug that accessed all blocks from the genesis block when a swap occurred. [#575]
- Fixed a bug that
Swarm<T>had thrownInvalidBlockIndexExceptionduring synchronizing with other reorganized peer. [#528, #576] - Fixed a bug where
Swarm<T>does not render actions in blocks which are filled from other peers. [#579] - Fixed a bug where
Swarm<T>renders actions in same block multiple times when reorg happens. [#579] LiteDBStorebecame to guarantee atomicity of storing blocks. [#584]- Fixed a bug that
BlockChain<T>had appended a block even if fails to evaluate. [#591] - Fixed a bug where
Swarm<T>hadn't removed stale peers. [#568, #593, #602] - Fixed a bug that
TurnClienthad thrownIOExceptionwhen accepting connection through a TURN relay server. [#453, #599] - Fixed a bug that
KeyNotFoundExceptionoccurred when sending a message through the TurnClient. - Fixed a bug where
BlockChain<T>.GetNextTxNonceonly returned the same nonce when transactions with an old nonce were staged. [#637] - Fixed a bug that
BlockChain<T>had reset whenSwarm<T>.PreloadAsync()fails. [#644] - Fixed bug that whole processes could halt when received an invalid type of message. [#628, #641]
- Fixed a bug that received blocks could not be processed if a branch point is a stale block. [#655]
Version 0.6.0
Released on October 1, 2019.
Backward-incompatible interface changes
BlockChain<T>.MineBlock()is nowasyncand became to throwOperationCanceledExceptionifBlockChain<T>'s tip index is changed while mining. [#460, #517]- Users became able to give a cancellation token to
Block<T>.Mine()andHashcash.Answer()to cancel the operation. [#460, #517] - Replaced
UnexpectedlyTerminatedTxRehearsalExceptionwithUnexpectedlyTerminatedActionException. [#498] - The following methods became to throw
UnexpectedlyTerminatedActionExceptionwith having itsInnerExceptionduring actions being evaluated if any action of them throws an exception: [#498]Transaction<T>.EvaluateActions()Transaction<T>.EvaluateActionsGradually()Block<T>.EvaluateActionsPerTx()Block<T>.Evaluate()BlockChain<T>.GetStates(completeStates: true)
- The concept of "namespaces" in
IStorewas replaced by "chain IDs" to be consistent withBlockChain<T>. [#483, #486]- Renamed
IStore.ListNamespaces()method toListChainIds(). - Renamed
IStore.DeleteNamespace()method toDeleteChainId(). - Renamed
IStore.GetCanonicalNamespace()method toGetCanonicalChainId(). - Renamed
IStore.SetCanonicalNamespace(string)method toSetCanonicalChainId(Guid). - Replaced
namespace/sourceNamespace/destinationNamespaceparameters takingstringof methods inIStoreandStoreExtensionwithchainId/sourceChainId/destinationChainIdtakingGuid. - Renamed
NamespaceNotFoundExceptiontoChainIdNotFoundException. - Replaced
NamespaceNotFoundException(string, string)constructor withChainIdNotFoundException(Guid, string)constructor. - Replaced
NamespaceNotFoundException.Namespaceproperty withChainIdNotFoundException.ChainIdproperty.
- Renamed
IStore.StoreStateReference<T>(string, IImmutableSet<Address>, Block<T>)method became replaced byStoreStateReference(Guid, IImmutableSet<Address>, HashDigest<SHA256>, long)method so that it takes hash and index of a block instead of an entire block. [#420]- Added
IStore.ForkBlockIndexes()method. [#420] - Removed
addressesToStripparameter fromIStore.ForkStateReferences<T>()method. [#454, #467, #509, #522] - Removed the concept of "staged transactions that should not be broadcasted,"
because its primary usage had been to make a transaction of a reward action
for a candidate for block miner, and the case became achieved through
IBlockPolicy<T>.BlockActionproperty which was introduced at 0.5.0. All staged transactions became broadcasted. [#319, #470]BlockChain<T>.StageTransactions(IDictionary<Transaction<T>, bool>)method became replaced byStageTransactions(IImmutableSet<Transaction<T>>).- Removed
toBroadcastparameter fromIStore.IterateStagedTransactionIds(bool)method. IStore.StageTransactionIds(IDictionary<TxId, bool>)method became replaced byStageTransactionIds(IImmutableSet<TxId>().
- Removed
Swarm<T>.AddPeersAsync()method. To connect with seed peers, useSwarm<T>.BootstrapAsync()method instead. [#353] Peerwith endpoints should be typed asBoundPeerwhich is inherited fromPeer. [#353]- Removed
IActionContext.NewGuid()method. To get a randomly generated Guid, useRandomExtension.GenerateRandomGuid()which implements RFC 4122 instead. [#508]
Added interfaces
- Added
BlockChain<T>.TipChangedevent which is invoked with an argument ofBlockChain<T>.TipChangedEventArgswhenBlockChain<T>.Tipis changed. [#517, #526] - Added
BlockChain<T>.TipChangedEventArgsclass. [#526] - Added
Swarm<T>.BootstrapAsync()method to connect with seed peers. [#353] - Added
RandomExtensionstatic class. [#508] TxIdclass became to implementIComparable<TxId>andIComparableinterfaces. [#244, #511]
Behavioral changes
Swarm<T>now broadcasts transactions as soon as new transactions are received. [#463, #496]Swarm<T>now ignores block hashes which already exists. [#461, #484]Swarm<T>.PreloadAsync()method became to download precalculated states of blocks from a likely branchpoint instead of a genesis block from a trusted peer (i.e.,trustedStateValidators) where there are branches between peers. [#465, #481]Swarm<T>'s internalGetRecentStatesmessage became to takeBlockLocator, an internal data type to approximates a path of a chain of blocks for heuristics to search a likely branchpoint, instead ofHashDigest<SHA256>. [#465, #481]- NetMQ instances are now initialized at
Swarm<T>.StartAsync()instead ofSwarm<T>(). [#353] - Peers now connected via Kademlia protocol. Peers are now selectively connected to each peer. [#353]
TxIds andBlocks are now broadcasted to selected peers from routing table of the host peer. [#353]PolymorphicAction<T>.ToString()method became to show the runtime type of itsInnerActionfor the sake of easier debugging. [#512]- The order of
Block<T>.Transactionsbecame to be determined by both aBlock<T>.Hashand aTransaction<T>.Id, so that signers cannot predict the order of transactions in a block before it's mined. If there are multiple transactions signed by the same signer in a block these transactions become grouped together and the order is determined by aBlock<T>.Hashand a fingerprint derived from all these transactions, and transactions in each group (per signer) are ordered byTransaction<T>.Nonce. [#244, #355, #511, #520] LiteDBStore()became to create the database in memory if thepathparameter isnull. [#521]
Bug fixes
- Fixed a bug that
Swarm<T>hadn't released its TURN related resources onSwarm<T>.StopAsync(). [#450] - Fixed a bug that
IActionContext.Randomhad been possible to generated equivalent results between actions of different transactions in aBlock<T>. [#519] - Fixed a bug where a forked chain would not be deleted when an exception occurred during fetching block from other peers. [#527, #537, #540]
Version 0.5.3
Released on September 9, 2019.
Bug fixes
- Fix bug where
IAccountStateDelta.GetState()hadn't returned proper state when the block action is evaluated. [#500]
Version 0.5.2
Released on August 29, 2019.
Bug fixes
- Fixed a bug that
Swarm<T>.PreloadAsync()method had thrownLiteException(or other exception depending onIStore), which indicates a state reference is duplicate, wheretrustedStateValidatorsis present and a miner tries to download precalculated states from a trusted peer. [#465, #474] - Fixed a bug tag
Swarm<T>.StartAsync()sometimes had thrown an exception fromIStore(e.g.,NullReferenceException) during broadcasting transactions. [#352, #476]
Version 0.5.1
Released on August 28, 2019.
Bug fixes
- Fixed a bug that
ArgumentNullExceptionhad been thrown when a blockchain, which consists of incomplete states (i.e., precalculated states downloaded from trusted peers), encounters a new branch so that reorg is made. [#454, #466] - Fixed a bug that unnecessarily received all blocks in multiple miner situations. [#457, #468]
Version 0.5.0
Released on August 22, 2019.
Backward-incompatible interface changes
- Added
IStore.GetBlockIndex()method. [#385] StoreExtension.LookupStateReference<T>()method became to returnTuple<HashDigest<SHA256>, long>which is a nullable tuple ofBlock<T>.HashandBlock<T>.Index. [#350]- Added
IBlockPolicy<T>.BlockActionproperty. [#319, #367] - Removed the type parameter of
ActionEvaluation. [#319, #367] ActionEvaluation.Actionbecame toIActiontype. [#319, #367]LiteDBStore()constructor became to have a new option namedflushand turned on by default. [#387, LiteDB #1268]LiteDBStore()constructor became to have a new option namedreadOnlyand turned off by default. [#434]BaseIndex.ContainsKey()method becameabstract. [#390]BlockDownloadState.TotalBlockCountandBlockDownloadState.ReceivedBlockCountbecame toInt64type. [#396, #399]IStore.IterateIndex()method became to receiveoffsetandlimitparameters. [[#425]]- Added
IStore.GetCanonicalNamespace()method. [#426] - Added
IStore.SetCanonicalNamespace()method. [#426] - Removed
IRandom.NextDouble()method, because floating-point arithmetics, which is underspecified, likely introduce indeterminism. [#410, #419] - Added
IActionContext.NewGuId()method. [#371, #439] Address(byte[])became to throwArgumentNullExceptioninstead ofNullReferenceException. [#443]- Removed
FileStoreclass. [#446]
Added interfaces
- Added
trustedStateValidatorsoption toSwarm<T>.PreloadAsync()method. If any peer in this set is reachable and there is no built up blockchain in a current node,Swarm<T>receives the latest states of the major blockchain from that trusted peer, which is also calculated by that peer, instead of autonomously calculating the states from scratch. Note that this option is intended to be exposed to end users through a feasible user interface so that they can decide whom to trust for themselves. [#272, #343] - Added
StoreExtension.ListAllStateReferences(this IStore, string, HashDigest<SHA256>?, HashDigest<SHA256>?)extension method. [#363, #384, #385] Addressclass became to implementIComparable<Address>andIComparableinterfaces. [#363]- Added
BlockChain<T>.BlockHashesproperty. [#389] Swarm<T>.PreloadAsync(IProgress<PreloadState>, IImmutableSet<Address>, CancellationToken)became to report progress for all phases. [#397, #400]- Added
PreloadState,ActionExecutionState,StateReferenceDownloadState, andBlockStateDownloadStateclasses to cover all phases in the entire preloading process. [#397, #400] - Added
Address(ImmutableArray<byte>)constructor. [#442, #443]
Behavioral changes
BlockChain<T>.PreloadAsync()method became to omit rendering ofIActions in the preloaded behind blocks. [#272, #343]Swarm<T>became to have two more message types:GetRecentStates(0x0b) andRecentStates(0x0c). [#272, #343]BlockChain<T>.MineBlock()andBlockChain<T>.GetNextTxNonce()methods became to ignore transactions that didn't followTransaction<T>.Noncesequentially and treat them as pendings. [#365]BlockChain<T>became to evaluateIBlockPolicy<T>.BlockActionand set the state when a block is appended to the chain. [#319, #367]BlockSet<T>.ContainsKey()andTransactionSet<T>.ContainsKey()methods became O(1) time complexity through omitting iteration and relying own retrieve implementations. [#390]- The way
LiteDBStorestores state references became efficient, but the file-level backward compatibility was also broken. [#395, #398] Swarm<T>.PreloadAsync()method became to report a block downloading progress with the total number of blocks to download in the entire batch, instead of the window size of a chunk (i.e., 500). [#396, #399]Swarm<T>.PreloadAsync()became to get the first parameter,progress, which acceptsIProgress<PreloadState>. [#397, #400]BlockHashesmessages became to contain one more higher hash. [#408, #445]Swarm<T>.PreloadAsync()became safe from data corruption even if a preloading process suddenly gets shutdown. [#417]FileStoreandLiteDBStorebecame to guarantee atomicity of storing transactions. [#413]IStore.PutTransaction<T>()became to do nothing when it takes theTransaction<T>more than once. [#413]BlockChain<T>.Swap()became to omit common block finding whenrenderisfalse. [#423]PrivateKey(byte[])constructor became to check validity. [#438]
Bug fixes
- Fixed a bug where the
LiteDBStore.IterateStagedTransactionIds()returns duplicated transaction ids. [#366] - Fixed a bug that
NullReferenceExceptionoccurred when serializing defaultAddress. [#369] - Removed unnecessary mutex in
Swarm<T>to avoid continuous delays in peer registration in some situations. [#375] - Fixed a bug that
TurnClienthad thrownKeyNotFoundExceptionandIOExceptionon startup. [#377, #378] - Fixed a
LiteDBStorebug that blocks or transactions had got corrupted sometimes. Instead,LiteDBStore.GetTransaction()became possible to returnnulleven for already stored transactions, and for that case, a warning will be logged through Serilog. [#386, #387, LiteDB #1268] - Fixed a bug that
NetworkStreamProxy.StartAsync()hadn't stopped properly when the connection had reset by a remote peer. [#414] - Fixed a bug that
Swarm<T>had hung forever after a remote peer had disconnected while receiving. [#416] - Fixed a bug that
Swarm<T>.PreloadAsync()had been processed even if there is no appropriate peer. [#418] - Fixed a bug that TURN-related tasks hadn't restarted automatically when an exception occurred. [#422]
- Fixed a bug that TURN relay connection had disconnected when preloading took a long time. [#424]
Version 0.4.1
Released on July 11, 2019.
Bug fixes
- Fixed a bug where the
BlockChain<T>.GetStates()method had not returned the latest state when there are multiple addresses. [#346]
Version 0.4.0
Released on July 8, 2019.
Backward-incompatible interface changes
Peer.AppProtocolVersionbecame nullable to representPeerwhose version is unknown. [#280]- Added
IStore.ListAddresses()method. [#272, #285] - Added
IStore.ListTxNonces()method. [#272, #309, #310] - Removed
BlockChain<T>.GetNonce()method. [#294] BlockChain<T>.StageTransactionsbecame to receiveIDictionary<Transaction<T>, bool>instead ofISet<Transaction<T>>. [#274, #297]IStore.StageTransactionIds()method became to receiveIDictionary<TxId, bool>instead ofISet<TxId>. [#274, #297]IStore.IterateStagedTransactionIds()method became to receivebool toBroadcastwhich is whether to iterate only the TxId set to broadcast. [#274, #297]Swarm<T>.StartAsync()method became to receivebroadcastTxInterval(ormillisecondsBroadcastTxInterval) parameter. [#274, #297]IStorebecame to treat a "tx nonce" mere alonginteger instead of a stack of block hashes. [#272, #307, #309, #310]IStore.IncreaseTxNonce<T>(string, Block<T>)method was replaced byIStore.IncreaseTxNonce(string, Address, long)method.- Removed
IStore.ForkTxNonce()method. FileStorebecame to occupy fewer bytes for storing tx nonces. This change broke file-level backward compatibility.
IStorebecame possible to look up multiple state references in a stack. [#272, #307]- Removed
IStore.LookupStateReference<T>()method. Instead, a newly added static classStoreExtensionprovides an extension method of the same name. - Added
IStore.IterateStateReferences()method.
- Removed
Swarmbecame to have type parameterTto represent an action type as like asBlockChain<T>. [#324]Swarm<T>constructor became to receiveBlockChain<T>. [#324]- Methods in
Swarm<T>that had taken a parameter ofBlockChain<T>type became to neither longer takeBlockChain<T>nor a generic method. Because theSwarm<T>constructor takes it instead. [#324] Swarm<T>does not implementICollection<Peer>anymore. [#326]- Added
IStore.DeleteNamespace()method. [#329] - Removed the
idparameter from theBlockChain<T>constructor, and it became to automatically detect an appropriateBlockChain<T>.Id. [#279, #332]
Added interfaces
- Added
LiteDBStorebackend that uses LiteDB under the hood. [#269] - All
*Async()methods belonging toTurnClientclass became to havecancellationTokenoption. [#287] - Added a
Peerconstructor omittingappProtocolVersionparameter to create aPeerwhose version is unknown. [#280] - Added
IncompleteBlockStatesExceptionclass. [#272, #285] - Added
completeStatesoption toBlockChain<T>.GetStates()method. [#272, #285] - Added
BlockChain<T>.MakeTransaction(PrivateKey, IEnumerable<T>, IImmutableSet<Address>, DateTimeOffset?)method. [#294] - Added
BlockChain<T>.GetNextTxNonce()method which counts staged transactions too during nonce computation. [#270, #294] - Added
StoreExtensionstatic class. [#272, #307] - Added
Swarm<T>.BlockChainproperty. [#272, #343]
Behavioral changes
BlockChain<T>.GetStates()method became to throwIncompleteBlockStatesExceptionif itsStorelacks the states of a block that a requested address lastly updated. [#272, #285]- A message
Swarm<T>makes became to have multiple blocks within it, which means round trips on the network are now much reduced. [#273, #276] Message.Blockhas been replaced byMessage.Blocksand the magic number has been changed to0x0a. [#276]- Improved performance of
Swarm<T>'s response time toGetBlockHashesrequest messages. [#277] - Added IPv6 support to
Libplanet.Stun.StunAddress. [#267, #271] IStore.GetBlockStates()became able to returnnullto represent an absence of states (i.e., incomplete states). [#272, #285]Swarm<T>became to broadcast stagedTransactions periodically so that game apps no more need to maintain their own thread to broadcast staged transactions. [#274, #297]- Previously,
Swarm<T>had sent an emptyGetTxsmessage when it receives an emptyTxIdsfrom peers, and it had made the network waste bandwidth for unnecessary messages.Swam<T>became to no more send such emptyGetTxs. [#297] BlockChain<T>.Swap()became to delete an index, tx nonces, and state references in the replaced chain. [#329]- Reduced the memory footprint of
BlockChain<T>.FindBranchPoint()method under the circumstances that the height of theBlockChain<T>object is high. [#282, #299]
Bug fixes
- Fixed a bug that
Swarm<T>reportedTaskCanceledExceptionas an unknown exception while stopping. [#275] - Fixed a bug that
Swarm<T>didn't stop properly duringSwarm<T>.PreloadAsync(). [#275] - Fixed a bug where the oldest
TxNonceof an address is not invalidated when forking usingFileStore.ForkTxNonce()method. [#281] - Fixed a bug where
LiteDBStore.GetTxNonce()method throws aSystem.IO.IOExceptionafter forking. [#281] - Fixed a bug that
TurnClienthad not stopped properly. [#287] - Fixed a bug that
TurnClienthad been trying to use an already closed connection. [#303, #308] - Fixed a bug that
KeyNotFoundExceptionhad been thrown instead ofArgumentOutOfRangeExceptionwhenBlockchain<T>[int]called while the index of a block that does not exist locally. [#208, #317] - Fixed a bug that
Swarm<T>had not dial to other peer afterSwarm<T>.PreloadAsync(). [#311] - Fixed an issue where unknown exceptions occurred when
Swarm<T>receiving a message. [#321, #327]
Version 0.3.0
Released on May 31, 2019.
Backward-incompatible interface changes
- Added
IAction.Render(IActionContext, IAccountStateDelta)method. [#31, #212] - Added
IAction.Unrender(IActionContext, IAccountStateDelta)method. [#31, #212] BlockChain<T>.Validate()method became to receiveIReadOnlyList<Block<T>>instead ofIEnumerable<Block<T>>. [#205]IBlockPolicy<T>.GetNextBlockDifficulty()method became to receiveIReadOnlyList<Block<T>>instead ofIEnumerable<Block<T>>. [#205]- Added
IBlockPolicy<T>.ValidateNextBlock(IReadOnlyList<Block<T>>, Block<T>)method. [#210] - Removed
IBlockPolicy<T>.ValidateBlocks()method. [#210] BlockChain<T>[int]became to throwArgumentOutOfRangeExceptioninstead ofIndexOutOfRangeException. [#210]- Removed
KeyEquals()methods from all classes and structs. [#216] Swarmclass now does not implementIEquatable<Swarm>anymore and itsEquals(object)method andGetHashCode()method became to have default behavior ofobjectclass. [#216]- Also,
Swarmclass now does not implementIDisposabletoo. ThusSwarm.Dispose()was removed too. [#218] Swarmbecame to use a queue to maintain internal messages. [#218]- The broadcasting methods are no more
async, so they are renamed as below.Swarm.BroadcastBlocksAsync()→Swarm.BroadcastBlocks()Swarm.BroadcastTxsAsync()→Swarm.BroadcastTxs()
- The broadcasting methods are no more
- The type of
Block<T>.Difficultyis changed tolonginstead ofint, and related classes method parameters and field types have changed accordingly. - Removed
HashDigest.HasLeadingZeroBits()method. [#213] - The signature of
IStore.PutBlock<T>(Block<T>)method was changed toPutBlock<T>(Block<T>, Address). [#189, #197] Block<T>.Hashis no longer calculated using the full data of theTransaction<T>, but is calculated using only theTransaction<T>.Id. [#234]- Added
IStore.LookupStateReference<T>(string, Address, Block<T>)method. [#232] - Added
IStore.StoreStateReference<T>(string, Block<T>)method. [#232] - Added
IStore.ForkStateReferences<T>(string, string, Block<T>, IImmutableSet<Address>method. [#232] - Removed
Block<T>.Validate()andBlock<T>.EvaluateActions()method. [#243] - Added
Transaction<T>.NonceandRawTransaction.Nonceproperties. [#246] - Added
IStore.GetTxNonce(string, Address)method. [#246] - Added
IStore.IncreaseTxNonce<T>(string, Block<T>)method. [#246] - Added
IStore.ForkTxNonce<T>(string, string, Block<T>, IImmutableSet<Address>method. [#246]
Added interfaces
BlockChain<T>became to implementIReadOnlyList<Block<T>>. [#205]- Added
Swarm.DifferentVersionPeerEncounteredevent handler that can handle events when a different version of a peer is discovered. [#167], [#185] - Added
Peer.AppProtocolVersionproperty. [#185] - Added
Swarm.PreloadAsync()method to explicitly and preemptively download initial blocks beforeSwarm.StartAsync<T>()being called. [#204], [#206] - Added
BlockDownloadStateclass to represent a block downloading state. [#204], [#206] - Added
BlockPolicyExtension.ValidateBlocks<T>(IBlockPolicy<T>, IReadOnlyList<Block<T>>, DateTimeOffset)method. [#210] - Added
Transaction<T>.EvaluateActionsGradually(HashDigest<SHA256>, long, IAccountStateDelta, Address, bool)method. [#31, #212] - Added
Block<T>.EvaluateActionsPerTx(AccountStateGetter)method. [#31, #212] - Added
HashDigest.Satisfies()method. [#213] BlockPolicy<T>constructor became to receive theminimumDifficultyand the miningdifficultyBoundDivisor. [#213]- Added
BlockChain<T>.UnstageTransactions()method. [#223] Swarmconstructor became to receive alinger(ormillisecondsLinger) parameter. This purposes to determine how long to wait for pending messages when aSwarminstance is requested to terminate.- Added
NamespaceNotFoundExceptionclass. [#232] - Added
Block<T>.Evaluate()method. [#243] - Made
InvalidBlockTimestampExceptionclasspublicso that it can be caught. [#133, #251] - Added
InvalidTxNonceExceptionclass. [#246]
Behavioral changes
Swarm.StartAsync()now receives the height of blocks (tipIndex) from other known peers and synchronizes the blocks if necessary before propagating/receiving pinpointed recent blocks to prevent inefficient round-trips. [#187, #190]- The calculation algorithm of
BlockPolicy<T>.GetNextBlockDifficulty()method was changed to the Ethereum Homestead algorithm except for the difficulty bomb. [#213] - The difficulty was changed from representing the number of leading zeros of target number to representing a divisor to obtain the target number. [#213]
BlockSet<T>[int]changed so as not to validate a block. [#231]- Improved read performance of
Block<T>.HashandTransaction<T>.Id. [#228, #234] Swarm.StartAsync()now does not callSwarm.StopAsync()anymore, thereforeSwarm.StopAsync()should be explicitly called. [#236]Transaction<T>.EvaluateActionsGradually()became to recordIAccountStateDelta.SetState()calls even if its argument is the same to the previous state. [#241]Block<T>.Validate()andBlock<T>.EvaluateActions()are integrated intoBlock<T>.Evaluate(). [#243]BlockChain<T>.Append()became to executeAction.Execute()only once per action in theBlock<T>. [#243]BlockChain<T>.Append()method became to throwInvalidTxNonceExceptionwhen theTransaction<T>.Noncedoes not correspond to itsSigner's current nonce. [#246]Swarmbecame to enforceForceDotNet.Force()in AsyncIO while it's running on Mono runtime. [#247]
Bug fixes
- Fixed a bug that TURN relay had been disconnected when being connected for longer than 5 minutes. [#198]
- Fixed a bug that
Swarmhad attempted to use TURN relay even if thehostargument was given. [#198] - Improved the read throughput of
BlockChain<T>.Append(). - Improved overall read throughput of
BlockChain<T>while blocks are being mined byBlockChain<T>.MineBlock(). [#191] - Fixed a bug that
TurnClientExceptionhad been thrown by Swarm when a STUN nonce is stale. [#193] - Fixed
BlockChain<T>.GetStates()had descended to the bottom (i.e., the genesis block) where a givenAddressrefers to a nonexistent account (i.e., never used before). [#189, #192] - Fixed a bug that a TURN connection had turned unavailable after it once failed to parse a message (due to a corrupted packet). [#215]
- Instead of validating the entire blocks,
BlockChain<T>.Append()method became to validate only the next block to be appended. [#210] - Improved
BlockChain<T>.Fork()performance by avoiding double validation of already validated blocks. [#215] - Removed unnecessary writer locks on
BlockChain<T>.StageTransactions(). [#217] - Improved concurrency of
BlockChain<T>.Append()method by removing unnecessary race conditions. [#217] - Fixed a bug that
Swarmcould not properly communicate withPeerbehind NAT. [#240] - Fixed a bug that
BlockChain<T>.FindNextHashes()throwsArgumentOutOfRangeExceptionwhen chain is empty. - Fixed a bug that
TurnClient.AcceptRelayedStreamAsync()didn't handle concurrent connections correctly. [#256]
Version 0.2.2
Released on April 12, 2019.
- Fixed a bug that
BlockChain<T>.GetStates()had returned slower than necessary for many addresses. [#189, #192]
Version 0.2.1
Released on April 7, 2019.
This version purposes to entirely replace 0.2.0, because a wrong .nupkg file was uploaded to 0.2.0 on NuGet Gallery. Note that 0.2.0 on NuGet Gallery was unlisted.
Version 0.2.0
Released on April 5, 2019.
PrivateKey.Decrypt()now throws anInvalidCiphertextExceptioninstead of returningnullwhencipherTextis invalid. [#140]Transaction<T>'sSender–Recipientmodel was replaced bySigner–UpdatedAddressesmodel. Unlike cryptocurrencies, transactions in games are not necessarily a transfer of assets, so it is difficult to determine what type of assert is transferred or who will receives the asset. A more useful perspective is, like what kind of transformation is performed, or what states are changed. To be close to this perspective, we decided to get rid ofTransaction<T>.Recipient(which is singular) and haveTransaction<T>.UpdatedAddresses(which is plural) instead. As there is no more asset to transfer, the termSenderwas also renamed toSigner, which fits more to the new perspective. [#121]- Renamed
Transaction<T>.Sender,RawTransaction.Signer, andIActionContext.Fromproperties toSigner. The corresponding parameter names on constructors and methods were also renamed too. - Old
Transaction<T>.Make()factory method is replaced by newTransaction<T>.Create()factory method. Thetimestampparameter became optional, and the new optionalupdatedAddressesparameter was added. - Removed
IActionContext.Toproperty. Transaction<T>.RecipientandRawTransaction.Recipientproperties were replaced byTransaction<T>.UpdatedAddressesandRawTransaction.UpdatedAddressesproperties. The corresponding parameter names on constructors and methods were replaced too.- Since the schema of
RawTransactionclass was changed, the serialization format of transactions and blocks were also changed. It affects to the way to generateTransaction<T>.Signature,Transaction<T>.Id, andBlock.Hashvalues as well. - Added
InvalidTxUpdatedAddressesExceptionexception class. - A nullary overload of
Block<T>.Validate()method was gone so that the block validation API is always time-wise. Instead,Block<T>.Validate()method now has only one overload:Validate(DateTimeOffset, AccountStateGetter)returningIAccountStateDelta. Block<T>.Validate()andBlockChain<T>.Validate()methods now can throw anInvalidTxUpdateAddressesException.
- Renamed
The
AddressesIActiontries to update no more need to be manually coded usingIAction.RequestStates()method. That method was removed at all, and updatedAddresses became automatically determined (for the most cases) by track "dirties" on rehearsal mode. This mode dry-runsIActions with emptyIActionContext.PreviousStates. [#121]- Added
AccountStateGetterdelegate to provide a read-only view to account states. - Added
IAccountStateDeltainterface to replaceAddressStateMap. The interface purposes to provide a read-write view to account states with maintainingUpdatedAddresses(so-called "dirty"). [#98] - The type of
IActionContext.PreviousStatesproperty was changed fromAddressStateMaptoIAccountStateDelta. - Added
IActionContext.Rehearsalproperty. [#131, #135] - Added
UnexpectedlyTerminatedTxRehearsalExceptionclass. [#132, #136] - The return type of
IAction.Execute()method was changed fromAddressStateMaptoIAccountStateDelta. - Removed
IAction.RequestStates()method because there is no need for it and thus it is not used anymore. - Added
Transaction<T>.EvaluateActions()method. - Added
Block<T>.EvaluateActions()generator method.
- Added
The built-in subtype polymorphism of
IActionandTransaction<T>was moved to a separated newPolymorphicAction<T>abstract class. Polymorphic actions now should be wrapped byPolymorphicAction<T>. For example, the following code:public abstract class AbstractAction : IAction { ... } [ActionType("attack")] public sealed class Attack : AbstractAction { ... } [ActionType("sleep")] public sealed class Sleep : AbstractAction { ... }var tx = Transaction<AbstractAction>.Create( ..., actions: new[] { new Attack(...), ... } );should be changed to like:
var tx = Transaction<PolymorphicAction<AbstractAction>>.Create( ..., actions: new[] { new PolymorphicAction<AbstractAction>(new Attack(...)), ... } );It can be simpler by implicit casting:
var tx = Transaction<PolymorphicAction<AbstractAction>>.Create( ..., actions: new PolymorphicAction<AbstractAction>[] { new Attack(...), } );[#169]
- The type parameter
TofTransaction<T>,Block<T>, andBlockChain<T>became to require having apublicparameterless constructor (i.e.,new()) besides implementingIActioninterface. This means anabstract classor aninterfaceno more can be passed toT, but only a concreteclassor astructcan be passed.
- The type parameter
Fixed a bug that mutating a collection of
IActions passed to constructors or factory methods ofTransaction<T>had affected made instances as well. The type ofTransaction<T>.Actionsproperty was changed fromIList<T>toIImmutableList<T>. The corresponding parameters on constructors and factory methods also were changed to takeIEnumerable<T>instead ofIList<T>.InvalidTxExceptionand its subclasses became to haveTxIdproperty and the corresponding constructor parameter. This can be useful when multipleTransaction<T>objects are validated at once.Added
Address.Sizeconstant, which is fixed to theInt3220.Fixed a bug that
Block<T>.Validate()had not thrownInvalidTxExceptioneven if there is any integrity error on itsTransactions.Improved the write throughput of
BlockChain<T>while pollingBlockChain<T>.GetStates()Swarm.AddPeersAsync()was fixed so that unreachablePeers are ignored. [#128]Swarmbecame able to relay their connection via TURN (RFC 5766) to NAT traversal. To enable this, its constructor (Swarm()) takes the newly addedIceServers as configuration.Since we decided to depend on TURN (RFC 5766) and STUN (RFC 5389) to work around NAT so that
Peer's endpoints don't have to be multiple,Peer.Urlswas renamed toPeer.EndPointand its type also was changed fromIImmutableList<Uri>toDnsEndPoint. [#120, #123 by Yang Chun Ung, #126, #127, #165, #166]Swarmbecame to ignore tip blocks of the same height (Index) that it already has and deal with only longer (higher) blocks.Fixed a bug that occurred when
Swarmwas handling multiple responses at the same time.Fixed a bug that the
Swarmconstructor had hanged in certain runtimes like Unity engine.Removed
AddressTransactionSetwhich handles handleAddresstoIEnumerable<TxId>indices, and the following methods inIStore:IStore.IterateAddresses()IStore.GetAddressTransactionIds()IStore.AppendAddressTransactionId()IStore.CountAddresses()
Added
IStore.ListNamespaces()method.IStore.CountBlocks()andIStore.CountTransactions()became to returnlong.Block/tx-related methods in
IStoreandBaseIndex<T>no longer accepts@namespaceparameter. It means that even if a forking occurs, the same block/tx files are shared.Fixed a bug that made unnecessary fork when receiving blocks from other peer.
Action classes that implement
IActionbut lackActionTypeAttributebecame reported byPolymorphicAction<T>throwingMissingActionTypeExceptionat runtime. [#28, #144, #169]Turn into parameter in
BlockPolicy's constructor to milliseconds. [#151]BencodexFormatterbecame able to serializeBigInteger. [#159]Made
Swarmpossible to configure its networkappProtocolVersionand, to ignore peers if their version is different. [#167], [#170]Added
DifferentAppProtocolVersionExceptionclass. [#167, #170]Renamed
Block<T>.RewardBeneficiarytoBlock<T>.Miner. [#174]Added
BlockChain<T>.Blocksproperty. [#176]Added
BlockChain<T>.Transactionsproperty. [#176]
Version 0.1.1
Released on March 5, 2019.
- Improved stability of
SwarmandSwarmTest.
Version 0.1.0
Initial release. Released on February 26, 2019.